You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
92041 lines
3.0 MiB
92041 lines
3.0 MiB
(window.webpackJsonp = window.webpackJsonp || []).push([
|
|
["library"], {
|
|
"+2Ad": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "setupChartScreenshotHint", (function() {
|
|
return o
|
|
}));
|
|
var s = i("YFKU"),
|
|
r = i("FQhm"),
|
|
n = i("Eyy1");
|
|
|
|
function o(e, t) {
|
|
const o = Object(s.t)("Link to the chart image copied to clipboard {emoji}").format({
|
|
emoji: "👍"
|
|
}),
|
|
a = Object(s.t)("Chart image copied to clipboard {emoji}").format({
|
|
emoji: "👍"
|
|
});
|
|
r.on("onServerScreenshotCopiedToClipboard", () => h(o), null), r.on(
|
|
"onClientScreenshotCopiedToClipboard", () => h(a), null);
|
|
let l = null;
|
|
const c = e.getContainer();
|
|
|
|
function h(e) {
|
|
l ? l.show(e) : Promise.all([i.e("react"), i.e(84), i.e("chart-screenshot-hint")]).then(
|
|
i.bind(null, "USSy")).then(i => {
|
|
l || (l = new i.ChartScreenshotHintRenderer(Object(n.ensureNotNull)(c), {
|
|
bottomPadding: t.seriesControlBarEnabled
|
|
}), l.show(e))
|
|
})
|
|
}
|
|
}
|
|
},
|
|
"+6II": function(e, t, i) {
|
|
"use strict";
|
|
var s = i("8+VR");
|
|
let r = 0,
|
|
n = 0,
|
|
o = 0;
|
|
|
|
function a() {
|
|
clearTimeout(r), clearTimeout(n), clearTimeout(o)
|
|
}
|
|
|
|
function l(e, t) {
|
|
r = setTimeout(e, t)
|
|
}
|
|
const c = "tooltip-root-element";
|
|
let h;
|
|
|
|
function u() {
|
|
const e = document.getElementById(c);
|
|
e ? h = e : (h = document.createElement("div"), h.id = c, document.body.appendChild(h))
|
|
}
|
|
|
|
function d() {
|
|
h && (h.innerHTML = "")
|
|
}
|
|
"interactive" === document.readyState ? u() : document.addEventListener("DOMContentLoaded", u);
|
|
var p = i("Eyy1");
|
|
const _ = {
|
|
default: "",
|
|
white: "theme-white",
|
|
"round-shadow": "theme-round-shadow"
|
|
},
|
|
m = Object.keys(_);
|
|
var f = i("CPmC"),
|
|
g = i("/DW5"),
|
|
b = i("gWrr"),
|
|
v = i("Ialn"),
|
|
S = (i("HbRj"), i("XAms")),
|
|
y = i("Hr11"),
|
|
w = i("qFKp"),
|
|
P = i("Wo0S");
|
|
|
|
function C(e) {
|
|
const t = e.hasAttribute("data-tooltip") ? e.getAttribute("data-tooltip") : e.getAttribute(
|
|
"title");
|
|
return t && (Object(f.b)(e, "text", t), e.removeAttribute("title")), Object(f.a)(e,
|
|
"text") || ""
|
|
}
|
|
|
|
function x(e) {
|
|
const t = E.cloneNode(!0),
|
|
i = V(t),
|
|
{
|
|
content: s
|
|
} = e;
|
|
switch (s.type) {
|
|
case "element":
|
|
i.innerHTML = "", i.appendChild(s.data);
|
|
break;
|
|
case "html":
|
|
i.innerHTML = s.data;
|
|
break;
|
|
case "text":
|
|
if (e.hotkey) {
|
|
const e = D.cloneNode(!0);
|
|
e.innerText = s.data, i.appendChild(e)
|
|
} else i.innerText = s.data
|
|
}
|
|
if (e.hotkey) {
|
|
const t = "none" !== s.type,
|
|
r = k.cloneNode(!0),
|
|
n = Object(g.a)(e.hotkey),
|
|
o = n.keys.map(e =>
|
|
`<span class="${P["common-tooltip__hotkey-button"]}">${e}</span>`);
|
|
r.innerHTML = function(e, t) {
|
|
return e.replace(/{\d}|{hotkey_\d}/gi, e => {
|
|
const i = Number(e.match(/\d/));
|
|
return t[i]
|
|
})
|
|
}(n.text, o).replace(/\s\+\s/g,
|
|
`<span class="${P["common-tooltip__plus-sign"]}">+</span>`), i.classList.add(P[
|
|
"common-tooltip__body--with-hotkey"]), t && r.classList.add(P[
|
|
"common-tooltip__hotkey-block--divider"]), i.appendChild(r)
|
|
}
|
|
return t.addEventListener("contextmenu", S.a), t
|
|
}
|
|
|
|
function T(e, t) {
|
|
const i = t.rect;
|
|
if (!i) return;
|
|
! function(e, t) {
|
|
const i = m.includes(t) ? _[t] : "";
|
|
e.classList.remove(...m.map(e => _[e]).filter(e => !!e)), i && !e.classList.contains(
|
|
i) && e.classList.add(i)
|
|
}(e, t.colorTheme || "default"), t.addClass && e.classList.add(t.addClass);
|
|
const s = V(e),
|
|
r = e.querySelector("." + P["common-tooltip__button-container"]);
|
|
s.classList.toggle(P["common-tooltip__body--width_wide"], Boolean(t.wide)), s.classList
|
|
.toggle(P["common-tooltip__body--no-padding"], Boolean(t.noPadding)), s.classList
|
|
.toggle(P["common-tooltip__body--width_narrow"], Boolean(t.narrow)),
|
|
s.classList.toggle(P["common-tooltip__body--no-buttons"], !0), s.style.left = M(0), s
|
|
.style.width = M(s.clientWidth + (Boolean(t.noPadding) ? 0 : 2));
|
|
const n = document.body.clientWidth,
|
|
o = w.CheckMobile.iOS() || Object(w.supportTouch)() && Object(w.isMac)() ? window
|
|
.innerHeight : document.body.clientHeight,
|
|
a = t.vertical,
|
|
l = t.extendMargin || a && i.w < 20 || !a && i.h < 20;
|
|
e.classList.toggle(P["common-tooltip--farther"], l), e.classList.toggle(P[
|
|
"common-tooltip--vertical"], a), e.classList.toggle(P["common-tooltip--horizontal"],
|
|
!a);
|
|
const c = function(e) {
|
|
return e.querySelector("." + P["common-tooltip__ear-holder"])
|
|
}(e),
|
|
h = e.offsetHeight;
|
|
if (a) {
|
|
const a = 10,
|
|
l = o - 10,
|
|
u = 12,
|
|
d = a + u,
|
|
p = l - u,
|
|
_ = Object(y.clamp)(i.y + i.h / 2, d, p) - h / 2,
|
|
m = _ + h;
|
|
e.style.left = M(i.x + i.w), e.style.top = M(_), _ < a ? s.style.top = r.style.top = M(
|
|
a - _) : m > l && (s.style.top = r.style.top = M(l - m));
|
|
const {
|
|
right: f
|
|
} = (e.querySelector(":last-child") || s).getBoundingClientRect(), g = f + 10 > n;
|
|
e.classList.toggle(P["common-tooltip--direction_reversed"], g), e.classList.toggle(P[
|
|
"common-tooltip--direction_normal"], !g);
|
|
let b = g ? "after" : "before";
|
|
Object(v.isRtl)() ? (b = t.otr ? "after" : b, b = t.otl ? "before" : b) : (b = t.otr ?
|
|
"before" : b, b = t.otl ? "after" : b), c.classList.toggle(P[
|
|
"common-tooltip__ear-holder--before"], "before" === b), c.classList.toggle(P[
|
|
"common-tooltip__ear-holder--after"], "after" === b), "after" === b && (e.style
|
|
.left = "auto", e.style.right = M(n - i.x))
|
|
} else {
|
|
const a = i.x - (s.offsetWidth - i.w) / 2,
|
|
l = n - 10 - e.offsetWidth,
|
|
u = Math.max(10, Math.min(a, l));
|
|
e.style.left = M(u);
|
|
const d = l < a;
|
|
e.classList.toggle(P["common-tooltip--direction_reversed"], d), e.classList.toggle(P[
|
|
"common-tooltip--direction_normal"], !d);
|
|
const p = function(e, t, i, s) {
|
|
if (e.above) return B(t, s) ? "above" : "below";
|
|
if (e.below) return function(e, t, i) {
|
|
return i.y + i.h + t + 10 < e
|
|
}(t, i, s) ? "below" : "above";
|
|
return B(i, s) ? "above" : "below"
|
|
}(t, o, h, i);
|
|
"above" === p ? e.style.bottom = M(o - i.y) : e.style.top = M(i.y + i.h), c.classList
|
|
.add("above" === p ? P["common-tooltip__ear-holder--above"] : P[
|
|
"common-tooltip__ear-holder--below"]);
|
|
const {
|
|
left: _
|
|
} = s.getBoundingClientRect();
|
|
let m = Math.trunc(i.x + i.w / 2 - (_ + s.clientWidth / 2));
|
|
e.style.left = M(u + m), e.style.width = M(s.clientWidth + r.clientWidth), m = d ? Math
|
|
.max(0, m) : Math.min(0, m), r.style.left = M(-m), s.style.left = M(-m)
|
|
}
|
|
}
|
|
|
|
function I(e) {
|
|
e.classList.toggle(P["common-tooltip--hidden"], !0)
|
|
}
|
|
|
|
function M(e) {
|
|
return Math.floor(e) + "px"
|
|
}
|
|
const O =
|
|
`\n\t<div id="common-tooltip-wrapper" class="${P["common-tooltip"]}">\n\t\t<div class="${P["common-tooltip__ear-holder"]}" >\n\t\t\t<div class="${P["common-tooltip__body"]} js-tooltip-body"></div>\n\t\t</div>\n\t\t<div class="${P["common-tooltip__button-container"]}"></div>\n\t</div>\n`,
|
|
L = `\n\t<div class="${P["common-tooltip__hotkey-block"]}"></div>\n`,
|
|
A = `\n\t<div class="${P["common-tooltip__hotkey-text"]}"></div>\n`,
|
|
E = Object(b.b)(O),
|
|
k = Object(b.b)(L),
|
|
D = Object(b.b)(A);
|
|
|
|
function V(e) {
|
|
return e.querySelector("." + P["common-tooltip__body"])
|
|
}
|
|
|
|
function B(e, t) {
|
|
return 10 + e < t.y
|
|
}
|
|
var R = i("lxNp");
|
|
i.d(t, "c", (function() {
|
|
return H
|
|
})), i.d(t, "b", (function() {
|
|
return U
|
|
})), i.d(t, "a", (function() {
|
|
return G
|
|
}));
|
|
let N = !1,
|
|
j = null,
|
|
F = null;
|
|
s.mobiletouch || document.addEventListener("mouseover", (function(e) {
|
|
var t;
|
|
if (null === (t = e.sourceCapabilities) || void 0 === t ? void 0 : t
|
|
.firesTouchEvents) return;
|
|
const i = e.target,
|
|
s = e.currentTarget,
|
|
r = function(e, t, i) {
|
|
const s = [];
|
|
for (; e && e !== t;) e.classList && e.classList.contains(i) && s.push(
|
|
e), e = e.parentElement || (r = e.parentNode) && (r.nodeType ===
|
|
Node.ELEMENT_NODE ? r : null);
|
|
var r;
|
|
return s
|
|
}(i, s, "apply-common-tooltip");
|
|
for (const t of r) {
|
|
if ("buttons" in e) {
|
|
if (1 & e.buttons) continue
|
|
} else if (1 === e.which) continue;
|
|
const i = () => H(t);
|
|
if (i()) {
|
|
const e = e => {
|
|
e.target instanceof Element && e.target.contains(t) && s(null, !
|
|
0)
|
|
},
|
|
s = (r, n = !1) => {
|
|
t.removeEventListener("common-tooltip-update", i), t
|
|
.removeEventListener("mouseleave", s), t
|
|
.removeEventListener("mousedown", s), document
|
|
.removeEventListener("scroll", e, {
|
|
capture: !0
|
|
}), F && (F.destroy(), F = null), G(n)
|
|
};
|
|
t.addEventListener("common-tooltip-update", i), t.addEventListener(
|
|
"mouseleave", s), t.addEventListener("mousedown", s), document
|
|
.addEventListener("scroll", e, {
|
|
capture: !0
|
|
}), null === F && (F = Object(R.createGroup)({
|
|
desc: "Tooltip"
|
|
}), F.add({
|
|
desc: "Hide",
|
|
hotkey: 27,
|
|
handler: s
|
|
}));
|
|
break
|
|
}
|
|
}
|
|
}), !0);
|
|
const W = new MutationObserver(() => {
|
|
if (j && j.options.target) {
|
|
let e;
|
|
e = "isConnected" in j.options.target ? j.options.target.isConnected : document
|
|
.body.contains(j.options.target), e || G()
|
|
}
|
|
}),
|
|
H = (e, t = {}) => {
|
|
const {
|
|
content: i,
|
|
...s
|
|
} = Y(t), r = function(e) {
|
|
const t = C(e),
|
|
i = e.getBoundingClientRect(),
|
|
s = {
|
|
h: i.height,
|
|
w: i.width,
|
|
x: i.left,
|
|
y: i.top
|
|
},
|
|
r = e.getAttribute("data-color-theme") || "",
|
|
n = e.classList.contains("common-tooltip-html"),
|
|
o = parseInt(e.getAttribute("data-tooltip-delay") || ""),
|
|
a = parseInt(e.getAttribute("data-tooltip-debounce") || "");
|
|
let l = {
|
|
type: "none"
|
|
};
|
|
return t && (l = {
|
|
type: n ? "html" : "text",
|
|
data: t
|
|
}), {
|
|
above: e.classList.contains("common-tooltip-above"),
|
|
below: e.classList.contains("common-tooltip-below"),
|
|
otl: e.classList.contains("common-tooltip-otl"),
|
|
otr: e.classList.contains("common-tooltip-otr"),
|
|
vertical: e.classList.contains("common-tooltip-vertical"),
|
|
hotkey: e.getAttribute("data-tooltip-hotkey"),
|
|
narrow: e.classList.contains("common-tooltip-narrow"),
|
|
wide: e.classList.contains("common-tooltip-wide"),
|
|
colorTheme: r,
|
|
tooltipDelay: o,
|
|
tooltipDebounce: a,
|
|
rect: s,
|
|
content: l,
|
|
target: e
|
|
}
|
|
}(e), n = Object.assign(r, s);
|
|
return "none" !== i.type && (n.content = i), !("none" === n.content.type && !n
|
|
.hotkey) && (n.target = e, U(n), !0)
|
|
},
|
|
U = e => {
|
|
const t = Y(e),
|
|
i = x(t);
|
|
var s;
|
|
if (j = {
|
|
options: t,
|
|
element: i
|
|
}, s = i, d(), h && h.appendChild(s), a(), !N) return I(i), void l(() => q(i),
|
|
function(e) {
|
|
return "number" != typeof e.tooltipDelay || isNaN(e.tooltipDelay) ?
|
|
500 : e.tooltipDelay
|
|
}(t));
|
|
const {
|
|
tooltipDebounce: r
|
|
} = e;
|
|
"number" != typeof r || isNaN(r) ? q(i) : l(() => q(i), r)
|
|
};
|
|
|
|
function z() {
|
|
d(), N = !1, j = null
|
|
}
|
|
const G = e => {
|
|
if (a(), W.disconnect(), !j) return;
|
|
if (!e && !N) return;
|
|
const {
|
|
element: t,
|
|
options: i
|
|
} = j, s = () => {
|
|
t.removeEventListener("mouseleave", s), I(t), e ? z() : o = setTimeout(() => {
|
|
z()
|
|
}, 250)
|
|
};
|
|
var r, l;
|
|
i.tooltipHideDelay ? (r = () => {
|
|
t.querySelector(":hover") ? t.addEventListener("mouseleave", s) : s()
|
|
}, l = i.tooltipHideDelay, n = setTimeout(r, l)) : s()
|
|
};
|
|
|
|
function q(e) {
|
|
const {
|
|
options: t
|
|
} = Object(p.ensureNotNull)(j);
|
|
if (T(e, t), function(e) {
|
|
e.classList.toggle(P["common-tooltip--hidden"], !1)
|
|
}(e), W.observe(document, {
|
|
childList: !0,
|
|
subtree: !0
|
|
}), N = !0, t.forceHideOnMove) {
|
|
const e = () => {
|
|
document.removeEventListener("mousemove", e), G()
|
|
};
|
|
document.addEventListener("mousemove", e)
|
|
}
|
|
}
|
|
|
|
function Y(e) {
|
|
if (function(e) {
|
|
return "content" in e
|
|
}(e)) return e;
|
|
const {
|
|
inner: t,
|
|
html: i,
|
|
text: s,
|
|
...r
|
|
} = e;
|
|
let n = {
|
|
type: "none"
|
|
};
|
|
return t && (n = {
|
|
type: "element",
|
|
data: t
|
|
}), s && (n = {
|
|
type: i ? "html" : "text",
|
|
data: s
|
|
}), {
|
|
content: n,
|
|
...r
|
|
}
|
|
}
|
|
},
|
|
"+6ja": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "availableTimezones", (function() {
|
|
return o
|
|
})), i.d(t, "timezoneIsAvailable", (function() {
|
|
return a
|
|
})), i.d(t, "timezoneTitle", (function() {
|
|
return l
|
|
}));
|
|
i("YFKU");
|
|
var s = i("/+9u");
|
|
const r = [{
|
|
id: "Etc/UTC",
|
|
title: window.t("UTC")
|
|
}, {
|
|
id: "exchange",
|
|
title: window.t("Exchange")
|
|
}],
|
|
n = [{
|
|
id: "Africa/Cairo",
|
|
title: window.t("Cairo"),
|
|
offset: 0
|
|
}, {
|
|
id: "Africa/Johannesburg",
|
|
title: window.t("Johannesburg"),
|
|
offset: 0
|
|
}, {
|
|
id: "Africa/Lagos",
|
|
title: window.t("Lagos"),
|
|
offset: 0
|
|
}, {
|
|
id: "America/Argentina/Buenos_Aires",
|
|
title: window.t("Buenos Aires"),
|
|
offset: 0
|
|
}, {
|
|
id: "America/Bogota",
|
|
title: window.t("Bogota"),
|
|
offset: 0
|
|
}, {
|
|
id: "America/Caracas",
|
|
title: window.t("Caracas"),
|
|
offset: 0
|
|
}, {
|
|
id: "America/Chicago",
|
|
title: window.t("Chicago"),
|
|
offset: 0
|
|
}, {
|
|
id: "America/El_Salvador",
|
|
title: window.t("San Salvador"),
|
|
offset: 0
|
|
}, {
|
|
id: "America/Juneau",
|
|
title: window.t("Juneau"),
|
|
offset: 0
|
|
}, {
|
|
id: "America/Lima",
|
|
title: window.t("Lima"),
|
|
offset: 0
|
|
}, {
|
|
id: "America/Los_Angeles",
|
|
title: window.t("Los Angeles"),
|
|
offset: 0
|
|
}, {
|
|
id: "America/Mexico_City",
|
|
title: window.t("Mexico City"),
|
|
offset: 0
|
|
}, {
|
|
id: "America/New_York",
|
|
title: window.t("New York"),
|
|
offset: 0
|
|
}, {
|
|
id: "America/Phoenix",
|
|
title: window.t("Phoenix"),
|
|
offset: 0
|
|
}, {
|
|
id: "America/Santiago",
|
|
title: window.t("Santiago"),
|
|
offset: 0
|
|
}, {
|
|
id: "America/Sao_Paulo",
|
|
title: window.t("Sao Paulo"),
|
|
offset: 0
|
|
}, {
|
|
id: "America/Toronto",
|
|
title: window.t("Toronto"),
|
|
offset: 0
|
|
}, {
|
|
id: "America/Vancouver",
|
|
title: window.t("Vancouver"),
|
|
offset: 0
|
|
}, {
|
|
id: "US/Mountain",
|
|
title: window.t("Denver"),
|
|
offset: 0
|
|
}, {
|
|
id: "Asia/Almaty",
|
|
title: window.t("Almaty"),
|
|
offset: 0
|
|
}, {
|
|
id: "Asia/Ashkhabad",
|
|
title: window.t("Ashkhabad"),
|
|
offset: 0
|
|
}, {
|
|
id: "Asia/Bahrain",
|
|
title: window.t("Bahrain"),
|
|
offset: 0
|
|
}, {
|
|
id: "Asia/Bangkok",
|
|
title: window.t("Bangkok"),
|
|
offset: 0
|
|
}, {
|
|
id: "Asia/Chongqing",
|
|
title: window.t("Chongqing"),
|
|
offset: 0
|
|
}, {
|
|
id: "Asia/Dubai",
|
|
title: window.t("Dubai"),
|
|
offset: 0
|
|
}, {
|
|
id: "Asia/Ho_Chi_Minh",
|
|
title: window.t("Ho Chi Minh"),
|
|
offset: 0
|
|
}, {
|
|
id: "Asia/Hong_Kong",
|
|
title: window.t("Hong Kong"),
|
|
offset: 0
|
|
}, {
|
|
id: "Asia/Jakarta",
|
|
title: window.t("Jakarta"),
|
|
offset: 0
|
|
}, {
|
|
id: "Asia/Jerusalem",
|
|
title: window.t("Jerusalem"),
|
|
offset: 0
|
|
}, {
|
|
id: "Asia/Kolkata",
|
|
title: window.t("Kolkata"),
|
|
offset: 0
|
|
}, {
|
|
id: "Asia/Kuwait",
|
|
title: window.t("Kuwait"),
|
|
offset: 0
|
|
}, {
|
|
id: "Asia/Muscat",
|
|
title: window.t("Muscat"),
|
|
offset: 0
|
|
}, {
|
|
id: "Asia/Qatar",
|
|
title: window.t("Qatar"),
|
|
offset: 0
|
|
}, {
|
|
id: "Asia/Riyadh",
|
|
title: window.t("Riyadh"),
|
|
offset: 0
|
|
}, {
|
|
id: "Asia/Seoul",
|
|
title: window.t("Seoul"),
|
|
offset: 0
|
|
}, {
|
|
id: "Asia/Shanghai",
|
|
title: window.t("Shanghai"),
|
|
offset: 0
|
|
}, {
|
|
id: "Asia/Singapore",
|
|
title: window.t("Singapore"),
|
|
offset: 0
|
|
}, {
|
|
id: "Asia/Taipei",
|
|
title: window.t("Taipei"),
|
|
offset: 0
|
|
}, {
|
|
id: "Asia/Tehran",
|
|
title: window.t("Tehran"),
|
|
offset: 0
|
|
}, {
|
|
id: "Asia/Tokyo",
|
|
title: window.t("Tokyo"),
|
|
offset: 0
|
|
}, {
|
|
id: "Atlantic/Reykjavik",
|
|
title: window.t("Reykjavik"),
|
|
offset: 0
|
|
}, {
|
|
id: "Australia/Adelaide",
|
|
title: window.t("Adelaide"),
|
|
offset: 0
|
|
}, {
|
|
id: "Australia/Brisbane",
|
|
title: window.t("Brisbane"),
|
|
offset: 0
|
|
}, {
|
|
id: "Australia/Perth",
|
|
title: window.t("Perth"),
|
|
offset: 0
|
|
}, {
|
|
id: "Australia/Sydney",
|
|
title: window.t("Sydney"),
|
|
offset: 0
|
|
}, {
|
|
id: "Europe/Amsterdam",
|
|
title: window.t("Amsterdam"),
|
|
offset: 0
|
|
}, {
|
|
id: "Europe/Athens",
|
|
title: window.t("Athens"),
|
|
offset: 0
|
|
}, {
|
|
id: "Europe/Belgrade",
|
|
title: window.t("Belgrade"),
|
|
offset: 0
|
|
}, {
|
|
id: "Europe/Berlin",
|
|
title: window.t("Berlin"),
|
|
offset: 0
|
|
}, {
|
|
id: "Europe/Brussels",
|
|
title: window.t("Brussels"),
|
|
offset: 0
|
|
}, {
|
|
id: "Europe/Copenhagen",
|
|
title: window.t("Copenhagen"),
|
|
offset: 0
|
|
}, {
|
|
id: "Europe/Dublin",
|
|
title: window.t("Dublin"),
|
|
offset: 0
|
|
}, {
|
|
id: "Europe/Helsinki",
|
|
title: window.t("Helsinki"),
|
|
offset: 0
|
|
}, {
|
|
id: "Europe/Istanbul",
|
|
title: window.t("Istanbul"),
|
|
offset: 0
|
|
}, {
|
|
id: "Europe/Lisbon",
|
|
title: window.t("Lisbon"),
|
|
offset: 0
|
|
}, {
|
|
id: "Europe/London",
|
|
title: window.t("London"),
|
|
offset: 0
|
|
}, {
|
|
id: "Europe/Luxembourg",
|
|
title: window.t("Luxembourg"),
|
|
offset: 0
|
|
}, {
|
|
id: "Europe/Madrid",
|
|
title: window.t("Madrid"),
|
|
offset: 0
|
|
}, {
|
|
id: "Europe/Malta",
|
|
title: window.t("Malta"),
|
|
offset: 0
|
|
}, {
|
|
id: "Europe/Moscow",
|
|
title: window.t("Moscow"),
|
|
offset: 0
|
|
}, {
|
|
id: "Europe/Oslo",
|
|
title: window.t("Oslo"),
|
|
offset: 0
|
|
}, {
|
|
id: "Europe/Paris",
|
|
title: window.t("Paris"),
|
|
offset: 0
|
|
}, {
|
|
id: "Europe/Riga",
|
|
title: window.t("Riga"),
|
|
offset: 0
|
|
}, {
|
|
id: "Europe/Rome",
|
|
title: window.t("Rome"),
|
|
offset: 0
|
|
}, {
|
|
id: "Europe/Stockholm",
|
|
title: window.t("Stockholm"),
|
|
offset: 0
|
|
}, {
|
|
id: "Europe/Tallinn",
|
|
title: window.t("Tallinn"),
|
|
offset: 0
|
|
}, {
|
|
id: "Europe/Vilnius",
|
|
title: window.t("Vilnius"),
|
|
offset: 0
|
|
}, {
|
|
id: "Europe/Warsaw",
|
|
title: window.t("Warsaw"),
|
|
offset: 0
|
|
}, {
|
|
id: "Europe/Zurich",
|
|
title: window.t("Zurich"),
|
|
offset: 0
|
|
}, {
|
|
id: "Pacific/Auckland",
|
|
title: window.t("New Zealand"),
|
|
offset: 0
|
|
}, {
|
|
id: "Pacific/Chatham",
|
|
title: window.t("Chatham Islands"),
|
|
offset: 0
|
|
}, {
|
|
id: "Pacific/Fakaofo",
|
|
title: window.t("Tokelau"),
|
|
offset: 0
|
|
}, {
|
|
id: "Pacific/Honolulu",
|
|
title: window.t("Honolulu"),
|
|
offset: 0
|
|
}, {
|
|
id: "Pacific/Norfolk",
|
|
title: window.t("Norfolk Island"),
|
|
offset: 0
|
|
}];
|
|
for (const e of n) {
|
|
const t = Object(s.a)(e.id);
|
|
e.title = `(${t.string}) ${e.title}`, e.offset = t.offset
|
|
}
|
|
n.sort((e, t) => {
|
|
const i = e.offset - t.offset;
|
|
return 0 !== i ? i : e.title.localeCompare(t.title)
|
|
});
|
|
const o = r.concat(n);
|
|
|
|
function a(e) {
|
|
for (let t = 0; t < o.length; t++)
|
|
if (e === o[t].id) return !0;
|
|
return !1
|
|
}
|
|
|
|
function l(e) {
|
|
for (const t of o)
|
|
if (t.id === e) return t.title;
|
|
return e
|
|
}
|
|
},
|
|
"+DwS": function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return n
|
|
}));
|
|
var s = i("hY0g"),
|
|
r = i.n(s);
|
|
|
|
function n(e, t) {
|
|
const i = new r.a(e()),
|
|
s = {};
|
|
t.subscribe(s, () => {
|
|
i.setValue(e())
|
|
});
|
|
return i.readonly().spawn(() => t.unsubscribeAll(s))
|
|
}
|
|
},
|
|
"+FzY": function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return r
|
|
}));
|
|
var s = i("VymR");
|
|
|
|
function r(e, t) {
|
|
let i = "";
|
|
return s.a.parse(e, e => (i = s.a.base + ("svg" === t ? `svg/${e}.svg` : `72x72/${e}.png`),
|
|
!1)), i
|
|
}
|
|
},
|
|
"+GxX": function(e, t, i) {
|
|
"use strict";
|
|
var s = i("VVxS").TVLocalStorage,
|
|
r = i("aIyQ");
|
|
i("qFKp");
|
|
var n = new r;
|
|
TradingView.FeatureToggle = {
|
|
force_prefix: "forcefeaturetoggle.",
|
|
onChanged: new r,
|
|
enableFeature: function(e) {
|
|
s.setItem(this.force_prefix + e, "true"), n.fire(e)
|
|
},
|
|
disableFeature: function(e) {
|
|
s.setItem(this.force_prefix + e, "false"), n.fire(e)
|
|
},
|
|
resetFeature: function(e) {
|
|
s.removeItem(this.force_prefix + e), n.fire(e)
|
|
},
|
|
onFeaturesStateChanged: function() {
|
|
return n
|
|
}
|
|
},
|
|
TradingView.isFeatureEnabled = function(e) {
|
|
function t(e) {
|
|
try {
|
|
var t = (void 0)(e + function() {
|
|
if (window.user && window.user.id) return window.user.id;
|
|
var e = s.getItem("featuretoggle_seed");
|
|
return null !== e || (e = Math.floor(1e6 * Math.random()), s
|
|
.setItem("featuretoggle_seed", e)), e
|
|
}());
|
|
return new DataView(t).getUint32(0, !0) / 4294967296
|
|
} catch (e) {
|
|
return .5
|
|
}
|
|
}
|
|
return function(i) {
|
|
return !("local" !== window.environment || ! function(e) {
|
|
return -1 === ["broker_FXCM_token_v2", "broker_TRADESTATION_V3",
|
|
"broker_TRADOVATE_dev", "black_friday_mainpage",
|
|
"black_friday_popup", "datawindow",
|
|
"trading-fast-renew-oauth-token",
|
|
"switching_trial_year_to_month_disabled",
|
|
"switching_year_to_month_disabled",
|
|
"default_year_billing_cycle_switcher",
|
|
"marketing-analytics", "disable_obs_streaming",
|
|
"google-ads", "visible_address_fields_by_default",
|
|
"slow-support-warning", "hide-trading-floating-toolbar",
|
|
"tvcoins_donations", "save-short-streams",
|
|
"details_disable_bid_ask", "vat_disabled",
|
|
"pro_plan_upgrades_disabled",
|
|
"pro_plan_downgrades_disabled", "video-ideas-new-api",
|
|
"unit_conversion", "disable_recaptcha_on_signup",
|
|
"braintree-trial-implementation",
|
|
"braintree-gopro-in-order-dialog", "trial-weekly",
|
|
"braintree-apple-pay", "braintree-google-pay",
|
|
"braintree-apple-pay-trial", "braintree-google-pay-trial",
|
|
"hide_gopro_popup_upgrade_button", "yandex_metric_enabled",
|
|
"broker_id_session", "remove_line_tools_from_content",
|
|
"chart_storage_with_broker_name",
|
|
"autosave_line_tools_immediately",
|
|
"log_removing_line_tools_group",
|
|
"oanda-european-accounts-warning",
|
|
"mobile_show_bottom_panel", "disable_save_settings",
|
|
"enable_non_unique_watch_sections",
|
|
"desktop_version_notification_enabled", "paperrest_2fa",
|
|
"paperrest_preview", "favorites-in-broker-dropdown",
|
|
"streams_stats_profile", "hide_ecomonic_events",
|
|
"aggregating_page_pings", "hide_alert_counter",
|
|
"mobile_menu_alert_button",
|
|
"show_reverse_on_active_source_only", "mobile_trading_web",
|
|
"mobile_trading_ios", "mobile_trading_android",
|
|
"hide_real_brokers_on_mobile",
|
|
"percentage_values_for_percentage_scale",
|
|
"hide_historical_price_label", "hide_ranges_label_colors",
|
|
"new_align_trading_sources"
|
|
].indexOf(e) && -1 === e.indexOf("-maintenance") && !1 ===
|
|
/broker_[A-Z]+[a-zA-Z0-9_]+_dev/g.test(e)
|
|
}(i)) || (!e[i] || -1 !== e[i]) && (!!("true" === s.getItem(TradingView
|
|
.FeatureToggle.force_prefix + i) || window.is_authenticated &&
|
|
"undefined" != typeof user && user.settings && "true" === user
|
|
.settings[TradingView.FeatureToggle.force_prefix + i]) || !(
|
|
"false" === s.getItem(TradingView.FeatureToggle.force_prefix + i) ||
|
|
window.is_authenticated && "undefined" != typeof user && user
|
|
.settings && "false" === user.settings[TradingView.FeatureToggle
|
|
.force_prefix + i]) && (!!e[i] && (1 === e[i] || t(i) <= e[i])))
|
|
}
|
|
}(window.featureToggleState || {}), t.FeatureToggle = TradingView.FeatureToggle, t
|
|
.isFeatureEnabled = TradingView.isFeatureEnabled, t.onFeaturesStateChanged = TradingView
|
|
.FeatureToggle.onFeaturesStateChanged.bind(TradingView.FeatureToggle)
|
|
},
|
|
"+PIq": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("ocLq");
|
|
|
|
function r(e, t, i) {
|
|
const r = {
|
|
slope: NaN,
|
|
average: NaN,
|
|
intercept: NaN,
|
|
stdDev: NaN,
|
|
upDev: NaN,
|
|
downDev: NaN,
|
|
pearsons: NaN
|
|
};
|
|
return 0 === e.length || (function(e, t) {
|
|
let i = 0,
|
|
s = 0,
|
|
r = 0,
|
|
n = 0;
|
|
for (let t = 0; t < e.length; ++t) {
|
|
const o = e[t],
|
|
a = t + 1;
|
|
i += a, s += o, r += a * a, n += o * a
|
|
}
|
|
t.slope = (e.length * n - i * s) / (e.length * r - i * i), t.average = s / e
|
|
.length, t.intercept = t.average - t.slope * i / e.length + t.slope
|
|
}(e, r), function(e, t, i, r) {
|
|
let n = 0,
|
|
o = 0,
|
|
a = 0,
|
|
l = 0,
|
|
c = 0,
|
|
h = 0,
|
|
u = r.intercept;
|
|
const d = e.length - 1,
|
|
p = r.intercept + r.slope * d / 2;
|
|
for (let s = 0; s <= d; ++s) {
|
|
let d = t[s] - u;
|
|
d > n && (n = d), d = u - i[s], d > o && (o = d), d = e[s];
|
|
const _ = d - r.average,
|
|
m = u - p;
|
|
d -= u, a += d * d, l += _ * _, c += m * m, h += _ * m, u += r.slope
|
|
}
|
|
r.stdDev = Math.sqrt(a / (0 === d ? 1 : d)), r.pearsons = s.Std.isZero(l) || s
|
|
.Std.isZero(c) ? 0 : h / Math.sqrt(l * c), r.upDev = n, r.downDev = o
|
|
}(e, t, i, r)), r
|
|
}
|
|
i.d(t, "regressionTrendStudyItem", (function() {
|
|
return n
|
|
}));
|
|
const n = {
|
|
name: "Regression Trend",
|
|
metainfo: {
|
|
_metainfoVersion: 51,
|
|
description: "Regression Trend",
|
|
format: {
|
|
type: "inherit"
|
|
},
|
|
id: "RegressionTrend@tv-basicstudies-144",
|
|
is_hidden_study: !0,
|
|
is_price_study: !0,
|
|
shortDescription: "Reg Trend",
|
|
defaults: {
|
|
inputs: {
|
|
"first bar time": 0,
|
|
"last bar time": 0,
|
|
"lower diviation": -2,
|
|
source: "close",
|
|
"upper diviation": 2,
|
|
"use lower diviation": !0,
|
|
"use upper diviation": !0
|
|
}
|
|
},
|
|
inputs: [{
|
|
defval: 2,
|
|
id: "upper diviation",
|
|
max: 500,
|
|
min: -500,
|
|
name: "Upper Deviation",
|
|
type: "float"
|
|
}, {
|
|
defval: -2,
|
|
id: "lower diviation",
|
|
max: 500,
|
|
min: -500,
|
|
name: "Lower Deviation",
|
|
type: "float"
|
|
}, {
|
|
defval: !0,
|
|
id: "use upper diviation",
|
|
name: "Use Upper Deviation",
|
|
type: "bool"
|
|
}, {
|
|
defval: !0,
|
|
id: "use lower diviation",
|
|
name: "Use Lower Deviation",
|
|
type: "bool"
|
|
}, {
|
|
defval: 0,
|
|
id: "first bar time",
|
|
isHidden: !0,
|
|
max: 253370764800,
|
|
min: -253370764800,
|
|
name: "First bar time",
|
|
type: "time"
|
|
}, {
|
|
defval: 0,
|
|
id: "last bar time",
|
|
isHidden: !0,
|
|
max: 253370764800,
|
|
min: -253370764800,
|
|
name: "Last bar time",
|
|
type: "time"
|
|
}, {
|
|
defval: "close",
|
|
id: "source",
|
|
name: "Source",
|
|
options: ["open", "high", "low", "close", "hl2", "hlc3", "ohlc4"],
|
|
type: "source"
|
|
}],
|
|
plots: []
|
|
},
|
|
constructor: class {
|
|
constructor() {
|
|
this._resultSent = !1
|
|
}
|
|
init(e, t) {
|
|
this._resultSent = !1, this._data = {
|
|
baseLine: {
|
|
startPrice: NaN,
|
|
endPrice: NaN
|
|
},
|
|
upLine: {
|
|
startPrice: NaN,
|
|
endPrice: NaN
|
|
},
|
|
downLine: {
|
|
startPrice: NaN,
|
|
endPrice: NaN
|
|
},
|
|
pearsons: NaN,
|
|
startIndex__t: NaN,
|
|
endIndex__t: NaN
|
|
}
|
|
}
|
|
main(e, t) {
|
|
const i = t(6),
|
|
n = e.new_unlimited_var(s.Std.time(e)),
|
|
o = e.new_unlimited_var(s.Std.high(e)),
|
|
a = e.new_unlimited_var(s.Std.low(e)),
|
|
l = e.new_unlimited_var(s.Std[i](e));
|
|
if (!e.symbol.isLastBar) return null;
|
|
if (this._resultSent) return null;
|
|
const c = t(0),
|
|
h = t(1),
|
|
u = t(2),
|
|
d = t(3),
|
|
p = t(4),
|
|
_ = t(5),
|
|
m = n.indexOf(p),
|
|
f = n.indexOf(_),
|
|
g = [],
|
|
b = [],
|
|
v = [],
|
|
S = [];
|
|
for (let e = m; e >= f; --e) g.push(n.get(e)), b.push(o.get(e)), v.push(
|
|
a.get(e)), S.push(l.get(e));
|
|
return this._updateData(g, u, c, d, h, p, _, r(S, b, v)), this
|
|
._resultSent = !0, {
|
|
type: "non_series_data",
|
|
nonseries: !0,
|
|
data: {
|
|
data: this._data
|
|
}
|
|
}
|
|
}
|
|
_updateData(e, t, i, s, r, n, o, a) {
|
|
const l = e.length - 1;
|
|
this._data.baseLine.startPrice = a.intercept, this._data.baseLine
|
|
.endPrice = a.intercept + a.slope * l;
|
|
const c = a.intercept + (t ? a.stdDev * i : a.upDev);
|
|
this._data.upLine.startPrice = c, this._data.upLine.endPrice = c + a
|
|
.slope * l;
|
|
const h = a.intercept + (s ? a.stdDev * r : -a.downDev);
|
|
this._data.downLine.startPrice = h, this._data.downLine.endPrice = h + a
|
|
.slope * l, this._data.pearsons = a.pearsons, this._data
|
|
.startIndex__t = n, this._data.endIndex__t = o
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"+Qfv": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("Eyy1"),
|
|
r = i("O+9b"),
|
|
n = i("ocLq"),
|
|
o = i("23IT"),
|
|
a = i("KG+6"),
|
|
l = i("LxhU"),
|
|
c = i("8LSp"),
|
|
h = i("iu9X"),
|
|
u = i("c7G1"),
|
|
d = i("WYmP"),
|
|
p = i("hXqA"),
|
|
_ = i("WTyR"),
|
|
m = i("972a"),
|
|
f = i("aR4w");
|
|
class g extends f.a {
|
|
constructor(e, t, i, s, r, n, o, a, l, c, h, u) {
|
|
super(e, t, i, n, o, a, !1, l, c, () => h, u, s, r, !1), this._firstBarTime = s,
|
|
this._lastBarTime = r
|
|
}
|
|
update(e) {
|
|
this._supplyRowsLayout(this._ctx), this.timeInRequestedRange(e) && super.update(
|
|
e)
|
|
}
|
|
timeInRequestedRange(e) {
|
|
const t = this._timeScale().get(e);
|
|
return this._firstBarTime <= t && t < this._lastBarTime
|
|
}
|
|
}
|
|
var b = i("rWtV");
|
|
i.d(t, "VolumeProfileFixedRange", (function() {
|
|
return v
|
|
})), i.d(t, "volumeProfileFixedRangeVbPStudyItem", (function() {
|
|
return y
|
|
})), i.d(t, "volumeProfileFixedRangeBSStudyItem", (function() {
|
|
return w
|
|
}));
|
|
class v extends r.a {
|
|
constructor() {
|
|
super(...arguments), this._rowsLayout = "Number Of Rows", this._rowSize = 24,
|
|
this._volume = "Up/Down", this._firstBarTime = 0, this._lastBarTime = 0,
|
|
this._vaVolumePercent = 70, this._anInt = 0, this._eraseCmds = []
|
|
}
|
|
nextGraphicsObjId() {
|
|
return ++this._anInt
|
|
}
|
|
pushEraseObjCmd(e, t) {
|
|
this._eraseCmds.push(new u.b(e, t))
|
|
}
|
|
popEraseCmds() {
|
|
const e = this._eraseCmds;
|
|
return this._eraseCmds = [], e
|
|
}
|
|
init(e, t) {
|
|
this._studyDataUpdate = new p.a(!0), this._hists = new c.a, this._boxPolygons =
|
|
new d.a, this._pocLines = new d.a, this._valueAreaHists = new c.a;
|
|
const i = new h.b;
|
|
i.getObjsContainer("hhists").push(new h.a("histBars2", this._hists)), i
|
|
.getObjsContainer("hhists").push(new h.a("histBarsVA", this
|
|
._valueAreaHists)), i.getObjsContainer("horizlines").push(new h.a(
|
|
"pocLines", this._pocLines)), i.getObjsContainer("polygons").push(new h
|
|
.a("histBoxBg", this._boxPolygons)), this._studyDataUpdate.init(i), this
|
|
._rowsLayout = t(0), this._rowSize = t(1), this._volume = t(2), this
|
|
._firstBarTime = t(3), this._lastBarTime = t(4), this._vaVolumePercent = t(
|
|
5), this.verifyRowSizeInput(this._rowSize, this._rowsLayout), this
|
|
._originalResolution = l.Interval.parse(e.symbol.interval + e.symbol
|
|
.resolution);
|
|
const n = this._lastBarTime + this._originalResolution.inMilliseconds(this
|
|
._lastBarTime);
|
|
0 === this._firstBarTime && 0 === this._lastBarTime ? this._basicResolution =
|
|
this._originalResolution : this._basicResolution = this
|
|
.findBasicResolutionForFromTo(this._originalResolution, this._firstBarTime,
|
|
n, Object(s.ensureDefined)(e.symbol.info)), this._hasSecondarySymbol = !
|
|
this._originalResolution.isEqualTo(this._basicResolution), this
|
|
._hasSecondarySymbol && e.new_sym(e.symbol.tickerid, this._basicResolution
|
|
.value());
|
|
const o = this._getRowsLayout(this._rowsLayout, this._rowSize);
|
|
this._vbPCheckHaveVolumeExpr = new _.a(this), this._volumeByPriceExpr = new g(
|
|
Object(r.c)(this._volume), e, this, this._firstBarTime, n, this._hists,
|
|
this._boxPolygons, this._pocLines, this._valueAreaHists, this
|
|
._vaVolumePercent, o, Object(r.b)()), this._volumeByPriceExpr
|
|
.setIdsGeneratorProxy(this), this._developingPocSeries = new b.a, this
|
|
._developingVAHighSeries = new b.a, this._developingVALowSeries = new b.a
|
|
}
|
|
main(e, t, i) {
|
|
this._hasSecondarySymbol && e.select_sym(1), this._timeSeries = e
|
|
.new_unlimited_var(), this._openSeries = e.new_unlimited_var(), this
|
|
._highSeries = e.new_unlimited_var(), this._lowSeries = e
|
|
.new_unlimited_var(), this._closeSeries = e.new_unlimited_var(),
|
|
this._volumeSeries = e.new_unlimited_var();
|
|
const r = {
|
|
type: "composite",
|
|
data: []
|
|
};
|
|
if (i && i.period === this._basicResolution.value() && (this._timeSeries.set(n
|
|
.Std.time(e)), this._openSeries.set(n.Std.open(e)), this._highSeries
|
|
.set(n.Std.high(e)), this._lowSeries.set(n.Std.low(e)), this
|
|
._closeSeries.set(n.Std.close(e)), this._volumeSeries.set(n.Std.volume(
|
|
e)), this._developingPocSeries.addHist(n.Std.time(e)), this
|
|
._developingVAHighSeries.addHist(n.Std.time(e)), this
|
|
._developingVALowSeries.addHist(n.Std.time(e)), this
|
|
._vbPCheckHaveVolumeExpr.update(0, e.symbol.isLastBar), this
|
|
._volumeByPriceExpr.update(0), this._developingPocSeries
|
|
.removeLastIfNaN(), this._developingVAHighSeries.removeLastIfNaN(), this
|
|
._developingVALowSeries.removeLastIfNaN(), e.symbol.isLastBar)) {
|
|
this._studyDataUpdate.setEraseCmds(this.popEraseCmds()), this
|
|
._studyDataUpdate.update();
|
|
const e = this._studyDataUpdate.getUpdate();
|
|
e.json && r.data.push({
|
|
nonseries: !0,
|
|
type: "study_graphics",
|
|
data: e.json
|
|
}), e.jsonUpdate && r.data.push({
|
|
nonseries: !0,
|
|
type: "study_graphics",
|
|
data: e.jsonUpdate
|
|
})
|
|
}
|
|
if (this._hasSecondarySymbol && e.select_sym(0), i && i.period === this
|
|
._originalResolution.value()) {
|
|
Object(s.assert)(e.symbol.time === i.time);
|
|
const t = i.time,
|
|
n = t + this._originalResolution.inMilliseconds(t) - 1;
|
|
if (t && t >= this._firstBarTime) {
|
|
const e = this._developingPocSeries.getLeftOrEqual(n),
|
|
t = this._developingVAHighSeries.getLeftOrEqual(n),
|
|
i = this._developingVALowSeries.getLeftOrEqual(n);
|
|
r.data.push([e, t, i])
|
|
} else r.data.push([NaN, NaN, NaN])
|
|
}
|
|
return r
|
|
}
|
|
time() {
|
|
return this._timeSeries
|
|
}
|
|
open() {
|
|
return this._openSeries
|
|
}
|
|
high() {
|
|
return this._highSeries
|
|
}
|
|
low() {
|
|
return this._lowSeries
|
|
}
|
|
close() {
|
|
return this._closeSeries
|
|
}
|
|
volume() {
|
|
return this._volumeSeries
|
|
}
|
|
developingPoc() {
|
|
return this._developingPocSeries
|
|
}
|
|
developingVAHigh() {
|
|
return this._developingVAHighSeries
|
|
}
|
|
developingVALow() {
|
|
return this._developingVALowSeries
|
|
}
|
|
}
|
|
|
|
function S(e) {
|
|
return {
|
|
constructor: v,
|
|
name: e.description,
|
|
metainfo: {
|
|
_metainfoVersion: 51,
|
|
shortDescription: "VPFR",
|
|
format: {
|
|
type: "volume"
|
|
},
|
|
is_price_study: !0,
|
|
defaults: {
|
|
graphics: {
|
|
hhists: {
|
|
histBars2: {
|
|
colors: ["#1592e6", "#fbc123"],
|
|
direction: a.a.LeftToRight,
|
|
percentWidth: 30,
|
|
showValues: !1,
|
|
transparencies: [76, 76],
|
|
valuesColor: "#424242",
|
|
visible: !0
|
|
},
|
|
histBarsVA: {
|
|
colors: ["#1592e6", "#fbc123"],
|
|
direction: a.a.LeftToRight,
|
|
percentWidth: 30,
|
|
showValues: !1,
|
|
transparencies: [30, 30],
|
|
valuesColor: "#424242",
|
|
visible: !0
|
|
}
|
|
},
|
|
horizlines: {
|
|
pocLines: {
|
|
color: "#ff0000",
|
|
style: m.b.Solid,
|
|
visible: !0,
|
|
width: 2
|
|
}
|
|
},
|
|
polygons: {
|
|
histBoxBg: {
|
|
color: "#37a6ef",
|
|
transparency: 94
|
|
}
|
|
}
|
|
},
|
|
inputs: {
|
|
first_bar_time: 0,
|
|
last_bar_time: 0,
|
|
rows: 24,
|
|
rowsLayout: "Number Of Rows",
|
|
subscribeRealtime: !0,
|
|
vaVolume: 70,
|
|
volume: "Up/Down"
|
|
},
|
|
styles: {
|
|
developingPoc: {
|
|
color: "#ff0000",
|
|
linestyle: m.b.Solid,
|
|
linewidth: 1,
|
|
plottype: o.LineStudyPlotStyle.StepLine,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !1
|
|
},
|
|
developingVAHigh: {
|
|
color: "#0000ff",
|
|
linestyle: m.b.Solid,
|
|
linewidth: 1,
|
|
plottype: o.LineStudyPlotStyle.StepLine,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !1
|
|
},
|
|
developingVALow: {
|
|
color: "#0000ff",
|
|
linestyle: m.b.Solid,
|
|
linewidth: 1,
|
|
plottype: o.LineStudyPlotStyle.StepLine,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !1
|
|
}
|
|
}
|
|
},
|
|
graphics: {
|
|
hhists: {
|
|
histBars2: {
|
|
location: a.b.Absolute,
|
|
title: "Volume Profile",
|
|
titles: ["Up Volume", "Down Volume"]
|
|
},
|
|
histBarsVA: {
|
|
location: a.b.Absolute,
|
|
title: "Value Area",
|
|
titles: ["Value Area Up", "Value Area Down"]
|
|
}
|
|
},
|
|
horizlines: {
|
|
pocLines: {
|
|
name: "POC",
|
|
showPrice: !0
|
|
}
|
|
},
|
|
polygons: {
|
|
histBoxBg: {
|
|
mouseTouchable: !1,
|
|
name: "Histogram Box",
|
|
showBorder: !1
|
|
}
|
|
}
|
|
},
|
|
inputs: [{
|
|
defval: "Number Of Rows",
|
|
id: "rowsLayout",
|
|
name: "Rows Layout",
|
|
options: ["Number Of Rows", "Ticks Per Row"],
|
|
type: "text"
|
|
}, {
|
|
defval: 24,
|
|
id: "rows",
|
|
max: 1e6,
|
|
min: 1,
|
|
name: "Row Size",
|
|
type: "integer"
|
|
}, {
|
|
defval: "Up/Down",
|
|
id: "volume",
|
|
name: "Volume",
|
|
options: ["Up/Down", "Total"],
|
|
type: "text"
|
|
}, {
|
|
defval: 0,
|
|
id: "first_bar_time",
|
|
isHidden: !0,
|
|
max: 253370764800,
|
|
min: -253370764800,
|
|
name: "First Bar Time",
|
|
type: "time"
|
|
}, {
|
|
defval: 0,
|
|
id: "last_bar_time",
|
|
isHidden: !0,
|
|
max: 253370764800,
|
|
min: -253370764800,
|
|
name: "Last Bar Time",
|
|
type: "time"
|
|
}, {
|
|
defval: 70,
|
|
id: "vaVolume",
|
|
max: 100,
|
|
min: 0,
|
|
name: "Value Area Volume",
|
|
type: "integer"
|
|
}, {
|
|
defval: !0,
|
|
id: "subscribeRealtime",
|
|
isHidden: !0,
|
|
name: "SubscribeRealtime",
|
|
type: "bool"
|
|
}],
|
|
plots: [{
|
|
id: "developingPoc",
|
|
type: "line"
|
|
}, {
|
|
id: "developingVAHigh",
|
|
type: "line"
|
|
}, {
|
|
id: "developingVALow",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
developingPoc: {
|
|
histogramBase: 0,
|
|
title: "Developing Poc"
|
|
},
|
|
developingVAHigh: {
|
|
histogramBase: 0,
|
|
title: "Developing VA High"
|
|
},
|
|
developingVALow: {
|
|
histogramBase: 0,
|
|
title: "Developing VA Low"
|
|
}
|
|
},
|
|
...e
|
|
}
|
|
}
|
|
}
|
|
const y = S({
|
|
id: "VbPFixed@tv-volumebyprice-57",
|
|
description: "Volume Profile Fixed Range"
|
|
}),
|
|
w = S({
|
|
id: "VbPFixed@tv-basicstudies-152",
|
|
description: "Fixed Range",
|
|
is_hidden_study: !0
|
|
})
|
|
},
|
|
"+cnz": function(e, t) {
|
|
e.exports =
|
|
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 7 5" width="7" height="5" fill="none"><path stroke="currentColor" stroke-width="1.2" d="M1 1.5l2.5 2 2.5-2"/></svg>'
|
|
},
|
|
"+hLl": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineToolBrush", (function() {
|
|
return o
|
|
}));
|
|
var s = i("Ocx9"),
|
|
r = i("DVnF"),
|
|
n = i("j3hX");
|
|
class o extends r.a {
|
|
constructor(e, t) {
|
|
super(e, t || o.createProperties()), this._loadPaneViews(e)
|
|
}
|
|
properties() {
|
|
return super.properties()
|
|
}
|
|
smooth() {
|
|
return this.properties().childs().smooth.value()
|
|
}
|
|
name() {
|
|
return "Brush"
|
|
}
|
|
hasEditableCoordinates() {
|
|
return !1
|
|
}
|
|
static createProperties(e) {
|
|
const t = new s.DefaultProperty("linetoolbrush", e);
|
|
return o._configureProperties(t), t
|
|
}
|
|
_loadPaneViews(e) {
|
|
i.e("lt-pane-views").then(i.bind(null, "00XE")).then(t => {
|
|
this._setPaneViews([new t.BrushPaneView(this, e)])
|
|
})
|
|
}
|
|
_getPropertyDefinitionsViewModelClass() {
|
|
return Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "ZSes")).then(
|
|
e => e.BrushDefinitionsViewModel)
|
|
}
|
|
static _configureProperties(e) {
|
|
r.a._configureProperties(e), e.addChild("backgroundsColors", new n
|
|
.LineToolColorsProperty([e.childs().backgroundColor], e.childs()
|
|
.fillBackground))
|
|
}
|
|
}
|
|
},
|
|
"+jnJ": function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return a
|
|
}));
|
|
i("YFKU");
|
|
var s = i("8+VR"),
|
|
r = i("m/cY"),
|
|
n = i("Vdly");
|
|
|
|
function o(e) {
|
|
return "alwaysOn" === e || "alwaysOff" === e ? e : "visibleOnMouseOver"
|
|
}
|
|
|
|
function a(e, t) {
|
|
let i, a;
|
|
|
|
function l() {
|
|
if (!i) {
|
|
i = Object(r.a)();
|
|
let s = n.getValue(e);
|
|
void 0 === s && void 0 !== t && (s = n.getValue(t)), i.setValue(o(s)), i.subscribe(
|
|
i, t => {
|
|
n.setValue(e, o(t.value()))
|
|
})
|
|
}
|
|
return i
|
|
}
|
|
return {
|
|
property: l,
|
|
availableValues: function() {
|
|
return [{
|
|
id: "visibleOnMouseOver",
|
|
value: "visibleOnMouseOver",
|
|
title: window.t("Visible on Mouse Over")
|
|
}, {
|
|
id: "alwaysOn",
|
|
value: "alwaysOn",
|
|
title: window.t("Always Visible")
|
|
}, {
|
|
id: "alwaysOff",
|
|
value: "alwaysOff",
|
|
title: window.t("Always Invisible")
|
|
}]
|
|
},
|
|
actualBehavior: function() {
|
|
if (!a) {
|
|
a = Object(r.a)();
|
|
const e = l(),
|
|
t = () => {
|
|
let t = e.value();
|
|
"alwaysOn" !== t && "alwaysOff" !== t && (t = s.mobiletouch ?
|
|
"alwaysOn" : "visibleOnMouseOver"), a && a.setValue(t)
|
|
};
|
|
e.subscribe(a, t), t()
|
|
}
|
|
return a
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/+9u": function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return r
|
|
}));
|
|
var s = i("jCNj");
|
|
|
|
function r(e, t = Date.now()) {
|
|
const i = Object(s.get_timezone)(e).offset_utc(t);
|
|
let r = "";
|
|
const n = i / 1e3 / 60 / 60;
|
|
n % 1 && (r = ":" + n % 1 * 60);
|
|
let o = "";
|
|
return o = n > 0 ? "+" + (n - n % 1) + r : 0 === n ? "" : String(n - n % 1 + r), {
|
|
offset: i,
|
|
string: "UTC" + o
|
|
}
|
|
}
|
|
},
|
|
"//lZ": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "doAnimate", (function() {
|
|
return n
|
|
}));
|
|
const s = {
|
|
from: 0,
|
|
duration: 250,
|
|
easing: i("9uLv").c.easeOutCubic
|
|
};
|
|
class r {
|
|
constructor(e) {
|
|
this._doing = !0, this._completed = !1, this._options = {
|
|
...s,
|
|
...e
|
|
};
|
|
const t = performance.now();
|
|
window.requestAnimationFrame(e => {
|
|
this._animation(t, this._options.from, e)
|
|
})
|
|
}
|
|
stop() {
|
|
this._doing = !1
|
|
}
|
|
completed() {
|
|
return this._completed
|
|
}
|
|
_animation(e, t, i) {
|
|
if (!this._doing) return void this._finishAnimation();
|
|
const s = (i = !i || i < 1e12 ? performance.now() : i) - e,
|
|
r = s >= this._options.duration || t === this._options.to,
|
|
n = (o = this._options.from, a = this._options.to, l = this._options.easing(s /
|
|
this._options.duration), o * (1 - l) + a * l);
|
|
var o, a, l;
|
|
const c = r ? this._options.to : n,
|
|
h = c - t;
|
|
this._options.onStep(h, c), r ? this._finishAnimation() : window
|
|
.requestAnimationFrame(t => {
|
|
this._animation(e, c, t)
|
|
})
|
|
}
|
|
_finishAnimation() {
|
|
this._options.onComplete && this._options.onComplete(), this._completed = !0
|
|
}
|
|
}
|
|
|
|
function n(e) {
|
|
return new r(e)
|
|
}
|
|
},
|
|
"//lt": function(e, t, i) {
|
|
"use strict";
|
|
var s;
|
|
i.r(t), i.d(t, "PaneCursorType", (function() {
|
|
return s
|
|
})),
|
|
function(e) {
|
|
e[e.Default = 0] = "Default", e[e.Pointer = 1] = "Pointer", e[e.Eraser = 2] = "Eraser",
|
|
e[e.Dot = 3] = "Dot", e[e.Grabbing = 4] = "Grabbing", e[e.ZoomIn = 5] = "ZoomIn", e[
|
|
e.VerticalResize = 6] = "VerticalResize", e[e.HorizontalResize = 7] =
|
|
"HorizontalResize", e[e.DiagonalNeSwResize = 8] = "DiagonalNeSwResize", e[e
|
|
.DiagonalNwSeResize = 9] = "DiagonalNwSeResize"
|
|
}(s || (s = {}))
|
|
},
|
|
"/3z9": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "isMacKeyboard", (function() {
|
|
return r
|
|
})), i.d(t, "Modifiers", (function() {
|
|
return n
|
|
})), i.d(t, "modifiersFromEvent", (function() {
|
|
return o
|
|
})), i.d(t, "hashFromEvent", (function() {
|
|
return a
|
|
})), i.d(t, "humanReadableModifiers", (function() {
|
|
return l
|
|
})), i.d(t, "humanReadableHash", (function() {
|
|
return h
|
|
}));
|
|
var s = i("qFKp");
|
|
const r = Object(s.isMac)() || s.CheckMobile.iOS();
|
|
var n;
|
|
|
|
function o(e) {
|
|
let t = 0;
|
|
return e.shiftKey && (t += 1024), e.altKey && (t += 512), e.ctrlKey && (t += 256), e
|
|
.metaKey && (t += 2048), t
|
|
}
|
|
|
|
function a(e) {
|
|
return o(e) | e.keyCode
|
|
}
|
|
|
|
function l(e) {
|
|
let t = "";
|
|
return 256 & e && (t += r ? "^" : "Ctrl + "), 512 & e && (t += r ? "⌥" : "Alt + "), 1024 &
|
|
e && (t += r ? "⇧" : "Shift + "), 2048 & e && (t += r ? "⌘" : "Win + "), t
|
|
}! function(e) {
|
|
e[e.None = 0] = "None", e[e.Alt = 512] = "Alt", e[e.Shift = 1024] = "Shift", e[e.Mod = r ?
|
|
2048 : 256] = "Mod", e[e.Control = 256] = "Control", e[e.Meta = 2048] = "Meta"
|
|
}(n || (n = {}));
|
|
const c = {
|
|
9: "⇥",
|
|
13: "↵",
|
|
27: "Esc",
|
|
8: r ? "⌫" : "Backspace",
|
|
32: "Space",
|
|
35: "End",
|
|
36: "Home",
|
|
37: "←",
|
|
38: "↑",
|
|
39: "→",
|
|
40: "↓",
|
|
45: "Ins",
|
|
46: "Del",
|
|
188: ",",
|
|
191: "/"
|
|
};
|
|
for (let e = 1; e <= 16; e++) c[e + 111] = "F" + e;
|
|
|
|
function h(e) {
|
|
let t = l(e);
|
|
const i = 255 & e;
|
|
return t += i in c ? c[i] : String.fromCharCode(i), t
|
|
}
|
|
},
|
|
"/5ju": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("Kxc7"),
|
|
r = i("hY0g"),
|
|
n = i.n(r),
|
|
o = i("FQhm"),
|
|
a = i("htUT"),
|
|
l = i("/z0S"),
|
|
c = i("YFKU");
|
|
i("HbRj"), i("+GxX");
|
|
i("zUrt");
|
|
async function h() {
|
|
return !0
|
|
}
|
|
var u = i("fZEr");
|
|
class d {
|
|
constructor(e, t) {
|
|
this._visibility = new n.a(!1), this._chartWidgetCollection = e, this._doSave = t
|
|
}
|
|
hide() {
|
|
var e;
|
|
null === (e = this._hide) || void 0 === e || e.call(this), this._visibility
|
|
.setValue(!1)
|
|
}
|
|
visible() {
|
|
return this._visibility.readonly()
|
|
}
|
|
}
|
|
class p extends d {
|
|
cloneChart() {
|
|
this._cloneChart().then(() => this._visibility.setValue(!0))
|
|
}
|
|
show() {
|
|
Object(l.a)(this.cloneChart.bind(this), {
|
|
source: "Clone chart"
|
|
})
|
|
}
|
|
async _cloneChart() {
|
|
const e = this._chartWidgetCollection,
|
|
t = await h(),
|
|
i = e.metaInfo.name.value();
|
|
t && (this._hide = await Object(u.showRename)({
|
|
title: Object(c.t)("Copy Chart Layout"),
|
|
text: Object(c.t)("Enter a new chart layout name") + ":",
|
|
maxLength: 64,
|
|
initValue: Object(c.t)("{title} copy", {
|
|
context: "ex: AAPL chart copy"
|
|
}).format({
|
|
title: e.metaInfo.name.value()
|
|
}),
|
|
onRename: ({
|
|
newValue: t,
|
|
dialogClose: r
|
|
}) => {
|
|
s.enabled("saveload_storage_customization") && (e.metaInfo
|
|
.uid.deleteValue(), e.metaInfo.id.deleteValue(), e
|
|
.metaInfo.name.setValue(t), this._doSave(void 0,
|
|
void 0, () => {
|
|
e.metaInfo.name.setValue(i)
|
|
})), r()
|
|
},
|
|
onClose: () => this._visibility.setValue(!1)
|
|
}))
|
|
}
|
|
}
|
|
class _ extends d {
|
|
show(e, t, i) {
|
|
this._saveNewChart(e, t, i).then(() => this._visibility.setValue(!0))
|
|
}
|
|
async _saveNewChart(e, t, i) {
|
|
const s = this._chartWidgetCollection,
|
|
r = s.metaInfo.name.value();
|
|
await h() && (this._hide = await Object(u.showRename)({
|
|
title: Object(c.t)("Save New Chart Layout"),
|
|
text: Object(c.t)("Enter a new chart layout name") + ":",
|
|
maxLength: 64,
|
|
initValue: r,
|
|
onRename: ({
|
|
newValue: n,
|
|
dialogClose: o
|
|
}) => {
|
|
s.metaInfo.name.setValue(n), this._doSave(e, t, () => {
|
|
s.metaInfo.name.setValue(r), null == i || i()
|
|
}), o()
|
|
},
|
|
onClose: () => this._visibility.setValue(!1)
|
|
}))
|
|
}
|
|
}
|
|
class m extends d {
|
|
show() {
|
|
this._renameChart(), this._visibility.setValue(!0)
|
|
}
|
|
_renameChart() {
|
|
Object(l.a)(async () => {
|
|
const e = this._chartWidgetCollection,
|
|
t = e.metaInfo.name.value();
|
|
this._hide = await Object(u.showRename)({
|
|
title: Object(c.t)("Rename Chart Layout"),
|
|
text: Object(c.t)("Enter a new chart layout name") +
|
|
":",
|
|
maxLength: 64,
|
|
initValue: t,
|
|
onRename: ({
|
|
newValue: i,
|
|
dialogClose: s
|
|
}) => {
|
|
e.metaInfo.name.setValue(i), this._doSave(
|
|
void 0, void 0, () => {
|
|
e.metaInfo.name.setValue(t)
|
|
}), s()
|
|
},
|
|
onClose: () => this._visibility.setValue(!1)
|
|
})
|
|
}, {
|
|
source: "Rename chart"
|
|
})
|
|
}
|
|
}
|
|
i.d(t, "SaveChartService", (function() {
|
|
return f
|
|
}));
|
|
class f {
|
|
constructor(e, t) {
|
|
this._autosaveTimer = null, this._watchedAutoSaveEnabled = new n.a, this
|
|
._toggleAutoSaveEnabledHandler = this._toggleAutoSaveEnabled.bind(this), this
|
|
._doSave = (e, t, i, s) => {
|
|
const r = this._chartWidgetCollection;
|
|
void 0 !== e && e(), this._chartSaver.saveChartSilently(e => {
|
|
var i;
|
|
i = r.metaInfo.uid.value(), "/chart/" === location.pathname && (
|
|
location.href = "/chart/" + i), void 0 !== t && t(e)
|
|
}, () => {
|
|
void 0 !== i && i()
|
|
}, {
|
|
autoSave: Boolean(s)
|
|
})
|
|
}, this._chartWidgetCollection = e, this._chartSaver = t, this
|
|
._createController = new _(e, this._doSave),
|
|
this._renameController = new m(e, this._doSave), this._saveAsController = new p(
|
|
e, this._doSave), this._chartChangesWatcher = new a.ChartChangesWatcher(e
|
|
.undoHistory, t, o), e.saveKeysPressed().subscribe(this, this
|
|
.saveChartOrShowTitleDialog), this._chartChangesWatcher.getOnChange()
|
|
.subscribe(this, this._onStateChanged)
|
|
}
|
|
autoSaveEnabled() {
|
|
return this._watchedAutoSaveEnabled
|
|
}
|
|
destroy() {
|
|
0
|
|
}
|
|
getCreateController() {
|
|
return this._createController
|
|
}
|
|
getRenameController() {
|
|
return this._renameController
|
|
}
|
|
getSaveAsController() {
|
|
return this._saveAsController
|
|
}
|
|
cloneChart() {
|
|
this._saveAsController.cloneChart()
|
|
}
|
|
saveChartAs() {
|
|
this._saveAsController.show()
|
|
}
|
|
renameChart() {
|
|
this._renameController.show()
|
|
}
|
|
saveNewChart(e, t, i) {
|
|
this._createController.show(e, t, i)
|
|
}
|
|
saveExistentChart(e, t, i) {
|
|
this._doSave(e, t, i)
|
|
}
|
|
hasChanges() {
|
|
return this._chartChangesWatcher.hasChanges()
|
|
}
|
|
saveChartOrShowTitleDialog(e, t, i) {
|
|
const s = window.saver.isSaveInProcess(),
|
|
r = this._chartChangesWatcher.hasChanges(),
|
|
n = !!this._chartWidgetCollection.metaInfo.id.value();
|
|
window.is_authenticated && (s || !r && n) || Object(l.a)(() => {
|
|
null != this._chartWidgetCollection.metaInfo.id.value() ? this
|
|
.saveExistentChart(e, t, i) : this.saveNewChart(e, t, i)
|
|
}, {
|
|
source: "Save chart",
|
|
sourceMeta: "Chart"
|
|
})
|
|
}
|
|
whenReadyToSave(e) {
|
|
this._chartSaver.whenReadyToSave(e)
|
|
}
|
|
saveToJSON() {
|
|
return this._chartSaver.saveToJSON()
|
|
}
|
|
saveChartSilently(e, t, i) {
|
|
this._chartSaver.saveChartSilently(e, t, i)
|
|
}
|
|
setAutoSaveEnabled(e) {
|
|
window.is_authenticated && window.saver.isSaveInProcess() || Object(l.a)(() => {
|
|
this._watchedAutoSaveEnabled.setValue(e)
|
|
}, {
|
|
source: "AutoSave chart"
|
|
})
|
|
}
|
|
saveChartLineTools(e, t) {
|
|
return this._chartSaver.saveChartLineTools(e, t)
|
|
}
|
|
_autoSaveEnabledSettingHandler(e) {
|
|
0
|
|
}
|
|
_toggleAutoSaveEnabled(e) {
|
|
0
|
|
}
|
|
_enableAutoSave() {
|
|
0
|
|
}
|
|
_disableAutoSave() {
|
|
0
|
|
}
|
|
_onStateChanged(e) {
|
|
e ? this._startAutosave() : this._stopAutosave()
|
|
}
|
|
_startAutosave() {
|
|
s.enabled("charts_auto_save") && null === this._autosaveTimer && (this
|
|
._autosaveTimer = setTimeout(() => {
|
|
this._autosaveTimer = null, this._chartWidgetCollection.metaInfo.id
|
|
.value() && this._doSave(void 0, void 0, void 0, !0)
|
|
}, 6e4))
|
|
}
|
|
_stopAutosave() {
|
|
null !== this._autosaveTimer && (clearInterval(this._autosaveTimer), this
|
|
._autosaveTimer = null)
|
|
}
|
|
}
|
|
},
|
|
"/DW5": function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "b", (function() {
|
|
return r
|
|
})), i.d(t, "a", (function() {
|
|
return n
|
|
}));
|
|
var s = i("CLNU");
|
|
|
|
function r(e) {
|
|
return Object(s.clean)(JSON.stringify(e))
|
|
}
|
|
|
|
function n(e) {
|
|
return JSON.parse(Object(s.clean)(e, !0))
|
|
}
|
|
},
|
|
"/DxK": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineToolHorzLine", (function() {
|
|
return l
|
|
}));
|
|
var s = i("tc+8"),
|
|
r = i.n(s),
|
|
n = i("Ocx9"),
|
|
o = i("Ss5c"),
|
|
a = i("p1SQ");
|
|
class l extends o.LineDataSource {
|
|
constructor(e, t) {
|
|
super(e, t || l.createProperties()), this._priceAxisView = new a
|
|
.LineToolHorzLinePriceAxisView(this), i.e("lt-pane-views").then(i.bind(null,
|
|
"ckl+")).then(({
|
|
HorzLinePaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
state(e) {
|
|
const t = super.state(e);
|
|
return t.points && 0 !== t.points.length && (t.points[0].offset = 0), t
|
|
}
|
|
pointsCount() {
|
|
return 1
|
|
}
|
|
name() {
|
|
return "Horizontal Line"
|
|
}
|
|
priceAxisViews(e, t) {
|
|
return this.isSourceHidden() ? null : t === this.priceScale() && this
|
|
.properties().showPrice.value() && this._model.paneForSource(this) === e ? [
|
|
this._priceAxisView
|
|
] : null
|
|
}
|
|
timeAxisViews() {
|
|
return null
|
|
}
|
|
timeAxisPoints() {
|
|
return []
|
|
}
|
|
updateAllViews() {
|
|
super.updateAllViews(), this._priceAxisView.update()
|
|
}
|
|
canHasAlert() {
|
|
return !0
|
|
}
|
|
template() {
|
|
const e = super.template();
|
|
return e.text = this.properties().childs().text.value(), e.showLabel = this
|
|
.properties().childs().showLabel.value(), e
|
|
}
|
|
static createProperties(e) {
|
|
const t = new n.DefaultProperty("linetoolhorzline", e);
|
|
return l._configureProperties(t), t
|
|
}
|
|
_getAlertPlots() {
|
|
return [this.points()[0].price]
|
|
}
|
|
_getPropertyDefinitionsViewModelClass() {
|
|
return Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "NEbb")).then(
|
|
e => e.HorizontalLineDefinitionsViewModel)
|
|
}
|
|
_applyTemplateImpl(e) {
|
|
super._applyTemplateImpl(e), this.properties().childs().text.setValue(e.text ||
|
|
""), this.properties().childs().showLabel.setValue(Boolean(e.showLabel))
|
|
}
|
|
static _configureProperties(e) {
|
|
o.LineDataSource._configureProperties(e), e.hasChild("text") || e.addChild(
|
|
"text", new r.a("")), e.addExclusion("text"), e.addExclusion(
|
|
"showLabel")
|
|
}
|
|
}
|
|
},
|
|
"/G2Z": function(e, t, i) {
|
|
"use strict";
|
|
(function(e) {
|
|
i("xdS3");
|
|
var t, s = i("Eyy1").assert;
|
|
i("fPdn"), i("wZIs"), i("WmDe"), JSON.parse(urlParams.disabledFeatures).forEach((
|
|
function(t) {
|
|
e.setEnabled(t, !1)
|
|
})), JSON.parse(urlParams.enabledFeatures).forEach((function(t) {
|
|
e.setEnabled(t, !0)
|
|
})), null != (t = window.parent[window.urlParams.uid].settingsAdapter) ? (TVSettings
|
|
.setSettingsAdapter(t), TVSettings.sync()) : e.enabled(
|
|
"use_localstorage_for_settings") && TVSettings.sync();
|
|
var r = i("UlDV").RestrictedToolsetBootloader,
|
|
n = i("I4UZ").HeaderToolbarBootloader,
|
|
o = i("9zVu").DrawingToolbarBootloader,
|
|
a = i("OiSa").isDrawingToolbarVisible;
|
|
(0, i("8+VR").setClasses)();
|
|
var l = i("EsvI"),
|
|
c = i("oiZD").setTheme,
|
|
h = i("JcHK"),
|
|
u = i("Ery9"),
|
|
d = i("lxNp"),
|
|
p = i("n0Bl").migrateShortcut,
|
|
_ = i("RXmj").ChartSaver,
|
|
m = i("/5ju").SaveChartService,
|
|
f = i("lA7n").LoadChartService,
|
|
g = i("F58L").StudyTemplates,
|
|
b = i("54XG").FavoriteStudyTemplateService,
|
|
v = i("PT1i").linking,
|
|
S = i("FQhm"),
|
|
y = i("kcTO").formatterOptions,
|
|
w = i("iboI").customFormatters,
|
|
P = i("JT5O").StudyMarket,
|
|
C = i("FBuY").TVXWindowEvents,
|
|
x = i("jofe").createDeferredPromise,
|
|
T = i("FIi8").deepExtend,
|
|
I = i("e3/o").randomHash,
|
|
M = i("/qn+").convertPropertyToWatchedValue,
|
|
O = i("1ANp").property,
|
|
L = i("RspR").property,
|
|
A = i("3t3b").dateFormatProperty,
|
|
E = i("UXvI").default,
|
|
k = i("LxhU").Interval,
|
|
D = i("lW/c").Root,
|
|
V = i("NsVT").ChartPage,
|
|
B = i("IWXC").destroyQuoteSessions,
|
|
R = i("uDHo").TIMEFRAMETYPE,
|
|
N = new V(new D(window).allocate()),
|
|
j = N.allocate({
|
|
areaName: "center"
|
|
}),
|
|
F = (N.allocate({
|
|
areaName: "tradingpanel"
|
|
}), window.parent[urlParams.uid].brokerFactory, Boolean(!1)),
|
|
W = i("vPbs").CHART_WIDGET_COLLECTION_SERVICE,
|
|
H = i("eqEH");
|
|
i("Wh/T");
|
|
var U = i("/Y2c"),
|
|
z = i("g5Qf").createFavoriteDrawingToolbar,
|
|
G = i("x5Tw").setupChartEventHint,
|
|
q = i("+2Ad").setupChartScreenshotHint,
|
|
Y = i("EX27"),
|
|
K = i("0YCj"),
|
|
J = i("9nLJ");
|
|
i("2cgs"), i("vIQA");
|
|
var Z = i("K5cv").setSearchRequestDelay,
|
|
X = i("dfhE"),
|
|
$ = i("ocLq"),
|
|
Q = i("qE4g").addBrandingSource,
|
|
ee = i("6vtU").setAdditionalSymbolInfoFields,
|
|
te = i("kNVT").setSymbolSearchCompleteOverrideFunction,
|
|
ie = i("fRER").DropdownApi,
|
|
se = window.parent[urlParams.uid].getCustomIndicators,
|
|
re = x(),
|
|
ne = x(),
|
|
oe = e.enabled("left_toolbar");
|
|
if (Promise.all([re.promise, ne.promise]).then((function() {
|
|
window.ChartApiInstance.start()
|
|
})), "function" == typeof se) {
|
|
var ae = se($);
|
|
ae && ae.then ? ae.then((function(e) {
|
|
if (!Array.isArray(e)) return console.warn(
|
|
"custom_indicators_getter should be a function that returns a Promise object which result is an array of custom indicators"
|
|
), void re.resolve();
|
|
JSServer.studyLibrary.push.apply(JSServer.studyLibrary, e), re
|
|
.resolve(), console.log("{0} custom indicators loaded.".format(e
|
|
.length))
|
|
})).catch((function(e) {
|
|
console.warn("Error loading custom indicators " + e), re.resolve()
|
|
})) : (console.warn(
|
|
"custom_indicators_getter should be a function that returns a Promise object"
|
|
), re.resolve())
|
|
} else re.resolve();
|
|
window.widgetReady = function(e) {
|
|
S.subscribe("onChartReady", e)
|
|
};
|
|
var le = urlParams.theme && urlParams.theme.toLowerCase();
|
|
|
|
function ce(e) {
|
|
window.__defaultsOverrides = window.__defaultsOverrides || {}, T(window
|
|
.__defaultsOverrides, e), void 0 !== TradingView.defaultProperties &&
|
|
void 0 !== TradingView.defaultProperties.chartproperties && (window
|
|
.applyDefaultsOverrides(TradingView.defaultProperties.chartproperties),
|
|
window.applyDefaultOverridesToLinetools())
|
|
}! function(e) {
|
|
l.themes[e] && c(e)
|
|
}(le), window.applyStudiesOverrides = function(e) {
|
|
e && (window.chartWidgetCollection ? window.chartWidgetCollection
|
|
.applyStudiesOverrides(e) : K.mergeDefaultsOverrides(e))
|
|
}, window.applyOverrides = function(e) {
|
|
ce(e), window.chartWidgetCollection && window.chartWidgetCollection
|
|
.applyOverrides(e)
|
|
}, window.doWhenApiIsReady = function(e) {
|
|
window.tradingViewApi ? e() : ne.promise.then(e)
|
|
}, window.applyTradingCustomization = function(e) {
|
|
for (var t in e.order) TradingView.defaultProperties.linetoolorder[t] = e.order[
|
|
t];
|
|
for (var t in e.position) TradingView.defaultProperties.linetoolposition[t] = e
|
|
.position[t]
|
|
}, window.changeTheme = function(e, t) {
|
|
var i = l.themes[e.toLowerCase()];
|
|
return i ? window.tradingViewApi.themes().setStdTheme(i.name, !0, t && t
|
|
.disableUndo) : Promise.resolve()
|
|
}, window.getTheme = function() {
|
|
return window.tradingViewApi.themes().getCurrentThemeName()
|
|
}, window.is_authenticated = !1;
|
|
JSON.parse(window.urlParams.brokerConfig);
|
|
window.t("charts by TradingView"), window.t("powered by TradingView"), window.t(
|
|
"by TradingView");
|
|
var he = null,
|
|
ue = x(),
|
|
de = null,
|
|
pe = function() {
|
|
if (e.setEnabled("charting_library_debug_mode", "true" === urlParams.debug), e
|
|
.setEnabled("chart_property_page_trading", !1), e.enabled(
|
|
"remove_library_container_border")) {
|
|
var t = document.querySelector("#library-container");
|
|
null !== t && (t.style.border = "0px", t.style.padding = "1px")
|
|
}
|
|
e.enabled("no_min_chart_width") && (window.document.body.style.minWidth =
|
|
"0px"), null != urlParams.studiesOverrides && K.mergeDefaultsOverrides(
|
|
JSON
|
|
.parse(urlParams.studiesOverrides)), s(void 0 === TradingView
|
|
.defaultProperties,
|
|
"Default properties are inited before applying overrides"),
|
|
ce(JSON.parse(urlParams.overrides)), urlParams.numeric_formatting =
|
|
urlParams.numeric_formatting && JSON.parse(urlParams.numeric_formatting),
|
|
urlParams.numeric_formatting && "string" == typeof urlParams
|
|
.numeric_formatting.decimal_sign && (y.decimalSign = urlParams
|
|
.numeric_formatting.decimal_sign[0]), window.ChartApiInstance = new Y(
|
|
window.parent[urlParams.uid].datafeed), window.parent[urlParams.uid]
|
|
.customFormatters && (window.parent[urlParams.uid].customFormatters
|
|
.timeFormatter && (w.timeFormatter = window.parent[urlParams.uid]
|
|
.customFormatters.timeFormatter), window.parent[urlParams.uid]
|
|
.customFormatters.dateFormatter && (w.dateFormatter = window.parent[
|
|
urlParams.uid].customFormatters.dateFormatter), window.parent[
|
|
urlParams.uid].customFormatters.tickMarkFormatter && (w
|
|
.tickMarkFormatter = window.parent[urlParams.uid].customFormatters
|
|
.tickMarkFormatter)), window.ChartApiInstance
|
|
.setStudiesAccessController(window.ChartApiInstance
|
|
.createStudiesAccessController(urlParams.studiesAccess));
|
|
var c = urlParams.chartContent ? JSON.parse(urlParams.chartContent).json :
|
|
void 0,
|
|
u = urlParams.chartContentExtendedData ? JSON.parse(urlParams
|
|
.chartContentExtendedData) : c ? c.extendedData : void 0,
|
|
d = urlParams.interval || "D",
|
|
p = function(e) {
|
|
var t = /(\d+)(\w+)/;
|
|
return e.map((function(e) {
|
|
var i = t.exec(e.text),
|
|
s = i[2].toLowerCase(),
|
|
r = parseInt(i[1]),
|
|
n = "y" === s ? 12 * r + "M" : r + s,
|
|
o = k.parse(e.resolution);
|
|
return {
|
|
text: window.t(e.title) || r + window.t(s, {
|
|
context: "dates",
|
|
count: r
|
|
}),
|
|
description: e.description || "",
|
|
value: {
|
|
value: n.toUpperCase(),
|
|
type: R.PeriodBack
|
|
},
|
|
targetResolution: o.value(),
|
|
requiresIntraday: o.isIntraday()
|
|
}
|
|
}))
|
|
}(JSON.parse(urlParams.timeFrames)),
|
|
x = {
|
|
resizerBridge: j,
|
|
padding: e.enabled("border_around_the_chart") ? 2 : 0,
|
|
content: c,
|
|
widgetOptions: {
|
|
addToWatchlistEnabled: !1,
|
|
hideIdeas: !0,
|
|
addVolume: window.ChartApiInstance.studiesAccessController
|
|
.isToolEnabled("Volume"),
|
|
muteSessionErrors: !0,
|
|
timezone: urlParams.timezone,
|
|
defSymbol: urlParams.symbol,
|
|
defInterval: d,
|
|
compareSymbols: urlParams.compareSymbols && JSON.parse(urlParams
|
|
.compareSymbols),
|
|
defTimeframe: urlParams.timeframe,
|
|
paneContextMenuEnabled: e.enabled("pane_context_menu"),
|
|
paneContextMenu: {
|
|
mainSeriesTrade: F
|
|
},
|
|
priceScaleContextMenuEnabled: e.enabled("scales_context_menu"),
|
|
currencyConversionEnabled: e.enabled("pricescale_currency"),
|
|
unitConversionEnabled: e.enabled("pricescale_unit"),
|
|
legendWidgetEnabled: e.enabled("legend_widget"),
|
|
legendWidget: {
|
|
contextMenu: {
|
|
settings: e.enabled("show_chart_property_page"),
|
|
showOpenMarketStatus: e.enabled("display_market_status")
|
|
}
|
|
},
|
|
sourceStatusesWidget: {
|
|
errorSolution: !1
|
|
},
|
|
marketStatusWidgetEnabled: e.enabled("display_market_status"),
|
|
marketStatusWidget: {
|
|
preMarketSolution: !1,
|
|
postMarketSolution: !1
|
|
},
|
|
chartWarningWidget: {
|
|
subscriptionFullInfo: !1
|
|
},
|
|
timeScaleWidget: {
|
|
contextMenuEnabled: e.enabled("scales_context_menu"),
|
|
timezoneMenuEnabled: e.enabled("timezone_menu"),
|
|
priceAxisLabelsOptions: {
|
|
showLabels: e.enabled("main_series_scale_menu")
|
|
}
|
|
},
|
|
timeScale: {
|
|
preserveBarSpacing: !1,
|
|
lockVisibleTimeRangeOnResize: e.enabled(
|
|
"lock_visible_time_range_on_resize"),
|
|
rightBarStaysOnScroll: e.enabled("right_bar_stays_on_scroll"),
|
|
minBarSpacing: urlParams.time_scale && JSON.parse(urlParams
|
|
.time_scale).min_bar_spacing
|
|
},
|
|
goToDateEnabled: e.enabled("go_to_date"),
|
|
crossHair: {
|
|
menuEnabled: e.enabled("chart_crosshair_menu")
|
|
},
|
|
handleScale: {
|
|
mouseWheel: e.enabled("mouse_wheel_scale"),
|
|
pinch: e.enabled("pinch_scale"),
|
|
axisPressedMouseMove: {
|
|
time: e.enabled("axis_pressed_mouse_move_scale"),
|
|
price: e.enabled("axis_pressed_mouse_move_scale")
|
|
}
|
|
},
|
|
handleScroll: {
|
|
mouseWheel: e.enabled("mouse_wheel_scroll"),
|
|
pressedMouseMove: e.enabled("pressed_mouse_move_scroll"),
|
|
horzTouchDrag: e.enabled("horz_touch_drag_scroll"),
|
|
vertTouchDrag: e.enabled("vert_touch_drag_scroll")
|
|
},
|
|
shiftVisibleRangeOnNewBar: e.enabled(
|
|
"shift_visible_range_on_new_bar"),
|
|
croppedTickMarks: e.enabled("cropped_tick_marks"),
|
|
countdownEnabled: e.enabled("countdown"),
|
|
indicatorsDialogShortcutEnabled: e.enabled(
|
|
"insert_indicator_dialog_shortcut")
|
|
},
|
|
seriesControlBarEnabled: e.enabled("timeframes_toolbar"),
|
|
seriesControlBar: {
|
|
timeFramesWidgetEnabled: !0,
|
|
timeFramesWidget: {
|
|
goToDateEnabled: e.enabled("go_to_date"),
|
|
availableTimeFrames: function(e, t) {
|
|
return e ? t !== X.STATUS_DELAYED && t !== X
|
|
.STATUS_DELAYED_STREAMING && t !== X.STATUS_READY ?
|
|
[] : p.filter((function(t) {
|
|
return !(t.requiresIntraday && !e
|
|
.has_intraday) && !(e
|
|
.supported_resolutions && !e
|
|
.supported_resolutions.includes(
|
|
t.targetResolution))
|
|
})) : []
|
|
}
|
|
},
|
|
timeWidgetEnabled: !0,
|
|
timeWidget: {
|
|
timezoneMenuEnabled: e.enabled("timezone_menu")
|
|
},
|
|
adjustForDividendsButtonEnabled: !1,
|
|
sessionIdButtonEnabled: !1,
|
|
percentageScaleButtonEnabled: !0,
|
|
logScaleButtonEnabled: !0,
|
|
autoScaleButtonEnabled: !0,
|
|
fullscreenButtonEnabled: !0,
|
|
mobileChangeLayoutEnabled: !1
|
|
},
|
|
globalEvents: !0,
|
|
snapshotUrl: urlParams.snapshotUrl,
|
|
mobileForceChartMaximizeEnabled: !1,
|
|
saveChartEnabled: e.enabled("save_shortcut")
|
|
};
|
|
oe && (z(), x.widgetOptions.isDrawingToolbarVisible = a), u && (x.metaInfo = {
|
|
id: u.uid,
|
|
name: u.name,
|
|
description: u.description,
|
|
uid: u.uid,
|
|
username: "",
|
|
tags: ""
|
|
}), window.parent[urlParams.uid].additionalSymbolInfoFields && ee(window
|
|
.parent[urlParams.uid].additionalSymbolInfoFields), window.parent[
|
|
urlParams.uid].symbolSearchComplete && te(window.parent[urlParams.uid]
|
|
.symbolSearchComplete);
|
|
var T = window.chartWidgetCollection = new U(x);
|
|
Q(T), window.studyMarket = new P(T), void 0 !== H && H.registerService(W, T), T
|
|
.activeChartWidget.subscribe((function(e) {
|
|
S.emit("activeChartChanged", T.getAll().indexOf(e))
|
|
})), window.saver = new _(T);
|
|
var I = new m(T, window.saver),
|
|
M = new f(T);
|
|
window.chartWidget = T.activeChartWidget.value(), window.pro = new TradingView
|
|
.Pro;
|
|
var O = function(t) {
|
|
if (!e.enabled("header_widget")) return null;
|
|
var s = N.allocate({
|
|
areaName: "top"
|
|
}),
|
|
o = new(0, i("htUT").ChartChangesWatcher)(t.chartWidgetCollection
|
|
.undoHistory, window.saver, S),
|
|
a = JSON.parse(urlParams.favorites);
|
|
a.intervals = a.intervals.map((function(e) {
|
|
var t = "" + e;
|
|
return t.match(/1[DWMYdwmy]/) && (t = t.slice(1)), t
|
|
}));
|
|
var l = null;
|
|
e.enabled("study_templates") && (l = new b(C, TVSettings), de = new g({
|
|
chartWidgetCollection: t.chartWidgetCollection,
|
|
favoriteStudyTemplatesService: l
|
|
}));
|
|
var c = void 0,
|
|
h = urlParams.header_widget_buttons_mode;
|
|
"fullsize" === h && (c = ["full"]);
|
|
"compact" === h && (c = ["small"]);
|
|
return new n(new r, {
|
|
chartSaver: window.saver,
|
|
chartApiInstance: ChartApiInstance,
|
|
chartWidgetCollection: t.chartWidgetCollection,
|
|
defaultFavoriteStyles: a.chartTypes,
|
|
defaultFavoriteIntervals: a.intervals,
|
|
hideStudyTemplates: !0,
|
|
resizerBridge: s,
|
|
studyMarket: window.studyMarket,
|
|
studyTemplates: de,
|
|
favoriteStudyTemplatesService: l,
|
|
allowedModes: c,
|
|
saveChartService: t.saveChartService,
|
|
loadChartService: t.loadChartService,
|
|
chartChangesWatcher: o,
|
|
onClick: we,
|
|
snapshotUrl: t.snapshotUrl
|
|
})
|
|
}({
|
|
chartWidgetCollection: T,
|
|
saveChartService: I,
|
|
loadChartService: M,
|
|
snapshotUrl: urlParams.snapshotUrl
|
|
});
|
|
null !== O ? O.load().then((function(e) {
|
|
he = e.getComponent(), ue.resolve()
|
|
})) : (ue.promise.catch((function() {})), ue.reject(
|
|
"header widget is not loaded"));
|
|
var L = function(e) {
|
|
if (oe) {
|
|
var t = urlParams.toolbarbg && /^[0-9a-f]+$/i.test(urlParams
|
|
.toolbarbg) ? String(urlParams.toolbarbg) : void 0;
|
|
if (t) {
|
|
var i = document.createElement("style");
|
|
i.textContent =
|
|
"body,.chart-controls-bar,#footer-chart-panel{background-color:#" +
|
|
t + " !important}", document.head.appendChild(i)
|
|
}
|
|
return new o({
|
|
bgColor: t,
|
|
chartWidgetCollection: e,
|
|
drawingsAccess: urlParams.drawingsAccess ? JSON.parse(
|
|
urlParams.drawingsAccess) : void 0,
|
|
resizerBridge: N.allocate({
|
|
areaName: "left"
|
|
}),
|
|
onClick: we
|
|
})
|
|
}
|
|
return null
|
|
}(T),
|
|
A = null;
|
|
window.tradingViewApi = new J({
|
|
chartWidgetCollection: T,
|
|
chartApiInstance: window.ChartApiInstance,
|
|
saveChartService: I,
|
|
loadChartService: M
|
|
});
|
|
if (v.bindToChartWidgetCollection(T), TradingView.isNaN(urlParams
|
|
.studyCountLimit) || (TradingView.STUDY_COUNT_LIMIT = Math.max(2, +
|
|
urlParams.studyCountLimit)), !TradingView.isNaN(urlParams.ssreqdelay)) {
|
|
var D = Math.max(0, +urlParams.ssreqdelay);
|
|
Z(D)
|
|
}
|
|
window.ChartApiInstance.connect(), Promise.all([i.e("react"), i.e(1), i.e(4), i
|
|
.e(6), i.e(11), i.e(12), i.e(13), i.e(14), i.e(17), i.e(21), i.e(
|
|
22), i.e(24), i.e(28), i.e(33), i.e(41), i.e(48), i.e(51), i.e(
|
|
52),
|
|
i.e(60), i.e(67), i.e(75), i.e(0), i.e(5), i.e(30), i.e(38), i.e(
|
|
"line-tools-icons"), i.e(53), i.e(54), i.e("floating-toolbars")
|
|
]).then(i.t.bind(null, "tPkB", 7)).then(({
|
|
default: e
|
|
}) => {
|
|
window.lineToolPropertiesToolbar = new e(T)
|
|
});
|
|
var V = document.querySelector(".tv-content");
|
|
|
|
function B() {
|
|
L && L.load(), A && A.load().then((function(e) {
|
|
window.footerWidget = e.getComponent()
|
|
}))
|
|
}
|
|
null !== V && V.addEventListener("contextmenu", (function(e) {
|
|
null !== e.target && "input" !== e.target.tagName
|
|
.toLowerCase() && "textarea" !== e.target.tagName
|
|
.toLowerCase() && e.preventDefault()
|
|
})), ne.resolve(), T.undoHistory.undoStack().onChange().subscribe(null, E((
|
|
function() {
|
|
S.emit("onAutoSaveNeeded")
|
|
}), 1e3 * (urlParams.autoSaveDelay || 5), {
|
|
leading: !1,
|
|
trailing: !0
|
|
})), window.chartWidget.withModel(null, (function() {
|
|
if (ChartApiInstance.on("realtime_tick", (function(e) {
|
|
S.emit("onTick", e)
|
|
})), !l.savedThemeName() && le) {
|
|
var t = l.getStdTheme(le);
|
|
t && t.content && void 0 === c && T.applyTheme(t.content, !
|
|
1, !1, le, !0, !0).then(() => window.applyOverrides(
|
|
window.__defaultsOverrides))
|
|
}
|
|
e.enabled("charting_library_debug_mode") && S.subscribeToAll((
|
|
function() {
|
|
var e = Array.prototype.slice.call(arguments);
|
|
console.log('Event "{0}", arguments: {1}'
|
|
.format(e[0], JSON.stringify(e.slice(
|
|
1))))
|
|
})), G && (G(T), G = null), q && (q(T, {
|
|
seriesControlBarEnabled: e.enabled(
|
|
"timeframes_toolbar")
|
|
}), q = null)
|
|
})),
|
|
h.isAnyChartWidgetInitialized(T) ? B() : h.waitAnyChartWidgetInitialized(T,
|
|
B), S.subscribe("chart_load_requested", (function(e) {
|
|
window.tradingViewApi.loadChart({
|
|
json: JSON.parse(e.content),
|
|
extendedData: e
|
|
})
|
|
}))
|
|
};
|
|
window.addEventListener("unload", (function() {
|
|
window.ChartApiInstance && window.ChartApiInstance.disconnect(), window
|
|
.chartWidgetCollection && (window.chartWidgetCollection.destroy(),
|
|
window.chartWidgetCollection = null), B(), window
|
|
.ChartApiInstance && (window.ChartApiInstance.destroy(), window
|
|
.ChartApiInstance = null)
|
|
})), e.enabled("saveload_storage_customization") && (window.parent[urlParams.uid]
|
|
.saveLoadAdapter ? u.setCustomAdapter(window.parent[urlParams.uid]
|
|
.saveLoadAdapter) : void 0 !== urlParams.chartsStorageUrl && urlParams
|
|
.chartsStorageUrl && void 0 !== urlParams.clientId && urlParams.clientId ? u
|
|
.initialize(urlParams.clientId, urlParams.userId, urlParams.chartsStorageUrl,
|
|
urlParams.chartsStorageVer || "1.0") : (e.setEnabled(
|
|
"saveload_storage_customization", !1), e.setEnabled("header_saveload", !
|
|
1)));
|
|
var _e = x();
|
|
|
|
function me() {
|
|
_e.resolve()
|
|
}
|
|
window.parent[urlParams.uid].loadLastChart && e.enabled(
|
|
"saveload_storage_customization") ? u.getCharts().then((function(e) {
|
|
if (0 !== e.length) {
|
|
var t = e.sort((function(e, t) {
|
|
return t.modified_iso - e.modified_iso
|
|
}))[0];
|
|
u.getChartContent(t).then((function(e) {
|
|
var t = JSON.parse(e.content);
|
|
t.extendedData = e, urlParams.chartContent = JSON
|
|
.stringify({
|
|
json: t
|
|
}), me()
|
|
})).catch(me)
|
|
} else me()
|
|
})).catch(me) : me();
|
|
var fe, ge, be = x();
|
|
Promise.all([be.promise, _e.promise]).then((function() {
|
|
var t, i, s, r, n, o, a = document.querySelector(".loading-indicator");
|
|
if (a && (a.style.display = "none"), setTimeout(pe, 0), e.enabled(
|
|
"14851") && Math.random() <= .02) {
|
|
t = window, i = document, s = "script", r = "ga", t
|
|
.GoogleAnalyticsObject = r, t.ga = t.ga || function() {
|
|
(t.ga.q = t.ga.q || []).push(arguments)
|
|
}, t.ga.l = 1 * new Date, n = i.createElement(s), o = i
|
|
.getElementsByTagName(s)[0], n.async = 1, n.src =
|
|
"//www.google-analytics.com/analytics.js", o.parentNode
|
|
.insertBefore(n, o);
|
|
var l = document.URL.match(new RegExp("(:?.*://)([^/]+)/.*"))[2];
|
|
ga("create", "UA-112911840-1", "auto"), ga("set", "anonymizeIp", !
|
|
0), ga("set", {
|
|
hostname: l,
|
|
page: l,
|
|
referrer: l
|
|
}), ga("send", "pageview")
|
|
}
|
|
})), fe = !0, window.parent[urlParams.uid].datafeed.onReady((function(e) {
|
|
fe && console.warn(
|
|
"`onReady` should return result asynchronously. Use `setTimeout` with 0 interval to execute the callback function."
|
|
), window.configurationData = e, be.resolve()
|
|
})), fe = !1, window.getFunctionFromArguments = function(e) {
|
|
return window.parent[urlParams.uid][e]
|
|
}, window.createShortcutAction = (ge = d.createGroup({
|
|
desc: "API"
|
|
}), function(e, t) {
|
|
ge.add({
|
|
hotkey: p(e),
|
|
handler: t
|
|
})
|
|
}), window.initializationFinished = function() {
|
|
window.chartWidgetCollection.undoHistory.clearStack()
|
|
}, window.headerReady = function() {
|
|
return ue.promise
|
|
}, window.createButton = function(e) {
|
|
if (null === he) throw new Error(
|
|
"Cannot create button: header widget is not ready or is not loaded - use `headerReady` to wait until header is ready"
|
|
);
|
|
var t = (e = e || {}).align || "left";
|
|
return he.addButton(I(), t)
|
|
}, window.createDropdown = function(e) {
|
|
if (void 0 === e) throw new Error(
|
|
"Cannot create dropdown without any parameters. Please refer to the documentation"
|
|
);
|
|
void 0 === e.align && (e.align = "left");
|
|
const t = I();
|
|
return he ? (he.addDropdown(t, e), Promise.resolve(new ie(he, t))) : ue.promise
|
|
.then(() => (he.addDropdown(t, e), new ie(he, t)))
|
|
}, window.getAllFeatures = function() {
|
|
const t = e.getAllFeatures();
|
|
return Object.keys(t).forEach((function(e) {
|
|
isNaN(parseFloat(e)) || delete t[e]
|
|
})), t
|
|
};
|
|
var ve = null;
|
|
window.getNavigationButtonsVisibility = function() {
|
|
return null === ve && (ve = M(O())), ve
|
|
};
|
|
var Se = null;
|
|
window.getPaneButtonsVisibility = function() {
|
|
return null === Se && (Se = M(L())), Se
|
|
};
|
|
var ye = null;
|
|
|
|
function we(e) {
|
|
var t = TradingView.bottomWidgetBar;
|
|
t && t.turnOffMaximize()
|
|
}
|
|
window.getDateFormat = function() {
|
|
return null === ye && (ye = M(A)), ye
|
|
}
|
|
}).call(this, i("Kxc7"))
|
|
},
|
|
"/McG": function(e) {
|
|
e.exports = JSON.parse(
|
|
'{"content":{"chartProperties":{"scalesProperties":{"textColor":"#131722","lineColor":"rgba(42, 46, 57, 0.14)","backgroundColor":"#ffffff"},"paneProperties":{"vertGridProperties":{"color":"rgba(42, 46, 57, 0.06)"},"horzGridProperties":{"color":"rgba(42, 46, 57, 0.06)"},"crossHairProperties":{"color":"#9598A1"},"background":"#ffffff","backgroundGradientStartColor":"#ffffff","backgroundGradientEndColor":"#ffffff"}},"sessions":{"graphics":{"backgrounds":{"outOfSession":{"color":"#2962FF","transparency":92},"preMarket":{"color":"#FF9800","transparency":92},"postMarket":{"color":"#2962FF","transparency":92}},"vertlines":{"sessBreaks":{"color":"#4985e7","style":2,"width":1}}}},"mainSourceProperties":{"baseLineColor":"#B2B5BE","candleStyle":{"borderColor":"#378658","upColor":"#26a69a","wickColor":"#737375","wickUpColor":"#26a69a","wickDownColor":"#ef5350","downColor":"#ef5350","borderUpColor":"#26a69a","borderDownColor":"#ef5350"},"haStyle":{"borderColor":"#378658","upColor":"#26a69a","wickColor":"#737375","wickUpColor":"#26a69a","wickDownColor":"#ef5350","downColor":"#ef5350","borderUpColor":"#26a69a","borderDownColor":"#ef5350"},"barStyle":{"downColor":"#ef5350","upColor":"#26a69a"},"pnfStyle":{"downColor":"#ef5350","upColor":"#26a69a","upColorProjection":"#a9dcc3","downColorProjection":"#f5a6ae"},"baselineStyle":{"baselineColor":"rgba( 117, 134, 150, 1)","topFillColor1":"rgba( 38, 166, 154, 0.28)","topFillColor2":"rgba( 38, 166, 154, 0.05)","bottomFillColor1":"rgba( 239, 83, 80, 0.05)","bottomFillColor2":"rgba( 239, 83, 80, 0.28)","topLineColor":"rgba( 38, 166, 154, 1)","bottomLineColor":"rgba( 239, 83, 80, 1)"},"areaStyle":{"transparency":100,"color1":"rgba(41, 98, 255, 0.28)","color2":"#2962FF","linecolor":"#2962FF","linewidth":2,"linestyle":0},"renkoStyle":{"upColor":"#26a69a","downColor":"#ef5350","borderUpColor":"#26a69a","borderDownColor":"#ef5350","upColorProjection":"#a9dcc3","downColorProjection":"#f5a6ae","borderUpColorProjection":"#a9dcc3","borderDownColorProjection":"#f5a6ae","wickUpColor":"#26a69a","wickDownColor":"#ef5350"},"lineStyle":{"color":"#2962FF","linewidth":2,"linestyle":0},"kagiStyle":{"downColor":"#ef5350","upColor":"#26a69a","upColorProjection":"#a9dcc3","downColorProjection":"#f5a6ae"},"pbStyle":{"upColor":"#26a69a","downColor":"#ef5350","borderUpColor":"#26a69a","borderDownColor":"#ef5350","upColorProjection":"#a9dcc3","downColorProjection":"#f5a6ae","borderUpColorProjection":"#a9dcc3","borderDownColorProjection":"#f5a6ae"},"rangeStyle":{"upColor":"#26a69a","downColor":"#ef5350","upColorProjection":"#a9dcc3","downColorProjection":"#f5a6ae"}}}}'
|
|
)
|
|
},
|
|
"/ToI": function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "b", (function() {
|
|
return o
|
|
})), i.d(t, "a", (function() {
|
|
return a
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("3u3j");
|
|
class n extends r.a {
|
|
constructor(e, t, i, s) {
|
|
super(e, t, s), this._sourcePaneRemoved = !1, this._targetPaneIndex = e.panes()
|
|
.indexOf(i)
|
|
}
|
|
redo() {
|
|
const e = this._chartModel.panes()[this._initialPaneIndex],
|
|
t = this._chartModel.panes()[this._targetPaneIndex],
|
|
i = e !== t,
|
|
r = this._targetPriceScale(t),
|
|
n = Object(s.ensureNotNull)(this._chartModel.dataSourceForId(this
|
|
._sourceId)),
|
|
o = this._chartModel.children(n, !0);
|
|
for (const e of o) i ? (this._chartModel.detachSource(e), t.addDataSource(e, r,
|
|
!1)) : t.move(e, r);
|
|
i ? (this._sourcePaneRemoved = this._chartModel.detachSource(n), t
|
|
.addDataSource(n, r, !1)) : t.move(n, r);
|
|
const a = t.priceScalePosition(r);
|
|
t.movePriceScale(r, a, this._targetPriceScaleIndex(n)), this._chartModel
|
|
.fullUpdate()
|
|
}
|
|
undo() {
|
|
this._sourcePaneRemoved && this._chartModel.createPane(this._initialPaneIndex);
|
|
const e = this._chartModel.panes()[this._initialPaneIndex],
|
|
t = e !== this._chartModel.panes()[this._targetPaneIndex],
|
|
i = Object(s.ensureNotNull)(this._chartModel.dataSourceForId(this
|
|
._sourceId));
|
|
let r = e.getPriceScaleById(this._initialPriceScaleId);
|
|
null === r && (r = e.createPriceScaleAtPosition(this._initialPriceScalePosition,
|
|
this._initialPriceScaleIndex));
|
|
const n = this._chartModel.children(i, !0);
|
|
for (const i of n) t ? (this._chartModel.detachSource(i), e.addDataSource(i, r,
|
|
!1)) : e.move(i, r);
|
|
t ? (this._chartModel.detachSource(i), e.addDataSource(i, r, !1)) : e.move(i,
|
|
r), Object(s.ensureNotNull)(i.priceScale()).restoreState(this
|
|
._originalPriceScaleState()), this._chartModel.fullUpdate()
|
|
}
|
|
}
|
|
class o extends n {
|
|
constructor(e, t, i, s, r) {
|
|
super(e, t, i, r), this._targetPriceScalePosition = s
|
|
}
|
|
_targetPriceScale(e) {
|
|
const t = e.createPriceScaleAtPosition(this._targetPriceScalePosition);
|
|
return t.restoreState(this._newPriceScaleState("overlay" === this
|
|
._targetPriceScalePosition)), t
|
|
}
|
|
_targetPriceScaleIndex(e) {
|
|
return e === this._chartModel.mainSeries() ? 0 : void 0
|
|
}
|
|
}
|
|
class a extends n {
|
|
constructor(e, t, i, s, r) {
|
|
super(e, t, i, r), this._targetPriceScaleId = s.id()
|
|
}
|
|
_targetPriceScale(e) {
|
|
return Object(s.ensureNotNull)(e.getPriceScaleById(this._targetPriceScaleId))
|
|
}
|
|
_targetPriceScaleIndex(e) {}
|
|
}
|
|
},
|
|
"/Y2c": function(e, t, i) {
|
|
"use strict";
|
|
(function(t) {
|
|
var s = i("Eyy1").assert,
|
|
r = i("jofe").createDeferredPromise,
|
|
n = (i("qFKp").CheckMobile, i("VNzU").layouts),
|
|
o = i("Zo2/"),
|
|
a = i("qFKp").supportTouch,
|
|
l = i("qFKp").isIE,
|
|
c = i("qFKp").isEdge,
|
|
h = i("x8jL").createUndoHistory,
|
|
u = i("mMWL"),
|
|
d = i("lxNp"),
|
|
p = i("/3z9"),
|
|
_ = i("FQhm"),
|
|
m = i("PzPU"),
|
|
f = i("Kxc7"),
|
|
g = i("ijBy").SetChartLayoutCommand,
|
|
b = i("hY0g"),
|
|
v = i("HySD").ResizerDetacherState,
|
|
S = i("HV/F").delegateToPromise,
|
|
y = i("sEk5"),
|
|
w = i("lJvs"),
|
|
P = i("txPx").getLogger("Chart.ChartWidgetCollection"),
|
|
C = (i("JWMC").trackEvent, i("wamh").ChangeToolBarsThemeUndoCommand);
|
|
const {
|
|
getCurrentTheme: x
|
|
} = i("EsvI");
|
|
var T = i("dfhE"),
|
|
I = i("ufwo").rangesAreEqual,
|
|
M = i("0psP").GeneralChartPropertiesRenderer,
|
|
O = i("NSoL").clientSnapshot,
|
|
L = i("pPtI").setLastUsedResolution,
|
|
A = i("TCfT").CompareDialogRenderer,
|
|
E = i("mNbo").isOnMobileAppPage,
|
|
k = i("E3Wt"),
|
|
D = k.applyIndicatorsToAllChartsImpl,
|
|
V = k.applyIndicatorToAllChartsImpl,
|
|
B = k.lineToolsAndGroupsDTOsImpl,
|
|
R = k.getStateForChartImpl,
|
|
N = k.getAsyncStateForChartImpl,
|
|
j = k.resetLineToolsInvalidatedImpl,
|
|
F = k.applyLineToolUpdateNotificationImpl,
|
|
W = k.createClipboardHandler,
|
|
H = k.chartsSymbolsImpl,
|
|
U = {
|
|
saveChartEnabled: !0,
|
|
takeScreenshotEnabled: !0,
|
|
publishedChartsEnabled: !0
|
|
};
|
|
e.exports = function(e) {
|
|
var k = this,
|
|
z = Object.assign({}, U, e),
|
|
G = 1,
|
|
q = 2,
|
|
Y = 0,
|
|
K = 0,
|
|
J = new b,
|
|
Z = z.readOnly || !1,
|
|
X = [],
|
|
$ = 0,
|
|
Q = new b,
|
|
ee = new b,
|
|
te = null,
|
|
ie = "s",
|
|
se = new b,
|
|
re = [],
|
|
ne = !1,
|
|
oe = !1,
|
|
ae = !1,
|
|
le = new b(!1),
|
|
ce = new b(!1),
|
|
he = new b(!1),
|
|
ue = new b(TVSettings.getBool("chart.syncCrosshair", !0)),
|
|
de = d.createGroup({
|
|
desc: "Layout"
|
|
}),
|
|
pe = null,
|
|
_e = ue.value();
|
|
ue.subscribe((function(e) {
|
|
_e = e = !!e, TVSettings.setValue("chart.syncCrosshair", e);
|
|
for (var t = 0; t < X.length; ++t) {
|
|
var i = X[t].chartWidget;
|
|
i.hasModel() && i.model().lightUpdate()
|
|
}
|
|
}));
|
|
var me = new b(ie),
|
|
fe = z.resizerBridge.width,
|
|
ge = z.resizerBridge.height,
|
|
be = null;
|
|
void 0 !== z.padding && (q = z.padding), void 0 !== z.topOffset && (G = z
|
|
.topOffset), void 0 !== z.edge && (Y = z.edge), void 0 !== z.border && (
|
|
K = z.border);
|
|
var ve = z.widgetOptions || {},
|
|
Se = z.metaInfo || {},
|
|
ye = {
|
|
id: new b(Se.id || null),
|
|
name: new b(Se.name),
|
|
description: new b(Se.description),
|
|
username: new b(Se.username),
|
|
uid: new b(Se.uid),
|
|
lastModified: new b(Se.lastModified)
|
|
},
|
|
we = h();
|
|
we.onChange().subscribe(null, (function(e) {
|
|
_.emit("undo_redo_state_changed", e)
|
|
}));
|
|
var Pe = z.resizerBridge.container.value(),
|
|
Ce = r(),
|
|
xe = new t,
|
|
Te = new t,
|
|
Ie = new t;
|
|
|
|
function Me() {
|
|
X.forEach((function(e) {
|
|
e.chartWidget.onZoom().unsubscribeAll(this)
|
|
}))
|
|
}
|
|
|
|
function Oe() {
|
|
X.forEach((function(e) {
|
|
e.chartWidget.onScroll().unsubscribeAll(this)
|
|
}))
|
|
}
|
|
var Le, Ae = null,
|
|
Ee = null,
|
|
ke = null;
|
|
z.seriesControlBarEnabled && (Le = Y + K + "px", (Ae = document.createElement(
|
|
"div")).style.left = Le, Ae.style.right = Le, Ae.style.bottom = Le,
|
|
Ae.classList.add("chart-toolbar", "chart-controls-bar"), Pe.appendChild(
|
|
Ae), Promise.all([i.e("react"), i.e(1), i.e(6), i.e(8), i.e(11), i
|
|
.e(12), i.e(13), i.e(14), i.e(28), i.e(29), i.e(41), i.e(43), i
|
|
.e(48), i.e(73), i.e(0), i.e(5), i.e(7), i.e(10), i.e(38), i.e(
|
|
"chart-bottom-toolbar")
|
|
]).then(i.bind(null, "MfqI")).then(({
|
|
BottomToolbarRenderer: e
|
|
}) => {
|
|
var i = z.resizerBridge,
|
|
s = [i.container.spawn(), i.width.spawn(), i.height
|
|
.spawn()
|
|
],
|
|
r = i.container.value(),
|
|
n = new t,
|
|
o = function() {
|
|
n.fire()
|
|
};
|
|
s.forEach((function(e) {
|
|
e.subscribe(o)
|
|
})), Ee = new e(Ae, n, (function() {
|
|
var e = r.getBoundingClientRect(),
|
|
t = Re();
|
|
return t.top = e.top + t.top, t.left = e.left +
|
|
t.left, t
|
|
}), k, ChartApiInstance, ve, z.seriesControlBar), ke =
|
|
function() {
|
|
null !== Ee && (Ee.destroy(), Ee = null, Ae.remove(),
|
|
Ae = null), s.forEach((function(e) {
|
|
e.destroy()
|
|
})), n.destroy()
|
|
}
|
|
}));
|
|
var De = new M(k),
|
|
Ve = new A(k);
|
|
|
|
function Be() {
|
|
return {
|
|
undoHistory: we,
|
|
chartWidgetsDefs: X,
|
|
chartsCountToSave: Ne,
|
|
actualLayoutCount: je,
|
|
savedChartWidgetOptions: re,
|
|
activeChartWidget: J,
|
|
options: z,
|
|
parent: Pe,
|
|
toastsFactory: null
|
|
}
|
|
}
|
|
|
|
function Re() {
|
|
var e = Y + K,
|
|
t = Ae ? Ae.offsetHeight : 0;
|
|
return {
|
|
width: fe.value() - 2 * e,
|
|
height: ge.value() - G - t - e,
|
|
top: G,
|
|
left: e
|
|
}
|
|
}
|
|
|
|
function Ne() {
|
|
return je()
|
|
}
|
|
|
|
function je() {
|
|
return n[ie].count
|
|
}
|
|
|
|
function Fe(e, t, i, s, r) {
|
|
return R(Be(), e, t, i, s, r)
|
|
}
|
|
|
|
function We() {
|
|
var e;
|
|
e = be ? [be] : X.slice(0, te.count).filter((function(e) {
|
|
return !e.hiddenInLayout.value()
|
|
}));
|
|
for (var t = 0; t < e.length; t++) He(e[t], t, e.length)
|
|
}
|
|
|
|
function He(e, t, i) {
|
|
var s = te.sizer(Re(), t, i, q + K);
|
|
s.width = Math.max(Math.round(s.width), 0), s.height = Math.max(Math.round(s
|
|
.height), 0), s.top = Math.round(s.top), s.left = Math.round(s
|
|
.left), e.metrics = s;
|
|
var r = e.container.value();
|
|
r && (r.style.width = s.width + "px", r.style.height = s.height + "px", r
|
|
.style.top = s.top + "px",
|
|
r.style.left = s.left + "px"), e.width.setValue(s.width), e.height
|
|
.setValue(s.height)
|
|
}
|
|
|
|
function Ue(e) {
|
|
return e.rdState.owner.value() !== e
|
|
}
|
|
|
|
function ze() {
|
|
return Promise.resolve(null)
|
|
}
|
|
|
|
function Ge(e) {
|
|
var t;
|
|
e = Object.assign({
|
|
chartWidgetCollection: k,
|
|
isActive: 0 === X.length,
|
|
barsMarksContainersFactory: qe,
|
|
undoHistory: we,
|
|
readOnly: Z,
|
|
initialLoading: ae,
|
|
getToasts: ze
|
|
}, e || {}), void 0 !== gt && (e.customLegendWidgetFactories = new Map(
|
|
gt));
|
|
var i = document.createElement("div");
|
|
i.classList.add("chart-container"), i.style.position = "absolute", i.style
|
|
.overflow = "hidden", Pe.appendChild(i), (l || c) && (i.style
|
|
.touchAction = "none", i.style.msTouchAction = "none"), z
|
|
.className && i.addClass(z.className);
|
|
var s = {
|
|
alive: new b(!0),
|
|
container: new b(i),
|
|
width: new b,
|
|
height: new b,
|
|
hiddenInLayout: new b(!1),
|
|
visible: new b,
|
|
rdState: new v,
|
|
requestFullscreen: function() {
|
|
Q.value() && (Ye(s), J.setValue(s.chartWidget))
|
|
},
|
|
exitFullscreen: function() {
|
|
J.value() === s.chartWidget && Ye(null)
|
|
},
|
|
detachable: Q,
|
|
fullscreenable: Q,
|
|
fullscreen: new b
|
|
};
|
|
|
|
function r() {
|
|
s.visible.setValue(!s.hiddenInLayout.value() && z.resizerBridge.visible
|
|
.value())
|
|
}
|
|
s.rdState.pushOwner(s), X.push(s), s.hiddenInLayout.subscribe((function() {
|
|
s.chartWidget.setVisible(!s.hiddenInLayout.value()), r()
|
|
})), z.resizerBridge.visible.subscribe(r), r(),
|
|
function(e) {
|
|
for (var t = 0, i = 0, s = 0; s < te.count; s++) {
|
|
X[s] && Ue(X[s]) || (X[s] === e && (i = t), t++)
|
|
}
|
|
He(e, i, t)
|
|
}(s), Object.assign(e, s.rdState.bridge());
|
|
var n = e.content ? e.content.chartId : Je(Ke);
|
|
return s.chartWidget = t = new o.ChartWidget(e, n, ye.uid.value()), pe && s
|
|
.chartWidget.setSaveChartService(pe), e.containsData ? t
|
|
.finishInitWithoutConnect() : t.connect(), t.withModel(null, (
|
|
function() {
|
|
var e = t.model().model();
|
|
ft.forEach((function(t, i) {
|
|
e.addCustomSource(i, t.factory, t.layer)
|
|
}))
|
|
})), et(), tt(), xe.fire(t), t
|
|
}
|
|
|
|
function qe(e) {
|
|
var t = [],
|
|
i = new y(e);
|
|
t.push(i);
|
|
var s = new w(e);
|
|
return t.push(s), t
|
|
}
|
|
|
|
function Ye(e) {
|
|
be !== e && (be = e, Qe(ie))
|
|
}
|
|
|
|
function Ke(e) {
|
|
return X.some((function(t) {
|
|
return t.chartWidget && t.chartWidget.id() === e
|
|
}))
|
|
}
|
|
|
|
function Je(e) {
|
|
for (var t = 1; e("" + t);) t++;
|
|
return "" + t
|
|
}
|
|
|
|
function Ze() {
|
|
X.every(e => e.chartWidget.hasModel()) && (et(), _.emit("layout_changed"))
|
|
}
|
|
|
|
function Xe(e, t) {
|
|
const i = Ge(Object.assign({}, ve, re.shift() || function() {
|
|
const e = J.value();
|
|
if (e) {
|
|
const t = e.state();
|
|
return t.chartId = Je(Ke), t
|
|
.shouldBeSavedEvenIfHidden = !1, {
|
|
content: t
|
|
}
|
|
}
|
|
}(), 0 === e || le.value() ? void 0 : {
|
|
defSymbol: null
|
|
}));
|
|
return i.modelCreated().subscribe(null, t || Ze, !0), i
|
|
}
|
|
|
|
function $e(e) {
|
|
e.hiddenInLayout.setValue(!0);
|
|
const t = e.container.value();
|
|
t.parentNode && t.parentNode.removeChild(t), e.fullscreen.setValue(!1)
|
|
}
|
|
|
|
function Qe(e) {
|
|
e in n || (e = "s"), Me(), Oe();
|
|
var t = ie,
|
|
i = n[e].count;
|
|
_.emit("layout_about_to_be_changed", e), me.setValue(e), ie = e, te = n[e];
|
|
for (var s = i; s < X.length; s++) {
|
|
Ue(r = X[s]) && r.rdState.bridge().attach()
|
|
}
|
|
t !== e && be && (be = null), be && J.setValue(be.chartWidget);
|
|
for (s = 0; s < i || s < X.length; s++) {
|
|
var r = X[s];
|
|
if (be ? be === r : s < i && (!r || !Ue(r))) {
|
|
if (r) {
|
|
if (Pe.appendChild(r.container.value()), r.hiddenInLayout
|
|
.setValue(!1), oe) {
|
|
var o = re.shift();
|
|
o && (ne = !0, r.chartWidget.loadContent(o.content, ae),
|
|
ne = !1)
|
|
}
|
|
} else Xe(s), r = X[s];
|
|
r.container.value().classList.toggle("multiple", i > 1), r
|
|
.fullscreen.setValue(be === r)
|
|
} else r && $e(r)
|
|
}
|
|
We(), et(),
|
|
function() {
|
|
for (var e = te.count, t = e, i = 0; i < e; i++) X[i] && Ue(X[i]) &&
|
|
t--;
|
|
ee.setValue(t), Q.setValue(t > 1)
|
|
}(), Ze(), X.forEach((function(e) {
|
|
e.chartWidget.onZoom().subscribe(this, (function(e) {
|
|
Te.fire(e)
|
|
}))
|
|
})), X.forEach((function(e) {
|
|
e.chartWidget.onScroll().subscribe(this, (function() {
|
|
Ie.fire()
|
|
}))
|
|
})), ee.value() < 1 && i > 0 && X[i - 1].rdState.bridge().attach()
|
|
}
|
|
|
|
function et() {
|
|
var e = Math.min(te.count, X.length) - 1;
|
|
if (e < 0) J.deleteValue();
|
|
else {
|
|
var t = $;
|
|
t < 0 && (t = 0), t > e && (t = e), J.setValue(X[t].chartWidget)
|
|
}
|
|
}
|
|
|
|
function tt() {
|
|
for (var e = X.length; e--;) {
|
|
var t = e === $;
|
|
X[e].container.value().classList.toggle("active", t), X[e].container
|
|
.value().classList.toggle("inactive", !t)
|
|
}
|
|
}
|
|
|
|
function it(e) {}
|
|
fe.subscribe(We), ge.subscribe(We), this.updateLayout = We;
|
|
var st = new t,
|
|
rt = new b,
|
|
nt = new b,
|
|
ot = null;
|
|
|
|
function at(e) {
|
|
var t = e.mainSeries().properties();
|
|
t.style.subscribe(null, lt), lt(t.style), e.model()
|
|
.onSelectedSourceChanged().subscribe(null, ct), ct(e.selection()
|
|
.allSources())
|
|
}
|
|
|
|
function lt(e) {
|
|
rt.setValue(e.value())
|
|
}
|
|
|
|
function ct() {
|
|
var e = ot.model();
|
|
nt.setValue(e.selection().allSources())
|
|
}
|
|
|
|
function ht(e) {
|
|
for (var t = !1, i = 0; i < X.length; i++) {
|
|
var s = X[i].chartWidget;
|
|
if (s.hasModel()) s.model().mainSeries().properties().symbol.value() !==
|
|
e && (t || (we.beginUndoMacro("Change Symbol"), t = !0), s
|
|
.setSymbol(e))
|
|
}
|
|
t && we.endUndoMacro()
|
|
}
|
|
J.subscribe((function(e) {
|
|
if (e) {
|
|
for (var t, i = X.length; i--;)
|
|
if (X[i].chartWidget === e) {
|
|
t = i;
|
|
break
|
|
} if (!isFinite(t)) throw new Error(
|
|
"Cannot make detached ChartWidget active");
|
|
if ($ !== t) {
|
|
be && (Ue(X[t]) || (be = X[t])), $ = t, tt();
|
|
for (i = X.length; i--;) X[i].chartWidget !== e && X[i]
|
|
.chartWidget.setActive(!1);
|
|
yt(), e.setActive(!0)
|
|
}! function(e) {
|
|
if (ot !== e) {
|
|
if (ot && (ot.modelCreated().unsubscribe(null, at),
|
|
ot.hasModel())) {
|
|
var t = ot.model();
|
|
t.mainSeries().properties().style.unsubscribe(
|
|
null, lt), t.model()
|
|
.onSelectedSourceChanged().unsubscribe(null,
|
|
ct), ot = null
|
|
}
|
|
e && (ot = e, e.hasModel() ? at(e.model()) : e
|
|
.modelCreated().subscribe(null, at))
|
|
}
|
|
}(e)
|
|
}
|
|
}), {
|
|
callWithLast: !0
|
|
});
|
|
var ut = !1,
|
|
dt = !1;
|
|
|
|
function pt(e) {
|
|
var t = Math.max(1, window.devicePixelRatio || 1);
|
|
if (e && e.onlyActiveChart || be) return {
|
|
layout: "s",
|
|
hidpiRatio: t,
|
|
theme: x().name,
|
|
charts: [J.value().images(e)]
|
|
};
|
|
for (var i = [], s = te.count, r = {
|
|
showCollapsedStudies: (e = e || {}).showCollapsedStudies,
|
|
status: e.status
|
|
}, n = 0; n < X.length && n < s; n++) i.push(X[n].chartWidget.images(
|
|
r));
|
|
return {
|
|
layout: ie,
|
|
hidpiRatio: t,
|
|
theme: x().name,
|
|
charts: i
|
|
}
|
|
}
|
|
|
|
function _t() {
|
|
const e = {
|
|
snapshotUrl: z.snapshotUrl
|
|
};
|
|
const t = E("any");
|
|
return (t ? m.getImageOfChartSilently : m.copyToClipboardImageOfChart)(k, e)
|
|
.then((function(e) {
|
|
return _.emit("onScreenshotReady", e), t || _.emit(
|
|
"onServerScreenshotCopiedToClipboard"), e
|
|
}))
|
|
}
|
|
|
|
function mt(e) {
|
|
if (0 !== X.length) {
|
|
for (var t = X.length; t--;) X[t].chartWidget.setActive(!1);
|
|
X[$].chartWidget.setActive(e)
|
|
}
|
|
}
|
|
Z || (de.add({
|
|
desc: "Switch active chart",
|
|
hotkey: 9,
|
|
handler: function() {}
|
|
}), de.add({
|
|
desc: "Switch active chart",
|
|
hotkey: p.Modifiers.Shift + 9,
|
|
handler: function() {}
|
|
})), z.takeScreenshotEnabled && (de.add({
|
|
desc: "Screenshot server",
|
|
hotkey: p.Modifiers.Alt + 83,
|
|
handler: function() {
|
|
_t()
|
|
}
|
|
}), E("any") || (de.add({
|
|
desc: "Download client screenshot",
|
|
hotkey: p.Modifiers.Mod + p.Modifiers.Alt + 83,
|
|
handler: function() {
|
|
m.downloadClientScreenshot(k)
|
|
}
|
|
}), de.add({
|
|
desc: "Copy client screenshot",
|
|
hotkey: p.Modifiers.Mod + p.Modifiers.Shift + 83,
|
|
handler: function() {
|
|
m.copyToClipboardClientScreenshot(k).then(() => {
|
|
_.emit(
|
|
"onClientScreenshotCopiedToClipboard"
|
|
)
|
|
})
|
|
}
|
|
}))), z.saveChartEnabled && de.add({
|
|
desc: "Save Chart Layout",
|
|
hotkey: p.Modifiers.Mod + 83,
|
|
handler: function() {
|
|
st.fire()
|
|
}
|
|
});
|
|
var ft = new Map,
|
|
gt = new Map;
|
|
const bt = W(Be());
|
|
|
|
function vt(e) {
|
|
if (f.enabled("charting_library_base")) return e;
|
|
if ("s" === e || ve.containsData || Z || (void 0)((void 0)
|
|
.MULTIPLE_CHARTS) && (void 0)((void 0).MULTIPLE_CHARTS).limit >= n[
|
|
e]
|
|
.count) return e;
|
|
return "s"
|
|
}
|
|
|
|
function St(e, t) {
|
|
if (oe = !0, ae = Boolean(t), re = [], e) {
|
|
e.charts || (e = {
|
|
layout: "s",
|
|
charts: [e]
|
|
});
|
|
var i = new Set;
|
|
e.charts.forEach((function(e) {
|
|
e.chartId && i.add(e.chartId)
|
|
})), e.charts.forEach((function(e) {
|
|
if (!e.chartId) {
|
|
var t = Je((function(e) {
|
|
return i.has(e)
|
|
}));
|
|
i.add(t), e.chartId = t
|
|
}
|
|
})), ie = vt(e.layout || "s");
|
|
for (var s = 0; s < e.charts.length; s++) {
|
|
var r = e.charts[s];
|
|
re.push({
|
|
content: r
|
|
})
|
|
}
|
|
e.symbolLock && le.setValue(!0), e.intervalLock && ce.setValue(!0), e
|
|
.trackTimeLock && he.setValue(!0)
|
|
}
|
|
Qe(ie), u.init(), u.tool.subscribe(wt), u.tool.subscribe(yt), oe = !1,
|
|
ae = !1
|
|
}
|
|
|
|
function yt() {
|
|
var e = J.value();
|
|
X.forEach((function(t) {
|
|
t.chartWidget !== e && t.chartWidget
|
|
.updateCrossHairPositionIfNeeded()
|
|
})), e && e.updateCrossHairPositionIfNeeded()
|
|
}
|
|
|
|
function wt() {
|
|
X.forEach((function(e) {
|
|
e.chartWidget.onToolChanged()
|
|
}))
|
|
}
|
|
z.globalEvents && bt.listen(), Object.assign(this, {
|
|
createChartWidget: Ge,
|
|
getAll: function() {
|
|
return X.map((function(e) {
|
|
return e.chartWidget
|
|
}))
|
|
},
|
|
destroy: function() {
|
|
mt(!1), null !== ke && (ke(), ke = null), Me(), Oe(), X
|
|
.forEach((function(e) {
|
|
void 0 !== e.timingsMeter && e.timingsMeter
|
|
.destroy(), e.chartWidget.destroy()
|
|
})), z.resizerBridge.remove(), window
|
|
.removeEventListener("resize", We), u.tool.unsubscribe(
|
|
yt), u.tool.unsubscribe(wt), Ce.resolve(), Pe
|
|
.remove(), ft.clear(), gt.clear(), de.destroy(), bt &&
|
|
bt.destroy()
|
|
},
|
|
layout: me.readonly(),
|
|
setLayout: Qe,
|
|
activeChartWidget: J,
|
|
viewMode: se,
|
|
activeChartStyle: rt.readonly(),
|
|
setChartStyleToWidget: function(e, t) {
|
|
t || (t = J.value()), t && function(e, t) {
|
|
var i = e.model(),
|
|
s = i.mainSeries().properties().style;
|
|
i.setChartStyleProperty(s, t, "Change Series Style")
|
|
}(t, e)
|
|
},
|
|
selectedSources: nt.readonly(),
|
|
metaInfo: ye,
|
|
state: function(e, t, i, s) {
|
|
for (var r = [], n = Ne(), o = 0; o < n; o++) {
|
|
var a = Fe(o, e, t, i, s);
|
|
a && r.push(a)
|
|
}
|
|
var l = {
|
|
name: k.metaInfo.name.value(),
|
|
layout: ie,
|
|
charts: r
|
|
};
|
|
return le.value() && (l.symbolLock = 1), ce.value() && (l
|
|
.intervalLock = 1), he.value() && (l.trackTimeLock =
|
|
1), l
|
|
},
|
|
lineToolsAndGroupsDTOs: function() {
|
|
return B(Be())
|
|
},
|
|
resetLineToolsInvalidated: function(e, t) {
|
|
return j(Be(), e, t)
|
|
},
|
|
applyLineToolUpdateNotification: F.bind(null, X),
|
|
asyncState: function() {
|
|
for (var e, t = [], i = Ne(), s = 0; s < i; s++) t.push((e =
|
|
s, N(Be(), e)));
|
|
return Promise.all(t).then((function(e) {
|
|
for (var t = {
|
|
charts: []
|
|
}, i = 0; i < e.length; i++) t.charts
|
|
.push(e[i]);
|
|
return t
|
|
}))
|
|
},
|
|
readOnly: function() {
|
|
return Z
|
|
},
|
|
onZoom: function() {
|
|
return Te
|
|
},
|
|
onScroll: function() {
|
|
return Ie
|
|
},
|
|
lock: {
|
|
symbol: le,
|
|
setSymbolLockWithUndo: function(e) {
|
|
if (e !== le.value()) {
|
|
if (we.beginUndoMacro("Symbol Lock"), e)
|
|
for (var t = J.value(), i = t.getSymbol(), s =
|
|
0; s < X.length; s++) {
|
|
var r = X[s].chartWidget;
|
|
r !== t && (r.getSymbol() !== i && r
|
|
.setSymbol(i))
|
|
}
|
|
we.setWatchedValue(le, e, "Symbol Lock"), we
|
|
.endUndoMacro()
|
|
}
|
|
},
|
|
interval: ce,
|
|
setIntervalLockWithUndo: function(e) {
|
|
if (e !== ce.value()) {
|
|
if (we.beginUndoMacro("Interval Lock"), e)
|
|
for (var t = J.value(), i = t.getResolution(),
|
|
s = 0; s < X.length; s++) {
|
|
var r = X[s].chartWidget;
|
|
r !== t && (r.getResolution() !== i && r
|
|
.setResolution(i))
|
|
}
|
|
we.setWatchedValue(ce, e, "Resolution Lock"), we
|
|
.endUndoMacro()
|
|
}
|
|
},
|
|
crosshair: ue,
|
|
trackTime: he,
|
|
setTrackTimeWithUndo: function(e) {
|
|
he.value() !== e && we.setWatchedValue(he, e,
|
|
"Track Time")
|
|
}
|
|
},
|
|
setSymbol: function(e) {
|
|
le.value() ? ht(e) : J.value().setSymbol(e)
|
|
},
|
|
setResolution: function(e) {
|
|
ne || dt || ut || function(e) {
|
|
if (L(e), ut = !0, ce.value()) {
|
|
for (var t = !1, i = 0; i < X.length; i++) {
|
|
var s = X[i].chartWidget;
|
|
s.model().mainSeries().properties().interval
|
|
.value() !== e && (t || (we
|
|
.beginUndoMacro(
|
|
"Change Resolution"), t = !0
|
|
), s.setResolution(e))
|
|
}
|
|
t && we.endUndoMacro()
|
|
} else J.value().setResolution(e);
|
|
ut = !1
|
|
}(e)
|
|
},
|
|
setTimeFrame: function(e) {
|
|
if (!ne && !dt) {
|
|
if (dt = !0, ce.value())
|
|
for (var t = 0; t < X.length; t++) {
|
|
var i, s = X[t].chartWidget;
|
|
null !== (i = s.model().model()
|
|
.appliedTimeFrame().value()) && I(i,
|
|
e) || s.loadRange(e)
|
|
} else null !== (i = J.value().model().model()
|
|
.appliedTimeFrame().value()) && I(i, e) || J
|
|
.value().loadRange(e);
|
|
dt = !1
|
|
}
|
|
},
|
|
updateLayout: We,
|
|
setChartLayoutWithUndo: function(e) {
|
|
return e = vt(e), me.value() !== e && (we.pushUndoCommand(
|
|
new g(k, e)), !0)
|
|
},
|
|
images: pt,
|
|
clientSnapshot: function(e) {
|
|
const t = {
|
|
hideResolution: e && e.hideResolution
|
|
},
|
|
i = e && e.hideResolution;
|
|
let s = e;
|
|
return O(pt({
|
|
showCollapsedStudies: !0,
|
|
status: t,
|
|
hideResolution: i
|
|
}), s)
|
|
},
|
|
tags: function() {
|
|
for (var e = [], t = 0; t < X.length && t < te.count; t++)
|
|
e = e.concat(X[t].chartWidget.tags());
|
|
return e = (e = Array.from(new Set(e))).map((function(e) {
|
|
return e.toLowerCase().replace(/\W+/g, "-")
|
|
.replace(/-+/g, "-").replace(/^-|-$/g,
|
|
"")
|
|
}))
|
|
},
|
|
syncCrosshair: function(e, t, i, s) {
|
|
if (i || _e)
|
|
for (var r = te.count, n = 0; n < X.length && n <
|
|
r; n++) {
|
|
var o = X[n].chartWidget;
|
|
o !== t && (X[n].rdState.bridge().visible.value() &&
|
|
o.hasModel() && o.model().model()
|
|
.setExternalPosition(e, s))
|
|
}
|
|
},
|
|
syncScroll: function(e, t) {
|
|
if (he.value()) {
|
|
var i = te.count;
|
|
we.beginUndoMacro("Sync Time");
|
|
for (var s = 0; s < X.length && s < i; s++) {
|
|
var r = X[s].chartWidget;
|
|
if (r.hasModel()) {
|
|
var n = r.model().model();
|
|
if (n === t) continue;
|
|
n.syncTimeWithModel(t, e)
|
|
}
|
|
}
|
|
we.endUndoMacro()
|
|
}
|
|
},
|
|
setSymbolAll: ht,
|
|
clearChartMetaInfo: function() {
|
|
ye.id.setValue(null), ye.uid.setValue(void 0), ye.name
|
|
.setValue(void 0)
|
|
},
|
|
takeScreenshot: function() {
|
|
var e = {
|
|
snapshotUrl: z.snapshotUrl
|
|
};
|
|
return m.getImageOfChartSilently(k, e).then((function(e) {
|
|
return _.emit("onScreenshotReady", e), e
|
|
}))
|
|
},
|
|
takeServerScreenshot: _t,
|
|
loadContent: St,
|
|
purgeUnusedWidgets: function() {
|
|
for (var e = n[ie].count; e < X.length; e++) X[e]
|
|
.chartWidget.destroy();
|
|
X.splice(n[ie].count)
|
|
},
|
|
applyOverrides: function(e) {
|
|
for (var t = 0; t < X.length; t++) X[t].chartWidget
|
|
.applyOverrides(e)
|
|
},
|
|
applyStudiesOverrides: function(e) {
|
|
for (var t = 0; t < X.length; t++) X[t].chartWidget
|
|
.applyStudiesOverrides(e)
|
|
},
|
|
switchChart: it,
|
|
startFullscreen: function() {
|
|
z.resizerBridge.requestFullscreen()
|
|
},
|
|
exitFullscreen: function() {
|
|
z.resizerBridge.exitFullscreen()
|
|
},
|
|
destroyPromise: function() {
|
|
return Ce.promise()
|
|
},
|
|
chartWidgetCreated: function() {
|
|
return xe
|
|
},
|
|
saveKeysPressed: function() {
|
|
return st
|
|
},
|
|
getContainer: function() {
|
|
return Pe
|
|
},
|
|
onWidget: ve.onWidget,
|
|
applyTheme: function(e, t, i, s, r, n, o) {
|
|
void 0 === n && (n = !0);
|
|
const a = x().name;
|
|
return Promise.all(t ? [J.value()] : X.concat(re).map((e,
|
|
t) => e.chartWidget ? e.chartWidget :
|
|
new Promise(e => {
|
|
const i = Xe(t, () => e(i));
|
|
$e(X[t])
|
|
}))).then(t => {
|
|
o ? (r && new C(a, s, n).redo(), t.forEach((
|
|
function(t) {
|
|
t.model().model()
|
|
.restoreTheme(e, i, o)
|
|
}))) : (we.beginUndoMacro(
|
|
"Apply Chart Theme"), r && we
|
|
.pushUndoCommand(new C(a, s, n)), t
|
|
.forEach((function(t) {
|
|
t.model().model()
|
|
.restoreTheme(e, i)
|
|
})), we.endUndoMacro())
|
|
})
|
|
},
|
|
applyIndicatorsToAllCharts: function(e) {
|
|
D(Be(), e)
|
|
},
|
|
applyIndicatorsToAllChartsAvailable: function() {
|
|
return !Z && je() > 1
|
|
},
|
|
applyIndicatorToAllCharts: function(e, t, i, s) {
|
|
V(Be(), e, t, i, s)
|
|
},
|
|
setActive: mt,
|
|
inlineChartsCount: ee.readonly(),
|
|
revertToInline: function() {
|
|
Ye(null);
|
|
for (var e = 0; e < X.length; e++) X[e].rdState.bridge()
|
|
.attach()
|
|
},
|
|
chartMarketStatuses: function() {
|
|
return X.map((function(e) {
|
|
return "-"
|
|
}))
|
|
},
|
|
chartSeriesStatuses: function() {
|
|
return X.map((function(e) {
|
|
var t = e.chartWidget.hasModel() ? e
|
|
.chartWidget.model().mainSeries()
|
|
.status() : null;
|
|
return (null === t ? "" : T
|
|
.SERIES_STATUS_TEXT[t]) + " (" + t +
|
|
")"
|
|
}))
|
|
},
|
|
undoHistory: we,
|
|
applyPreferencesToAllCharts: function(e) {},
|
|
getToasts: ze,
|
|
addCustomSource: function(e, t, i) {
|
|
s(!ft.has(e),
|
|
"Cannot create the same custom source multiple times"
|
|
), ft.set(e, {
|
|
factory: t,
|
|
layer: i
|
|
});
|
|
for (var r = 0; r < X.length; ++r) {
|
|
var n = X[r].chartWidget;
|
|
n.hasModel() && n.model().model().addCustomSource(e, t,
|
|
i)
|
|
}
|
|
},
|
|
removeCustomSource: function(e) {
|
|
s(ft.has(e), "Cannot remove not created custom source"), ft
|
|
.delete(e);
|
|
for (var t = 0; t < X.length; ++t) {
|
|
var i = X[t].chartWidget;
|
|
i.hasModel() && i.model().model().removeCustomSource(e)
|
|
}
|
|
},
|
|
addCustomWidgetToLegend: function(e, t) {
|
|
s(!gt.has(e),
|
|
"Cannot create the same custom widget in legend multiple times"
|
|
), gt.set(e, t);
|
|
for (var i = 0; i < X.length; ++i) X[i].chartWidget
|
|
.addCustomWidgetToLegend(e, t)
|
|
},
|
|
setViewMode: function(e) {
|
|
se.setValue(e)
|
|
},
|
|
moveActiveChartWithUndo: function(e) {},
|
|
activeChartCanBeMoved: function() {
|
|
return !1
|
|
},
|
|
generalPropertiesDefinitions: function() {
|
|
return J.value().generalPropertiesDefinitions()
|
|
},
|
|
reconnectChartApi: function(e) {
|
|
(void 0)(e)
|
|
},
|
|
setBroker: function(e) {
|
|
0
|
|
},
|
|
setSaveChartService: function(e) {
|
|
pe = e;
|
|
for (var t = 0; t < X.length; ++t) {
|
|
X[t].chartWidget.setSaveChartService(e)
|
|
}
|
|
},
|
|
getCompareDialogRenderer: function() {
|
|
return Ve
|
|
},
|
|
getChartPropertiesDialogRenderer: function() {
|
|
return De
|
|
},
|
|
clipboard: bt,
|
|
chartsSymbols: function() {
|
|
return H(Be())
|
|
}
|
|
}), St(z.content, !0), me.subscribe((function() {
|
|
tt()
|
|
})), me.hook = function(e) {
|
|
return e === this.value() ? e : vt(e)
|
|
}, Z && (me.writeLock = !0), window.addEventListener("resize", We);
|
|
var Pt = 0;
|
|
|
|
function Ct() {
|
|
0 === --Pt && _.emitOnce("onChartReady")
|
|
}
|
|
if (X.forEach((function(e) {
|
|
if (e) {
|
|
Pt++;
|
|
var t = e.chartWidget;
|
|
t.withModel(null, (function() {
|
|
z.metaInfo && t.model().model()
|
|
.setChartSaveTime(1e3 * z.metaInfo
|
|
.lastModified);
|
|
var e = t.model().mainSeries();
|
|
if (e.bars().size() > 0 || e.isStatusBad())
|
|
Ct();
|
|
else {
|
|
var i = e.dataEvents(),
|
|
s = function() {
|
|
Ct(), i.barReceived()
|
|
.unsubscribe(null, s), i
|
|
.completed().unsubscribe(
|
|
null, s), i.error()
|
|
.unsubscribe(null, s)
|
|
};
|
|
i.barReceived().subscribe(null, s), i
|
|
.completed().subscribe(null, s), i
|
|
.error().subscribe(null, s)
|
|
}
|
|
}))
|
|
}
|
|
})), a()) {
|
|
var xt = u.tool.setValue;
|
|
u.tool.setValue = function() {
|
|
k.selectedSources.value() && k.activeChartWidget.value().model()
|
|
.lineBeingCreated() && k.activeChartWidget.value().model()
|
|
.cancelCreatingLine(), xt.apply(u.tool, arguments)
|
|
}
|
|
}
|
|
Promise.all(X.map((function(e) {
|
|
return S(e.chartWidget.modelCreated()).promise
|
|
}))).then((function() {
|
|
return Promise.all(X.map((function(e) {
|
|
return S(e.chartWidget.model().mainSeries()
|
|
.dataEvents().symbolResolved())
|
|
.promise
|
|
})))
|
|
})).then((function() {
|
|
window.saver && window.is_authenticated && z.widgetOptions
|
|
.justCloned && window.saver.saveChartSilently()
|
|
})).catch(P.logError.bind(P))
|
|
}
|
|
}).call(this, i("aIyQ"))
|
|
},
|
|
"/YGI": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s, r = i("0YCj"),
|
|
n = i.n(r);
|
|
! function(e) {
|
|
e.StudyCannotBeChild = "cannot_be_child", e.StubWasRemoved = "stub_was_removed", e
|
|
.CannotGetMetainfo = "cannot_get_metainfo", e.Cancelled = "cancelled", e.Unknown =
|
|
"unknown"
|
|
}(s || (s = {}));
|
|
var o = i("txPx");
|
|
i.d(t, "StudyInserter", (function() {
|
|
return l
|
|
}));
|
|
const a = Object(o.getLogger)("Chart.Studies.StudyInserter");
|
|
class l {
|
|
constructor(e, t, i) {
|
|
this._parentSource = void 0, this._propsState = void 0, this._preferredPriceScale =
|
|
void 0, this._allowChangeCurrency = !1, this._allowChangeUnit = !1, this
|
|
._paneSize = void 0, this._forceOverlay = !1, this._studyMetaInfoRepository = t,
|
|
this._inserterImpl = i, this._studyDescriptor = e
|
|
}
|
|
setParentSource(e) {
|
|
this._parentSource = e || void 0
|
|
}
|
|
setPaneSize(e) {
|
|
this._paneSize = e
|
|
}
|
|
setPreferredPriceScale(e) {
|
|
this._preferredPriceScale = e
|
|
}
|
|
setAllowChangeCurrency(e) {
|
|
this._allowChangeCurrency = e
|
|
}
|
|
setAllowChangeUnit(e) {
|
|
this._allowChangeUnit = e
|
|
}
|
|
setForceOverlay(e) {
|
|
this._forceOverlay = e
|
|
}
|
|
setPropertiesState(e) {
|
|
this._propsState = e
|
|
}
|
|
setTargetPriceScaleMode(e) {
|
|
this._targetPriceScaleMode = e
|
|
}
|
|
async insert(e, t) {
|
|
const i = void 0 !== (r = this._inserterImpl).createStub && void 0 !== r
|
|
.removeStub ? this._inserterImpl.createStub() : null;
|
|
var r;
|
|
let n, o = !0;
|
|
try {
|
|
n = await this._studyMetaInfoRepository.findById(this._studyDescriptor)
|
|
} catch (e) {
|
|
return a.logWarn("Cannot get study " + JSON.stringify(this._studyDescriptor)),
|
|
Promise.reject(s.CannotGetMetainfo)
|
|
} finally {
|
|
null !== i && (o = this._inserterImpl.removeStub(i))
|
|
}
|
|
if (!o) return Promise.reject(s.StubWasRemoved);
|
|
if (void 0 !== t && t.cancelled) return Promise.reject(s.Cancelled);
|
|
if (!this._canApplyStudyToParent(n)) return Promise.reject(s.StudyCannotBeChild);
|
|
const l = {
|
|
...n.defaults.inputs
|
|
},
|
|
c = void 0 !== e ? await e(l, n.inputs, n) : {};
|
|
if (void 0 !== t && t.cancelled) return Promise.reject(s.Cancelled);
|
|
const h = this._insertStudy(n, c);
|
|
return null === h ? Promise.reject(s.Unknown) : h
|
|
}
|
|
_insertStudy(e, t) {
|
|
return this._inserterImpl.createStudy(e, t, null, this._propsState, this
|
|
._forceOverlay, this._parentSource, this._preferredPriceScale, this
|
|
._allowChangeCurrency, this._allowChangeUnit, this._paneSize, this
|
|
._targetPriceScaleMode)
|
|
}
|
|
_canApplyStudyToParent(e) {
|
|
return void 0 === this._parentSource || n.a.canBeChild(e)
|
|
}
|
|
}
|
|
},
|
|
"/bs+": function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return r
|
|
})), i.d(t, "b", (function() {
|
|
return n
|
|
}));
|
|
var s = i("E6p6");
|
|
|
|
function r(e, t, i) {
|
|
if (i.isDays()) return t;
|
|
if (e.moveTo(1e3 * t), i.isIntraday()) {
|
|
const i = e.indexOfBar(1e3 * t);
|
|
if (i < 0) throw new Error(t + " is out of the instrument session ");
|
|
return e.endOfBar(i) / 1e3
|
|
}
|
|
return e.startOfBar(s.SessionStage.LASTBAR_SESSION) / 1e3
|
|
}
|
|
|
|
function n(e, t, i) {
|
|
if (i.isDays()) return t;
|
|
const s = 1e3 * t - 1;
|
|
if (e.moveTo(s), i.isIntraday()) {
|
|
const i = e.indexOfBar(s);
|
|
if (i < 0) throw new Error(t + " is out of the instrument session ");
|
|
return e.startOfBar(i) / 1e3
|
|
}
|
|
return t = e.startOfBar(0) / 1e3
|
|
}
|
|
},
|
|
"/hKg": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "PaneRendererCandles", (function() {
|
|
return l
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("VdBB"),
|
|
n = i("gAom"),
|
|
o = i("Zp/P"),
|
|
a = i("ExCE");
|
|
class l extends a.a {
|
|
constructor(e) {
|
|
super(), this._barSpacing = 1, this._barWidth = 1, this._borderVisible = !1,
|
|
this._barBorderWidth = 1, this._wickVisible = !1, this._bodyVisible = !0,
|
|
this._borderColor = void 0, this._wickColor = void 0, this._hittest =
|
|
void 0, e && this.setData(e)
|
|
}
|
|
setData(e) {
|
|
this._bars = e.bars, this._barSpacing = e.barSpacing, this._borderVisible = e
|
|
.borderVisible, this._bodyVisible = e.bodyVisible, this._wickVisible = e
|
|
.wickVisible, this._borderColor = e.borderColor, this._wickColor = e
|
|
.wickColor, this._hittest = e.hittest
|
|
}
|
|
hitTest(e) {
|
|
return this._wickVisible || this._borderVisible || this._bodyVisible ? super
|
|
.hitTest(e) : null
|
|
}
|
|
draw(e, t) {
|
|
if (0 === this._bars.length) return;
|
|
const i = t.pixelRatio;
|
|
if (this._barWidth = Object(o.optimalCandlestickWidth)(this._barSpacing, i),
|
|
this._barWidth >= 2) {
|
|
Math.floor(i) % 2 != this._barWidth % 2 && this._barWidth--
|
|
}
|
|
this._wickVisible && this._drawWicks(e, i), this._borderVisible && this
|
|
._drawBorder(e, i), this._bodyVisible && this._drawCandles(e, i)
|
|
}
|
|
_getTolerance() {
|
|
return Object(o.interactionTolerance)().series + this._barBorderWidth / 2
|
|
}
|
|
_getBarSpacing() {
|
|
return this._barSpacing
|
|
}
|
|
_getHitTest() {
|
|
return this._hittest || new r.HitTestResult(r.HitTestResult.REGULAR)
|
|
}
|
|
_isPointAtBar(e, t, i) {
|
|
const s = this._bodyVisible || this._borderVisible,
|
|
r = this._wickVisible;
|
|
if (!s && !r) return !1;
|
|
if (s) {
|
|
const s = r ? Math.min(e.high, e.low) : Math.min(e.open, e.close),
|
|
n = r ? Math.max(e.high, e.low) : Math.max(e.open, e.close);
|
|
return s - i <= t && t <= n + i
|
|
} {
|
|
const s = Math.min(e.open, e.close),
|
|
r = Math.max(e.open, e.close);
|
|
return e.high - i <= t && t <= s + i || r - i <= t && t <= e.low + i
|
|
}
|
|
}
|
|
_drawWicks(e, t) {
|
|
const i = this._bars;
|
|
let r = "",
|
|
n = Math.min(Math.floor(t), Math.floor(this._barSpacing * t));
|
|
n = Math.max(Math.floor(t), Math.min(n, this._barWidth));
|
|
const o = Math.floor(.5 * n);
|
|
let a = null;
|
|
for (const l of i) {
|
|
const i = l.wickColor ? l.wickColor : Object(s.ensureDefined)(this
|
|
._wickColor);
|
|
i !== r && (e.fillStyle = i, r = i);
|
|
const c = Math.round(Math.min(l.open, l.close) * t),
|
|
h = Math.round(Math.max(l.open, l.close) * t),
|
|
u = Math.round(l.high * t),
|
|
d = Math.round(l.low * t);
|
|
let p = Math.round(t * l.time) - o;
|
|
const _ = p + n - 1;
|
|
null !== a && (p = Math.max(a + 1, p), p = Math.min(p, _));
|
|
const m = _ - p + 1;
|
|
e.fillRect(p, u, m, c - u), e.fillRect(p, h + 1, m, d - h), a = _
|
|
}
|
|
}
|
|
_calculateBorderWidth(e) {
|
|
let t = Math.floor(1 * e);
|
|
this._barWidth <= 2 * t && (t = Math.floor(.5 * (this._barWidth - 1)));
|
|
const i = Math.max(Math.floor(e), t);
|
|
return this._barWidth <= 2 * i ? Math.max(Math.floor(e), Math.floor(1 * e)) : i
|
|
}
|
|
_drawBorder(e, t) {
|
|
let i = "";
|
|
const r = this._calculateBorderWidth(t);
|
|
let o = null;
|
|
for (const a of this._bars) {
|
|
if (a.borderColor !== i && (e.fillStyle = a.borderColor ? a.borderColor :
|
|
Object(s.ensureDefined)(this._borderColor), i = a.borderColor), this
|
|
._bodyVisible && a.hollow) continue;
|
|
let l = Math.round(a.time * t) - Math.floor(.5 * this._barWidth);
|
|
const c = l + this._barWidth - 1,
|
|
h = Math.round(Math.min(a.open, a.close) * t),
|
|
u = Math.round(Math.max(a.open, a.close) * t);
|
|
if (null !== o && (l = Math.max(o + 1, l), l = Math.min(l, c)), this
|
|
._barSpacing * t > 2 * r) Object(n.fillRectInnerBorder)(e, l, h, c - l +
|
|
1, u - h + 1, r);
|
|
else {
|
|
const t = c - l + 1;
|
|
e.fillRect(l, h, t, u - h + 1)
|
|
}
|
|
o = c
|
|
}
|
|
}
|
|
_drawCandles(e, t) {
|
|
let i = "";
|
|
const s = this._calculateBorderWidth(t);
|
|
for (const r of this._bars) {
|
|
if (this._borderVisible && this._barWidth <= 2 * s && !r.hollow) continue;
|
|
let o = Math.round(Math.min(r.open, r.close) * t),
|
|
a = Math.round(Math.max(r.open, r.close) * t),
|
|
l = Math.round(r.time * t) - Math.floor(.5 * this._barWidth),
|
|
c = l + this._barWidth - 1;
|
|
if (r.color !== i) {
|
|
const t = r.color;
|
|
e.fillStyle = t, i = t
|
|
}
|
|
if (r.hollow) e.fillStyle = r.color, Object(n.fillRectInnerBorder)(e, l, o,
|
|
c - l + 1, a - o + 1, s);
|
|
else {
|
|
if (this._borderVisible && (l += s, o += s, c -= s, a -= s), o > a)
|
|
continue;
|
|
e.fillRect(l, o, c - l + 1, a - o + 1)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/kal": function(e, t) {
|
|
e.exports =
|
|
'<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28"><g fill="none" fill-rule="evenodd" transform="translate(4 5)"><path fill="currentColor" d="M3 1h1v13.5H3z"/><circle stroke="currentColor" cx="3.5" cy="16.5" r="2"/><path fill="currentColor" d="M5.5 16H18v1H5.5z"/><path stroke="currentColor" d="M0 4L3.5.5 7 4m8 9l3.5 3.5L15 20"/></g></svg>'
|
|
},
|
|
"/qn+": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "convertPropertyToWatchedValue", (function() {
|
|
return n
|
|
}));
|
|
var s = i("hY0g"),
|
|
r = i.n(s);
|
|
|
|
function n(e) {
|
|
const t = new r.a(e.value());
|
|
let i = !1;
|
|
e.subscribe(t, () => {
|
|
i || (i = !0, t.setValue(e.value()), i = !1)
|
|
});
|
|
const s = () => {
|
|
i || (i = !0, e.setValue(t.value()), i = !1)
|
|
};
|
|
return t.subscribe(s), t.spawn(() => {
|
|
e.unsubscribeAll(t), t.unsubscribe(s)
|
|
})
|
|
}
|
|
},
|
|
"/tGj": function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e) {
|
|
return e.symbolSource() === e
|
|
}
|
|
i.r(t), i.d(t, "isSymbolSource", (function() {
|
|
return s
|
|
}))
|
|
},
|
|
"/z0S": function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return r
|
|
}));
|
|
var s = i("Kxc7");
|
|
|
|
function r(e, t) {
|
|
s.enabled("saveload_requires_authentication") ? window.runOrSignIn(e, t) : e()
|
|
}
|
|
},
|
|
"08i5": function(e, t, i) {
|
|
"use strict";
|
|
var s, r;
|
|
i.r(t), i.d(t, "AlertStatus", (function() {
|
|
return s
|
|
})), i.d(t, "Direction", (function() {
|
|
return r
|
|
})),
|
|
function(e) {
|
|
e[e.Waiting = 0] = "Waiting", e[e.Success = 1] = "Success", e[e.Failure = 2] = "Failure"
|
|
}(s || (s = {})),
|
|
function(e) {
|
|
e[e.Up = 1] = "Up", e[e.Down = 2] = "Down"
|
|
}(r || (r = {}))
|
|
},
|
|
"0C7r": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "intervalsVisibilitiesDefaults", (function() {
|
|
return s
|
|
}));
|
|
const s = {
|
|
ticks: !0,
|
|
seconds: !0,
|
|
secondsFrom: 1,
|
|
secondsTo: 59,
|
|
minutes: !0,
|
|
minutesFrom: 1,
|
|
minutesTo: 59,
|
|
hours: !0,
|
|
hoursFrom: 1,
|
|
hoursTo: 24,
|
|
days: !0,
|
|
daysFrom: 1,
|
|
daysTo: 366,
|
|
weeks: !0,
|
|
weeksFrom: 1,
|
|
weeksTo: 52,
|
|
months: !0,
|
|
monthsFrom: 1,
|
|
monthsTo: 12,
|
|
ranges: !0
|
|
}
|
|
},
|
|
"0F0w": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("aIyQ"),
|
|
r = i.n(s),
|
|
n = i("Eyy1"),
|
|
o = i("hY0g"),
|
|
a = i.n(o),
|
|
l = i("e3/o"),
|
|
c = i("txPx");
|
|
const h = Object(c.getLogger)("ChartApi.AbstractSession");
|
|
var u = i("ogJP");
|
|
i.d(t, "ChartSession", (function() {
|
|
return d
|
|
}));
|
|
Object(c.getLogger)("ChartSession");
|
|
class d extends class {
|
|
constructor(e, t, i) {
|
|
this._isConnected = new a.a(!1), this._state = 0, this._isConnectForbidden = !1,
|
|
this._sessionId = "", this._sessionIdChanged = new r.a, this._chartApi = e, this
|
|
._sessionPrefix = t, this._shouldReconnectAfterCriticalError = i
|
|
}
|
|
destroy() {
|
|
this._logNormal("Destroying session"), this._isConnected.unsubscribe(), this
|
|
.disconnect(), this._sessionIdChanged.destroy(), delete this._chartApi, this
|
|
._logNormal("Session has been destroyed")
|
|
}
|
|
isConnected() {
|
|
return this._isConnected
|
|
}
|
|
sessionId() {
|
|
return this._sessionId
|
|
}
|
|
onSessionIdChanged() {
|
|
return this._sessionIdChanged
|
|
}
|
|
connect() {
|
|
0 === this._state && (Object(n.assert)(!this._isConnectForbidden,
|
|
"Cannot call connect because it is forbidden at this moment"), this
|
|
._setSessionId(`${this._sessionPrefix}_${Object(l.randomHash)()}`), this
|
|
._logNormal("Connecting session - wait until transport stay connected"),
|
|
this._state = 1, this._chartApi.createSession(this._sessionId, this))
|
|
}
|
|
disconnect() {
|
|
0 !== this._state && (Object(n.assert)("" !== this._sessionId,
|
|
"sessionId must not be invalid"), this._logNormal(
|
|
"Disconnecting session..."), this._forbidConnectWhile(() => {
|
|
this._chartApi.connected() && this._sendRemoveSession(), this
|
|
._processDestroyingOnServer()
|
|
}))
|
|
}
|
|
onMessage(e) {
|
|
switch (e.method) {
|
|
case "connected":
|
|
return void this._onChartApiConnected();
|
|
case "disconnected":
|
|
return void this._onChartApiDisconnected();
|
|
case "critical_error":
|
|
const t = String(e.params[0]),
|
|
i = String(e.params[1]);
|
|
return void this._onCriticalError(t, i)
|
|
}
|
|
this._onMessage(e)
|
|
}
|
|
_getChartApi() {
|
|
return this._chartApi
|
|
}
|
|
_generateLogMessage(e) {
|
|
return `[${this._sessionId}] ${e}`
|
|
}
|
|
_onCriticalError(e, t) {
|
|
this._logError(`Critical error. Reason=${e}, info=${t}.`), this._forbidConnectWhile(
|
|
() => {
|
|
this._processDestroyingOnServer()
|
|
}), this._shouldReconnectAfterCriticalError ? (this._logNormal(
|
|
"Reconnecting after critical error..."), this.connect()) : this._logNormal(
|
|
"Reconnecting after critical error skipped")
|
|
}
|
|
_onChartApiConnected() {
|
|
Object(n.assert)(1 === this._state, "Session is not registered"), this._logNormal(
|
|
"Transport is connected. Creating session on the server"), this
|
|
._sendCreateSession(), this._state = 2, this._isConnected.setValue(!0)
|
|
}
|
|
_onChartApiDisconnected() {
|
|
this._logNormal("Transport is disconnected. Reconnecting..."), this
|
|
._forbidConnectWhile(() => {
|
|
this._processDestroyingOnServer()
|
|
}), this.connect()
|
|
}
|
|
_setSessionId(e) {
|
|
const t = this._sessionId;
|
|
this._logNormal(`Changing sessionId: old=${t}, new=${e}`), this._sessionId = e, this
|
|
._sessionIdChanged.fire(e, t)
|
|
}
|
|
_logNormal(e) {
|
|
h.logNormal(this._generateLogMessage(e))
|
|
}
|
|
_logError(e) {
|
|
h.logError(this._generateLogMessage(e))
|
|
}
|
|
_processDestroyingOnServer() {
|
|
this._state = 0, this._isConnected.setValue(!1), this._chartApi.removeSession(this
|
|
._sessionId), this._setSessionId("")
|
|
}
|
|
_forbidConnectWhile(e) {
|
|
this._isConnectForbidden = !0, e(), this._isConnectForbidden = !1
|
|
}
|
|
} {
|
|
constructor(e, t = !1) {
|
|
super(e, "cs", !1), this._sessionDisabled = !1, this._handler = null, this
|
|
._criticalError = new r.a, this._disableStatistics = t
|
|
}
|
|
destroy() {
|
|
this._criticalError.destroy(), this._handler = null, super.destroy()
|
|
}
|
|
serverTimeOffset() {
|
|
return this._getChartApi().serverTimeOffset()
|
|
}
|
|
switchTimezone(e) {
|
|
return this._getChartApi().switchTimezone(this.sessionId(), e)
|
|
}
|
|
defaultResolutions() {
|
|
return this._getChartApi().defaultResolutions()
|
|
}
|
|
availableCurrencies() {
|
|
return this._getChartApi().availableCurrencies()
|
|
}
|
|
availableUnits() {
|
|
return this._getChartApi().availableUnits()
|
|
}
|
|
resolveSymbol(e, t, i) {
|
|
return this._getChartApi().resolveSymbol(this.sessionId(), e, t, i)
|
|
}
|
|
requestFirstBarTime(e, t, i) {
|
|
return this._getChartApi().requestFirstBarTime(this.sessionId(), e, t, i)
|
|
}
|
|
createSeries(e, t, i, s, r, n, o) {
|
|
return this._getChartApi().createSeries(this.sessionId(), e, t, i, s, r, n, o)
|
|
}
|
|
modifySeries(e, t, i, s, r, n) {
|
|
return this._getChartApi().modifySeries(this.sessionId(), e, t, i, s, r, n)
|
|
}
|
|
removeSeries(e) {
|
|
return !!this.isConnected().value() && this._getChartApi().removeSeries(this
|
|
.sessionId(), e)
|
|
}
|
|
requestMoreData(e, t, i) {
|
|
return "number" == typeof e ? this._getChartApi().requestMoreData(this.sessionId(),
|
|
e) : this._getChartApi().requestMoreData(this.sessionId(), e, t, i)
|
|
}
|
|
requestMoreTickmarks(e, t, i) {
|
|
return Object(u.isNumber)(e) ? this._getChartApi().requestMoreTickmarks(this
|
|
.sessionId(), e) : this._getChartApi().requestMoreTickmarks(this
|
|
.sessionId(), e, t, i)
|
|
}
|
|
requestMetadata(e, t) {
|
|
(() => {
|
|
this._getChartApi().requestMetadata(this.sessionId(), e, t)
|
|
})()
|
|
}
|
|
isCanCreateStudy(e) {
|
|
return this._getChartApi().isCanCreateStudy(e)
|
|
}
|
|
createStudy(e, t, i, s, r, n, o) {
|
|
return this._getChartApi().createStudy(this.sessionId(), e, t, i, s, r, n, o)
|
|
}
|
|
rebindStudy(e, t, i, s, r, n, o) {
|
|
return this._getChartApi().rebindStudy(this.sessionId(), e, t, i, s, r, n, o)
|
|
}
|
|
modifyStudy(e, t, i, s) {
|
|
return this._getChartApi().modifyStudy(this.sessionId(), e, t, i, s)
|
|
}
|
|
removeStudy(e, t) {
|
|
return this._getChartApi().removeStudy(this.sessionId(), e, t)
|
|
}
|
|
createPointset(e, t, i, s, r, n) {
|
|
return this._getChartApi().createPointset(this.sessionId(), e, t, i, s, r, n)
|
|
}
|
|
modifyPointset(e, t, i, s) {
|
|
return this._getChartApi().modifyPointset(this.sessionId(), e, t, i, s)
|
|
}
|
|
removePointset(e) {
|
|
return this._getChartApi().removePointset(this.sessionId(), e)
|
|
}
|
|
setVisibleTimeRange(e, t, i, s, r, n) {
|
|
this._getChartApi().setVisibleTimeRange(this.sessionId(), e, t, i, s, !0, r, n)
|
|
}
|
|
criticalError() {
|
|
return this._criticalError
|
|
}
|
|
connect(e = null) {
|
|
null !== e && (this._handler = e), super.connect()
|
|
}
|
|
setHandler(e) {
|
|
this._handler = e
|
|
}
|
|
connected() {
|
|
return this.isConnected().value() && !this._sessionDisabled
|
|
}
|
|
disable() {
|
|
this._sessionDisabled = !0
|
|
}
|
|
chartApi() {
|
|
return this._getChartApi()
|
|
}
|
|
_sendCreateSession() {
|
|
Object.keys(this).forEach(e => {
|
|
/^(s|st|symbol_)\d+$/.test(e) && delete this[e]
|
|
}), this._getChartApi().chartCreateSession(this.sessionId(), this
|
|
._disableStatistics)
|
|
}
|
|
_sendRemoveSession() {
|
|
this._getChartApi().chartDeleteSession(this.sessionId())
|
|
}
|
|
_onMessage(e) {
|
|
this._handler && this._handler(e)
|
|
}
|
|
_onCriticalError(e, t) {
|
|
this._criticalError.fire(e, t), super._onCriticalError(e, t)
|
|
}
|
|
}
|
|
},
|
|
"0Pxc": function(e, t, i) {
|
|
"use strict";
|
|
var s = i("aO4+").Point,
|
|
r = i("GEp6").distanceToLine,
|
|
n = i("hfHJ"),
|
|
o = n.rotationMatrix,
|
|
a = n.scalingMatrix,
|
|
l = n.translationMatrix,
|
|
c = n.transformPoint,
|
|
h = i("Ss5c").LineDataSource,
|
|
u = i("Ocx9").DefaultProperty,
|
|
d = i("j3hX").LineToolColorsProperty;
|
|
class p extends h {
|
|
constructor(e, t) {
|
|
super(e, t || p.createProperties()), this.version = p.version, i.e("lt-pane-views")
|
|
.then(i.t.bind(null, "dKqZ", 7)).then(({
|
|
ArcPaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
startChanging(e, t) {
|
|
if (super.startChanging(e, t), 0 === e || 1 === e) {
|
|
var i = this.pointToScreenPoint(this._points[0])[0],
|
|
n = this.pointToScreenPoint(this._points[1])[0],
|
|
o = this.pointToScreenPoint(this._points[2])[0];
|
|
this._dist = r(i, n, o).distance;
|
|
var a = n.subtract(i),
|
|
l = new s(-a.y, a.x),
|
|
c = i.add(n).scaled(.5);
|
|
o.subtract(c).dotProduct(l) < 0 && (this._dist = -this._dist)
|
|
}
|
|
}
|
|
pointsCount() {
|
|
return 3
|
|
}
|
|
name() {
|
|
return "Arc"
|
|
}
|
|
hasEditableCoordinates() {
|
|
return !1
|
|
}
|
|
setPoint(e, t) {
|
|
var i = Object.assign({}, t),
|
|
n = this.pointToScreenPoint(this._points[0])[0],
|
|
h = this.pointToScreenPoint(this._points[1])[0],
|
|
u = this.pointToScreenPoint(this._points[2])[0];
|
|
switch (e) {
|
|
case 0:
|
|
n = this.pointToScreenPoint(i)[0];
|
|
var d = h.subtract(n),
|
|
p = n.add(h).scaled(.5);
|
|
m = (m = new s(-d.y, d.x)).normalized(), u = p.add(m.scaled(this._dist)),
|
|
u = this.screenPointToPoint(u), this._points[0] = i, this._points[2] =
|
|
u;
|
|
break;
|
|
case 1:
|
|
var _ = r(n, h, u).distance;
|
|
d = (h = this.pointToScreenPoint(i)[0]).subtract(n), p = n.add(h).scaled(
|
|
.5);
|
|
m = (m = new s(-d.y, d.x)).normalized(), u = p.add(m.scaled(this._dist)),
|
|
u = this.screenPointToPoint(u), this._points[1] = i, this._points[2] =
|
|
u;
|
|
break;
|
|
case 2:
|
|
i = this.pointToScreenPoint(i)[0];
|
|
var m;
|
|
_ = r(n, h, i).distance, d = h.subtract(n), p = n.add(h).scaled(.5);
|
|
m = (m = new s(-d.y, d.x)).normalized(), u = p.add(m.scaled(_));
|
|
var f = p.add(m.scaled(-_)),
|
|
g = d.length(),
|
|
b = d.x / g,
|
|
v = d.y / g,
|
|
S = Math.acos(b);
|
|
v < 0 && (S = -S);
|
|
var y = l(-p.x, -p.y);
|
|
i = c(y, i);
|
|
var w = c(y, u);
|
|
y = o(-S), i = c(y, i), w = c(y, w), y = a(1, g / (2 * _)), i = c(y, i), w =
|
|
c(y, w);
|
|
var P = i.y * w.y >= 0 ? new s(u.x, u.y) : new s(f.x, f.y);
|
|
P = this.screenPointToPoint(P), this._points[2] = P
|
|
}
|
|
this.normalizePoints()
|
|
}
|
|
migrateVersion(e, t, i) {
|
|
if (1 === e && 2 === this._points.length) {
|
|
var s = (2 * this._points[0].price + 3 * this._points[1].price) / 5;
|
|
this._points.append({
|
|
price: s,
|
|
index: this._points[1].index
|
|
})
|
|
}
|
|
if (1 === e && 2 === this._timePoint.length) {
|
|
var r = {
|
|
price: s = (2 * this._timePoint[0].price + 3 * this._timePoint[1]
|
|
.price) / 5,
|
|
offset: this._timePoint[1].offset,
|
|
time_t: this._timePoint[1].time_t
|
|
};
|
|
this._timePoint.append(r)
|
|
}
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "Zd1D")))
|
|
.GeneralFiguresDefinitionsViewModel
|
|
}
|
|
static createProperties(e) {
|
|
var t = new u("linetoolarc", e);
|
|
return p._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
h._configureProperties(e), e.addChild("linesColors", new d([e.color]))
|
|
}
|
|
}
|
|
p.version = 2, t.LineToolArc = p
|
|
},
|
|
"0YCj": function(e, t, i) {
|
|
"use strict";
|
|
(function(e, t) {
|
|
i("Eyy1").assert;
|
|
var s = i("txPx").getLogger("Chart.Study.MetaInfo"),
|
|
r = i("9iCb").applyOverridesToStudyDefaults,
|
|
n = {};
|
|
|
|
function o(e) {
|
|
TradingView.merge(this, {
|
|
palettes: {},
|
|
inputs: [],
|
|
plots: [],
|
|
graphics: {},
|
|
defaults: {}
|
|
}), TradingView.merge(this, e);
|
|
var t = e.fullId || e.id;
|
|
TradingView.merge(this, o.parseIdString(t)), this.name = this.id
|
|
}
|
|
o.VERSION_STUDY_ARG_SOURCE = 41, o.METAINFO_FORMAT_VERSION_SOS_V2 = 42, o
|
|
.VERSION_PINE_PROTECT_TV_4164 = 43, o.CURRENT_METAINFO_FORMAT_VERSION = 52, o
|
|
.VERSION_NEW_STUDY_PRECISION_FORMAT = 46, o.CHILD_STUDY_ALLOWED_PLOT_TYPES = [
|
|
"line"
|
|
], o.canPlotBeSourceOfChildStudy = function(e) {
|
|
return o.CHILD_STUDY_ALLOWED_PLOT_TYPES.includes(e)
|
|
}, o.CHILD_STUDY_EXCLUDE_IDS = ["CorrelationCoefficient@tv-basicstudies",
|
|
"Correlation - Log@tv-basicstudies-1"
|
|
], o.CHILD_STUDY_PARENT_EXCLUDE_IDS = [], o.FilledArea = {}, o.FilledArea
|
|
.TYPE_PLOTS = "plot_plot", o.FilledArea.TYPE_HLINES = "hline_hline", o.versionOf =
|
|
function(e) {
|
|
var t = "_metainfoVersion" in e && isNumber(e._metainfoVersion) ? e
|
|
._metainfoVersion : 0;
|
|
return t < 0 && s.logError("Metainfo format version cannot be negative: " + t),
|
|
t
|
|
}, o.parseIdString = function(e) {
|
|
var t = {};
|
|
if (-1 === e.indexOf("@")) t.shortId = e, t.packageId = "tv-basicstudies", t
|
|
.id = e + "@" + t.packageId, t.version = 1;
|
|
else {
|
|
var i = e.split("@");
|
|
t.shortId = i[0];
|
|
var s = i[1].split("-");
|
|
if (3 === s.length) t.packageId = s.slice(0, 2).join("-"), t.id = t
|
|
.shortId + "@" + t.packageId, t.version = s[2];
|
|
else if (1 === s.length && "decisionbar" === s[0]) t.packageId = "les-" + s[
|
|
0], t.id = t.shortId + "@" + t.packageId, t.version = 1;
|
|
else {
|
|
if (1 !== s.length) throw new Error("unexpected study id:" + e);
|
|
t.packageId = "tv-" + s[0], t.id = t.shortId + "@" + t.packageId, t
|
|
.version = 1
|
|
}
|
|
}
|
|
if (t.fullId = t.id + "-" + t.version, "tv-scripting" === t.packageId) {
|
|
var r = t.shortId;
|
|
if (0 === r.indexOf("Script$") || 0 === r.indexOf("StrategyScript$")) {
|
|
var n = r.indexOf("_");
|
|
t.productId = n >= 0 ? r.substring(0, n) : t.packageId
|
|
} else t.productId = t.packageId
|
|
} else t.productId = t.packageId;
|
|
return t
|
|
}, o.getPackageName = function(e) {
|
|
return (/^[^@]+@([^-]+-[^-]+)/.exec(e || "") || [0, "tv-basicstudies"])[1]
|
|
}, o.cutDollarHash = function(e) {
|
|
var t = e.indexOf("$"),
|
|
i = e.indexOf("@");
|
|
return -1 === t ? e : e.substr(0, t) + (i >= 0 ? e.substr(i) : "")
|
|
}, o.hasUserIdSuffix = function(e) {
|
|
return /^USER;[\d\w]+;\d+$/.test(e)
|
|
}, o.isStandardPine = function(e) {
|
|
return /^(Strategy)?Script\$STD;.*@tv-scripting$/.test(e)
|
|
}, o.getSourceIdByInputs = function(e, t) {
|
|
if (!Array.isArray(e) || !t) return null;
|
|
for (var i = 0; i < e.length; ++i) {
|
|
var s = e[i];
|
|
if (o.isSourceInput(s) && "string" == typeof t[s.id]) {
|
|
var r = t[s.id];
|
|
return ~r.indexOf("$") && (r = r.split("$")[0]), r
|
|
}
|
|
}
|
|
return null
|
|
}, o.getSourceInputIds = function(e) {
|
|
for (var t = [], i = e.inputs, s = 0; s < i.length; ++s) {
|
|
var r = i[s];
|
|
o.isSourceInput(r) && t.push(r.id)
|
|
}
|
|
return t
|
|
}, o.setChildStudyMetaInfoPropertiesSourceId = function(t, i, s) {
|
|
for (var r = 0; r < t.inputs.length; ++r) {
|
|
var n = t.inputs[r];
|
|
if (o.isSourceInput(n) && (s instanceof e && s.inputs && s.inputs[n.id])) {
|
|
var a = s.inputs[n.id].value();
|
|
if (a.indexOf("$") > 0) {
|
|
var l = a.replace(/^[^\$]+/, i);
|
|
s.inputs[n.id].setValue(l)
|
|
}
|
|
}
|
|
}
|
|
}, o.patchChildStudyMetaInfoState = function(e) {
|
|
e.state && function e(t) {
|
|
if ("object" == typeof t)
|
|
for (var i in t) "string" == typeof t[i] && /^[^\$]+\$\d+$/.test(t[
|
|
i]) ? t[i] = t[i].replace(/^[^\$]+/, "{pid}") : e(t[i])
|
|
}(e.state.inputs), e.state.isChildStudy = !0
|
|
}, o.prototype.parseValue = function(e, t) {
|
|
return "bool" === e ? TradingView.parseBool(t) : t
|
|
}, o.prototype.defaultInputs = function() {
|
|
for (var e = [], t = 0; t < this.inputs.length; t++) e.push(this.inputs[t]
|
|
.defval);
|
|
return e
|
|
}, o.prototype.state = function(e) {
|
|
var t = {};
|
|
for (var i in this) this.hasOwnProperty(i) && (t[i] = this[i], !0 !== e &&
|
|
"id" === i && (t[i] += "-" + this.version));
|
|
return t
|
|
}, o.prototype.symbolInputId = function() {
|
|
var e = this.inputs.filter((function(e) {
|
|
return "symbol" === e.type
|
|
}));
|
|
return e.length > 0 ? e[0].id : null
|
|
}, o.prototype.createDefaults = function() {
|
|
if (this.defaults) {
|
|
var e = TradingView.clone(this.defaults);
|
|
e.precision = "default";
|
|
var t = o.getStudyPropertyRootName(this);
|
|
defaults.create(t, e)
|
|
}
|
|
}, o.prototype.removeDefaults = function() {
|
|
defaults.remove(o.getStudyPropertyRootName(this))
|
|
}, o.findStudyMetaInfoByDescription = function(e, t) {
|
|
if (e) {
|
|
for (var i = 0; i < e.length; ++i)
|
|
if (e[i].description.toLowerCase() === t.toLowerCase()) return e[i];
|
|
throw new Error("unexpected study id:" + t)
|
|
}
|
|
throw new Error("There is no studies metainfo")
|
|
}, o.isParentSourceId = function(e) {
|
|
return "string" == typeof e && /^[^\$]+\$\d+$/.test(e)
|
|
}, o.isSourceInput = function(e) {
|
|
return e.id && (("source" === e.id || "src" === e.id) && ("text" === e.type ||
|
|
"source" === e.type) || "source" === e.type)
|
|
}, o.getChildSourceInputTitles = function(e, t, i) {
|
|
var s = {};
|
|
if (t.plots && t.plots.length && e.options && e.options.length)
|
|
for (var r, n, a, l = 0; l < e.options.length; ++l) n = (r = e.options[
|
|
l]) && +r.split("$")[1], (a = isFinite(n) && t.plots[n]) && ~o
|
|
.CHILD_STUDY_ALLOWED_PLOT_TYPES.indexOf(a.type) && (s[r] = t.styles && t
|
|
.styles[a.id] && t.styles[a.id].title || a.id, i && (s[r] = i +
|
|
": " + s[r]));
|
|
return s
|
|
};
|
|
var a = new Map([
|
|
["AnchoredVWAP@tv-basicstudies", "linetoolanchoredvwap"],
|
|
["RegressionTrend@tv-basicstudies", "linetoolregressiontrend"]
|
|
]);
|
|
o.getStudyPropertyRootName = function(e) {
|
|
var t = a.get(e.id);
|
|
if (void 0 !== t) return t;
|
|
var i = "study_" + e.id;
|
|
return e.pine && e.pine.version && (i += "_" + e.pine.version.replace(".",
|
|
"_")), i
|
|
}, o.getStudyPropertyRootNameById = function(e) {
|
|
var t = a.get(e);
|
|
return void 0 !== t ? t : "study_" + e
|
|
}, o.overrideDefaults = function(e) {
|
|
0 !== e.length && r(n, e, (function(e) {
|
|
return TradingView.defaultProperties[o.getStudyPropertyRootName(
|
|
e)] || null
|
|
}))
|
|
}, o.mergeDefaultsOverrides = function(e) {
|
|
TradingView.merge(n, e)
|
|
}, o.isScriptStrategy = function(e) {
|
|
if (e.extra && e.extra.kind) return e.extra.kind === TVScript.Kinds.STRATEGY;
|
|
if (!0 === e.isTVScriptStrategy) return !0;
|
|
var t = e.TVScriptSourceCode || e.scriptSource;
|
|
return !!t && TVScript.isStrategy(t)
|
|
}, o.getOrderedInputIds = function(e) {
|
|
for (var t = [], i = e.inputs, s = 0; s < i.length; ++s) {
|
|
var r = i[s];
|
|
t.push(r.id)
|
|
}
|
|
return t
|
|
}, o.canBeChild = function(e) {
|
|
if (e && "string" == typeof e) return !0;
|
|
if (!e || e.extra && !o.isAllowedSourceInputsCount(e.extra.sourceInputsCount) ||
|
|
!0 === e.canNotBeChild || !1 === e.canBeChild || ~o.CHILD_STUDY_EXCLUDE_IDS
|
|
.indexOf(e.id)) return !1;
|
|
for (var t = e.inputs, i = 0, s = 0; s < t.length; ++s) o.isSourceInput(t[s]) &&
|
|
++i;
|
|
return o.isAllowedSourceInputsCount(i)
|
|
}, o.isAllowedSourceInputsCount = function(e) {
|
|
return 1 === e
|
|
}, o.canHaveChildren = function(e) {
|
|
if (e) {
|
|
if (e.isTVScriptStrategy || e.TVScriptSourceCode && TVScript.isStrategy(e
|
|
.TVScriptSourceCode)) return !1;
|
|
if (e.id && !~o.CHILD_STUDY_PARENT_EXCLUDE_IDS.indexOf(e.id) && Array
|
|
.isArray(e.plots))
|
|
for (var t = 0; t < e.plots.length; ++t)
|
|
if (~o.CHILD_STUDY_ALLOWED_PLOT_TYPES.indexOf(e.plots[t].type))
|
|
return !0
|
|
}
|
|
return !1
|
|
}, TradingView.StudyMetaInfo = o, t && t.exports && (t.exports = o)
|
|
}).call(this, i("tc+8"), i("YuTi")(e))
|
|
},
|
|
"0psP": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "GeneralChartPropertiesRenderer", (function() {
|
|
return r
|
|
}));
|
|
var s = i("sQaR");
|
|
class r extends s.a {
|
|
constructor(e) {
|
|
super(), this._dialog = null, this._subscribe = e => {
|
|
this._setVisibility(e)
|
|
}, this._chartWidgetCollection = e
|
|
}
|
|
show() {
|
|
const e = this._chartWidgetCollection,
|
|
t = e.activeChartWidget.value();
|
|
return t.generalPropertiesDefinitions().then(s => Promise.all([i.e("redux"), i
|
|
.e("react"), i.e(1), i.e(3), i.e(4), i.e(6), i.e(8), i.e(9), i
|
|
.e(11), i.e(12), i.e(13), i.e(14), i.e(16), i.e(17), i.e(19), i
|
|
.e(21), i.e(22), i.e(23), i.e(26), i.e(29), i.e(33), i.e(34), i
|
|
.e(35), i.e(36), i.e(39), i.e(45), i.e(68), i.e(87), i.e(0), i
|
|
.e(2), i.e(5), i.e(7), i.e(10), i.e(15), i.e(18), i.e(20), i.e(
|
|
25), i.e(27), i.e(30), i.e(31), i.e(32), i.e(37), i.e(44), i
|
|
.e("general-chart-properties-dialog")
|
|
]).then(i.bind(null, "PI1I")).then(i => {
|
|
var r, n;
|
|
const o = new i.GeneralChartPropertiesDialogRenderer({
|
|
chartWidgetCollection: e,
|
|
propertyPages: s,
|
|
activePageId: this._activePageId,
|
|
model: t.model()
|
|
});
|
|
return null === (r = this._dialog) || void 0 === r || r.hide(),
|
|
null === (n = this._dialog) || void 0 === n || n.visible()
|
|
.unsubscribe(this._subscribe), this._dialog = o, o.visible()
|
|
.subscribe(this._subscribe), o.show(), this._activePageId =
|
|
void 0, o
|
|
}))
|
|
}
|
|
hide() {
|
|
var e;
|
|
null === (e = this._dialog) || void 0 === e || e.hide()
|
|
}
|
|
isVisible() {
|
|
return this.visible().value()
|
|
}
|
|
focusOnText() {}
|
|
setActivePage(e) {
|
|
this._activePageId = e
|
|
}
|
|
}
|
|
},
|
|
"0qMc": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "lineToolsLocalizedNames", (function() {
|
|
return r
|
|
}));
|
|
i("YFKU");
|
|
var s = i("+GxX");
|
|
const r = {
|
|
LineTool5PointsPattern: window.t("XABCD Pattern"),
|
|
LineToolABCD: window.t("ABCD Pattern"),
|
|
LineToolArc: window.t("Arc"),
|
|
LineToolArrow: window.t("Arrow"),
|
|
LineToolArrowMarkDown: window.t("Arrow Mark Down"),
|
|
LineToolArrowMarkLeft: window.t("Arrow Mark Left"),
|
|
LineToolArrowMarkRight: window.t("Arrow Mark Right"),
|
|
LineToolArrowMarkUp: window.t("Arrow Mark Up"),
|
|
LineToolBalloon: window.t("Balloon"),
|
|
LineToolBarsPattern: window.t("Bars Pattern"),
|
|
LineToolBezierCubic: window.t("Double Curve"),
|
|
LineToolBezierQuadro: window.t("Curve"),
|
|
LineToolBrush: window.t("Brush"),
|
|
LineToolCallout: window.t("Callout"),
|
|
LineToolCircleLines: window.t("Cyclic Lines"),
|
|
LineToolCypherPattern: window.t("Cypher Pattern"),
|
|
LineToolDateAndPriceRange: window.t("Date and Price Range"),
|
|
LineToolDateRange: window.t("Date Range"),
|
|
LineToolDisjointAngle: window.t("Disjoint Channel"),
|
|
LineToolElliottCorrection: window.t("Elliott Correction Wave (ABC)"),
|
|
LineToolElliottDoubleCombo: window.t("Elliott Double Combo Wave (WXY)"),
|
|
LineToolElliottImpulse: window.t("Elliott Impulse Wave (12345)"),
|
|
LineToolElliottTriangle: window.t("Elliott Triangle Wave (ABCDE)"),
|
|
LineToolElliottTripleCombo: window.t("Elliott Triple Combo Wave (WXYXZ)"),
|
|
LineToolEllipse: window.t("Ellipse"),
|
|
LineToolExtended: window.t("Extended Line"),
|
|
LineToolFibChannel: window.t("Fib Channel"),
|
|
LineToolFibCircles: window.t("Fib Circles"),
|
|
LineToolFibRetracement: window.t("Fib Retracement"),
|
|
LineToolFibSpeedResistanceArcs: window.t("Fib Speed Resistance Arcs"),
|
|
LineToolFibSpeedResistanceFan: window.t("Fib Speed Resistance Fan"),
|
|
LineToolFibSpiral: window.t("Fib Spiral"),
|
|
LineToolFibTimeZone: window.t("Fib Time Zone"),
|
|
LineToolFibWedge: window.t("Fib Wedge"),
|
|
LineToolFlagMark: window.t("Flag Mark"),
|
|
LineToolImage: window.t("Image"),
|
|
LineToolFlatBottom: window.t("Flat Top/Bottom"),
|
|
LineToolAnchoredVWAP: window.t("Anchored VWAP"),
|
|
LineToolGannComplex: window.t("Gann Square"),
|
|
LineToolGannFixed: window.t("Gann Square Fixed"),
|
|
LineToolGannFan: window.t("Gann Fan"),
|
|
LineToolGannSquare: window.t("Gann Box"),
|
|
LineToolHeadAndShoulders: window.t("Head and Shoulders"),
|
|
LineToolHorzLine: window.t("Horizontal Line"),
|
|
LineToolHorzRay: window.t("Horizontal Ray"),
|
|
LineToolIcon: window.t("Icon"),
|
|
LineToolInsidePitchfork: window.t("Inside Pitchfork"),
|
|
LineToolNote: window.t("Note"),
|
|
LineToolNoteAbsolute: window.t("Anchored Note"),
|
|
LineToolSignpost: window.t("Signpost"),
|
|
LineToolParallelChannel: window.t("Parallel Channel"),
|
|
LineToolPitchfan: window.t("Pitchfan"),
|
|
LineToolPitchfork: window.t("Pitchfork"),
|
|
LineToolPolyline: window.t("Polyline"),
|
|
LineToolPath: window.t("Path"),
|
|
LineToolPrediction: window.t("Forecast"),
|
|
LineToolPriceLabel: window.t("Price Label"),
|
|
LineToolArrowMarker: window.t("Arrow Marker"),
|
|
LineToolPriceRange: window.t("Price Range"),
|
|
LineToolProjection: window.t("Projection"),
|
|
LineToolRay: window.t("Ray"),
|
|
LineToolRectangle: window.t("Rectangle"),
|
|
LineToolRegressionTrend: window.t("Regression Trend"),
|
|
LineToolRiskRewardLong: window.t("Long Position"),
|
|
LineToolRiskRewardShort: window.t("Short Position"),
|
|
LineToolFixedRangeVolumeProfile: window.t("Fixed Range Volume Profile"),
|
|
LineToolRotatedRectangle: window.t("Rotated Rectangle"),
|
|
LineToolSchiffPitchfork: window.t("Modified Schiff Pitchfork"),
|
|
LineToolSchiffPitchfork2: window.t("Schiff Pitchfork"),
|
|
LineToolSineLine: window.t("Sine Line"),
|
|
LineToolText: window.t("Text", {
|
|
context: "tool"
|
|
}),
|
|
LineToolTextAbsolute: window.t("Anchored Text"),
|
|
LineToolThreeDrivers: window.t("Three Drives Pattern"),
|
|
LineToolTimeCycles: window.t("Time Cycles"),
|
|
LineToolTrendAngle: window.t("Trend Angle"),
|
|
LineToolTrendBasedFibExtension: window.t("Trend-Based Fib Extension"),
|
|
LineToolTrendBasedFibTime: window.t("Trend-Based Fib Time"),
|
|
LineToolTrendLine: window.t("Trend Line"),
|
|
LineToolInfoLine: window.t("Info Line"),
|
|
LineToolTriangle: window.t("Triangle"),
|
|
LineToolTrianglePattern: window.t("Triangle Pattern"),
|
|
LineToolVertLine: window.t("Vertical Line"),
|
|
LineToolCrossLine: window.t("Cross Line"),
|
|
LineToolHighlighter: window.t("Highlighter"),
|
|
LineToolPriceNote: window.t("Price Note"),
|
|
LineToolVbPFixed: window.t("Volume Profile Fixed Range")
|
|
};
|
|
Object(s.isFeatureEnabled)("remove-line-tool-ghost-feed") || (r.LineToolGhostFeed = window.t(
|
|
"Ghost Feed"))
|
|
},
|
|
"1AAW": function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return n
|
|
}));
|
|
var s = i("hY0g"),
|
|
r = i.n(s);
|
|
|
|
function n(e, ...t) {
|
|
const i = (...t) => e(...t.map(e => e.value())),
|
|
s = new r.a(i(...t)),
|
|
n = () => s.setValue(i(...t)),
|
|
o = t.map(e => e.spawn());
|
|
for (const e of o) e.subscribe(n);
|
|
return s.readonly().spawn(() => o.forEach(e => e.destroy()))
|
|
}
|
|
},
|
|
"1ANp": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "navigationButtonsVisibilityKey", (function() {
|
|
return r
|
|
})), i.d(t, "property", (function() {
|
|
return n
|
|
})), i.d(t, "availableValues", (function() {
|
|
return o
|
|
})), i.d(t, "actualBehavior", (function() {
|
|
return a
|
|
}));
|
|
var s = i("+jnJ");
|
|
const r = "NavigationButtons.visibility",
|
|
{
|
|
property: n,
|
|
availableValues: o,
|
|
actualBehavior: a
|
|
} = Object(s.a)(r)
|
|
},
|
|
"1IXQ": function(e, t, i) {
|
|
"use strict";
|
|
i("jJ9X");
|
|
var s = i("aO4+").Point,
|
|
r = i("/3z9"),
|
|
n = i("qFKp").CheckMobile,
|
|
o = i("7KDR"),
|
|
a = o.Action,
|
|
l = o.Separator,
|
|
c = i("ikwP").hardResizeCanvas,
|
|
h = i("S8xo").MouseEventHandler,
|
|
u = i("YmeR").ActionBinder,
|
|
d = i("T6Of").LimitedPrecisionNumericFormatter,
|
|
p = i("HZKX").createLinesAction,
|
|
_ = i("xzdg").PriceAxisWidgetBase,
|
|
m = i("Kxc7"),
|
|
f = window.t("Merge All Scales Into One");
|
|
class g extends _ {
|
|
constructor(e, t, i, s, r, n, o, a) {
|
|
super(e, t, i, r, n, s, a), this._axisInfo = o, this._offset = 0, this
|
|
.restoreDefaultCursor(), this.update(), this._mouseEventHandler = new h(this
|
|
._topCanvasBinding.canvas, this, {
|
|
treatVertTouchDragAsPageScroll: !1,
|
|
treatHorzTouchDragAsPageScroll: !0
|
|
}), this.contextMenu = null, this.actions = null
|
|
}
|
|
destroy() {
|
|
null !== this.actions && this.actions.reset && this.actions.reset.destroy(), this
|
|
._mouseEventHandler.destroy(), super.destroy()
|
|
}
|
|
dataSourceAtPoint(e, t) {
|
|
var i = this._grouppedSources(),
|
|
r = i.sources.concat(Array.from(i.topLevelSources)).concat(this._pane.state()
|
|
.customSources()),
|
|
n = null,
|
|
o = null;
|
|
if (!this._priceScale) return null;
|
|
|
|
function a(e, t) {
|
|
var i = o ? o.result() : 0;
|
|
e.result() > i && (o = e, n = t)
|
|
}
|
|
for (var l = new s(e, t), c = this._pane.state(), h = r.length - 1; h >= 0; --h) {
|
|
var u = r[h],
|
|
d = u.priceAxisViews(c, this._priceScale);
|
|
if (d && 0 !== d.length)
|
|
for (var p = d.length - 1; p >= 0; --p) {
|
|
var _ = d[p].renderer();
|
|
if (null !== _ && void 0 !== _.hitTest) {
|
|
var m = _.hitTest(l, this._size.w, this._isLeft ? "left" : "right");
|
|
null !== m && a(m, u)
|
|
}
|
|
}
|
|
}
|
|
return n
|
|
}
|
|
_initActions(e) {
|
|
if (this._pane.hasState() && null === this.actions) {
|
|
this.actions = {};
|
|
var t = this,
|
|
s = this._pane.chart().model();
|
|
this.actions.reset = new a({
|
|
label: window.t("Reset Price Scale"),
|
|
icon: i("LdoW"),
|
|
shortcut: "Alt+R",
|
|
shortcutHint: r.humanReadableHash(r.Modifiers.Alt + 82),
|
|
statName: "ResetScale",
|
|
onExecute: g.prototype.reset.bind(this)
|
|
}), this.actions.setAutoScale = new a({
|
|
label: window.t("Auto (Fits Data To Screen)"),
|
|
checkable: !0,
|
|
checked: !0,
|
|
statName: "ToggleAutoScale",
|
|
onExecute: function() {
|
|
s.togglePriceScaleAutoScaleMode(t.priceScale()), t
|
|
._updateScalesActions()
|
|
}
|
|
}), this.actions.setPercentage = new a({
|
|
label: window.t("Percent", {
|
|
context: "scale_menu"
|
|
}),
|
|
checkable: !0,
|
|
checked: this.priceScale().isPercentage(),
|
|
statName: "TogglePercantage",
|
|
onExecute: function() {
|
|
s.togglePriceScalePercentageScaleMode(t.priceScale()), t
|
|
._updateScalesActions()
|
|
}
|
|
}), this.actions.setIndexedTo100 = new a({
|
|
label: window.t("Indexed to 100", {
|
|
context: "scale_menu"
|
|
}),
|
|
checkable: !0,
|
|
checked: this.priceScale().isIndexedTo100(),
|
|
statName: "ToggleIndexedTo100",
|
|
onExecute: function() {
|
|
s.togglePriceScaleIndexedTo100ScaleMode(t.priceScale()), t
|
|
._updateScalesActions()
|
|
}
|
|
}), this.actions.setLog = new a({
|
|
label: window.t("Logarithmic", {
|
|
context: "scale_menu"
|
|
}),
|
|
checkable: !0,
|
|
checked: this.priceScale().isLog(),
|
|
statName: "ToggleLogScale",
|
|
onExecute: function() {
|
|
s.togglePriceScaleLogScaleMode(t.priceScale()), t
|
|
._updateScalesActions()
|
|
}
|
|
}), this.actions.setRegular = new a({
|
|
label: window.t("Regular", {
|
|
context: "scale_menu"
|
|
}),
|
|
checkable: !0,
|
|
checked: this.priceScale().isRegular(),
|
|
statName: "ToggleRegularScale",
|
|
onExecute: function() {
|
|
s.setPriceScaleRegularScaleMode(t.priceScale()), t
|
|
._updateScalesActions()
|
|
}
|
|
}), this.actions.alignLabels = new a({
|
|
label: window.t("No Overlapping Labels", {
|
|
context: "scale_menu"
|
|
}),
|
|
checkable: !0,
|
|
checked: !1,
|
|
statName: "TogglePreciseLabels"
|
|
}), this.actions.alignLabels.binding = new u(this.actions.alignLabels, this
|
|
.priceScale().properties().alignLabels, this._pane.chart().model(),
|
|
"No Overlapping Labels"), this.actions.invertScale = new a({
|
|
label: window.t("Invert Scale", {
|
|
context: "scale_menu"
|
|
}),
|
|
checkable: !0,
|
|
checked: this.priceScale().isInverted(),
|
|
statName: "Invert Scale",
|
|
onExecute: function() {
|
|
s.invertPriceScale(t.priceScale()), t._updateScalesActions()
|
|
}
|
|
}), this._updateScalesActions()
|
|
}
|
|
}
|
|
_logAction() {
|
|
return this._isMainSeriesAxis() ? this._pane.chart().actions().logSeriesScale : this
|
|
.actions.setLog
|
|
}
|
|
_percentageAction() {
|
|
return this._isMainSeriesAxis() ? this._pane.chart().actions().percentSeriesScale :
|
|
this.actions.setPercentage
|
|
}
|
|
_indexedTo100Action() {
|
|
return this._isMainSeriesAxis() ? this._pane.chart().actions()
|
|
.indexedTo100SeriesScale : this.actions.setIndexedTo100
|
|
}
|
|
_autoScaleAction() {
|
|
return this._isMainSeriesAxis() ? this._pane.chart().actions().autoSeriesScale :
|
|
this.actions.setAutoScale
|
|
}
|
|
_regularScaleAction() {
|
|
return this._isMainSeriesAxis() ? this._pane.chart().actions().regularSeriesScale :
|
|
this.actions.setRegular
|
|
}
|
|
_lockScaleAction() {
|
|
var e = this._pane.chart().actions().lockSeriesScale,
|
|
t = v(this.priceScale(), this._pane.chart().model().model()
|
|
.mainSeriesScaleRatio());
|
|
return e.update({
|
|
hint: t
|
|
}), e
|
|
}
|
|
_invertAction() {
|
|
return this._isMainSeriesAxis() ? this._pane.chart().actions().invertSeriesScale :
|
|
this.actions.invertScale
|
|
}
|
|
_isMainSeriesAxis() {
|
|
return this.priceScale().hasMainSeries()
|
|
}
|
|
_updateMainSeriesScalesActions() {
|
|
this._isMainSeriesAxis() && null !== this.actions && this._updateScalesActions()
|
|
}
|
|
_updateScalesActions() {
|
|
var e = this.priceScale(),
|
|
t = this._isMainSeriesAxis(),
|
|
i = e.mainSource().properties(),
|
|
s = t && e.isLockScale(),
|
|
r = t && i.style.value() === TradingView.Series.STYLE_PNF;
|
|
this.actions.setRegular.update({
|
|
checked: e.isRegular(),
|
|
disabled: s || r
|
|
}), this.actions.setPercentage.update({
|
|
checked: e.isPercentage(),
|
|
disabled: s || r
|
|
}), this.actions.setIndexedTo100.update({
|
|
checked: e.isIndexedTo100(),
|
|
disabled: s || r
|
|
}), this.actions.setLog.update({
|
|
checked: e.isLog(),
|
|
disabled: s || r
|
|
}), this.actions.setAutoScale.update({
|
|
checked: e.isAutoScale(),
|
|
disabled: e.properties().autoScaleDisabled.value()
|
|
})
|
|
}
|
|
_createMergeScalesAction() {
|
|
var e = this._pane.chart().actions(),
|
|
t = this._pane.chart().model().model().priceScaleSlotsCount();
|
|
if (t.left + t.right === 1) return 0 === t.left ? e.moveScaleToLeft : e
|
|
.moveScaleToRight;
|
|
var i = [];
|
|
return i.push(e.mergeLeftScalesAction), i.push(e.mergeRightScalesAction), new a({
|
|
label: f,
|
|
subItems: i
|
|
})
|
|
}
|
|
getContextMenuActions() {
|
|
this._initActions();
|
|
var e = this._pane.chart().actions(),
|
|
t = [];
|
|
if (t.push(this.actions.reset, new l, this._autoScaleAction()), this
|
|
._isMainSeriesAxis() && t.push(this._lockScaleAction()), t.push(e
|
|
.scaleSeriesOnly, this._invertAction(), new l, this._regularScaleAction(),
|
|
this._percentageAction(), this._indexedTo100Action(), this._logAction(),
|
|
new l), n.any() || (t.push(this._createMergeScalesAction()), t.push(new l)),
|
|
!m.enabled("fundamental_widget")) {
|
|
t.push(new a({
|
|
label: window.t("Labels"),
|
|
subItems: [e.showSymbolLabelsAction, e.showSeriesLastValue,
|
|
null, null, e.showHighLowPriceLabels, e
|
|
.showAverageClosePriceLabel, null, e
|
|
.showStudyPlotNamesAction, e.showStudyLastValue, null,
|
|
null, this.actions.alignLabels
|
|
].filter(Boolean)
|
|
}))
|
|
}
|
|
return t.push(p(this._pane.chart())), this._options.countdownEnabled && t.push(e
|
|
.showCountdown), this._options.currencyConversionEnabled && t.push(e
|
|
.showCurrency), this._options.unitConversionEnabled && t.push(e.showUnit),
|
|
this._pane.chart().model().crossHairSource().isMenuEnabled() && t.push(e
|
|
.addPlusButton), !TradingView.onWidget() && m.enabled(
|
|
"show_chart_property_page") && m.enabled("chart_property_page_scales") && e
|
|
.scalesProperties && t.push(new l, e.scalesProperties), t
|
|
}
|
|
setSizeAndOffset(e, t) {
|
|
if (e.w < 0 || e.h < 0) throw new Error(
|
|
"Try to set invalid size to PriceAxisWidget " + JSON.stringify(e));
|
|
this._size.equals(e) || (this._size = e, this._canvasBinding.resizeCanvas({
|
|
width: e.w,
|
|
height: e.h
|
|
}), this._topCanvasBinding.resizeCanvas({
|
|
width: e.w,
|
|
height: e.h
|
|
}), this._cell.style.width = e.w + "px", this._cell.style.height = e.h +
|
|
"px", this._cell.style.minWidth = e.w + "px"), this._offset !== t && (this
|
|
._offset = t, this._cell.style.left = t + "px")
|
|
}
|
|
getWidth() {
|
|
return this._size.w
|
|
}
|
|
update() {}
|
|
hardResetCanvas() {
|
|
null !== this._size && (c(this._canvasBinding, this._size), c(this
|
|
._topCanvasBinding, this._size))
|
|
}
|
|
_isMainPane() {
|
|
return this._pane.state().containsMainSeries()
|
|
}
|
|
restoreDefaultCursor() {
|
|
this.setCursor("")
|
|
}
|
|
setCursor(e) {
|
|
var t = "";
|
|
"grabbing" !== e && "ns-resize" !== e || (t = "price-axis--cursor-" + e), this
|
|
._currentCursorClassName !== t && (this._currentCursorClassName && this._cell
|
|
.classList.remove(this._currentCursorClassName), t && this._cell.classList
|
|
.add(t), this._currentCursorClassName = t, this._cell.style.cursor)
|
|
}
|
|
axisInfo() {
|
|
return this._axisInfo
|
|
}
|
|
}
|
|
|
|
function b(e) {
|
|
var t = new d(e);
|
|
return function(e, i) {
|
|
return isNumber(i) && !e.isLog() ? t.format(i) : ""
|
|
}
|
|
}
|
|
var v = b(4);
|
|
e.exports = {
|
|
PriceAxisWidget: g,
|
|
scaleRatioForContextMenuTransformer: b
|
|
}
|
|
},
|
|
"1Wlv": function(e, t, i) {
|
|
"use strict";
|
|
(function(e) {
|
|
var s = i("Yj6H").PriceScaleBase,
|
|
r = i("7ktv").PriceDataSource,
|
|
n = i("Qb4w").PriceRange,
|
|
o = i("e3/o").randomHash,
|
|
a = i("3ClC").isStudy,
|
|
l = i("TTFo"),
|
|
c = l.fromLog,
|
|
h = l.toLog;
|
|
class u extends s {
|
|
constructor(t, i) {
|
|
super(i), this._scalesProperties = t, this.m_scrollStartPoint = null;
|
|
var s = this;
|
|
this._modeChanged = new e, this._properties.isInverted.listeners()
|
|
.subscribe(this, u.prototype._onIsInvertedChanged), this._properties
|
|
.listeners().subscribe(null, (function() {
|
|
if (s.mainSource() && s.mainSource().model()) {
|
|
var e = s.mainSource().model().paneForSource(s
|
|
.mainSource());
|
|
s.mainSource().model().updatePane(e)
|
|
}
|
|
})), this._scalesProperties.listeners().subscribe(this, (function() {
|
|
this._marksCache = null
|
|
})), this.setId(o())
|
|
}
|
|
_convertPriceRangeFromLog(e) {
|
|
if (null === e) return null;
|
|
var t = c(e.minValue()),
|
|
i = c(e.maxValue());
|
|
return new n(t, i)
|
|
}
|
|
_convertPriceRangeToLog(e) {
|
|
if (null === e) return null;
|
|
var t = h(e.minValue()),
|
|
i = h(e.maxValue());
|
|
return new n(t, i)
|
|
}
|
|
_canConvertPriceRangeFromLog(e) {
|
|
if (null === e) return !1;
|
|
var t = c(e.minValue()),
|
|
i = c(e.maxValue());
|
|
return isFinite(t) && isFinite(i)
|
|
}
|
|
mode() {
|
|
return {
|
|
autoScale: this._properties.autoScale.value(),
|
|
lockScale: this._properties.lockScale.value(),
|
|
percentage: this._properties.percentage.value(),
|
|
indexedTo100: this._properties.indexedTo100.value(),
|
|
log: this._properties.log.value()
|
|
}
|
|
}
|
|
setMode(e) {
|
|
var t = {},
|
|
i = this.mode(),
|
|
s = this._properties.state(),
|
|
r = null;
|
|
void 0 !== e.autoScale && e.autoScale !== s.autoScale && (t.autoScale = e
|
|
.autoScale, this._setAutoScaleValueWithDependentProperties(e
|
|
.autoScale)), void 0 !== e.lockScale && e.lockScale !== s
|
|
.lockScale && (t.lockScale = e.lockScale, this
|
|
._setLockScaleValueWithDependentProperties(e.lockScale)), void 0 !==
|
|
e.percentage && e.percentage !== s.percentage && (t.percentage = e
|
|
.percentage, this._setPercentageValueWithDependentProperties(e
|
|
.percentage), this._invalidatedForRange.isValid = !1),
|
|
void 0 !== e.indexedTo100 && e.indexedTo100 !== s.indexedTo100 && (t
|
|
.indexedTo100 = e.indexedTo100, this
|
|
._setIndexedTo100ValueWithDependentProperties(e.indexedTo100), this
|
|
._invalidatedForRange.isValid = !1), void 0 !== e.log && e.log !== s
|
|
.log && (t.log = e.log, this._setLogValueWithDependentProperties(e
|
|
.log)), s.log && !this._properties.log.value() && (this
|
|
._canConvertPriceRangeFromLog(this.m_priceRange) ? null !== (r =
|
|
this._convertPriceRangeFromLog(this.m_priceRange)) && this
|
|
.setPriceRange(r) : this.properties().autoScale.setValue(!0)), !s
|
|
.log && this._properties.log.value() && null !== (r = this
|
|
._convertPriceRangeToLog(this.m_priceRange)) && this.setPriceRange(
|
|
r), s.autoScale !== this._properties.autoScale.value() && this
|
|
._properties.autoScale.listeners().fire(this._properties.autoScale), s
|
|
.autoScaleDisabled !== this._properties.autoScaleDisabled.value() &&
|
|
this._properties.autoScaleDisabled.listeners().fire(this._properties
|
|
.autoScaleDisabled), s.lockScale !== this._properties.lockScale
|
|
.value() && this._properties.lockScale.listeners().fire(this._properties
|
|
.lockScale), s.percentage !== this._properties.percentage.value() &&
|
|
(this._properties.percentage.listeners().fire(this._properties
|
|
.percentage), this.updateFormatter()), s.indexedTo100 !== this
|
|
._properties.indexedTo100.value() && (this._properties.indexedTo100
|
|
.listeners().fire(this._properties.indexedTo100), this
|
|
.updateFormatter()), s.percentageDisabled !== this._properties
|
|
.percentageDisabled.value() && this._properties.percentageDisabled
|
|
.listeners().fire(this._properties.percentageDisabled), s.log !== this
|
|
._properties.log.value() && this._properties.log.listeners().fire(this
|
|
._properties.log), s.logDisabled !== this._properties.logDisabled
|
|
.value() && this._properties.logDisabled.listeners().fire(this
|
|
._properties.logDisabled), void 0 === t.log && void 0 === t
|
|
.percentage && void 0 === t.lockScale && void 0 === t.autoScale &&
|
|
void 0 === t.indexedTo100 || this._modeChanged.fire(i, this.mode())
|
|
}
|
|
modeChanged() {
|
|
return this._modeChanged
|
|
}
|
|
fontSize() {
|
|
return this._scalesProperties.fontSize.value()
|
|
}
|
|
isEmpty() {
|
|
return this._makeSureItIsValid(), 0 === this.m_height || !this
|
|
.m_priceRange || this.m_priceRange.isEmpty()
|
|
}
|
|
startScroll(e) {
|
|
this.isAutoScale() || null === this.m_scrollStartPoint && null === this
|
|
._priceRangeSnapshot && (this.isEmpty() || (this.m_scrollStartPoint = e,
|
|
this._priceRangeSnapshot = this.priceRange().clone()))
|
|
}
|
|
scrollTo(e) {
|
|
if (!this.isAutoScale() && null !== this.m_scrollStartPoint) {
|
|
var t = this.priceRange().length() / (this.internalHeight() - 1),
|
|
i = e - this.m_scrollStartPoint;
|
|
this.isInverted() && (i *= -1);
|
|
var s = i * t,
|
|
r = this._priceRangeSnapshot.clone();
|
|
r.shift(s), this.setPriceRange(r, !0), this._marksCache = null
|
|
}
|
|
}
|
|
endScroll() {
|
|
this.isAutoScale() || null !== this.m_scrollStartPoint && (this
|
|
.m_scrollStartPoint = null, this._priceRangeSnapshot = null)
|
|
}
|
|
_onIsInvertedChanged() {
|
|
this._marksCache = null, this._markBuilder.rebuildTickMarks()
|
|
}
|
|
canDetachSource(e) {
|
|
return this.m_dataSources.some((function(t) {
|
|
return t !== e && t instanceof r && !(a(t) && t
|
|
.isLinkedToSeries())
|
|
}))
|
|
}
|
|
}
|
|
t.PriceScale = u
|
|
}).call(this, i("aIyQ"))
|
|
},
|
|
"1pHB": function(e, t) {
|
|
e.exports =
|
|
'<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28"><g fill="none" fill-rule="evenodd" transform="translate(4 5)"><circle stroke="currentColor" cx="9.5" cy="9.5" r="9"/><path stroke="currentColor" d="M7 14.5h2.5v-5H7"/><path stroke="currentColor" stroke-linecap="square" d="M9.5 14.5h2"/><path fill="currentColor" d="M9.5 7a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3z"/></g></svg>'
|
|
},
|
|
"2+aH": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("Eyy1"),
|
|
r = i("aO4+"),
|
|
n = i("fgLi"),
|
|
o = i("hY0g"),
|
|
a = i.n(o),
|
|
l = i("HGP3"),
|
|
c = i("KcY8"),
|
|
h = i("Ulff");
|
|
class u extends c.a {
|
|
constructor(e, t, i) {
|
|
super(), this._source = e, this._priceScale = t, this._priceProvider = i
|
|
}
|
|
setHitTestData(e) {
|
|
this._hitTestData = e
|
|
}
|
|
additionalPadding(e) {
|
|
return 0
|
|
}
|
|
_updateRendererData(e, t, i) {
|
|
e.visible = !1, t.visible = !1;
|
|
const s = this._priceScale.mainSource(),
|
|
r = null !== s ? s.firstValue() : null;
|
|
if (!this._isVisible() || this._priceScale.isEmpty() || null === r) return;
|
|
const n = this._priceProvider(this._priceScale);
|
|
if (null === n) return;
|
|
i.background = this._bgColor(), i.textColor = this.generateTextColor(i
|
|
.background);
|
|
const o = this.additionalPadding(this._priceScale.fontSize());
|
|
i.additionalPaddingTop = o, i.additionalPaddingBottom = o, i.coordinate = this
|
|
._priceScale.priceToCoordinate(n, r), e.text = this._priceScale.formatPrice(
|
|
n, r), e.visible = !0, t.visible = !0, t.hitTestData = this._hitTestData
|
|
}
|
|
}
|
|
const d = {
|
|
normalBgColor: l.colorsPalette["color-cold-gray-750"],
|
|
hoveredBgColor: l.colorsPalette["color-cold-gray-600"]
|
|
},
|
|
p = {
|
|
normalBgColor: l.colorsPalette["color-cold-gray-900"],
|
|
hoveredBgColor: l.colorsPalette["color-cold-gray-650"]
|
|
};
|
|
class _ extends u {
|
|
additionalPadding(e) {
|
|
return 2 / 12 * e
|
|
}
|
|
_isVisible() {
|
|
return this._source.visible && null !== this._source.pane
|
|
}
|
|
_bgColor() {
|
|
return this._getThemedColors().normalBgColor
|
|
}
|
|
_updateRendererData(e, t, i) {
|
|
const s = t.visible;
|
|
super._updateRendererData(e, t, i), this._source.isHovered() ? t.backgroung = this
|
|
._getThemedColors().hoveredBgColor : t.backgroung = void 0, s || (t.visible = s)
|
|
}
|
|
_getThemedColors() {
|
|
return this._source.model().isDark() ? d : p
|
|
}
|
|
}
|
|
class m extends u {
|
|
_isVisible() {
|
|
return null !== this._source.measurePane()
|
|
}
|
|
_bgColor() {
|
|
return h.a.common
|
|
}
|
|
}
|
|
var f = i("mMWL"),
|
|
g = i("YFKU"),
|
|
b = i("FQhm"),
|
|
v = i("KtbP"),
|
|
S = i("JWMC"),
|
|
y = (i("7KDR"), i("5VQP")),
|
|
w = (i("Kxc7"), i("/tGj"));
|
|
|
|
function P(e) {
|
|
const t = e.priceScale();
|
|
return null === t ? 0 : t.isPercentage() || t.isIndexedTo100() ? 2 : 1
|
|
}
|
|
class C extends v.PanePriceAxisView {
|
|
constructor(e, t, i, s, r) {
|
|
super(e, t, s), this._crossHairMenuCachedState = null, this._hasActions = !1,
|
|
this._tooltipText = null, this._gaOrigin = "CH menu", this
|
|
._crosshairPriceAxisView = e, e.setPaneRendererLabelIcon(0), this
|
|
._crosshair = t, this._scale = i,
|
|
this._options = r
|
|
}
|
|
_updateImpl(e, t) {
|
|
super._updateImpl(e, t);
|
|
const i = this._crosshair.y,
|
|
s = this._chartModel.properties().scalesProperties.fontSize.value(),
|
|
r = this._chartModel.timeScale().width(),
|
|
n = this._crosshair.model().priceAxisRendererOptions(),
|
|
o = s + 2 * this._crosshairPriceAxisView.additionalPadding(s) + n
|
|
.paddingTop + n.paddingBottom,
|
|
a = o,
|
|
l = i - o / 2,
|
|
c = r - a,
|
|
h = this._crosshair.pane,
|
|
u = this._mainDataSourceOnPane(),
|
|
d = u && u.symbolSource(),
|
|
p = !!d && (d.isConvertedToOtherCurrency() || d.isConvertedToOtherUnit());
|
|
if (null !== u) {
|
|
const e = P(u),
|
|
t = u.idForAlert(),
|
|
i = this._crossHairMenuCachedState;
|
|
null !== i && i.id === t && i.priceScale === e && i
|
|
.isCurrencyOrUnitConverted === p || (this
|
|
._updateTooltipAndActionsAvaliability(u, e, p), this
|
|
._crossHairMenuCachedState = {
|
|
id: t,
|
|
priceScale: e,
|
|
isCurrencyOrUnitConverted: p
|
|
})
|
|
}
|
|
const _ = null !== u && Object(w.isSymbolSource)(u) ? u.symbol() : null,
|
|
m = Boolean(_) || !1;
|
|
this._crosshairPriceAxisView.setPaneLabelVisible(m);
|
|
const f = null !== h && 0 !== h.leftPriceScales().length && m,
|
|
g = null !== h && 0 !== h.rightPriceScales().length && m,
|
|
b = r - a / 2,
|
|
v = this._tooltipText ? {
|
|
text: this._tooltipText,
|
|
rect: {
|
|
x: b,
|
|
y: l,
|
|
w: 0,
|
|
h: 0
|
|
}
|
|
} : void 0;
|
|
this._data = {
|
|
left: f,
|
|
right: g,
|
|
xl: 0,
|
|
xr: c,
|
|
y: l,
|
|
containerWidth: a,
|
|
containerHeight: o,
|
|
clickHandler: this._handleClick.bind(this),
|
|
tooltip: v
|
|
}, this._crosshairPriceAxisView.setHitTestData(this._data)
|
|
}
|
|
_priceScale() {
|
|
return this._scale
|
|
}
|
|
_updateTooltipAndActionsAvaliability(e, t, i) {
|
|
this._tooltipText = null, this._hasActions = !1;
|
|
if (!(1 === t)) return;
|
|
const s = !i && !1;
|
|
let r = 0;
|
|
s && r++;
|
|
let n = 0;
|
|
1 === r && (s ? (n = 1, this._tooltipText = window.t("Add Alert")) : this
|
|
._tooltipText = window.t("Add Horizontal Line")), this
|
|
._crosshairPriceAxisView.setPaneRendererLabelIcon(n), this._hasActions =
|
|
0 !== r
|
|
}
|
|
_handleClick(e, t, i) {
|
|
Object(S.trackEvent)(this._gaOrigin, "click");
|
|
const s = this._mainDataSourceOnPane(),
|
|
r = null !== s && Object(w.isSymbolSource)(s) ? s.symbol() : null,
|
|
n = {
|
|
pageX: i.pageX,
|
|
pageY: i.pageY,
|
|
clientX: i.clientX,
|
|
clientY: i.clientY,
|
|
screenX: i.screenX,
|
|
screenY: i.screenY,
|
|
price: this._crosshair.price,
|
|
symbol: r
|
|
};
|
|
b.emit("onPlusClick", n)
|
|
}
|
|
_getMenuItems(e) {
|
|
return Promise.resolve([])
|
|
}
|
|
_createAlertMenuItems(e) {
|
|
return Promise.resolve([])
|
|
}
|
|
_createTradingMenuItems() {
|
|
return Promise.resolve([])
|
|
}
|
|
_createAddHorizontalLineMenuItem() {
|
|
return []
|
|
}
|
|
_getActionAddAlert(e) {
|
|
return null
|
|
}
|
|
_getActionAddHorizontalLine(e) {
|
|
return null
|
|
}
|
|
_getValue(e, t) {
|
|
const i = e.priceScale(),
|
|
s = e.firstValue();
|
|
if (null === i || null === s) return null;
|
|
return i.isPercentage() || i.isIndexedTo100() ? null : i.coordinateToPrice(t, s)
|
|
}
|
|
_formatValue(e, t) {
|
|
return t.formatter().format(e)
|
|
}
|
|
_addAlert(e, t) {}
|
|
_addHorizontalLineTool(e, t) {}
|
|
_showContextMenu(e, t, i, r) {
|
|
const n = "left" === r;
|
|
setTimeout(() => {
|
|
y.ContextMenuManager.createMenu(e).then(e => {
|
|
e.show((e, t) => {
|
|
const r = Object(s.ensureDefined)(this
|
|
._data),
|
|
o = Object(s.ensureNotNull)(i.view)
|
|
.innerHeight,
|
|
a = n ? r.xl : r.xr,
|
|
l = i.localX - a,
|
|
c = {
|
|
left: i.clientX - l,
|
|
right: i.clientX - l + r
|
|
.containerWidth,
|
|
top: i.clientY - r.containerHeight /
|
|
2,
|
|
bottom: i.clientY + r
|
|
.containerHeight / 2
|
|
};
|
|
return {
|
|
clientX: n ? c.left : c.right - e,
|
|
clientY: o < c.bottom + t ? c.top - t :
|
|
c.bottom
|
|
}
|
|
})
|
|
})
|
|
})
|
|
}
|
|
_mainDataSourceOnPane() {
|
|
const e = this._crosshair.pane;
|
|
return null !== e ? e.mainDataSource() : null
|
|
}
|
|
}
|
|
var x = i("Tmoa"),
|
|
T = i("8Uy/"),
|
|
I = i("VaSN"),
|
|
M = i("jFln"),
|
|
O = i("VdBB"),
|
|
L = i("gAom");
|
|
class A {
|
|
constructor(e) {
|
|
this._data = e
|
|
}
|
|
hitTest(e) {
|
|
return void 0 === this._data.clickHandler ? null : new O.HitTestResult(O
|
|
.HitTestResult.CUSTOM, {
|
|
clickHandler: this._data.clickHandler,
|
|
tapHandler: this._data.clickHandler
|
|
})
|
|
}
|
|
draw(e, t) {
|
|
const i = t.pixelRatio,
|
|
s = this._data.vertLinesVisible,
|
|
r = this._data.horzLinesVisible;
|
|
if (!s && !r) return;
|
|
e.save(), e.lineWidth = Math.max(1, Math.floor(this._data.lineWidth * i)), e
|
|
.strokeStyle = this._data.color, e.fillStyle = this._data.color, e.lineCap =
|
|
"butt", Object(M.setLineStyle)(e, this._data.lineStyle);
|
|
const n = Math.round(this._data.x * i),
|
|
o = Math.round(this._data.y * i),
|
|
a = Math.ceil(this._data.w * i),
|
|
l = Math.ceil(this._data.h * i);
|
|
s && n >= 0 && Object(L.drawVerticalLine)(e, n, 0, l), r && o >= 0 && Object(L
|
|
.drawHorizontalLine)(e, o, 0, a), this._data.drawCenter && (e.beginPath(), e
|
|
.arc(n, o, Math.round(3 * i), 0, 2 * Math.PI, !0), e.fillStyle = this._data
|
|
.color, e.fill()), e.restore()
|
|
}
|
|
}
|
|
var E = i("CW80");
|
|
const k = l.colorsPalette["color-tv-blue-500"],
|
|
D = l.colorsPalette["color-tv-blue-500"];
|
|
class V {
|
|
constructor(e, t) {
|
|
this._rendererData = {}, this._renderer = new A(this._rendererData), this._source =
|
|
e, this._pane = t
|
|
}
|
|
update() {}
|
|
renderer(e, t) {
|
|
const i = this._source.selectPointMode().value(),
|
|
r = this._source.visible && (this._source.areLinesVisible || i) && !this._source
|
|
.linesShouldBeHidden(),
|
|
n = this._rendererData;
|
|
if (!r || null === this._pane) return null;
|
|
const o = this._source.paneForPointSelect(),
|
|
a = null !== o ? this._source.pane === o && this._pane === o : this._pane ===
|
|
this._source.pane;
|
|
if (i && this._source.isOnHoveredChartWidget() && a) {
|
|
const e = Object(s.ensureNotNull)(this._source.pointToSelect());
|
|
n.color = k, n.lineWidth = 1, n.lineStyle = T.LINESTYLE_SOLID, n
|
|
.horzLinesVisible = !0, n.vertLinesVisible = !0, n.drawCenter = !0,
|
|
"time" === e ? (n.horzLinesVisible = !1, n.drawCenter = !1) : "price" ===
|
|
e && (n.vertLinesVisible = !1, n.drawCenter = !1)
|
|
} else {
|
|
const e = this._source.properties(),
|
|
t = this._source.model().currentTool(),
|
|
i = Object(I.lastEventIsTouch)() && (Object(E.isLineToolName)(t) || Object(f
|
|
.toolIsMeasure)(t));
|
|
let s;
|
|
s = i ? D : e.childs().color.value();
|
|
const r = e.childs().transparency.value();
|
|
!i && r > 0 && (s = Object(x.generateColor)(s, r)), n.color = s, n
|
|
.horzLinesVisible = this._pane === this._source.pane, n.vertLinesVisible = !
|
|
0, n.lineWidth = e.childs().width.value(), n.lineStyle = e.childs().style
|
|
.value(), n.drawCenter = i && this._pane === this._source.pane
|
|
}
|
|
return n.w = this._pane.width(), n.h = this._pane.height(), n.x = void 0 !== this
|
|
._source.lockedX && isFinite(this._source.lockedX) && this._source.lockedX ||
|
|
this._source.x, n.y = this._source.y, this._renderer
|
|
}
|
|
}
|
|
var B = i("IjC5");
|
|
const R = {
|
|
backgroundColor: Object(x.generateColor)(l.colorsPalette["color-tv-blue-500"], 70),
|
|
borderColor: Object(x.generateColor)(l.colorsPalette["color-tv-blue-500"], 20)
|
|
};
|
|
class N {
|
|
constructor(e) {
|
|
this._renderer = new B.RectangleRenderer, this._rectangle = null, this._crosshair =
|
|
e
|
|
}
|
|
update() {
|
|
const e = this._crosshair.selection();
|
|
null !== e && null !== this._crosshair.pane ? this._rectangle = this._crosshair.pane
|
|
.logicalRectToPixels(e) : this._rectangle = null
|
|
}
|
|
renderer(e, t) {
|
|
if (!this._rectangle) return null;
|
|
const i = {
|
|
backcolor: R.backgroundColor,
|
|
color: R.borderColor,
|
|
fillBackground: !0,
|
|
linewidth: 1,
|
|
points: [this._rectangle.min, this._rectangle.max],
|
|
extendLeft: !1,
|
|
extendRight: !1
|
|
};
|
|
return this._renderer.setData(i), this._renderer
|
|
}
|
|
}
|
|
var j = i("Ialn"),
|
|
F = i("GH0z"),
|
|
W = i("5C6T"),
|
|
H = i("nda6"),
|
|
U = i("nEwK"),
|
|
z = i("pJOz"),
|
|
G = i("qgcf"),
|
|
q = i("Zy3/"),
|
|
Y = i("a7Ha"),
|
|
K = i("zDbI");
|
|
const J = Object(g.t)("{count} bars"),
|
|
Z = Object(g.t)("Vol"),
|
|
X = new F.PercentageFormatter,
|
|
$ = new H.TimeSpanFormatter,
|
|
Q = new U.VolumeFormatter,
|
|
ee = Object(l.getHexColorByName)("color-tv-blue-500"),
|
|
te = {
|
|
bgColorPositive: Object(x.generateColor)(ee, 80),
|
|
bgColorNegative: "rgba(239,83,80,0.2)",
|
|
colorPositive: "#1E53E5",
|
|
colorNegative: "#EF5350",
|
|
labelBgColorPositive: ee,
|
|
labelBgColorNegative: "#EF5350"
|
|
};
|
|
class ie {
|
|
constructor(e, t) {
|
|
this._pipFormatter = null, this._lastSymbolInfo = null, this._horzTrenRenderer =
|
|
new z.TrendLineRenderer, this._vertTrenRenderer = new z.TrendLineRenderer, this
|
|
._bgRenderer = new B.RectangleRenderer, this._labelRenderer = new G
|
|
.TextRenderer, this._p1 = null, this._p2 = null, this._label = null, this
|
|
._source = e, this._pane = t
|
|
}
|
|
update() {
|
|
const [e, t] = this._source.measurePoints();
|
|
if (void 0 === t) return this._p1 = null, void(this._p2 = null);
|
|
const i = Object(s.ensureNotNull)(this._source.measurePane()),
|
|
n = e.price,
|
|
o = t.price,
|
|
a = t.price - n,
|
|
l = t.index - e.index,
|
|
c = Object(j.forceLTRStr)("" + l),
|
|
h = Object(s.ensureNotNull)(i.mainDataSource());
|
|
let u = Object(s.ensureNotNull)(h.formatter()).format(a);
|
|
if (Math.abs(n) > 1e-8) {
|
|
const e = a / Math.abs(n);
|
|
u += " (" + X.format(100 * e) + ")"
|
|
}
|
|
const d = Object(j.forceLTRStr)(u);
|
|
this._label = d + "\n" + J.format({
|
|
count: c
|
|
});
|
|
const p = Object(s.ensureNotNull)(h.firstValue()),
|
|
_ = this._source.model().timeScale().indexToCoordinate(e.index),
|
|
m = this._source.model().timeScale().indexToCoordinate(t.index),
|
|
f = i.defaultPriceScale().priceToCoordinate(n, p),
|
|
g = i.defaultPriceScale().priceToCoordinate(o, p);
|
|
this._p1 = new r.Point(_, f), this._p2 = new r.Point(m, g);
|
|
const b = this._source.model().timeScale().indexToUserTime(e.index),
|
|
v = this._source.model().timeScale().indexToUserTime(t.index);
|
|
let S = null;
|
|
if (null !== b && null !== v) {
|
|
const e = this._pane.model().mainSeries().symbolInfo();
|
|
null !== e && e !== this._lastSymbolInfo && (this._pipFormatter = new W
|
|
.PipFormatter(e.pricescale, e.minmov, e.type, e.minmove2), this
|
|
._lastSymbolInfo = e), S = (v.valueOf() - b.valueOf()) / 1e3
|
|
}
|
|
const y = this._pipFormatter ? this._pipFormatter.format(a) : null,
|
|
w = null !== y ? " , " + y : "",
|
|
P = null !== S ? $.format(S) : null,
|
|
C = null !== P ? ", " + Object(j.startWithLTR)(P) : "";
|
|
this._label = Object(j.forceLTRStr)(d + w) + "\n" + J.format({
|
|
count: c
|
|
}) + C;
|
|
const x = this._source.measureVolume();
|
|
Number.isNaN(x) || (this._label += `\n${Z} ${Q.format(x)}`);
|
|
const I = o < n ? te.bgColorNegative : te.bgColorPositive,
|
|
M = o < n ? te.colorNegative : te.colorPositive,
|
|
O = o < n ? te.labelBgColorNegative : te.labelBgColorPositive,
|
|
L = {
|
|
points: [this._p1, this._p2],
|
|
linewidth: 0,
|
|
fillBackground: !0,
|
|
color: I,
|
|
backcolor: I,
|
|
extendLeft: !1,
|
|
extendRight: !1
|
|
};
|
|
this._bgRenderer.setData(L);
|
|
const A = this._p1.add(this._p2).scaled(.5); {
|
|
const e = Math.round(A.y),
|
|
t = new r.Point(this._p1.x, e),
|
|
i = new r.Point(this._p2.x, e),
|
|
s = {
|
|
points: [t, i],
|
|
color: M,
|
|
linewidth: 1,
|
|
linestyle: T.LINESTYLE_SOLID,
|
|
extendleft: !1,
|
|
extendright: !1,
|
|
leftend: Y.LineEnd.Normal,
|
|
rightend: Math.abs(t.x - i.x) >= 50 ? Y.LineEnd.Arrow : Y.LineEnd.Normal
|
|
};
|
|
this._horzTrenRenderer.setData(s)
|
|
} {
|
|
const e = Math.round(A.x),
|
|
t = new r.Point(e, this._p1.y),
|
|
i = new r.Point(e, this._p2.y),
|
|
s = {
|
|
points: [t, i],
|
|
color: M,
|
|
linewidth: 1,
|
|
linestyle: T.LINESTYLE_SOLID,
|
|
extendleft: !1,
|
|
extendright: !1,
|
|
leftend: Y.LineEnd.Normal,
|
|
rightend: Math.abs(t.y - i.y) >= 50 ? Y.LineEnd.Arrow : Y.LineEnd.Normal
|
|
};
|
|
this._vertTrenRenderer.setData(s)
|
|
}
|
|
const E = {
|
|
x: 0,
|
|
y: 10
|
|
},
|
|
k = .5 * (this._p1.x + this._p2.x),
|
|
D = this._p2.y,
|
|
V = new r.Point(k, D),
|
|
B = (R = Object(s.ensureNotNull)(this._label), {
|
|
points: [V],
|
|
text: R,
|
|
color: "#FFFFFF",
|
|
horzAlign: "center",
|
|
vertAlign: "middle",
|
|
font: K.CHART_FONT_FAMILY,
|
|
offsetX: E.x,
|
|
offsetY: E.y,
|
|
bold: !1,
|
|
italic: !1,
|
|
fontsize: 12,
|
|
padding: 8,
|
|
highlightBorder: !1,
|
|
backgroundColor: O,
|
|
backgroundTransparency: 10,
|
|
backgroundVertInflate: 5,
|
|
backgroundHorzInflate: 5,
|
|
backgroundRoundRect: 4
|
|
});
|
|
var R;
|
|
this._labelRenderer.setData(B);
|
|
const N = this._labelRenderer.measure(),
|
|
F = Object(G.calculateLabelPosition)(N, this._p1, this._p2, E, this._pane
|
|
.height());
|
|
this._labelRenderer.setPoints([F])
|
|
}
|
|
renderer() {
|
|
if (null === this._p1 || null === this._p2) return null;
|
|
const e = new q.CompositeRenderer;
|
|
return e.append(this._bgRenderer), e.append(this._horzTrenRenderer), e.append(this
|
|
._vertTrenRenderer), e.append(this._labelRenderer), e
|
|
}
|
|
}
|
|
var se = i("cPgM");
|
|
class re extends se.ScaledPaneRenderer {
|
|
constructor(e) {
|
|
super(), this._data = e
|
|
}
|
|
hitTest(e) {
|
|
return null
|
|
}
|
|
_drawImpl(e) {
|
|
e.translate(this._data.x - this._data.width / 2, this._data.y - this._data
|
|
.height / 2), e.strokeStyle = "rgba(153,153,153,.3)", e.lineWidth = 2, e
|
|
.beginPath(), this._drawShackle(e), e.stroke(), e.closePath(), e
|
|
.strokeStyle = "rgba(153,153,153,.7)", e.lineWidth = 1, e.beginPath(), e
|
|
.rect(0, this._data.height - this._data.bodyHeight + .5, this._data.width,
|
|
this._data.bodyHeight), e.closePath(), e.stroke(), e.translate(0, -1), e
|
|
.strokeStyle = "#777", e.beginPath(), this._drawShackle(e), e.stroke(), e
|
|
.closePath(), e.fillStyle = "rgba(255,255,255,.7)", e.beginPath(), e.rect(1,
|
|
this._data.height - this._data.bodyHeight + 1.5, this._data.width - 2,
|
|
this._data.bodyHeight - 2), e.fill(), e.beginPath(), e.rect(.5, this
|
|
._data.height - this._data.bodyHeight + 1, this._data.width - 1, this
|
|
._data.bodyHeight - 1), e.stroke(), e.closePath(), e.fillStyle = "#777",
|
|
e.fillRect(this._data.width / 2 - .5, this._data.height - this._data
|
|
.bodyHeight / 2, 1, 2)
|
|
}
|
|
_drawShackle(e) {
|
|
const t = (this._data.width - 3) / 2,
|
|
i = this._data.height - this._data.bodyHeight;
|
|
e.moveTo(1.5, t), e.arc(this._data.width / 2, t, t, Math.PI, 2 * Math.PI), i >
|
|
t && (e.moveTo(1.5, t), e.lineTo(1.5, i), e.moveTo(this._data.width - 1.5,
|
|
t), e.lineTo(this._data.width - 1.5, i))
|
|
}
|
|
}
|
|
class ne {
|
|
constructor(e, t, i) {
|
|
this._horzVisible = !1, this._source = e, this._pane = t, this._axis = i || "x"
|
|
}
|
|
update() {}
|
|
renderer(e, t) {
|
|
const i = this._source.visible && this._source.areLinesVisible,
|
|
r = Object(f.lockTimeAxis)().value(),
|
|
n = i && this._horzVisible,
|
|
o = i || r;
|
|
if ("y" === this._axis && !n || !o) return null;
|
|
const a = "y" === this._axis ? this._pane.width() - 4.5 : Object(s.ensureDefined)(
|
|
this._source.lockedX) + 1,
|
|
l = "y" === this._axis ? this._source.y : this._pane.height() - 5.5 - 1;
|
|
return new re({
|
|
x: a,
|
|
y: l,
|
|
width: 9,
|
|
height: 11,
|
|
bodyHeight: 7
|
|
})
|
|
}
|
|
}
|
|
var oe = i("qFKp"),
|
|
ae = i("aIyQ"),
|
|
le = i.n(ae),
|
|
ce = i("GDWD"),
|
|
he = i("ivNn"),
|
|
ue = i("4miz");
|
|
const de = window.t("n/a");
|
|
class pe extends ue.b {
|
|
constructor(e) {
|
|
super(),
|
|
this._invalidated = !0, this._dateItem = new ue.a(window.t("Date"), ""),
|
|
this._timeItem = new ue.a(window.t("Time"), ""), this._model = e, this
|
|
._items.push(this._dateItem), this._items.push(this._timeItem)
|
|
}
|
|
update() {
|
|
this._invalidated = !0
|
|
}
|
|
items() {
|
|
return this._invalidated && (this._updateImpl(), this._invalidated = !1), this
|
|
._items
|
|
}
|
|
_updateImpl() {
|
|
const e = this._model.mainSeries().isDWM();
|
|
if (this._timeItem.setVisible(!e), this._timeItem.setValue(de), this._dateItem
|
|
.setValue(de), this._model.timeScale().isEmpty()) return;
|
|
let t = this._model.crossHairSource().appliedIndex();
|
|
if (!Object(he.isNumber)(t)) {
|
|
const e = this._model.mainSeries().data().last();
|
|
if (null === e) return;
|
|
t = e.index
|
|
}
|
|
const i = this._model.timeScale().indexToUserTime(t);
|
|
null !== i && (this._dateItem.setValue(this._model.dateFormatter().format(i)),
|
|
e || this._timeItem.setValue(this._model.timeFormatter().format(i)))
|
|
}
|
|
}
|
|
var _e = i("cgFQ");
|
|
class me extends _e.a {
|
|
constructor(e, t, i = !1) {
|
|
super(e), this._indexProvider = t, this._highlighted = i
|
|
}
|
|
_getBgColor() {
|
|
const e = this._model.isDark();
|
|
return this._highlighted ? h.a.common : e ? l.colorsPalette[
|
|
"color-cold-gray-750"] : l.colorsPalette["color-cold-gray-900"]
|
|
}
|
|
_getIndex() {
|
|
return this._model.crossHairSource().visible ? this._indexProvider() : null
|
|
}
|
|
}
|
|
var fe = i("585y");
|
|
i.d(t, "Crosshair", (function() {
|
|
return be
|
|
}));
|
|
const ge = {
|
|
menuEnabled: !1,
|
|
menuForMainSourceOnly: !1,
|
|
disableTradingMenuActions: !1,
|
|
disableDrawHorizLineMenuAction: !1
|
|
};
|
|
class be extends n.DataSource {
|
|
constructor(e, t, i) {
|
|
super(), this.pane = null, this.price = NaN, this.index = NaN, this.visible = !
|
|
0, this.areLinesVisible = !0, this.x = NaN, this.y = NaN, this
|
|
._measuringEnabled = new le.a, this._measurePane = null, this
|
|
._startMeasurePoint = null, this._endMeasurePoint = null, this
|
|
._lastValidMeasurePoint = null, this._isOnHoveredChartWidget = !1, this
|
|
._selectPointMode = new a.a(!1), this._selectionPane = null, this
|
|
._selectionView = new N(this), this._selectionStartPoint = null, this
|
|
._measurePaneView = null, this._timeLockPaneView = null, this
|
|
._priceAxisViews = new Map, this._panePriceAxisViews = new Map, this
|
|
._startMeasurePriceAxisViews = new Map, this._endMeasurePriceAxisViews =
|
|
new Map, this._originX = NaN, this._originY = NaN, this._subscribed = !1,
|
|
this._movedDelegate = new le.a, this._pointSelectedDelegate = new le.a, this
|
|
._requestedPoint = null, this._paneForRequestedPoint = null, this
|
|
._volumeCalculator = null, this._model = e, this._options = Object
|
|
.assign({}, ge, i || {}), this._linesShouldBeHidden = this._model
|
|
.readOnly(), this._dataWindowView = new pe(e), this.setSelectionEnabled(!1);
|
|
const r = e => t => t === Object(s.ensureNotNull)(this._measurePane)
|
|
.defaultPriceScale() ? e() : null;
|
|
this._currentPosPriceProvider = e => {
|
|
const t = Object(s.ensureNotNull)(this.pane);
|
|
if (e === t.defaultPriceScale()) return this.price;
|
|
const i = Object(s.ensureNotNull)(t.defaultPriceScale().mainSource())
|
|
.firstValue();
|
|
if (null === i) return null;
|
|
const r = t.defaultPriceScale().priceToCoordinate(this.price, i),
|
|
n = Object(s.ensureNotNull)(e.mainSource()).firstValue();
|
|
return null === n ? null : e.coordinateToPrice(r, n)
|
|
}, this._startMeasurePriceProvider = r(() => Object(s.ensureNotNull)(this
|
|
._startMeasurePoint).price),
|
|
this._endMeasurePriceProvider = r(() => Object(s.ensureNotNull)(this
|
|
._lastMeasurePoint()).price), this._properties = t;
|
|
this._timeAxisView = new me(e, () => this.appliedIndex(), !1), this
|
|
._startMeasureTimeAxisView = new me(e, () => Object(s.ensureNotNull)(this
|
|
._startMeasurePoint).index, !0), this._endMeasureTimeAxisView = new me(
|
|
e, () => Object(s.ensureNotNull)(this._lastMeasurePoint()).index, !0), e
|
|
.readOnly() || f.cursorTool.subscribe(e => this.areLinesVisible =
|
|
"arrow" !== e, {
|
|
callWithLast: !0
|
|
})
|
|
}
|
|
destroy() {
|
|
null !== this._volumeCalculator && this._volumeCalculator.destroy()
|
|
}
|
|
moved() {
|
|
return this._movedDelegate
|
|
}
|
|
originX() {
|
|
return this._originX
|
|
}
|
|
originY() {
|
|
return this._originY
|
|
}
|
|
saveOriginCoords(e, t) {
|
|
this._originX = e, this._originY = t
|
|
}
|
|
clearOriginCoords() {
|
|
this._originX = NaN, this._originY = NaN
|
|
}
|
|
currentPoint() {
|
|
return new r.Point(this.x, this.y)
|
|
}
|
|
model() {
|
|
return this._model
|
|
}
|
|
appliedIndex() {
|
|
return Number.isFinite(this.lockedIndex) ? this.lockedIndex : this.index
|
|
}
|
|
startMeasurePoint() {
|
|
return this._startMeasurePoint || null
|
|
}
|
|
endMeasurePoint() {
|
|
return this._endMeasurePoint || null
|
|
}
|
|
measureVolume() {
|
|
if (null === this._volumeCalculator) return NaN;
|
|
const [e, t] = this.measurePoints();
|
|
return void 0 === t ? NaN : this._volumeCalculator.volume(e.index, t.index)
|
|
}
|
|
measurePane() {
|
|
return this._measurePane || null
|
|
}
|
|
startMeasuring(e, t) {
|
|
this._startMeasurePoint = e, this._measurePane = t, this._measuringEnabled.fire(
|
|
!0), t.containsMainSeries() && (Object(s.assert)(null === this
|
|
._volumeCalculator), this._volumeCalculator = new fe.a(this.model()
|
|
.mainSeries()))
|
|
}
|
|
finishMeasure(e) {
|
|
this._endMeasurePoint = e
|
|
}
|
|
clearMeasure() {
|
|
delete this._measurePane, delete this._startMeasurePoint, delete this
|
|
._endMeasurePoint, delete this._lastValidMeasurePoint, this._model
|
|
.lightUpdate(), null !== this._volumeCalculator && (this._volumeCalculator
|
|
.destroy(), this._volumeCalculator = null), this._measuringEnabled.fire(
|
|
!1)
|
|
}
|
|
measuringEnabled() {
|
|
return this._measuringEnabled
|
|
}
|
|
measurePoints() {
|
|
this.updateAllViews();
|
|
const e = [Object(s.ensureNotNull)(this._startMeasurePoint)],
|
|
t = this._lastMeasurePoint();
|
|
return null !== t && e.push(t), e
|
|
}
|
|
startSelection(e) {
|
|
this._selectionStartPoint = this.currentLogicalPoint(), this._selectionPane = e
|
|
}
|
|
clearSelection() {
|
|
this._selectionStartPoint = null, this._selectionPane = null
|
|
}
|
|
selection() {
|
|
return this._selectionStartPoint ? {
|
|
p1: this._selectionStartPoint,
|
|
p2: this.currentLogicalPoint()
|
|
} : null
|
|
}
|
|
currentLogicalPoint() {
|
|
return {
|
|
index: this.appliedIndex(),
|
|
price: this.price
|
|
}
|
|
}
|
|
selectPointMode() {
|
|
return this._selectPointMode
|
|
}
|
|
cancelRequestSelectPoint() {
|
|
this._selectPointMode.value() && this._setSelectPointModeState(!1)
|
|
}
|
|
requestSelectPoint(e, t) {
|
|
Object(s.assert)(!this._selectPointMode.value(), "Point already requested"),
|
|
t && (Object(s.assert)(-1 !== this._model.panes().indexOf(t),
|
|
"Chartmodel doesn't contains specified pane"), this
|
|
._paneForRequestedPoint = t, this._model.panesCollectionChanged()
|
|
.subscribe(this, this._paneCollectionChanged)), this._requestedPoint =
|
|
e, this._setSelectPointModeState(!0)
|
|
}
|
|
onPointSelected() {
|
|
return this._pointSelectedDelegate
|
|
}
|
|
trySelectCurrentPoint() {
|
|
const e = Object(s.ensureNotNull)(this._requestedPoint);
|
|
if (!this._model.mainSeries().bars().contains(this.index) && "price" !== e)
|
|
return;
|
|
const t = Object(s.ensureNotNull)(this.pane);
|
|
if (this._paneForRequestedPoint && this._paneForRequestedPoint !== t) return;
|
|
let i, r;
|
|
if ("price" === e || (i = this._model.timeScale().indexToTimePoint(this.index),
|
|
null !== i)) {
|
|
if ("time" !== e) {
|
|
const e = t.mainDataSource();
|
|
if (null === e) return;
|
|
const i = e.firstValue(),
|
|
s = e.priceScale();
|
|
if (null === i || null === s) return;
|
|
r = s.coordinateToPrice(this.y, i)
|
|
}
|
|
this._setSelectPointModeState(!1), this._pointSelectedDelegate.fire({
|
|
time: i,
|
|
price: r
|
|
}, t)
|
|
}
|
|
}
|
|
isOnHoveredChartWidget() {
|
|
return this._isOnHoveredChartWidget
|
|
}
|
|
setOnHoveredChartWidget(e) {
|
|
this._isOnHoveredChartWidget = e
|
|
}
|
|
clearPosition() {
|
|
this.visible = !1, this.index = NaN, this.price = NaN, this.x = NaN, this.y =
|
|
NaN, this.pane = null, this.clearOriginCoords()
|
|
}
|
|
setPosition(e, t, i) {
|
|
return this._subscribed || (this._model.mainSeries().onRestarted().subscribe(
|
|
this, this.clearMeasure), this._subscribed = !0), this
|
|
.setLockedPosition(i), this.visible = !0, this._tryToUpdateViews(e, t, i)
|
|
}
|
|
setLinesShouldBeHidden(e) {
|
|
this._linesShouldBeHidden = e
|
|
}
|
|
linesShouldBeHidden() {
|
|
return this._linesShouldBeHidden
|
|
}
|
|
handleContextMenuEvent(e) {
|
|
this._selectPointMode.value() && this._setSelectPointModeState(!1)
|
|
}
|
|
properties() {
|
|
return this._properties
|
|
}
|
|
priceAxisViews(e, t) {
|
|
const i = null === this._requestedPoint || "time" !== this._requestedPoint || !
|
|
this._isOnHoveredChartWidget,
|
|
s = [];
|
|
return this.pane === e && i && s.push(this._createPriceAxisViewOnDemand(this
|
|
._priceAxisViews, this._panePriceAxisViews, e, t, this
|
|
._currentPosPriceProvider, _, !0)[0]), this._startMeasurePoint && s
|
|
.push(this._createPriceAxisViewOnDemand(this._startMeasurePriceAxisViews,
|
|
null, e, t, this._startMeasurePriceProvider, m)[0]), this
|
|
._lastMeasurePoint() && s.push(this._createPriceAxisViewOnDemand(this
|
|
._endMeasurePriceAxisViews, null, e, t, this
|
|
._endMeasurePriceProvider, m)[0]), s
|
|
}
|
|
timeAxisViews() {
|
|
const e = [],
|
|
t = null === this._requestedPoint || "price" !== this._requestedPoint || !
|
|
this._isOnHoveredChartWidget;
|
|
return !this._linesShouldBeHidden && (this.visible || Object(f.lockTimeAxis)()
|
|
.value()) && t && e.push(this._timeAxisView), this._startMeasurePoint &&
|
|
e.push(this._startMeasureTimeAxisView), this._lastMeasurePoint() && e.push(
|
|
this._endMeasureTimeAxisView), e
|
|
}
|
|
paneViews(e) {
|
|
if (void 0 === e) return null;
|
|
const t = [new V(this, e)];
|
|
if (e === this._selectionPane && t.push(this._selectionView), e === this
|
|
._measurePane && (null === this._measurePaneView && (this._measurePaneView =
|
|
new ie(this, e)), this._measurePaneView.update(), t.push(this
|
|
._measurePaneView)), ce.addPlusButtonProperty.value()) {
|
|
const i = e === this.pane,
|
|
s = !oe.CheckMobile.any() || window.screen.width >= 320,
|
|
r = f.tool.value(),
|
|
n = Object(E.isLineToolName)(r),
|
|
o = null !== this._model.lineBeingEdited() || null !== this._model
|
|
.lineBeingCreated() || this._model.sourcesBeingMoved().length > 0 ||
|
|
null !== this._model.customSourceBeingMoved() || Object(f.toolIsMeasure)
|
|
(r);
|
|
if (i && this._isOnHoveredChartWidget && !this._selectPointMode.value() &&
|
|
s && !n && !o) {
|
|
const i = e.mainDataSource();
|
|
if (null !== i) {
|
|
const s = i.priceScale();
|
|
if (null !== s) {
|
|
const i = this._createPriceAxisViewOnDemand(this
|
|
._priceAxisViews, this._panePriceAxisViews, e, s, this
|
|
._currentPosPriceProvider, _, !0)[1];
|
|
null !== i && t.push(i)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return Object(f.lockTimeAxis)().value() && (null === this._timeLockPaneView && (
|
|
this._timeLockPaneView = new ne(this, e)), t.push(this
|
|
._timeLockPaneView)), t
|
|
}
|
|
dataWindowView() {
|
|
return this._dataWindowView
|
|
}
|
|
updateAllViews() {
|
|
this._priceAxisViews.forEach(e => {
|
|
e.forEach(e => e.update())
|
|
}), this._panePriceAxisViews.forEach(e => {
|
|
e.forEach(e => e.update())
|
|
}), this._startMeasurePoint && (this._startMeasurePriceAxisViews.forEach(
|
|
e => {
|
|
e.forEach(e => e.update())
|
|
}), this._startMeasureTimeAxisView.update()), this
|
|
._lastMeasurePoint() && (this._endMeasurePriceAxisViews.forEach(e => {
|
|
e.forEach(e => e.update())
|
|
}), this._endMeasureTimeAxisView.update()), this._timeAxisView.update(),
|
|
this._selectionView.update(), this._dataWindowView.update()
|
|
}
|
|
setLockedPosition(e) {
|
|
delete this.lockedIndex, delete this.lockedX, e !== this._measurePane && Object(
|
|
f.lockTimeAxis)().value() && (this.lockedIndex = this._model.timeScale()
|
|
.points().roughIndex(f.lockTimeAxisTime.value()), null !== this
|
|
.lockedIndex && (this.lockedX = this._model.timeScale()
|
|
.indexToCoordinate(this.lockedIndex)))
|
|
}
|
|
isMenuEnabled() {
|
|
return this._options.menuEnabled
|
|
}
|
|
isHoveredEnabled() {
|
|
return ce.addPlusButtonProperty.value()
|
|
}
|
|
isHovered() {
|
|
return this._model.hoveredSource() === this
|
|
}
|
|
pointToSelect() {
|
|
return this._requestedPoint
|
|
}
|
|
paneForPointSelect() {
|
|
return this._paneForRequestedPoint
|
|
}
|
|
_lastMeasurePoint() {
|
|
return this._endMeasurePoint ? this._endMeasurePoint : (null !== this.pane &&
|
|
this._measurePane === this.pane && (this._lastValidMeasurePoint = {
|
|
price: this._model.magnet().align(this.price, this.index, this
|
|
.pane),
|
|
index: this.index
|
|
}), this._lastValidMeasurePoint || null)
|
|
}
|
|
_createPriceAxisViewOnDemand(e, t, i, r, n, o, a = !1) {
|
|
let l = e.get(i),
|
|
c = null !== t ? t.get(i) : void 0;
|
|
void 0 === l && (l = new Map, e.set(i, l), this._options.menuEnabled && null !==
|
|
t && (c = new Map, t.set(i, c)), a && i.onDestroyed().subscribe(this,
|
|
() => this._onPaneDestroyed(i)));
|
|
let h = l.get(r);
|
|
if (void 0 === h) {
|
|
if (h = new o(this, r, n), l.set(r, h), void 0 !== c) {
|
|
const e = new C(h, this, r, this._model, this._options);
|
|
c.set(r, e)
|
|
}
|
|
a && r.lastSourceRemoved().subscribe(this, () => this._onPriceScaleCleared(
|
|
r))
|
|
}
|
|
let u = null;
|
|
return void 0 !== c && (u = Object(s.ensureDefined)(c.get(r))), [h, u]
|
|
}
|
|
_onPaneDestroyed(e) {
|
|
e.onDestroyed().unsubscribeAll(this), this._priceAxisViews.delete(e), this
|
|
._panePriceAxisViews.delete(e), this._startMeasurePriceAxisViews.delete(e),
|
|
this._endMeasurePriceAxisViews.delete(e)
|
|
}
|
|
_onPriceScaleCleared(e) {
|
|
e.lastSourceRemoved().unsubscribeAll(this), this._priceAxisViews.forEach(t => t
|
|
.delete(e)), this._panePriceAxisViews.forEach(t => t.delete(e)), this
|
|
._startMeasurePriceAxisViews.forEach(t => t.delete(e)), this
|
|
._endMeasurePriceAxisViews.forEach(t => t.delete(e))
|
|
}
|
|
_tryToUpdateViews(e, t, i) {
|
|
return !!this._tryToUpdateData(e, t, i) && (this.updateAllViews(), this
|
|
._movedDelegate.fire({
|
|
index: this.index,
|
|
price: this.price
|
|
}), !0)
|
|
}
|
|
_tryToUpdateData(e, t, i) {
|
|
const r = this.x,
|
|
n = this.y,
|
|
o = this.price,
|
|
a = this.index,
|
|
l = this.pane,
|
|
c = this._priceScaleByPane(i);
|
|
if (this.index = e, this.x = isNaN(e) ? NaN : this._model.timeScale()
|
|
.indexToCoordinate(e), null !== c && null !== i) {
|
|
this.pane = i, this.price = t;
|
|
const e = Object(s.ensureNotNull)(i.mainDataSource()).firstValue();
|
|
this.y = null === e ? NaN : c.priceToCoordinate(t, e)
|
|
} else this.pane = null, this.price = NaN, this.y = NaN;
|
|
return r !== this.x || n !== this.y || a !== this.index || o !== this.price ||
|
|
l !== this.pane
|
|
}
|
|
_priceScaleByPane(e) {
|
|
return e && !e.defaultPriceScale().isEmpty() ? e.defaultPriceScale() : null
|
|
}
|
|
_setSelectPointModeState(e) {
|
|
e || (this._requestedPoint = null, this._paneForRequestedPoint && (this
|
|
._paneForRequestedPoint = null, this._model.panesCollectionChanged()
|
|
.unsubscribe(this, this._paneCollectionChanged))), this._selectPointMode
|
|
.setValue(e), this._model.lightUpdate()
|
|
}
|
|
_paneCollectionChanged(e) {
|
|
const t = this._paneForRequestedPoint;
|
|
null !== t && -1 === e.indexOf(t) && this.cancelRequestSelectPoint()
|
|
}
|
|
}
|
|
},
|
|
"22xp": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("Eyy1"),
|
|
r = i("9uLv"),
|
|
n = i("txPx"),
|
|
o = i("//lZ"),
|
|
a = i("aIyQ"),
|
|
l = i.n(a),
|
|
c = i("Kxc7"),
|
|
h = i("Hr11"),
|
|
u = i("ogJP"),
|
|
d = i("FIi8"),
|
|
p = i("ZJKN");
|
|
class _ {
|
|
constructor(e, t) {
|
|
Object(s.assert)(e <= t,
|
|
"The left value should be greater than or equal to the right value"), this
|
|
._left = e, this._right = t
|
|
}
|
|
left() {
|
|
return this._left
|
|
}
|
|
right() {
|
|
return this._right
|
|
}
|
|
length() {
|
|
return this._right - this._left + 1
|
|
}
|
|
contains(e) {
|
|
return this._left <= e && e <= this._right
|
|
}
|
|
equals(e) {
|
|
return this._left === e.left() && this._right === e.right()
|
|
}
|
|
static compare(e, t) {
|
|
return null === e || null === t ? e === t : e.equals(t)
|
|
}
|
|
}
|
|
const m = Object(n.getLogger)("Chart.TimePoints");
|
|
class f {
|
|
constructor() {
|
|
this._zoffset = 0, this._items = []
|
|
}
|
|
clear() {
|
|
this._zoffset = 0, this._items = []
|
|
}
|
|
size() {
|
|
return this._items.length
|
|
}
|
|
firstIndex() {
|
|
return this._offsetToIndex(0)
|
|
}
|
|
lastIndex() {
|
|
return this._offsetToIndex(this._items.length - 1)
|
|
}
|
|
merge(e, t, i) {
|
|
if (0 === i.length) return m.logError(
|
|
"merge: 'values' does not contain any time points"), [];
|
|
if (t > this._zoffset && e + t > 0) return m.logError(
|
|
"merge: when the first time point index is updated, we should fill the time points starting from the first one"
|
|
), [];
|
|
if (0 === this._items.length) return this._items = i, this._zoffset = t, [{
|
|
change: "rebuild",
|
|
index: this._validOffsetToIndex(0)
|
|
}];
|
|
const s = e + this._zoffset;
|
|
if (s < 0) {
|
|
const r = Math.abs(s);
|
|
if (i.length < r) return m.logError(
|
|
"merge: 'values' does not contain enough time points to fill in the new items. 'index': " +
|
|
e.toString() + ", previous 'zoffset': " + this._zoffset.toString() +
|
|
", new 'zoffset': " + t.toString() + ", 'values.length': " + i
|
|
.length), [];
|
|
this._items = new Array(r).concat(this._items), this._zoffset = t;
|
|
for (let s = 0; s < i.length; ++s) this._items[e + s + t] = i[s];
|
|
return [{
|
|
change: "rebuild",
|
|
index: this._validOffsetToIndex(0)
|
|
}]
|
|
}
|
|
const r = [];
|
|
let n = s;
|
|
for (; n < this._items.length && n - s < i.length; ++n) this._items[n] = i[n - s], r
|
|
.push({
|
|
change: "update",
|
|
index: this._validOffsetToIndex(n),
|
|
value: i[n - s]
|
|
});
|
|
const o = s + i.length;
|
|
if (o > this._items.length) {
|
|
const e = o - this._items.length;
|
|
for (let t = n; t < n + e; ++t) {
|
|
const e = this._items.length;
|
|
this._items.push(i[t - s]), r.push({
|
|
change: "append",
|
|
index: this._validOffsetToIndex(e),
|
|
value: i[t - s]
|
|
})
|
|
}
|
|
} else {
|
|
for (let e = o; e < this._items.length; ++e) r.push({
|
|
change: "remove",
|
|
index: this._validOffsetToIndex(e),
|
|
value: this._items[e]
|
|
});
|
|
this._items.length = o
|
|
}
|
|
return this._zoffset = t, r
|
|
}
|
|
addTail(e, t) {
|
|
for (let i = t ? 1 : 0; i < e.length; i++) this._items.push(e[i])
|
|
}
|
|
remove(e) {
|
|
const t = this._indexToOffset(e);
|
|
if (null === t) return [];
|
|
const i = this._items.splice(t),
|
|
s = [];
|
|
for (let t = 0; t < i.length; t++) s.push({
|
|
change: "remove",
|
|
index: e + t,
|
|
value: i[t]
|
|
});
|
|
return s
|
|
}
|
|
valueAt(e) {
|
|
const t = this._indexToOffset(e);
|
|
return null !== t ? this._items[t] : null
|
|
}
|
|
indexOf(e, t) {
|
|
if (this._items.length < 1) return null;
|
|
if (e > this._items[this._items.length - 1]) return t ? this._validOffsetToIndex(
|
|
this._items.length - 1) : null;
|
|
for (let i = 0; i < this._items.length; ++i) {
|
|
if (e === this._items[i]) return this._validOffsetToIndex(i);
|
|
if (e < this._items[i]) return t ? this._validOffsetToIndex(i) : null
|
|
}
|
|
return null
|
|
}
|
|
state() {
|
|
return {
|
|
items: this._items,
|
|
zoffset: this._zoffset
|
|
}
|
|
}
|
|
restoreState(e) {
|
|
null !== e && (this._items = e.items, this._zoffset = e.zoffset)
|
|
}
|
|
roughTime(e, t = null) {
|
|
const i = this.valueAt(e);
|
|
if (null !== i) return i;
|
|
const s = this._items;
|
|
if (!s.length || s.length < 2) return null;
|
|
const r = s.length - 1,
|
|
n = this._validOffsetToIndex(0),
|
|
o = this._validOffsetToIndex(r),
|
|
a = s[0],
|
|
l = s[r],
|
|
c = (l - a) / (o - n);
|
|
if (e < n) {
|
|
return a - (n - e) * c
|
|
}
|
|
if (e > o) {
|
|
const i = e - o;
|
|
if (i < 500 && null != t) return t(l, i);
|
|
return l + i * c
|
|
}
|
|
return null
|
|
}
|
|
roughIndex(e, t = null) {
|
|
const i = this._items;
|
|
if (!i.length || i.length < 2) return null;
|
|
const s = i.length - 1,
|
|
r = this._validOffsetToIndex(0),
|
|
n = this._validOffsetToIndex(s),
|
|
o = i[0],
|
|
a = i[s];
|
|
if (e >= o && e <= a) return this.closestIndexLeft(e);
|
|
const l = (a - o) / (n - r);
|
|
if (e < o) {
|
|
const t = o - e;
|
|
return r - Math.round(t / l)
|
|
}
|
|
if (e > a) {
|
|
const i = e - a;
|
|
let s = Math.trunc(i / l);
|
|
if (s < 500 && null !== t) {
|
|
const i = t(a, e);
|
|
i.success && (s = i.result)
|
|
}
|
|
return n + s
|
|
}
|
|
return null
|
|
}
|
|
closestIndexLeft(e) {
|
|
const t = this._items;
|
|
if (!t.length) return null;
|
|
if (Number.isNaN(e)) return null;
|
|
let i = t.length - 1;
|
|
if (e >= t[i]) return this._validOffsetToIndex(i);
|
|
let s = 0;
|
|
const r = t[s];
|
|
if (e < r) return null;
|
|
if (e === r) return this._validOffsetToIndex(s);
|
|
for (; i > s + 1;) {
|
|
const r = s + i >> 1,
|
|
n = t[r];
|
|
if (n > e) i = r;
|
|
else {
|
|
if (!(n < e)) return n === e ? this._validOffsetToIndex(r) : null;
|
|
s = r
|
|
}
|
|
}
|
|
return this._validOffsetToIndex(s)
|
|
}
|
|
_validOffsetToIndex(e) {
|
|
return e - this._zoffset
|
|
}
|
|
_offsetToIndex(e) {
|
|
return 0 <= e && e < this.size() ? this._validOffsetToIndex(e) : null
|
|
}
|
|
_indexToOffset(e) {
|
|
const t = e + this._zoffset;
|
|
return 0 <= t && t < this.size() ? t : null
|
|
}
|
|
}
|
|
var g = i("tc+8"),
|
|
b = i.n(g);
|
|
const v = new Map([
|
|
[0, .1],
|
|
[11, .1],
|
|
[1, .35],
|
|
[9, .35],
|
|
[12, .35],
|
|
[8, .35]
|
|
]);
|
|
class S {
|
|
constructor(e, t) {
|
|
this._styleSpecificRanges = new Map, this._logicalRange = e, this._defaultStyle = t
|
|
}
|
|
strictRange(e) {
|
|
if (null === this._logicalRange) return null;
|
|
void 0 === e && (e = this._defaultStyle);
|
|
let t = this._styleSpecificRanges.get(e);
|
|
if (void 0 === t) {
|
|
const i = (v.get(e) || 0) / 2;
|
|
t = new p.BarsRange(Math.floor(this._logicalRange.left() + i), Math.ceil(this
|
|
._logicalRange.right() - i)), this._styleSpecificRanges.set(e, t)
|
|
}
|
|
return t
|
|
}
|
|
logicalRange() {
|
|
return this._logicalRange
|
|
}
|
|
isValid() {
|
|
return null !== this._logicalRange
|
|
}
|
|
static invalid() {
|
|
return new S(null, 1)
|
|
}
|
|
}
|
|
var y = i("Ocx9"),
|
|
w = i("GhVi"),
|
|
P = i("8OdW");
|
|
class C {
|
|
constructor(e, t = 50) {
|
|
this._actualSize = 0, this._usageTick = 1, this._oldestTick = 1, this._cache =
|
|
new Map, this._tick2Labels = new Map, this._format = e, this._maxSize = t
|
|
}
|
|
format(e) {
|
|
const t = this._cache.get(e.valueOf());
|
|
if (void 0 !== t) return t.string;
|
|
if (this._actualSize === this._maxSize) {
|
|
const e = this._tick2Labels.get(this._oldestTick);
|
|
this._tick2Labels.delete(this._oldestTick), this._cache.delete(Object(s
|
|
.ensureDefined)(e)), this._oldestTick++, this._actualSize--
|
|
}
|
|
const i = this._format(e);
|
|
return this._cache.set(e.valueOf(), {
|
|
string: i,
|
|
tick: this._usageTick
|
|
}), this._tick2Labels.set(this._usageTick, e.valueOf()), this._actualSize++,
|
|
this._usageTick++, i
|
|
}
|
|
}
|
|
var x = i("iboI"),
|
|
T = i("YFKU");
|
|
let I;
|
|
var M = i("kcTO");
|
|
i.d(t, "TimeScale", (function() {
|
|
return k
|
|
}));
|
|
const O = {
|
|
preserveBarSpacing: !1,
|
|
lockVisibleTimeRangeOnResize: !1,
|
|
rightBarStaysOnScroll: !0,
|
|
minBarSpacing: .5
|
|
},
|
|
L = c.enabled("low_density_bars"),
|
|
A = L ? 1 : 5,
|
|
E = Object(n.getLogger)("Chart.TimeScale");
|
|
class k {
|
|
constructor(e, t) {
|
|
this._width = 0, this._widthChanged = new l.a, this._rightOffset = 10, this
|
|
._rightOffsetChanged = new l.a, this._maxRightOffsetChanged = new l.a, this
|
|
._defaultRightOffsetProperty = new b.a(10), this._baseIndex = null, this
|
|
._leftEdgeIndex = null, this._barSpacingChanged = new l.a, this._barSpacing = 6,
|
|
this._visibleBars = S.invalid(), this._visibleBarsInvalidated = !0, this
|
|
._visibleBarsChanged = new l.a, this._logicalRangeChanged = new l.a, this
|
|
._points = new f, this._tickMarks = new w.Tickmarks, this._onScroll = new l.a,
|
|
this._resetDelegate = new l.a, this._scrollStartPoint = null, this
|
|
._scaleStartPoint = null, this._commonTransitionStartState = null, this
|
|
._formattedBySpan = new Map, this._requestingMoreData = !1, this
|
|
._requestedTickmarksCount = 0, this._endOfData = !1, this._options = Object(d
|
|
.deepExtend)({}, O, t), this._model = e, this._scalesProperties = e
|
|
.properties().scalesProperties, this._defaultRightOffsetProperty.listeners()
|
|
.subscribe(this, e => {
|
|
this.setRightOffset(e.value())
|
|
}), this._options.preserveBarSpacing && (this._barSpacing = this
|
|
._scalesProperties.childs().barSpacing.value() || 6), this
|
|
._barSpacingChanged.subscribe(this, this._maxRightOffsetOnChanged), this
|
|
._widthChanged.subscribe(this, this._maxRightOffsetOnChanged)
|
|
}
|
|
destroy() {
|
|
this._barSpacingChanged.unsubscribeAll(this), this._barSpacingChanged.destroy(),
|
|
this._widthChanged.unsubscribeAll(this), this._widthChanged.destroy()
|
|
}
|
|
isEmpty() {
|
|
return 0 === this._width || 0 === this._points.size()
|
|
}
|
|
update(e, t, i, s) {
|
|
this._visibleBarsInvalidated = !0, i.length > 0 && this._points.merge(e, t, i), this
|
|
._tickMarks.merge(s), this._correctOffset()
|
|
}
|
|
addTail(e, t, i) {
|
|
this._tickMarks.removeTail(t);
|
|
const r = e.params,
|
|
n = Object(s.ensureDefined)(this._tickMarks.maxIndex) + (i ? 0 : 1);
|
|
for (let e = 0; e < r.marks.length; e++) r.marks[e].index = n + e;
|
|
this._tickMarks.addTail(r.marks), this._points.addTail(r.changes, i);
|
|
const o = this._rightOffset - r.changes.length;
|
|
this._updateRightOffset(o)
|
|
}
|
|
state(e) {
|
|
const t = {
|
|
m_barSpacing: this.barSpacing(),
|
|
m_rightOffset: e ? this._rightOffset : this._defaultRightOffsetProperty
|
|
.value()
|
|
};
|
|
return e && (t.points = this._points.state(), t.tickmarks = this._tickMarks.state(),
|
|
t.width = this._width), t
|
|
}
|
|
restoreState(e, t) {
|
|
if (void 0 === e.m_barSpacing) return void E.logDebug(
|
|
"restoreState: invalid state");
|
|
if (void 0 === e.m_rightOffset) return void E.logDebug(
|
|
"restoreState: invalid state");
|
|
let i = e.m_barSpacing;
|
|
const s = e.m_rightOffset < 0 && !t ? this.rightOffsetDefaultValue() : e
|
|
.m_rightOffset,
|
|
r = s < 0 ? this.rightOffsetDefaultValue() : Math.round(s);
|
|
this._defaultRightOffsetProperty.setValue(r), this._rightOffset = s, t && (this
|
|
._requestedTickmarksCount = 1 / 0, this._endOfData = !0, this._points
|
|
.restoreState(e.points || null),
|
|
this._tickMarks.restoreState(e.tickmarks || null), e.width && this._width >
|
|
0 && (i *= this._width / e.width)), this._tryToUpdateBarSpacing(this
|
|
._barSpacing, i), this._correctOffset(), this._rightOffsetChanged.fire(this
|
|
._rightOffset)
|
|
}
|
|
marks() {
|
|
if (this.isEmpty()) return null;
|
|
const e = this._barSpacing,
|
|
t = 5 * ((this._scalesProperties.childs().fontSize.value() || 0) + 4),
|
|
i = Math.round(t / e),
|
|
r = Object(s.ensureNotNull)(this.visibleBarsStrictRange()),
|
|
n = Math.max(r.firstBar(), r.firstBar() - i),
|
|
o = Math.max(r.lastBar(), r.lastBar() - i),
|
|
a = this._tickMarks.build(e, t),
|
|
l = [];
|
|
for (const e of a) {
|
|
if (!(n <= e.index && e.index <= o)) continue;
|
|
const t = this._tickMarks.indexToTime(e.index);
|
|
null !== t && l.push({
|
|
coord: this.indexToCoordinate(e.index),
|
|
label: this.formatLabel(t, e.span),
|
|
span: e.span,
|
|
major: e.label >= P.DAY_SPAN
|
|
})
|
|
}
|
|
return l
|
|
}
|
|
visibleBarsStrictRange() {
|
|
return this._visibleBarsInvalidated && (this._visibleBarsInvalidated = !1, this
|
|
._updateVisibleBars()), this._visibleBars.strictRange()
|
|
}
|
|
visibleBarsStrictRangeChanged() {
|
|
return this._visibleBarsChanged
|
|
}
|
|
logicalRangeChanged() {
|
|
return this._logicalRangeChanged
|
|
}
|
|
tickMarks() {
|
|
return this._tickMarks
|
|
}
|
|
points() {
|
|
return this._points
|
|
}
|
|
width() {
|
|
return this._width
|
|
}
|
|
setWidth(e, t) {
|
|
if (!Number.isFinite(e) || e <= 0) return void E.logWarn(
|
|
"setWidth: invalid argument: " + e);
|
|
if (this._width === e) return;
|
|
if (this._visibleBarsInvalidated = !0, (t || this._options
|
|
.lockVisibleTimeRangeOnResize) && this._width) {
|
|
const t = this._barSpacing * e / this._width;
|
|
this._tryToUpdateBarSpacing(this._barSpacing, t)
|
|
}
|
|
if (null !== this._leftEdgeIndex) {
|
|
if (Object(s.ensureNotNull)(this.visibleBarsStrictRange()).firstBar() <= this
|
|
._leftEdgeIndex) {
|
|
const t = this._width - e;
|
|
this._rightOffset -= Math.round(t / this._barSpacing) + 1
|
|
}
|
|
}
|
|
this._width = e, this._widthChanged.fire(e);
|
|
const i = this._rightOffset;
|
|
this._correctOffset(), this._rightOffset !== i && this._rightOffsetChanged.fire(this
|
|
._rightOffset), this._requestMoreData()
|
|
}
|
|
setLeftEdgeFix(e) {
|
|
this._leftEdgeIndex = e;
|
|
const t = this.visibleBarsStrictRange();
|
|
if (null === t) return;
|
|
const i = t.firstBar() - e;
|
|
if (i < 0) {
|
|
const e = this._rightOffset - i - 1;
|
|
this.scrollToOffsetAnimated(e, 500)
|
|
}
|
|
}
|
|
indexToCoordinate(e) {
|
|
if (this.isEmpty()) return 0;
|
|
if (!Object(u.isInteger)(e)) return 0;
|
|
const t = this.baseIndex() + this._rightOffset - e;
|
|
return this._width - (t + .5) * this._barSpacing - 1
|
|
}
|
|
indexToUserTime(e) {
|
|
return this._tickMarks.indexToTime(e)
|
|
}
|
|
timePointToIndex(e) {
|
|
return this._points.indexOf(e, !0)
|
|
}
|
|
indexToTimePoint(e) {
|
|
return this._points.valueAt(e)
|
|
}
|
|
timeToCoordinate(e) {
|
|
const t = this._points.closestIndexLeft(e);
|
|
if (null === t) return null;
|
|
const i = Object(s.ensureNotNull)(this._points.valueAt(t)),
|
|
r = this.indexToCoordinate(t);
|
|
if (r <= 0 || r >= this._width) return null;
|
|
const n = this.barSpacing(),
|
|
o = this.baseIndex(),
|
|
a = r + (e - i) / (Object(s.ensureNotNull)(this._points.valueAt(o)) - Object(s
|
|
.ensureNotNull)(this._points.valueAt(o - 1))) * n + 1;
|
|
return a <= 0 || a >= this._width ? null : a
|
|
}
|
|
barIndexesToCoordinates(e) {
|
|
const t = this.baseIndex();
|
|
for (const i of e) {
|
|
const e = i.time,
|
|
s = t + this._rightOffset - e,
|
|
r = this._width - (s + .5) * this._barSpacing - 1;
|
|
i.time = r, i.exactTime = r
|
|
}
|
|
}
|
|
timedValuesToCoordinates(e) {
|
|
const t = this.baseIndex() + this._rightOffset,
|
|
i = this._width - t * this._barSpacing - .5 * this._barSpacing - 1;
|
|
for (const t of e) t.x = i + t.x * this._barSpacing
|
|
}
|
|
indexesToCoordinates(e, t) {
|
|
if (this.isEmpty()) return;
|
|
void 0 === t && (t = e.length);
|
|
const i = this.baseIndex() + this._rightOffset,
|
|
s = this._width - i * this._barSpacing - .5 * this._barSpacing - 1,
|
|
r = this._barSpacing,
|
|
n = e;
|
|
for (let i = 0; i < t; ++i) Object(u.isInteger)(e[i]) ? n[i] = s + e[i] * r : n[i] =
|
|
0
|
|
}
|
|
rightOffsetForTimePoint(e) {
|
|
const t = this.timeToCoordinate(e);
|
|
return null === t ? null : this._rightOffsetForCoordinate(t)
|
|
}
|
|
scrollToRealtime(e, t) {
|
|
let i = this._defaultRightOffsetProperty.value();
|
|
i < 0 && (i = this.rightOffsetDefaultValue());
|
|
const s = () => {
|
|
void 0 !== t && t(), this._requestMoreData()
|
|
};
|
|
if (e) {
|
|
const e = this._rightOffset,
|
|
t = this.maxRightOffset();
|
|
t > 0 && i > t && (i = t);
|
|
const n = this._model;
|
|
Object(o.doAnimate)({
|
|
from: e,
|
|
to: i,
|
|
duration: 1e3,
|
|
easing: r.c.easeInOutQuint,
|
|
onComplete: s,
|
|
onStep: (e, t) => {
|
|
this._visibleBarsInvalidated = !0, this._updateRightOffset(
|
|
t), n.recalculateAllPanes(), n.lightUpdate(), n
|
|
.recalcVisibleRangeStudies()
|
|
}
|
|
})
|
|
} else this._visibleBarsInvalidated = !0, this._updateRightOffset(i), s()
|
|
}
|
|
scrollToOffsetAnimated(e, t) {
|
|
if (!isFinite(e)) throw new RangeError(
|
|
"offset is required and must be finite number");
|
|
const i = void 0 === t ? 400 : t;
|
|
if (!isFinite(i) || i <= 0) throw new RangeError(
|
|
"animationDuration (optional) must be finite positive number");
|
|
const s = this._rightOffset,
|
|
r = Date.now(),
|
|
n = () => {
|
|
this._visibleBarsInvalidated = !0;
|
|
const t = (Date.now() - r) / i;
|
|
if (t >= 1) return this._updateRightOffset(e), this
|
|
._visibleBarsInvalidated = !0, this._model.recalculateAllPanes(),
|
|
void this._model.lightUpdate();
|
|
const o = s + (e - s) * t;
|
|
this._updateRightOffset(o), this._model.recalculateAllPanes(), setTimeout(n,
|
|
20)
|
|
};
|
|
n()
|
|
}
|
|
defaultRightOffsetProperty() {
|
|
return this._defaultRightOffsetProperty
|
|
}
|
|
rightOffsetDefaultValue() {
|
|
return 10
|
|
}
|
|
barSpacing() {
|
|
return this._barSpacing
|
|
}
|
|
setBarSpacing(e) {
|
|
Number.isFinite(e) ? (e = this.getValidBarSpacing(e), this._tryToUpdateBarSpacing(
|
|
this._barSpacing, e) && (this._correctOffset(), this._options
|
|
.preserveBarSpacing && (Object(y.saveDefaultProperties)(!0), this
|
|
._scalesProperties.childs().barSpacing.setValue(this._barSpacing),
|
|
Object(y.saveDefaultProperties)(!1)))) : E.logWarn(
|
|
"setBarSpacing: invalid argument: " + e)
|
|
}
|
|
barSpacingChanged() {
|
|
return this._barSpacingChanged
|
|
}
|
|
getValidBarSpacing(e) {
|
|
return null == e && (e = this.barSpacing()), e < this.minBarSpacing() ? this
|
|
.minBarSpacing() : e > this.maxBarSpacing() ? this.maxBarSpacing() : e
|
|
}
|
|
isValidBarSpacing(e) {
|
|
return e >= this.minBarSpacing() && e <= this.maxBarSpacing()
|
|
}
|
|
preserveBarSpacing() {
|
|
return this._options.preserveBarSpacing
|
|
}
|
|
normalizeBarIndex(e) {
|
|
let t = 0,
|
|
i = 0;
|
|
const r = this.baseIndex(),
|
|
n = Object(s.ensureNotNull)(this._points.firstIndex());
|
|
return e < n ? (t = Object(s.ensureNotNull)(this._points.valueAt(n)), i = e - n) :
|
|
e > r ? (t = Object(s.ensureNotNull)(this._points.valueAt(r)), i = e - r) : (t =
|
|
Object(s.ensureNotNull)(this._points.valueAt(e)), i = 0), {
|
|
time_t: t,
|
|
offset: i
|
|
}
|
|
}
|
|
denormalizeTimePoint(e) {
|
|
const t = this._points.indexOf(e.time_t, !1);
|
|
if (null !== t) return t + e.offset
|
|
}
|
|
rightOffset() {
|
|
return this._rightOffset
|
|
}
|
|
rightOffsetChanged() {
|
|
return this._rightOffsetChanged
|
|
}
|
|
minRightOffset() {
|
|
const e = this.points().firstIndex(),
|
|
t = this._baseIndex;
|
|
if (null === e || null === t) return null;
|
|
if (null !== this._leftEdgeIndex) {
|
|
const e = this.width() / this._barSpacing;
|
|
return this._leftEdgeIndex - t + e - 1
|
|
}
|
|
return e - t - 1 + A
|
|
}
|
|
maxRightOffset() {
|
|
return this.width() / this._barSpacing - A
|
|
}
|
|
maxRightOffsetChanged() {
|
|
return this._maxRightOffsetChanged
|
|
}
|
|
onReset() {
|
|
return this._resetDelegate
|
|
}
|
|
scrollStartPoint() {
|
|
return this._scrollStartPoint
|
|
}
|
|
baseIndex() {
|
|
return this._baseIndex || 0
|
|
}
|
|
zoom(e, t, i) {
|
|
if (!Number.isFinite(e) || !Number.isFinite(t)) return void E.logWarn(
|
|
`zoom: invalid arguments: ${e}, ${t}, ${i}`);
|
|
const s = this.coordinateToIndex(e),
|
|
r = this.barSpacing(),
|
|
n = r + t * (r / 10);
|
|
this.setBarSpacing(n);
|
|
(void 0 !== i ? !i : this._options.rightBarStaysOnScroll) || this.setRightOffset(
|
|
this.rightOffset() - .5 + (s - this._coordinateToFloatIndex(e))), this
|
|
._requestMoreData()
|
|
}
|
|
zoomToBarsRange(e, t) {
|
|
if (null !== this._leftEdgeIndex && (e = Math.max(e, this._leftEdgeIndex)), t <= e)
|
|
return;
|
|
const i = this.baseIndex(),
|
|
s = this._rightOffset;
|
|
this._rightOffset = t - i;
|
|
const r = Math.max(t - e + 1, A);
|
|
this.setBarSpacing(this.width() / r), this._visibleBarsInvalidated = !0, this
|
|
._correctOffset(), this._rightOffset !== s && this._rightOffsetChanged.fire(this
|
|
._rightOffset), this._requestMoreData()
|
|
}
|
|
coordinateToIndex(e) {
|
|
return Math.ceil(this._coordinateToFloatIndex(e))
|
|
}
|
|
coordinateToVisibleIndex(e) {
|
|
let t;
|
|
if (0 === e) {
|
|
const e = this._coordinateToFloatIndex(-1);
|
|
t = Math.floor(e) + 1
|
|
} else t = this.coordinateToIndex(e);
|
|
const i = this.visibleBarsStrictRange();
|
|
return null === i || i.contains(t) || (t = Math.min(Math.max(i.firstBar(), t), i
|
|
.lastBar())), t
|
|
}
|
|
canZoomIn() {
|
|
return this.barSpacing() < this.maxBarSpacing()
|
|
}
|
|
canZoomOut() {
|
|
return this.barSpacing() > this._options.minBarSpacing
|
|
}
|
|
minBarSpacing() {
|
|
return this._options.minBarSpacing
|
|
}
|
|
maxBarSpacing() {
|
|
return L ? this.width() : 50
|
|
}
|
|
resetRightOffset() {
|
|
this.setRightOffset(this._defaultRightOffsetProperty.value())
|
|
}
|
|
reset() {
|
|
this._visibleBarsInvalidated = !0, this._points = new f, this._scrollStartPoint =
|
|
null, this._scaleStartPoint = null, this._clearCommonTransitionsStartState(),
|
|
this._tickMarks.reset(), this._leftEdgeIndex = null, this._resetDelegate.fire(),
|
|
this.disconnect()
|
|
}
|
|
disconnect() {
|
|
this._requestingMoreData = !1, this._requestedTickmarksCount = 0, this
|
|
._endOfData = !1
|
|
}
|
|
setBaseIndex(e) {
|
|
Number.isFinite(e) ? (this._visibleBarsInvalidated = !0, this._baseIndex = e, this
|
|
._correctOffset()) : E.logDebug("setBaseIndex: invalid argument: " + e)
|
|
}
|
|
setRightOffset(e) {
|
|
Number.isFinite(e) ? (this._visibleBarsInvalidated = !0, this._updateRightOffset(
|
|
e)) : E.logWarn("setRightOffset: invalid argument: " + e)
|
|
}
|
|
correctBarSpacing() {
|
|
this.isEmpty() || this.points().size() < this.width() / this.barSpacing() && (this
|
|
.setRightOffset(this._defaultRightOffsetProperty.value()), this
|
|
.setBarSpacing(this.width() / (this.points().size() + this.rightOffset())))
|
|
}
|
|
logicalRange() {
|
|
return this._visibleBarsInvalidated && (this._visibleBarsInvalidated = !1, this
|
|
._updateVisibleBars()), this._visibleBars.logicalRange()
|
|
}
|
|
restoreDefault() {
|
|
this._visibleBarsInvalidated = !0, this.setBarSpacing(6), this.resetRightOffset(),
|
|
this._requestMoreData()
|
|
}
|
|
restoreRightOffsetPropertyToDefault() {
|
|
this._defaultRightOffsetProperty.setValue(this.rightOffsetDefaultValue())
|
|
}
|
|
startScale(e) {
|
|
this._scrollStartPoint && this.endScroll(),
|
|
null === this._scaleStartPoint && null === this._commonTransitionStartState && (
|
|
this.isEmpty() || (this._scaleStartPoint = e, this
|
|
._saveCommonTransitionsStartState()))
|
|
}
|
|
scaleTo(e) {
|
|
if (null === this._commonTransitionStartState) return;
|
|
const t = Object(h.clamp)(this._width - e, 0, this._width),
|
|
i = Object(h.clamp)(this._width - Object(s.ensureNotNull)(this
|
|
._scaleStartPoint), 0, this._width);
|
|
0 !== t && 0 !== i && this.setBarSpacing(this._commonTransitionStartState
|
|
.barSpacing * t / i)
|
|
}
|
|
endScale() {
|
|
null !== this._scaleStartPoint && (this._scaleStartPoint = null, this
|
|
._clearCommonTransitionsStartState(), this._requestMoreData())
|
|
}
|
|
startScroll(e) {
|
|
null === this._scrollStartPoint && null === this._commonTransitionStartState && (
|
|
this.isEmpty() || (this._scrollStartPoint = e, this
|
|
._saveCommonTransitionsStartState()))
|
|
}
|
|
scrollTo(e) {
|
|
if (this._visibleBarsInvalidated = !0, null === this._scrollStartPoint) return;
|
|
const t = (this._scrollStartPoint - e) / this.barSpacing(),
|
|
i = Object(s.ensureNotNull)(this._commonTransitionStartState).rightOffset + t;
|
|
this._updateRightOffset(i), this._onScroll.fire()
|
|
}
|
|
endScroll() {
|
|
null !== this._scrollStartPoint && (this._scrollStartPoint = null, this
|
|
._clearCommonTransitionsStartState(), this._requestMoreData())
|
|
}
|
|
formatLabel(e, t) {
|
|
let i = this._formattedBySpan.get(t);
|
|
return void 0 === i && (i = new C(e => this.formatLabelImpl(e, t)), this
|
|
._formattedBySpan.set(t, i)), i.format(new Date(e))
|
|
}
|
|
formatLabelImpl(e, t) {
|
|
if (!(e && e instanceof Date)) return "incorrect time";
|
|
const i = function(e, t) {
|
|
if (e < P.MINUTE_SPAN && t) return "TimeWithSeconds";
|
|
if (e < P.DAY_SPAN && t) return "Time";
|
|
if (e < P.WEEK_SPAN) return "DayOfMonth";
|
|
if (e < P.MONTH_SPAN) return "DayOfMonth";
|
|
if (e < P.YEAR_SPAN) return "Month";
|
|
return "Year"
|
|
}(t, !this._model.mainSeries().isDWM());
|
|
return null !== x.customFormatters.tickMarkFormatter ? x.customFormatters
|
|
.tickMarkFormatter(e, i) : function(e, t) {
|
|
switch (t) {
|
|
case "TimeWithSeconds":
|
|
return Object(M.numberToStringWithLeadingZero)(e.getUTCHours(), 2) +
|
|
":" + Object(M.numberToStringWithLeadingZero)(e.getUTCMinutes(),
|
|
2) + ":" + Object(M.numberToStringWithLeadingZero)(e
|
|
.getUTCSeconds(), 2);
|
|
case "Time":
|
|
return Object(M.numberToStringWithLeadingZero)(e.getUTCHours(), 2) +
|
|
":" + Object(M.numberToStringWithLeadingZero)(e.getUTCMinutes(),
|
|
2);
|
|
case "DayOfMonth":
|
|
return e.getUTCDate().toString();
|
|
case "Month":
|
|
return (void 0 === I && (I = [Object(T.t)("Jan"), Object(T.t)(
|
|
"Feb"), Object(T.t)("Mar"), Object(T.t)("Apr"),
|
|
Object(T.t)("May", {
|
|
context: "short"
|
|
}), Object(T.t)("Jun"), Object(T.t)("Jul"), Object(T
|
|
.t)("Aug"), Object(T.t)("Sep"), Object(T.t)(
|
|
"Oct"), Object(T.t)("Nov"), Object(T.t)("Dec")
|
|
]), I)[e.getUTCMonth()];
|
|
case "Year":
|
|
return e.getUTCFullYear().toString()
|
|
}
|
|
}(e, i)
|
|
}
|
|
onScroll() {
|
|
return this._onScroll
|
|
}
|
|
invalidateVisibleBars() {
|
|
this._visibleBarsInvalidated = !0
|
|
}
|
|
onTimeScaleCompleted(e) {
|
|
if (this._requestingMoreData = !1, this._endOfData = e, c.enabled(
|
|
"fix_left_edge") && this._endOfData) {
|
|
const e = this._points.firstIndex();
|
|
null !== e && this.setLeftEdgeFix(e)
|
|
}
|
|
this._requestMoreData()
|
|
}
|
|
requestMoreHistoryPoints(e) {
|
|
this._requestHistoryPoints(e)
|
|
}
|
|
_requestMoreData() {
|
|
this._requestFutureTickmarksIfNeeded(), this._requestHistoryPointsIfNeeded()
|
|
}
|
|
_requestFutureTickmarksIfNeeded() {
|
|
if (this.isEmpty() || !this._model.chartApi().isConnected().value()) return;
|
|
const e = this.visibleBarsStrictRange();
|
|
if (null === e) return;
|
|
const t = e.lastBar() - Object(s.ensureNotNull)(this._points.lastIndex());
|
|
if (t <= this._requestedTickmarksCount) return;
|
|
const i = t - this._requestedTickmarksCount;
|
|
this._requestedTickmarksCount = t, this._model.chartApi().requestMoreTickmarks(i)
|
|
}
|
|
_requestHistoryPointsIfNeeded() {
|
|
if (this.isEmpty()) return;
|
|
if (this._endOfData) return void E.logNormal(
|
|
"Skipping loading more data due end of data state");
|
|
const e = this.visibleBarsStrictRange();
|
|
if (null === e) return;
|
|
const t = Object(s.ensureNotNull)(this._points.firstIndex()) - e.firstBar();
|
|
t <= 0 || this._requestHistoryPoints(t)
|
|
}
|
|
_requestHistoryPoints(e) {
|
|
this._model.chartApi().isConnected().value() && (this._requestingMoreData ? E
|
|
.logNormal("Skipping loading more data due active loading") : (this
|
|
._requestingMoreData = !0, this._model.chartApi().requestMoreData(e)))
|
|
}
|
|
_updateVisibleBars() {
|
|
const e = this._visibleBars;
|
|
if (this.isEmpty()) return void(this._visibleBars.isValid() && (this._visibleBars =
|
|
S.invalid(), this._visibleBarsChanged.fire(null, e.strictRange()),
|
|
this._logicalRangeChanged.fire(null, e.logicalRange())));
|
|
const t = this.baseIndex(),
|
|
i = this.width() / this._barSpacing,
|
|
s = this._rightOffset + t,
|
|
r = s - i + 1;
|
|
Number.isFinite(r) && Number.isFinite(s) ? (this._visibleBars = new S(new _(r, s),
|
|
this._model.mainSeries().style()), p.BarsRange.compare(e.strictRange(),
|
|
this._visibleBars.strictRange()) || this._visibleBarsChanged.fire(this
|
|
._visibleBars.strictRange(), e.strictRange()), _.compare(e
|
|
.logicalRange(), this._visibleBars.logicalRange()) || this
|
|
._logicalRangeChanged.fire(this._visibleBars.logicalRange(), e
|
|
.logicalRange())) : E.logWarn(
|
|
`updateVisibleBars error: baseIndex: ${t}, barSpacing: ${this._barSpacing}, rightOffset: ${this._rightOffset}`
|
|
)
|
|
}
|
|
_rightOffsetForCoordinate(e) {
|
|
return (this._width - 1 - e) / this._barSpacing
|
|
}
|
|
_correctOffset() {
|
|
const e = this.maxRightOffset();
|
|
this._rightOffset > e && (this._rightOffset = e, this._visibleBarsInvalidated = !0);
|
|
const t = this.minRightOffset();
|
|
null !== t && this._rightOffset < t && (this._rightOffset = t, this
|
|
._visibleBarsInvalidated = !0)
|
|
}
|
|
_tryToUpdateBarSpacing(e, t) {
|
|
return e !== t && (this._visibleBarsInvalidated = !0, this._barSpacing = t, this
|
|
._barSpacingChanged.fire(t), !0)
|
|
}
|
|
_coordinateToFloatIndex(e) {
|
|
const t = this._rightOffsetForCoordinate(e),
|
|
i = this.baseIndex() + this.rightOffset() - t;
|
|
return Math.round(1e6 * i) / 1e6
|
|
}
|
|
_saveCommonTransitionsStartState() {
|
|
this._commonTransitionStartState = {
|
|
barSpacing: this.barSpacing(),
|
|
rightOffset: this.rightOffset()
|
|
}
|
|
}
|
|
_clearCommonTransitionsStartState() {
|
|
this._commonTransitionStartState = null
|
|
}
|
|
_maxRightOffsetOnChanged() {
|
|
this._maxRightOffsetChanged.fire(this.maxRightOffset())
|
|
}
|
|
_updateRightOffset(e) {
|
|
const t = this._rightOffset;
|
|
this._rightOffset = e, this._correctOffset(), this._rightOffset !== t && this
|
|
._rightOffsetChanged.fire(this._rightOffset)
|
|
}
|
|
}
|
|
},
|
|
"23IT": function(e, t, i) {
|
|
"use strict";
|
|
var s, r;
|
|
|
|
function n(e) {
|
|
return "line" === e.type
|
|
}
|
|
|
|
function o(e) {
|
|
return "shapes" === e.type
|
|
}
|
|
|
|
function a(e) {
|
|
return "chars" === e.type
|
|
}
|
|
|
|
function l(e) {
|
|
return "arrows" === e.type
|
|
}
|
|
|
|
function c(e) {
|
|
return "dataoffset" === e.type
|
|
}
|
|
|
|
function h(e) {
|
|
return "ohlc_open" === e.type
|
|
}
|
|
|
|
function u(e) {
|
|
return "ohlc_high" === e.type
|
|
}
|
|
|
|
function d(e) {
|
|
return "ohlc_low" === e.type
|
|
}
|
|
|
|
function p(e) {
|
|
return "ohlc_close" === e.type
|
|
}
|
|
|
|
function _(e) {
|
|
return h(e) || u(e) || d(e) || p(e)
|
|
}
|
|
|
|
function m(e) {
|
|
return "colorer" === e.type
|
|
}
|
|
|
|
function f(e) {
|
|
return "bar_colorer" === e.type
|
|
}
|
|
|
|
function g(e) {
|
|
return "bg_colorer" === e.type
|
|
}
|
|
|
|
function b(e) {
|
|
return "text_colorer" === e.type
|
|
}
|
|
|
|
function v(e) {
|
|
return "ohlc_colorer" === e.type
|
|
}
|
|
|
|
function S(e) {
|
|
return "wick_colorer" === e.type
|
|
}
|
|
|
|
function y(e) {
|
|
return "border_colorer" === e.type
|
|
}
|
|
|
|
function w(e) {
|
|
return "up_colorer" === e.type
|
|
}
|
|
|
|
function P(e) {
|
|
return "down_colorer" === e.type
|
|
}
|
|
|
|
function C(e) {
|
|
return "alertcondition" === e.type
|
|
}
|
|
|
|
function x(e) {
|
|
return "Plot" !== e
|
|
}
|
|
|
|
function T(e) {
|
|
return "ohlc_bars" === e.plottype
|
|
}
|
|
|
|
function I(e) {
|
|
return "ohlc_candles" === e.plottype
|
|
}
|
|
|
|
function M(e) {
|
|
return m(e) || f(e) || g(e) || c(e) || v(e) || C(e) || w(e) || P(e) || y(e) || S(e) || b(e)
|
|
}
|
|
|
|
function O(e) {
|
|
return m(e) || b(e) || f(e) || c(e) || v(e) || S(e) || y(e) || w(e) || P(e) || C(e)
|
|
}
|
|
i.r(t), i.d(t, "LineStudyPlotStyle", (function() {
|
|
return s
|
|
})), i.d(t, "isLinePlot", (function() {
|
|
return n
|
|
})), i.d(t, "isShapesPlot", (function() {
|
|
return o
|
|
})), i.d(t, "isCharsPlot", (function() {
|
|
return a
|
|
})), i.d(t, "isArrowsPlot", (function() {
|
|
return l
|
|
})), i.d(t, "isDataOffsetPlot", (function() {
|
|
return c
|
|
})), i.d(t, "isOhlcOpenPlot", (function() {
|
|
return h
|
|
})), i.d(t, "isOhlcHighPlot", (function() {
|
|
return u
|
|
})), i.d(t, "isOhlcLowPlot", (function() {
|
|
return d
|
|
})), i.d(t, "isOhlcClosePlot", (function() {
|
|
return p
|
|
})), i.d(t, "isOhlcPlot", (function() {
|
|
return _
|
|
})), i.d(t, "isColorerPlot", (function() {
|
|
return m
|
|
})), i.d(t, "isBarColorerPlot", (function() {
|
|
return f
|
|
})), i.d(t, "isBgColorerPlot", (function() {
|
|
return g
|
|
})), i.d(t, "isTextColorerPlot", (function() {
|
|
return b
|
|
})), i.d(t, "isOhlcColorerPlot", (function() {
|
|
return v
|
|
})), i.d(t, "isCandleWickColorerPlot", (function() {
|
|
return S
|
|
})), i.d(t, "isCandleBorderColorerPlot", (function() {
|
|
return y
|
|
})), i.d(t, "isUpColorerPlot", (function() {
|
|
return w
|
|
})), i.d(t, "isDownColorerPlot", (function() {
|
|
return P
|
|
})), i.d(t, "isAlertConditionPlot", (function() {
|
|
return C
|
|
})), i.d(t, "isPlotTitleDefined", (function() {
|
|
return x
|
|
})), i.d(t, "isOhlcPlotStyleBars", (function() {
|
|
return T
|
|
})), i.d(t, "isOhlcPlotStyleCandles", (function() {
|
|
return I
|
|
})), i.d(t, "PlotSymbolSize", (function() {
|
|
return r
|
|
})), i.d(t, "isPlotWithTechnicalValues", (function() {
|
|
return M
|
|
})), i.d(t, "isNonVisualPlot", (function() {
|
|
return O
|
|
})),
|
|
function(e) {
|
|
e[e.Line = 0] = "Line", e[e.Histogram = 1] = "Histogram", e[e.Cross = 3] = "Cross", e[e
|
|
.Area = 4] = "Area", e[e.Columns = 5] = "Columns", e[e.Circles = 6] = "Circles",
|
|
e[e.LineWithBreaks = 7] = "LineWithBreaks", e[e.AreaWithBreaks = 8] =
|
|
"AreaWithBreaks", e[e.StepLine = 9] = "StepLine", e[e.StepLineWithDiamonds = 10] =
|
|
"StepLineWithDiamonds"
|
|
}(s || (s = {})),
|
|
function(e) {
|
|
e.Auto = "auto", e.Tiny = "tiny", e.Small = "small", e.Normal = "normal", e.Large =
|
|
"large", e.Huge = "huge"
|
|
}(r || (r = {}))
|
|
},
|
|
"25b6": function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "b", (function() {
|
|
return n
|
|
})), i.d(t, "d", (function() {
|
|
return o
|
|
})), i.d(t, "c", (function() {
|
|
return a
|
|
})), i.d(t, "a", (function() {
|
|
return l
|
|
}));
|
|
const s = /[<"'&>]/g,
|
|
r = e => `&#${e.charCodeAt(0)};`;
|
|
|
|
function n(e) {
|
|
return e.replace(s, r)
|
|
}
|
|
|
|
function o(e = "") {
|
|
return e.replace(/(<([^>]+)>)/gi, "")
|
|
}
|
|
|
|
function a(e = "") {
|
|
return e.replace(/\s+/g, "")
|
|
}
|
|
|
|
function l(e = "") {
|
|
return e.replace(/\b\w/g, e => e.toUpperCase())
|
|
}
|
|
},
|
|
"29fS": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "PaneRendererBars", (function() {
|
|
return n
|
|
}));
|
|
var s = i("Zp/P"),
|
|
r = i("ExCE");
|
|
class n extends r.a {
|
|
constructor(e) {
|
|
super(), this._bars = e.bars, this._barSpacing = e.barSpacing, this
|
|
._dontDrawOpen = e.dontDrawOpen, this._thinBars = e.thinBars
|
|
}
|
|
draw(e, t) {
|
|
e.save();
|
|
const i = t.pixelRatio;
|
|
if (this._barWidth = this._calcBarWidth(i), this._barWidth >= 2) {
|
|
Math.max(1, Math.floor(i)) % 2 != this._barWidth % 2 && this._barWidth--
|
|
}
|
|
this._barLineWidth = this._thinBars ? Math.min(this._barWidth, Math.floor(i)) :
|
|
this._barWidth;
|
|
let s = null;
|
|
const r = this._barLineWidth <= this._barWidth && this._barSpacing >= Math
|
|
.floor(1.5 * t.pixelRatio);
|
|
for (const t of this._bars) {
|
|
s !== t.color && (e.fillStyle = t.color, s = t.color);
|
|
const n = Math.floor(.5 * this._barLineWidth),
|
|
o = Math.round(t.time * i),
|
|
a = o - n,
|
|
l = this._barLineWidth,
|
|
c = a + l - 1,
|
|
h = Math.min(t.high, t.low),
|
|
u = Math.max(t.high, t.low),
|
|
d = Math.round(h * i) - n,
|
|
p = Math.round(u * i) + n,
|
|
_ = Math.max(p - d, this._barLineWidth);
|
|
e.fillRect(a, d, l, _);
|
|
const m = Math.ceil(1.5 * this._barWidth);
|
|
if (r) {
|
|
const s = o - m,
|
|
r = o + m,
|
|
h = Math.min(a - s, r - c);
|
|
if (!this._dontDrawOpen) {
|
|
let r = Math.max(d, Math.round(t.open * i) - n),
|
|
o = r + l - 1;
|
|
o > d + _ - 1 && (o = d + _ - 1, r = o - l + 1), e.fillRect(s, r, h,
|
|
o - r + 1)
|
|
}
|
|
let u = Math.max(d, Math.round(t.close * i) - n),
|
|
p = u + l - 1;
|
|
p > d + _ - 1 && (p = d + _ - 1, u = p - l + 1), e.fillRect(c + 1, u, h,
|
|
p - u + 1)
|
|
}
|
|
}
|
|
e.restore()
|
|
}
|
|
_getTolerance() {
|
|
const e = this._calcBarWidth(1),
|
|
t = this._thinBars ? Math.min(e, 1) : e;
|
|
return Object(s.interactionTolerance)().series + t / 2
|
|
}
|
|
_getBarSpacing() {
|
|
return this._barSpacing
|
|
}
|
|
_calcBarWidth(e) {
|
|
const t = Math.floor(e);
|
|
return Math.max(t, Math.floor(Object(s.optimalBarWidth)(this._barSpacing, e)))
|
|
}
|
|
}
|
|
},
|
|
"2EnG": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "StandardPivotPointsImageCache", (function() {
|
|
return n
|
|
}));
|
|
var s = i("ikwP"),
|
|
r = i("Eyy1");
|
|
class n {
|
|
constructor(e, t, i, r) {
|
|
this._priceAxisFontSize = 11, this._prices = [], this._labelWidth = 0, this
|
|
._paneRenderParams = e, this._recreateCanvasAndContext(new s.Size(0, 0)), this
|
|
.reset({
|
|
font: t,
|
|
fontSize: i,
|
|
backColors: r
|
|
})
|
|
}
|
|
destroy() {
|
|
delete this._canvas, delete this._cache
|
|
}
|
|
canvas() {
|
|
return this._canvas
|
|
}
|
|
reset(e) {
|
|
this._renderParams = e, this._prices = [], this._cache.font = e.fontSize + "px " + e
|
|
.font, this._labelWidth = ["P", "S1", "R1", "S2", "R2", "S3", "R3", "S4", "R4",
|
|
"S5", "R5", "/"
|
|
].reduce((e, t) => {
|
|
const i = this._cache.measureText(t).width;
|
|
return Math.max(i, e)
|
|
}, 0)
|
|
}
|
|
rowHeight() {
|
|
return this._priceAxisFontSize + 4
|
|
}
|
|
labelRectByIndex(e) {
|
|
return {
|
|
left: 0,
|
|
top: Math.round(this._topByIndex(e)),
|
|
width: Math.round(this._labelWidth + 4),
|
|
height: Math.round(this._renderParams.fontSize + 8)
|
|
}
|
|
}
|
|
setPrices(e) {
|
|
let t = !1;
|
|
const i = (e, t) => {
|
|
const i = void 0 === e,
|
|
s = void 0 === t;
|
|
return (!i && !s || i === s) && Object(r.ensureDefined)(e).formatted ===
|
|
Object(r.ensureDefined)(t).formatted
|
|
};
|
|
if (e.length !== this._prices.length) t = !0;
|
|
else
|
|
for (let s = 0; s < this._prices.length; s++)
|
|
if (!i(this._prices[s], e[s])) {
|
|
t = !0;
|
|
break
|
|
} if (t) {
|
|
const t = this._labelWidth + 6,
|
|
i = this._renderParams.fontSize,
|
|
r = Math.max(e.length, 22) * (i + 8);
|
|
this._recreateCanvasAndContext(new s.Size(t, r)), this._prices = e, this._cache
|
|
.save(), Object(s.drawScaled)(this._cache, this._paneRenderParams
|
|
.pixelRatio, () => {
|
|
this._cache.translate(.5, .5),
|
|
this._cache.font = this._renderParams.fontSize + "px " + this
|
|
._renderParams.font, this._cache.textBaseline = "middle";
|
|
for (let e = 0; e < this._prices.length; e++) {
|
|
if (!this._prices[e]) continue;
|
|
const t = ["P", "S1", "R1", "S2", "R2", "S3", "R3", "S4", "R4",
|
|
"S5", "R5"
|
|
][e];
|
|
this._cache.fillStyle = this._renderParams.backColors[e], this
|
|
._cache.fillText(t, 0, this._centerByIndex(e)), this._cache
|
|
.fillText("/", 0, this._centerByIndex(e + 11))
|
|
}
|
|
}), this._cache.restore(), this._prices = e
|
|
}
|
|
}
|
|
_recreateCanvasAndContext(e) {
|
|
this._canvas = document.createElement("canvas"), this._canvas.width = e.w * this
|
|
._paneRenderParams.pixelRatio, this._canvas.height = e.h * this
|
|
._paneRenderParams.pixelRatio, this._cache = Object(r.ensureNotNull)(this
|
|
._canvas.getContext("2d"))
|
|
}
|
|
_centerByIndex(e) {
|
|
return Math.round((e + .5) * (this._renderParams.fontSize + 8))
|
|
}
|
|
_topByIndex(e) {
|
|
return Math.round(e * (this._renderParams.fontSize + 8))
|
|
}
|
|
}
|
|
},
|
|
"2bPF": function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Ss5c").LineDataSource,
|
|
r = i("7KDR").Action,
|
|
n = i("Ocx9").DefaultProperty,
|
|
o = i("k9/m").PlotRowSearchMode,
|
|
a = i("Ye2/").LineToolBarsPatternMode;
|
|
class l extends s {
|
|
constructor(e, t) {
|
|
var s = t || l.createProperties();
|
|
super(e, s), s.mirrored.listeners().subscribe(this, l.prototype.mirror), s.flipped
|
|
.listeners().subscribe(this, l.prototype.flip), this._scaleCoeff = 1, this
|
|
.version = l.version, this._pattern = [], this._properties.mode.listeners()
|
|
.subscribe(this, l.prototype.onModeChanged), i.e("lt-pane-views").then(i.t.bind(
|
|
null, "c6sA", 7)).then(({
|
|
BarsPatternPaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
isSynchronizable() {
|
|
return !1
|
|
}
|
|
onModeChanged() {
|
|
var e = this.patternPriceDiff();
|
|
e *= this._pressCoeff, this._points[1].price = this._timePoint[1].price = this
|
|
._points[0].price + e
|
|
}
|
|
additionalActions(e) {
|
|
var t = this;
|
|
return [new r({
|
|
checked: this.properties().mirrored.value(),
|
|
checkable: !0,
|
|
label: window.t("Mirrored"),
|
|
payload: {
|
|
target: this
|
|
},
|
|
onExecute: function(t) {
|
|
var i = t.getPayload().target;
|
|
e.setProperty(i.properties().mirrored, !i.properties()
|
|
.mirrored.value(), "Bats Pattern Mirroring"), i
|
|
.updateAllViews(), i._model.updateSource(i)
|
|
}
|
|
}), new r({
|
|
checked: this.properties().flipped.value(),
|
|
checkable: !0,
|
|
label: window.t("Flipped"),
|
|
payload: {
|
|
target: this
|
|
},
|
|
onExecute: function(t) {
|
|
var i = t.getPayload().target;
|
|
e.setProperty(i.properties().flipped, !i.properties()
|
|
.flipped.value(), "Bats Pattern Flipping"), i
|
|
.updateAllViews(), i._model.updateSource(i)
|
|
}
|
|
}), new r({
|
|
checkable: !0,
|
|
label: window.t("Restore Size"),
|
|
onExecute: function(i) {
|
|
var s = t.points()[0],
|
|
r = t.patternPriceDiff(),
|
|
n = s.price + r,
|
|
o = s.index + t._pattern.length - 1;
|
|
e.startChangingLinetool(t, {
|
|
price: n,
|
|
index: o
|
|
}, 1, {}), e.changeLinePoint({
|
|
price: n,
|
|
index: o
|
|
}, {}), e.endChangingLinetool()
|
|
}
|
|
})]
|
|
}
|
|
pointsCount() {
|
|
return 2
|
|
}
|
|
_preparePoint(e, t) {
|
|
e = this._alignPointToRangeOfActualData(e);
|
|
var i = this._model.mainSeries();
|
|
this.properties().mode.value() === a.Bars ? e.price = i.bars().valueAt(e.index)[
|
|
TradingView.HIGH_PLOT] : e.price = i.bars().valueAt(e.index)[TradingView
|
|
.CLOSE_PLOT];
|
|
var r = this.priceScale(),
|
|
n = this.ownerSource().firstValue(),
|
|
o = .05 * r.height(),
|
|
l = r.priceToCoordinate(e.price, n) - o;
|
|
return e.price = r.coordinateToPrice(l, n), s.prototype._preparePoint.call(this, e,
|
|
t)
|
|
}
|
|
state(e) {
|
|
var t = s.prototype.state.call(this, e);
|
|
return t.pattern = this._pattern, t
|
|
}
|
|
restoreData(e) {
|
|
e.pattern && (this._pattern = e.pattern)
|
|
}
|
|
name() {
|
|
return "Bars Pattern"
|
|
}
|
|
hasEditableCoordinates() {
|
|
return !1
|
|
}
|
|
cloneData(e) {
|
|
this._pattern = TradingView.clone(e._pattern)
|
|
}
|
|
mirror() {
|
|
for (var e = this._pattern, t = e[0][TradingView.HIGH_PLOT], i = Math.min(e[0][
|
|
TradingView.LOW_PLOT
|
|
], e[0][TradingView.HIGH_PLOT]), s = Math.max(e[0][TradingView.LOW_PLOT], e[
|
|
0][TradingView.HIGH_PLOT]), r = 1; r < e.length; r++) i = Math.min(i, e[r][
|
|
TradingView.LOW_PLOT
|
|
]), s = Math.max(s, e[r][TradingView.HIGH_PLOT]);
|
|
if (i < s) {
|
|
var n = (i + s) / 2,
|
|
o = function(e) {
|
|
return n - (e - n)
|
|
};
|
|
for (r = 0; r < e.length; r++) e[r][TradingView.HIGH_PLOT] = o(e[r][TradingView
|
|
.HIGH_PLOT
|
|
]), e[r][TradingView.LOW_PLOT] = o(e[r][TradingView.LOW_PLOT]), e[r][
|
|
TradingView.OPEN_PLOT
|
|
] = o(e[r][TradingView.OPEN_PLOT]), e[r][TradingView.CLOSE_PLOT] = o(e[r][
|
|
TradingView.CLOSE_PLOT
|
|
])
|
|
}
|
|
var a = e[0][TradingView.HIGH_PLOT] - t,
|
|
l = e[e.length - 1][TradingView.LOW_PLOT] - e[0][TradingView.HIGH_PLOT];
|
|
this._points[0].price += a, this._points[1].price = this._points[0].price + l, this
|
|
.updateAllViews()
|
|
}
|
|
flip() {
|
|
this._points[0].price = this._points[1].price;
|
|
for (var e = 0; e < this._pattern.length / 2; e++) {
|
|
var t = this._pattern[e];
|
|
this._pattern[e] = this._pattern[this._pattern.length - e - 1], this._pattern[
|
|
this._pattern.length - e - 1] = t
|
|
}
|
|
var i = this._pattern[this._pattern.length - 1][TradingView.LOW_PLOT] - this
|
|
._pattern[0][TradingView.HIGH_PLOT];
|
|
this._points[1].price = this._points[0].price + i, this.updateAllViews()
|
|
}
|
|
firstPatternPrice() {
|
|
var e = parseInt(this.properties().mode.value(), 10);
|
|
if (e === a.LineHL2) return (this._pattern[0][TradingView.HIGH_PLOT] + this
|
|
._pattern[0][TradingView.LOW_PLOT]) / 2;
|
|
var t = {
|
|
0: TradingView.HIGH_PLOT,
|
|
1: TradingView.CLOSE_PLOT,
|
|
2: TradingView.OPEN_PLOT,
|
|
3: TradingView.OPEN_PLOT,
|
|
4: TradingView.HIGH_PLOT,
|
|
5: TradingView.LOW_PLOT
|
|
} [e];
|
|
return this._pattern[0][t]
|
|
}
|
|
lastPatternPrice() {
|
|
var e = parseInt(this.properties().mode.value(), 10);
|
|
if (e === a.LineHL2) return (this._pattern[this._pattern.length - 1][TradingView
|
|
.HIGH_PLOT
|
|
] + this._pattern[this._pattern.length - 1][TradingView.LOW_PLOT]) / 2;
|
|
var t = {
|
|
0: TradingView.LOW_PLOT,
|
|
1: TradingView.CLOSE_PLOT,
|
|
2: TradingView.CLOSE_PLOT,
|
|
3: TradingView.OPEN_PLOT,
|
|
4: TradingView.HIGH_PLOT,
|
|
5: TradingView.LOW_PLOT
|
|
} [e];
|
|
return this._pattern[this._pattern.length - 1][t]
|
|
}
|
|
patternPriceDiff() {
|
|
return this.lastPatternPrice() - this.firstPatternPrice()
|
|
}
|
|
pressCoeff() {
|
|
var e = this.patternPriceDiff(),
|
|
t = this.points()[0].price,
|
|
i = (this.points()[1].price - t) / e;
|
|
return this._pressCoeff = i, i
|
|
}
|
|
addPoint(e, t) {
|
|
var i = s.prototype.addPoint.call(this, e, t, !0);
|
|
if (i) {
|
|
var r = Math.min(this.points()[0].index, this.points()[1].index),
|
|
n = Math.max(this.points()[0].index, this.points()[1].index),
|
|
a = this._model.mainSeries().nearestIndex(r, o.NearestRight),
|
|
l = this._model.mainSeries().nearestIndex(n, o.NearestLeft);
|
|
this.points()[0].index > this.points()[1].index && (this._points[0].price = this
|
|
._points[1].price), this._pattern = [];
|
|
for (var c = a; c <= l; c++) {
|
|
var h = this._model.mainSeries().data().valueAt(c);
|
|
this._pattern.push(TradingView.clone(h))
|
|
}
|
|
if (this._pattern.length > 0) {
|
|
var u = this.patternPriceDiff();
|
|
this._points[1].price = this._points[0].price + u,
|
|
this._points[1].index = this._points[0].index + (l - a), this
|
|
.normalizePoints(), this.createServerPoints()
|
|
}
|
|
}
|
|
return i
|
|
}
|
|
setPoint(e, t, i) {
|
|
1 === e && t.index <= this._points[0].index && (t.index = this._points[0].index +
|
|
1), 0 === e && t.index >= this._points[1].index && (t.index = this._points[
|
|
1]
|
|
.index - 1), super.setPoint(e, t, i)
|
|
}
|
|
migrateVersion(e, t, i) {
|
|
if (1 === e && this._pattern.length > 0) {
|
|
var s = this.patternPriceDiff();
|
|
2 === this._timePoint.length && (this._timePoint[1].price = this._timePoint[0]
|
|
.price + s), 2 === this._points.length && (this._points[1].price = this
|
|
._points[0].price + s)
|
|
}
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "8ioM")))
|
|
.BarsPatternDefinitionsViewModel
|
|
}
|
|
static createProperties(e) {
|
|
var t = new n("linetoolbarspattern", e);
|
|
return l._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
s._configureProperties(e), e.addExclusion("mirrored"), e.addExclusion("flipped")
|
|
}
|
|
}
|
|
l.version = 2, t.LineToolBarsPattern = l
|
|
},
|
|
"2cgs": function(e, t, i) {
|
|
"use strict";
|
|
var s = i("ocLq");
|
|
JSServer.studyLibrary = [{
|
|
name: "Accumulation/Distribution",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
inputs: {}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Accumulation/Distribution",
|
|
shortDescription: "Accum/Dist",
|
|
is_price_study: !1,
|
|
inputs: [],
|
|
id: "Accumulation/Distribution@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Accumulation/Distribution",
|
|
format: {
|
|
type: "volume"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t, i, r) {
|
|
return s.Std.or(s.Std.and(s.Std.eq(e, t), s.Std.eq(e, i)), s.Std.eq(
|
|
t, i)) ? 0 : (2 * e - i - t) / (t - i) * r
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this.f_0(s.Std.close(this._context), s.Std.high(this
|
|
._context), s.Std.low(this._context), s.Std.volume(this
|
|
._context));
|
|
return [s.Std.cum(i, this._context)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Accumulative Swing Index",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 10
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "ASI",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Accumulative Swing Index",
|
|
shortDescription: "ASI",
|
|
is_price_study: !1,
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "Limit Move Value",
|
|
defval: 10,
|
|
type: "float",
|
|
min: .1,
|
|
max: 1e5
|
|
}],
|
|
id: "Accumulative Swing Index@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Accumulative Swing Index",
|
|
format: {
|
|
type: "volume"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t) {
|
|
var i = t.new_var(s.Std.open(t)),
|
|
r = t.new_var(s.Std.high(t)),
|
|
n = t.new_var(s.Std.low(t)),
|
|
o = t.new_var(s.Std.close(t)),
|
|
a = s.Std.abs(r - o.get(1)),
|
|
l = s.Std.abs(n - o.get(1)),
|
|
c = s.Std.abs(r - n),
|
|
h = s.Std.abs(o.get(1) - i.get(1)),
|
|
u = s.Std.max(a, l),
|
|
d = s.Std.iff(a >= s.Std.max(l, c), a - .5 * l + .25 * h, s.Std
|
|
.iff(l >= s.Std.max(a, c), l - .5 * a + .25 * h, c + .25 *
|
|
h));
|
|
return s.Std.iff(0 === d, 0, (o - o.get(1) + .5 * (o - i) + .25 * (o
|
|
.get(1) - i.get(1))) / d * u / e * 50)
|
|
}, this.f_1 = function(e, t) {
|
|
var i = this.f_0(e, t);
|
|
return s.Std.cum(i, t)
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0);
|
|
return [this.f_1(i, this._context)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Advance/Decline",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 10
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Advance/Decline",
|
|
shortDescription: "AD",
|
|
is_price_study: !1,
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "length",
|
|
defval: 10,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}],
|
|
id: "Advance/Decline@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Advance/Decline",
|
|
format: {
|
|
precision: 2,
|
|
type: "price"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t) {
|
|
return s.Std.gt(e, t)
|
|
}, this.f_1 = function(e, t) {
|
|
return s.Std.lt(e, t)
|
|
}, this.f_2 = function(e, t) {
|
|
return 0 === t ? e : e / t
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0),
|
|
r = this.f_0(s.Std.close(this._context), s.Std.open(this
|
|
._context)),
|
|
n = this._context.new_var(r),
|
|
o = s.Std.sum(n, i, this._context),
|
|
a = this.f_1(s.Std.close(this._context), s.Std.open(this
|
|
._context)),
|
|
l = this._context.new_var(a),
|
|
c = s.Std.sum(l, i, this._context);
|
|
return [this.f_2(o, c)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Arnaud Legoux Moving Average",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 9,
|
|
in_1: .85,
|
|
in_2: 6
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Arnaud Legoux Moving Average",
|
|
shortDescription: "ALMA",
|
|
is_price_study: !0,
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "Window Size",
|
|
defval: 9,
|
|
type: "integer",
|
|
min: 0,
|
|
max: 5e3
|
|
}, {
|
|
id: "in_1",
|
|
name: "Offset",
|
|
defval: .85,
|
|
type: "float",
|
|
min: -1e12,
|
|
max: 1e12
|
|
}, {
|
|
id: "in_2",
|
|
name: "Sigma",
|
|
defval: 6,
|
|
type: "float",
|
|
min: -1e12,
|
|
max: 1e12
|
|
}],
|
|
id: "Arnaud Legoux Moving Average@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Arnaud Legoux Moving Average",
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = s.Std.close(this._context),
|
|
r = this._input(0),
|
|
n = this._input(1),
|
|
o = this._input(2),
|
|
a = this._context.new_var(i);
|
|
return [s.Std.alma(a, r, n, o)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Aroon",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#FB8C00"
|
|
},
|
|
plot_1: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 14
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_1",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Upper",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
plot_1: {
|
|
title: "Lower",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Aroon",
|
|
shortDescription: "Aroon",
|
|
is_price_study: !1,
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "length",
|
|
defval: 14,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}],
|
|
id: "Aroon@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Aroon",
|
|
format: {
|
|
precision: 2,
|
|
type: "percent"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t) {
|
|
return 100 * (e + t) / t
|
|
},
|
|
this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0),
|
|
r = s.Std.high(this._context),
|
|
n = i + 1,
|
|
o = this._context.new_var(r),
|
|
a = s.Std.highestbars(o, n, this._context),
|
|
l = this.f_0(a, i),
|
|
c = s.Std.low(this._context),
|
|
h = this._context.new_var(c),
|
|
u = s.Std.lowestbars(h, n, this._context);
|
|
return [l, this.f_0(u, i)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Average Price",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
id: "AveragePrice@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Average Price",
|
|
description: "Average Price",
|
|
shortDescription: "Average Price",
|
|
is_price_study: !0,
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
visible: !0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
inputs: {}
|
|
},
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot"
|
|
}
|
|
},
|
|
inputs: [],
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.main = function(e, t) {
|
|
return this._context = e, this._input = t, [s.Std.ohlc4(this
|
|
._context)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Average Directional Index",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#FF5252"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 14,
|
|
in_1: 14
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "ADX",
|
|
histogramBase: 0,
|
|
joinPoints: !1,
|
|
isHidden: !1
|
|
}
|
|
},
|
|
description: "Average Directional Index",
|
|
shortDescription: "ADX",
|
|
is_price_study: !1,
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "ADX Smoothing",
|
|
defval: 14,
|
|
type: "integer",
|
|
min: -1e12,
|
|
max: 1e12
|
|
}, {
|
|
id: "in_1",
|
|
name: "DI Length",
|
|
defval: 14,
|
|
type: "integer",
|
|
min: -1e12,
|
|
max: 1e12
|
|
}],
|
|
id: "average_directional_Index@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Average Directional Index",
|
|
format: {
|
|
precision: 2,
|
|
type: "price"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e) {
|
|
var t = this._context.new_var(s.Std.high(this._context)),
|
|
i = s.Std.change(t),
|
|
r = this._context.new_var(s.Std.low(this._context)),
|
|
n = -s.Std.change(r),
|
|
o = this._context.new_var(s.Std.tr(void 0, this._context)),
|
|
a = s.Std.rma(o, e, this._context),
|
|
l = this._context.new_var(s.Std.and(s.Std.gt(i, n), s.Std.gt(i,
|
|
0)) ? i : 0),
|
|
c = s.Std.fixnan(100 * s.Std.rma(l, e, this._context) / a, this
|
|
._context),
|
|
h = this._context.new_var(s.Std.and(s.Std.gt(n, i), s.Std.gt(n,
|
|
0)) ? n : 0);
|
|
return [c, s.Std.fixnan(100 * s.Std.rma(h, e, this._context) / a,
|
|
this._context)]
|
|
}, this.f_1 = function(e, t) {
|
|
var i = this.f_0(e),
|
|
r = i[0],
|
|
n = i[1],
|
|
o = r + n,
|
|
a = this._context.new_var(s.Std.abs(r - n) / (s.Std.eq(o, 0) ?
|
|
1 : o));
|
|
return [100 * s.Std.rma(a, t, this._context)]
|
|
}, this.main = function(e, t) {
|
|
return this._context = e, this._input = t, this._context
|
|
.setMinimumAdditionalDepth(this._input(0) + this._input(1)),
|
|
this.f_1(this._input(0), this._input(1))
|
|
}
|
|
}
|
|
}, {
|
|
name: "Average True Range",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#B71C1C"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 14
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Average True Range",
|
|
shortDescription: "ATR",
|
|
is_price_study: !1,
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "length",
|
|
defval: 14,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}],
|
|
id: "Average True Range@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Average True Range",
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0),
|
|
r = s.Std.tr(this._context),
|
|
n = this._context.new_var(r);
|
|
return [s.Std.rma(n, i, this._context)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Awesome Oscillator",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 1,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#000080"
|
|
}
|
|
},
|
|
palettes: {
|
|
palette_0: {
|
|
colors: {
|
|
0: {
|
|
color: "#F44336",
|
|
width: 1,
|
|
style: 0
|
|
},
|
|
1: {
|
|
color: "#009688",
|
|
width: 1,
|
|
style: 0
|
|
}
|
|
}
|
|
}
|
|
},
|
|
inputs: {}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_1",
|
|
palette: "palette_0",
|
|
target: "plot_0",
|
|
type: "colorer"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Awesome Oscillator",
|
|
shortDescription: "AO",
|
|
is_price_study: !1,
|
|
palettes: {
|
|
palette_0: {
|
|
colors: {
|
|
0: {
|
|
name: "Color 0"
|
|
},
|
|
1: {
|
|
name: "Color 1"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
inputs: [],
|
|
id: "Awesome Oscillator@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Awesome Oscillator",
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t) {
|
|
return e - t
|
|
}, this.f_1 = function(e) {
|
|
return s.Std.le(e, 0) ? 0 : 1
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = s.Std.hl2(this._context),
|
|
r = this._context.new_var(i),
|
|
n = s.Std.sma(r, 5, this._context),
|
|
o = this._context.new_var(i),
|
|
a = s.Std.sma(o, 34, this._context),
|
|
l = this.f_0(n, a),
|
|
c = l,
|
|
h = this._context.new_var(l),
|
|
u = s.Std.change(h);
|
|
return [c, this.f_1(u)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Balance of Power",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#FF5252"
|
|
}
|
|
},
|
|
inputs: {}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Balance of Power",
|
|
shortDescription: "Balance of Power",
|
|
is_price_study: !1,
|
|
inputs: [],
|
|
id: "Balance of Power@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Balance of Power",
|
|
format: {
|
|
precision: 2,
|
|
type: "price"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t, i, s) {
|
|
return (e - t) / (i - s)
|
|
}, this.main = function(e, t) {
|
|
return this._context = e, this._input = t, [this.f_0(s.Std.close(
|
|
this._context), s.Std.open(this._context), s.Std
|
|
.high(this._context), s.Std.low(this._context))]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Bollinger Bands",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#FF6D00"
|
|
},
|
|
plot_1: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
},
|
|
plot_2: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
filledAreasStyle: {
|
|
fill_0: {
|
|
color: "#2196F3",
|
|
transparency: 95,
|
|
visible: !0
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 20,
|
|
in_1: 2
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_1",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_2",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Median",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
plot_1: {
|
|
title: "Upper",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
plot_2: {
|
|
title: "Lower",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Bollinger Bands",
|
|
shortDescription: "BB",
|
|
is_price_study: !0,
|
|
filledAreas: [{
|
|
id: "fill_0",
|
|
objAId: "plot_1",
|
|
objBId: "plot_2",
|
|
type: "plot_plot",
|
|
title: "Plots Background"
|
|
}],
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "length",
|
|
defval: 20,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e4
|
|
}, {
|
|
id: "in_1",
|
|
name: "mult",
|
|
defval: 2,
|
|
type: "float",
|
|
min: .001,
|
|
max: 50
|
|
}],
|
|
id: "Bollinger Bands@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Bollinger Bands",
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t) {
|
|
return e * t
|
|
}, this.f_1 = function(e, t) {
|
|
return e + t
|
|
}, this.f_2 = function(e, t) {
|
|
return e - t
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = s.Std.close(this._context),
|
|
r = this._input(0),
|
|
n = this._input(1),
|
|
o = this._context.new_var(i),
|
|
a = s.Std.sma(o, r, this._context),
|
|
l = this._context.new_var(i),
|
|
c = s.Std.stdev(l, r, this._context),
|
|
h = this.f_0(n, c);
|
|
return [a, this.f_1(a, h), this.f_2(a, h)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Bollinger Bands %B",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#26A69A"
|
|
}
|
|
},
|
|
bands: [{
|
|
color: "#787B86",
|
|
linestyle: 2,
|
|
linewidth: 1,
|
|
visible: !0,
|
|
value: 1
|
|
}, {
|
|
color: "#787B86",
|
|
linestyle: 2,
|
|
linewidth: 1,
|
|
visible: !0,
|
|
value: 0
|
|
}],
|
|
filledAreasStyle: {
|
|
fill_0: {
|
|
color: "#26A69A",
|
|
transparency: 90,
|
|
visible: !0
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 20,
|
|
in_1: 2
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Bollinger Bands %B",
|
|
shortDescription: "BB %B",
|
|
is_price_study: !1,
|
|
bands: [{
|
|
id: "hline_0",
|
|
name: "UpperLimit"
|
|
}, {
|
|
id: "hline_1",
|
|
name: "LowerLimit"
|
|
}],
|
|
filledAreas: [{
|
|
id: "fill_0",
|
|
objAId: "hline_0",
|
|
objBId: "hline_1",
|
|
type: "hline_hline",
|
|
title: "Hlines Background"
|
|
}],
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "length",
|
|
defval: 20,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e4
|
|
}, {
|
|
id: "in_1",
|
|
name: "mult",
|
|
defval: 2,
|
|
type: "float",
|
|
min: .001,
|
|
max: 50
|
|
}],
|
|
id: "Bollinger Bands %B@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Bollinger Bands %B",
|
|
format: {
|
|
precision: 2,
|
|
type: "price"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t) {
|
|
return e * t
|
|
}, this.f_1 = function(e, t) {
|
|
return e + t
|
|
}, this.f_2 = function(e, t) {
|
|
return e - t
|
|
}, this.f_3 = function(e, t, i) {
|
|
return (e - t) / (i - t)
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = s.Std.close(this._context),
|
|
r = this._input(0),
|
|
n = this._input(1),
|
|
o = this._context.new_var(i),
|
|
a = s.Std.sma(o, r, this._context),
|
|
l = this._context.new_var(i),
|
|
c = s.Std.stdev(l, r, this._context),
|
|
h = this.f_0(n, c),
|
|
u = this.f_1(a, h),
|
|
d = this.f_2(a, h);
|
|
return [this.f_3(i, d, u)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Bollinger Bands Width",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#FF6D00"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 20,
|
|
in_1: 2
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Bollinger Bands Width",
|
|
shortDescription: "BBW",
|
|
is_price_study: !1,
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "length",
|
|
defval: 20,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e4
|
|
}, {
|
|
id: "in_1",
|
|
name: "mult",
|
|
defval: 2,
|
|
type: "float",
|
|
min: .001,
|
|
max: 50
|
|
}],
|
|
id: "Bollinger Bands Width@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Bollinger Bands Width",
|
|
format: {
|
|
precision: 2,
|
|
type: "price"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t) {
|
|
return e * t
|
|
}, this.f_1 = function(e, t) {
|
|
return e + t
|
|
}, this.f_2 = function(e, t) {
|
|
return e - t
|
|
}, this.f_3 = function(e, t, i) {
|
|
return (e - t) / i
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = s.Std.close(this._context),
|
|
r = this._input(0),
|
|
n = this._input(1),
|
|
o = this._context.new_var(i),
|
|
a = s.Std.sma(o, r, this._context),
|
|
l = this._context.new_var(i),
|
|
c = s.Std.stdev(l, r, this._context),
|
|
h = this.f_0(n, c),
|
|
u = this.f_1(a, h),
|
|
d = this.f_2(a, h);
|
|
return [this.f_3(u, d, a)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Chaikin Money Flow",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#43A047"
|
|
}
|
|
},
|
|
bands: [{
|
|
color: "#787B86",
|
|
linestyle: 2,
|
|
linewidth: 1,
|
|
visible: !0,
|
|
value: 0
|
|
}],
|
|
inputs: {
|
|
in_0: 20
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Chaikin Money Flow",
|
|
shortDescription: "CMF",
|
|
is_price_study: !1,
|
|
bands: [{
|
|
id: "hline_0",
|
|
name: "Zero"
|
|
}],
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "length",
|
|
defval: 20,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}],
|
|
id: "Chaikin Money Flow@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Chaikin Money Flow",
|
|
format: {
|
|
precision: 2,
|
|
type: "price"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t, i, r) {
|
|
return s.Std.or(s.Std.and(s.Std.eq(e, t), s.Std.eq(e, i)), s.Std.eq(
|
|
t, i)) ? 0 : (2 * e - i - t) / (t - i) * r
|
|
}, this.f_1 = function(e, t) {
|
|
return e / t
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0),
|
|
r = this.f_0(s.Std.close(this._context), s.Std.high(this
|
|
._context), s.Std.low(this._context), s.Std.volume(this
|
|
._context)),
|
|
n = this._context.new_var(r),
|
|
o = s.Std.sum(n, i, this._context),
|
|
a = s.Std.volume(this._context),
|
|
l = this._context.new_var(a),
|
|
c = s.Std.sum(l, i, this._context);
|
|
return [this.f_1(o, c)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Chaikin Oscillator",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#EC407A"
|
|
}
|
|
},
|
|
bands: [{
|
|
color: "#787B86",
|
|
linestyle: 2,
|
|
linewidth: 1,
|
|
visible: !0,
|
|
value: 0
|
|
}],
|
|
inputs: {
|
|
in_0: 3,
|
|
in_1: 10
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Chaikin Oscillator",
|
|
shortDescription: "Chaikin Osc",
|
|
is_price_study: !1,
|
|
bands: [{
|
|
id: "hline_0",
|
|
name: "Zero"
|
|
}],
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "short",
|
|
defval: 3,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}, {
|
|
id: "in_1",
|
|
name: "long",
|
|
defval: 10,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}],
|
|
id: "Chaikin Oscillator@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Chaikin Oscillator",
|
|
format: {
|
|
type: "volume"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t) {
|
|
return e - t
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0),
|
|
r = this._input(1),
|
|
n = s.Std.accdist(this._context),
|
|
o = this._context.new_var(n),
|
|
a = s.Std.ema(o, i, this._context),
|
|
l = this._context.new_var(n),
|
|
c = s.Std.ema(l, r, this._context);
|
|
return [this.f_0(a, c)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Chaikin Volatility",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
is_price_study: !1,
|
|
id: "Chaikin Volatility@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Chaikin Volatility",
|
|
description: "Chaikin Volatility",
|
|
shortDescription: "Chaikin Volatility",
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
visible: !0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
color: "#AB47BC"
|
|
}
|
|
},
|
|
bands: [{
|
|
color: "#787B86",
|
|
linestyle: 2,
|
|
linewidth: 1,
|
|
visible: !0,
|
|
value: 0
|
|
}],
|
|
inputs: {
|
|
periods: 10,
|
|
rocLookback: 10
|
|
}
|
|
},
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot"
|
|
}
|
|
},
|
|
bands: [{
|
|
id: "hline_0",
|
|
name: "Zero"
|
|
}],
|
|
inputs: [{
|
|
id: "periods",
|
|
type: "integer",
|
|
name: "Periods"
|
|
}, {
|
|
id: "rocLookback",
|
|
type: "integer",
|
|
name: "Rate of Change Lookback"
|
|
}],
|
|
format: {
|
|
type: "volume"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.init = function(e, t) {
|
|
this._context = e, this._input = t, this.period = this._input(0),
|
|
this.rocLookback = this._input(1)
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t, this._context
|
|
.setMinimumAdditionalDepth(this.period + this.rocLookback);
|
|
var i = this._context.new_var(s.Std.high(this._context) - s.Std.low(
|
|
this._context)),
|
|
r = this._context.new_var(s.Std.ema(i, this.period, this
|
|
._context));
|
|
return [s.Std.roc(r, this.rocLookback)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Chande Kroll Stop",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
},
|
|
plot_1: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#FF6D00"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 10,
|
|
in_1: 1,
|
|
in_2: 9
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_1",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Long",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
plot_1: {
|
|
title: "Short",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Chande Kroll Stop",
|
|
shortDescription: "Chande Kroll Stop",
|
|
is_price_study: !0,
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "p",
|
|
defval: 10,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 4999
|
|
}, {
|
|
id: "in_1",
|
|
name: "x",
|
|
defval: 1,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e12
|
|
}, {
|
|
id: "in_2",
|
|
name: "q",
|
|
defval: 9,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e12
|
|
}],
|
|
id: "Chande Kroll Stop@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Chande Kroll Stop",
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t, i) {
|
|
return e - t * i
|
|
}, this.f_1 = function(e, t, i) {
|
|
return e + t * i
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0),
|
|
r = this._input(1),
|
|
n = this._input(2),
|
|
o = s.Std.high(this._context),
|
|
a = this._context.new_var(o),
|
|
l = s.Std.highest(a, i, this._context),
|
|
c = s.Std.atr(i, this._context),
|
|
h = this.f_0(l, r, c),
|
|
u = this._context.new_var(o),
|
|
d = s.Std.lowest(u, i, this._context),
|
|
p = this.f_1(d, r, c),
|
|
_ = this._context.new_var(h),
|
|
m = s.Std.highest(_, n, this._context),
|
|
f = this._context.new_var(p);
|
|
return [s.Std.lowest(f, n, this._context), m]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Chande Momentum Oscillator",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 9
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Chande Momentum Oscillator",
|
|
shortDescription: "ChandeMO",
|
|
is_price_study: !1,
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "length",
|
|
defval: 9,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}],
|
|
id: "Chande Momentum Oscillator@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Chande Momentum Oscillator",
|
|
format: {
|
|
type: "price",
|
|
precision: 2
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e) {
|
|
return s.Std.ge(e, 0) ? e : 0
|
|
},
|
|
this.f_1 = function(e) {
|
|
return s.Std.ge(e, 0) ? 0 : -e
|
|
}, this.f_2 = function(e, t) {
|
|
return 100 * e / t
|
|
}, this.f_3 = function(e, t) {
|
|
return this.f_2(e - t, e + t)
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0),
|
|
r = s.Std.close(this._context),
|
|
n = this._context.new_var(r),
|
|
o = s.Std.change(n),
|
|
a = this.f_0(o),
|
|
l = this.f_1(o),
|
|
c = this._context.new_var(a),
|
|
h = s.Std.sum(c, i, this._context),
|
|
u = this._context.new_var(l),
|
|
d = s.Std.sum(u, i, this._context);
|
|
return [this.f_3(h, d)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Chop Zone",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 5,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#000080"
|
|
}
|
|
},
|
|
palettes: {
|
|
palette_0: {
|
|
colors: {
|
|
0: {
|
|
color: "#26C6DA",
|
|
width: 1,
|
|
style: 0
|
|
},
|
|
1: {
|
|
color: "#43A047",
|
|
width: 1,
|
|
style: 0
|
|
},
|
|
2: {
|
|
color: "#A5D6A7",
|
|
width: 1,
|
|
style: 0
|
|
},
|
|
3: {
|
|
color: "#009688",
|
|
width: 1,
|
|
style: 0
|
|
},
|
|
4: {
|
|
color: "#D50000",
|
|
width: 1,
|
|
style: 0
|
|
},
|
|
5: {
|
|
color: "#E91E63",
|
|
width: 1,
|
|
style: 0
|
|
},
|
|
6: {
|
|
color: "#FF6D00",
|
|
width: 1,
|
|
style: 0
|
|
},
|
|
7: {
|
|
color: "#FFB74D",
|
|
width: 1,
|
|
style: 0
|
|
},
|
|
8: {
|
|
color: "#FDD835",
|
|
width: 1,
|
|
style: 0
|
|
}
|
|
}
|
|
}
|
|
},
|
|
inputs: {}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_1",
|
|
palette: "palette_0",
|
|
target: "plot_0",
|
|
type: "colorer"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1,
|
|
isHidden: !1
|
|
}
|
|
},
|
|
description: "Chop Zone",
|
|
shortDescription: "Chop Zone",
|
|
is_price_study: !1,
|
|
palettes: {
|
|
palette_0: {
|
|
colors: {
|
|
0: {
|
|
name: "Color 0"
|
|
},
|
|
1: {
|
|
name: "Color 1"
|
|
},
|
|
2: {
|
|
name: "Color 2"
|
|
},
|
|
3: {
|
|
name: "Color 3"
|
|
},
|
|
4: {
|
|
name: "Color 4"
|
|
},
|
|
5: {
|
|
name: "Color 5"
|
|
},
|
|
6: {
|
|
name: "Color 6"
|
|
},
|
|
7: {
|
|
name: "Color 7"
|
|
},
|
|
8: {
|
|
name: "Color 8"
|
|
}
|
|
},
|
|
valToIndex: {
|
|
0: 0,
|
|
1: 1,
|
|
2: 2,
|
|
3: 3,
|
|
4: 4,
|
|
5: 5,
|
|
6: 6,
|
|
7: 7,
|
|
8: 8
|
|
}
|
|
}
|
|
},
|
|
inputs: [],
|
|
id: "chop_zone@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Chop Zone",
|
|
format: {
|
|
precision: 0,
|
|
type: "price"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function() {
|
|
var e = s.Std.close(this._context),
|
|
t = s.Std.hlc3(this._context),
|
|
i = this._context.new_var(s.Std.high(this._context)),
|
|
r = s.Std.highest(i, 30, this._context),
|
|
n = s.Std.lowest(i, 30, this._context),
|
|
o = 25 / (r - n) * n,
|
|
a = this._context.new_var(e),
|
|
l = this._context.new_var(s.Std.ema(a, 34, this._context)),
|
|
c = (l.get(1) - l.get(0)) / t * o,
|
|
h = s.Std.sqrt(1 + c * c),
|
|
u = s.Std.round(180 * s.Std.acos(1 / h) / 3.141592653589793),
|
|
d = s.Std.iff(s.Std.gt(c, 0), -u, u),
|
|
p = s.Std.and(s.Std.gt(d, -2.14), s.Std.le(d, -.71)) ? 7 : 8,
|
|
_ = s.Std.and(s.Std.gt(d, -3.57), s.Std.le(d, -2.14)) ? 6 : p,
|
|
m = s.Std.and(s.Std.gt(d, -5), s.Std.le(d, -3.57)) ? 5 : _,
|
|
f = s.Std.le(d, -5) ? 4 : m,
|
|
g = s.Std.and(s.Std.lt(d, 2.14), s.Std.ge(d, .71)) ? 3 : f,
|
|
b = s.Std.and(s.Std.lt(d, 3.57), s.Std.ge(d, 2.14)) ? 2 : g,
|
|
v = s.Std.and(s.Std.lt(d, 5), s.Std.ge(d, 3.57)) ? 1 : b;
|
|
return [1, s.Std.ge(d, 5) ? 0 : v]
|
|
}, this.main = function(e, t) {
|
|
return this._context = e, this._input = t, this.f_0()
|
|
}
|
|
}
|
|
}, {
|
|
name: "Choppiness Index",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
bands: [{
|
|
color: "#787B86",
|
|
linestyle: 2,
|
|
linewidth: 1,
|
|
visible: !0,
|
|
value: 61.8
|
|
}, {
|
|
color: "#787B86",
|
|
linestyle: 2,
|
|
linewidth: 1,
|
|
visible: !0,
|
|
value: 38.2
|
|
}],
|
|
filledAreasStyle: {
|
|
fill_0: {
|
|
color: "#2196F3",
|
|
transparency: 90,
|
|
visible: !0
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 14
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Choppiness Index",
|
|
shortDescription: "CHOP",
|
|
is_price_study: !1,
|
|
bands: [{
|
|
id: "hline_0",
|
|
name: "UpperLimit"
|
|
}, {
|
|
id: "hline_1",
|
|
name: "LowerLimit"
|
|
}],
|
|
filledAreas: [{
|
|
id: "fill_0",
|
|
objAId: "hline_0",
|
|
objBId: "hline_1",
|
|
type: "hline_hline",
|
|
title: "Hlines Background"
|
|
}],
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "length",
|
|
defval: 14,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}],
|
|
id: "Choppiness Index@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Choppiness Index",
|
|
format: {
|
|
type: "price",
|
|
precision: 2
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t, i, r) {
|
|
return 100 * s.Std.log10(e / (t - i)) / r
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0),
|
|
r = s.Std.atr(1, this._context),
|
|
n = this._context.new_var(r),
|
|
o = s.Std.sum(n, i, this._context),
|
|
a = s.Std.high(this._context),
|
|
l = this._context.new_var(a),
|
|
c = s.Std.highest(l, i, this._context),
|
|
h = s.Std.low(this._context),
|
|
u = this._context.new_var(h),
|
|
d = s.Std.lowest(u, i, this._context),
|
|
p = s.Std.log10(i);
|
|
return [this.f_0(o, c, d, p)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Commodity Channel Index",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
},
|
|
smoothedMA: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !1
|
|
}
|
|
},
|
|
bands: [{
|
|
color: "#787B86",
|
|
linestyle: 2,
|
|
linewidth: 1,
|
|
visible: !0,
|
|
value: 100
|
|
}, {
|
|
color: "#787B86",
|
|
linestyle: 2,
|
|
linewidth: 1,
|
|
visible: !0,
|
|
value: -100
|
|
}],
|
|
filledAreasStyle: {
|
|
fill_0: {
|
|
color: "#2196F3",
|
|
transparency: 90,
|
|
visible: !0
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 20,
|
|
smoothingLine: "SMA",
|
|
smoothingLength: 20
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "smoothedMA",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
smoothedMA: {
|
|
title: "Smoothed MA",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Commodity Channel Index",
|
|
shortDescription: "CCI",
|
|
is_price_study: !1,
|
|
bands: [{
|
|
id: "hline_0",
|
|
name: "UpperLimit"
|
|
}, {
|
|
id: "hline_1",
|
|
name: "LowerLimit"
|
|
}],
|
|
filledAreas: [{
|
|
id: "fill_0",
|
|
objAId: "hline_0",
|
|
objBId: "hline_1",
|
|
type: "hline_hline",
|
|
title: "Hlines Background"
|
|
}],
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "length",
|
|
defval: 20,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}, {
|
|
id: "smoothingLine",
|
|
name: "Smoothing Line",
|
|
defval: "SMA",
|
|
type: "text",
|
|
options: ["SMA", "EMA", "WMA"]
|
|
}, {
|
|
id: "smoothingLength",
|
|
name: "Smoothing Length",
|
|
defval: 20,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e4
|
|
}],
|
|
id: "Commodity Channel Index@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Commodity Channel Index",
|
|
format: {
|
|
precision: 2,
|
|
type: "price"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t, i) {
|
|
return (e - t) / (.015 * i)
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = s.Std.hlc3(this._context),
|
|
r = this._input(0),
|
|
n = this._input(1),
|
|
o = this._input(2);
|
|
this._context.setMinimumAdditionalDepth(r + o);
|
|
var a, l = this._context.new_var(i),
|
|
c = s.Std.sma(l, r, this._context),
|
|
h = this._context.new_var(i),
|
|
u = s.Std.dev(h, r, this._context),
|
|
d = this.f_0(i, c, u),
|
|
p = this._context.new_var(d);
|
|
return "EMA" === n ? a = s.Std.ema(p, o, this._context) : "WMA" ===
|
|
n ? a = s.Std.wma(p, o, this._context) : "SMA" === n && (a = s
|
|
.Std.sma(p, o, this._context)), [d, a]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Connors RSI",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
bands: [{
|
|
color: "#787B86",
|
|
linestyle: 2,
|
|
linewidth: 1,
|
|
visible: !0,
|
|
value: 70
|
|
}, {
|
|
color: "#787B86",
|
|
linestyle: 2,
|
|
linewidth: 1,
|
|
visible: !0,
|
|
value: 30
|
|
}],
|
|
filledAreasStyle: {
|
|
fill_0: {
|
|
color: "#2196F3",
|
|
transparency: 90,
|
|
visible: !0
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 3,
|
|
in_1: 2,
|
|
in_2: 100
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "CRSI",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Connors RSI",
|
|
shortDescription: "CRSI",
|
|
is_price_study: !1,
|
|
bands: [{
|
|
id: "hline_0",
|
|
name: "UpperLimit"
|
|
}, {
|
|
id: "hline_1",
|
|
name: "LowerLimit"
|
|
}],
|
|
filledAreas: [{
|
|
id: "fill_0",
|
|
objAId: "hline_0",
|
|
objBId: "hline_1",
|
|
type: "hline_hline",
|
|
title: "Hlines Background"
|
|
}],
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "RSI Length",
|
|
defval: 3,
|
|
type: "integer",
|
|
min: 1
|
|
}, {
|
|
id: "in_1",
|
|
name: "UpDown Length",
|
|
defval: 2,
|
|
type: "integer",
|
|
min: 1
|
|
}, {
|
|
id: "in_2",
|
|
name: "ROC Length",
|
|
defval: 100,
|
|
type: "integer",
|
|
min: 1
|
|
}],
|
|
id: "Connors RSI@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Connors RSI",
|
|
format: {
|
|
precision: 2,
|
|
type: "price"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
var e;
|
|
this.f_1 = function(e, t, i) {
|
|
var r = i.new_var(s.Std.max(s.Std.change(e), 0));
|
|
return s.Std.rma(r, t, i)
|
|
}, this.f_2 = function(e, t, i) {
|
|
var r = i.new_var(-s.Std.min(s.Std.change(e), 0));
|
|
return s.Std.rma(r, t, i)
|
|
}, this.f_3 = (e = 0, function(t) {
|
|
var i = t.get(0),
|
|
r = t.get(1);
|
|
return e = i === r ? 0 : i > r ? s.Std.nz(e) <= 0 ? 1 : s.Std
|
|
.nz(e) + 1 : s.Std.nz(e) >= 0 ? -1 : s.Std.nz(e) - 1, this
|
|
._context.new_var(e)
|
|
}), this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = s.Std.close(this._context),
|
|
r = this._context.new_var(i),
|
|
n = this._input(0),
|
|
o = this._input(1),
|
|
a = this._input(2);
|
|
this._context.setMinimumAdditionalDepth(a);
|
|
var l = s.Std.rsi(this.f_1(r, n, this._context), this.f_2(r, n, this
|
|
._context)),
|
|
c = this.f_3(r),
|
|
h = s.Std.rsi(this.f_1(c, o, this._context), this.f_2(c, o, this
|
|
._context)),
|
|
u = this._context.new_var(s.Std.roc(r, 1)),
|
|
d = s.Std.percentrank(u, a);
|
|
return [s.Std.avg(l, h, d)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Coppock Curve",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 10,
|
|
in_1: 14,
|
|
in_2: 11
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Coppock Curve",
|
|
shortDescription: "Coppock Curve",
|
|
is_price_study: !1,
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "WMA Length",
|
|
defval: 10,
|
|
type: "integer",
|
|
min: -1e12,
|
|
max: 5e3
|
|
}, {
|
|
id: "in_1",
|
|
name: "Long RoC Length",
|
|
defval: 14,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 4999
|
|
}, {
|
|
id: "in_2",
|
|
name: "Short RoC Length",
|
|
defval: 11,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 4999
|
|
}],
|
|
id: "Coppock Curve@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Coppock Curve",
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t) {
|
|
return e + t
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0),
|
|
r = this._input(1),
|
|
n = this._input(2);
|
|
this._context.setMinimumAdditionalDepth(i + Math.max(r, n));
|
|
var o = s.Std.close(this._context),
|
|
a = this._context.new_var(o),
|
|
l = s.Std.roc(a, r),
|
|
c = this._context.new_var(o),
|
|
h = s.Std.roc(c, n),
|
|
u = this.f_0(l, h),
|
|
d = this._context.new_var(u);
|
|
return [s.Std.wma(d, i, this._context)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Correlation Coeff",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 4,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: "AAPL",
|
|
in_1: 20
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Correlation Coefficient",
|
|
shortDescription: "CC",
|
|
is_price_study: !1,
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "sym",
|
|
defval: "AAPL",
|
|
type: "symbol"
|
|
}, {
|
|
id: "in_1",
|
|
name: "length",
|
|
defval: 20,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}],
|
|
id: "Correlation Coeff@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Correlation Coeff",
|
|
format: {
|
|
precision: 2,
|
|
type: "price"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.init = function(e, t) {
|
|
this._context = e, this._input = t, this._context.new_sym(this
|
|
._input(0), s.Std.period(this._context))
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._context.new_unlimited_var(this._context.symbol.time),
|
|
r = (this._input(0), s.Std.period(this._context), s.Std.close(
|
|
this._context)),
|
|
n = this._input(1);
|
|
this._context.select_sym(1);
|
|
var o = this._context.new_unlimited_var(this._context.symbol.time),
|
|
a = s.Std.close(this._context),
|
|
l = this._context.new_unlimited_var(a);
|
|
this._context.select_sym(0);
|
|
var c = l.adopt(o, i, 0),
|
|
h = this._context.new_var(r),
|
|
u = this._context.new_var(c);
|
|
return [s.Std.correlation(h, u, n, this._context)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Correlation - Log",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
is_price_study: !1,
|
|
id: "Correlation - Log@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Correlation - Log",
|
|
description: "Correlation - Log",
|
|
shortDescription: "Correlation - Log",
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
visible: !0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
inputs: {
|
|
instrument: "INTC",
|
|
instrument2: "AMZN",
|
|
periods: 25
|
|
}
|
|
},
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot"
|
|
}
|
|
},
|
|
inputs: [{
|
|
id: "instrument",
|
|
name: "Instrument 1",
|
|
type: "symbol",
|
|
defval: "INTC",
|
|
confirm: !0
|
|
}, {
|
|
id: "instrument2",
|
|
name: "Instrument 2",
|
|
type: "symbol",
|
|
defval: "AMZN",
|
|
confirm: !0
|
|
}, {
|
|
id: "periods",
|
|
name: "Periods",
|
|
type: "integer",
|
|
defval: 25
|
|
}],
|
|
format: {
|
|
precision: 2,
|
|
type: "price"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.init = function(e, t) {
|
|
this._context = e, this._input = t, this._context.new_sym(this
|
|
._input(0), s.Std.period(this._context)), this._context
|
|
.new_sym(this._input(1), s.Std.period(this._context)), this
|
|
.period = this._input(2)
|
|
}, this.correlationLog = function(e, t, i, r) {
|
|
var n = s.Std.sma(e, i, r),
|
|
o = s.Std.sma(t, i, r),
|
|
a = r.new_var(e.get() * t.get());
|
|
return (s.Std.sma(a, i, r) - n * o) / Math.sqrt(s.Std.variance2(e,
|
|
n, i) * s.Std.variance2(t, o, i))
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t, this._context.select_sym(1);
|
|
var i = this._context.new_var(this._context.symbol.time);
|
|
this._context.select_sym(2);
|
|
var r = this._context.new_var(s.Std.close(this._context)),
|
|
n = this._context.new_var(s.Std.log(r.get() / r.get(1))),
|
|
o = this._context.new_var(this._context.symbol.time);
|
|
this._context.select_sym(1);
|
|
var a = this._context.new_var(s.Std.close(this._context)),
|
|
l = this._context.new_var(s.Std.log(a.get() / a.get(1))),
|
|
c = this._context.new_var(n.adopt(o, i, 0)),
|
|
h = this.correlationLog(l, c, this.period, this._context);
|
|
return [s.Std.round(1e3 * h) / 1e3]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Detrended Price Oscillator",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#43A047"
|
|
}
|
|
},
|
|
bands: [{
|
|
color: "#787B86",
|
|
linestyle: 2,
|
|
linewidth: 1,
|
|
visible: !0,
|
|
value: 0
|
|
}],
|
|
inputs: {
|
|
in_0: 21,
|
|
in_1: !1
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "DPO",
|
|
histogramBase: 0,
|
|
joinPoints: !1,
|
|
isHidden: !1
|
|
}
|
|
},
|
|
description: "Detrended Price Oscillator",
|
|
shortDescription: "DPO",
|
|
is_price_study: !1,
|
|
is_hidden_study: !1,
|
|
id: "detrended_price_oscillator@tv-basicstudies-1",
|
|
bands: [{
|
|
id: "hline_0",
|
|
name: "Zero",
|
|
isHidden: !1
|
|
}],
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "Period",
|
|
defval: 21,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e12
|
|
}, {
|
|
id: "in_1",
|
|
name: "isCentered",
|
|
defval: !1,
|
|
type: "bool"
|
|
}],
|
|
scriptIdPart: "",
|
|
name: "Detrended Price Oscillator",
|
|
format: {
|
|
type: "price",
|
|
precision: 2
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function() {
|
|
var e = this._input(0),
|
|
t = this._input(1),
|
|
i = Math.floor(e / 2 + 1);
|
|
this._context.setMinimumAdditionalDepth(e + i);
|
|
var r = this._context.new_var(s.Std.close(this._context)),
|
|
n = this._context.new_var(s.Std.sma(r, e, this._context)),
|
|
o = this._context.new_var(s.Std.close(this._context)).get(i) -
|
|
n,
|
|
a = s.Std.close(this._context) - n.get(i);
|
|
return [t ? o : a, t ? -i : 0]
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this.f_0();
|
|
return [{
|
|
value: i[0],
|
|
offset: i[1]
|
|
}]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Directional Movement Index",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
},
|
|
plot_1: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#FF6D00"
|
|
},
|
|
plot_2: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#F50057"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 14,
|
|
in_1: 14
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_1",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_2",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "+DI",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
plot_1: {
|
|
title: "-DI",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
plot_2: {
|
|
title: "ADX",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Directional Movement",
|
|
shortDescription: "DMI",
|
|
is_price_study: !1,
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "DI Length",
|
|
defval: 14,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}, {
|
|
id: "in_1",
|
|
name: "ADX Smoothing",
|
|
defval: 14,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 50
|
|
}],
|
|
id: "Directional Movement Index@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Directional Movement Index",
|
|
format: {
|
|
precision: 4,
|
|
type: "price"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e) {
|
|
return -e
|
|
}, this.f_1 = function(e, t) {
|
|
return s.Std.and(s.Std.gt(e, t), s.Std.gt(e, 0)) ? e : 0
|
|
}, this.f_2 = function(e, t) {
|
|
return 100 * e / t
|
|
}, this.f_3 = function(e, t) {
|
|
return e + t
|
|
}, this.f_4 = function(e, t, i) {
|
|
return s.Std.abs(e - t) / (s.Std.eq(i, 0) ? 1 : i)
|
|
}, this.f_5 = function(e) {
|
|
return 100 * e
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0),
|
|
r = this._input(1);
|
|
this._context.setMinimumAdditionalDepth(i + r);
|
|
var n = s.Std.high(this._context),
|
|
o = this._context.new_var(n),
|
|
a = s.Std.change(o),
|
|
l = s.Std.low(this._context),
|
|
c = this._context.new_var(l),
|
|
h = s.Std.change(c),
|
|
u = this.f_0(h),
|
|
d = s.Std.tr(this._context),
|
|
p = this._context.new_var(d),
|
|
_ = s.Std.rma(p, i, this._context),
|
|
m = this.f_1(a, u),
|
|
f = this._context.new_var(m),
|
|
g = s.Std.rma(f, i, this._context),
|
|
b = this.f_2(g, _),
|
|
v = s.Std.fixnan(b, this._context),
|
|
S = this.f_1(u, a),
|
|
y = this._context.new_var(S),
|
|
w = s.Std.rma(y, i, this._context),
|
|
P = this.f_2(w, _),
|
|
C = s.Std.fixnan(P, this._context),
|
|
x = this.f_3(v, C),
|
|
T = this.f_4(v, C, x),
|
|
I = this._context.new_var(T),
|
|
M = s.Std.rma(I, r, this._context);
|
|
return [v, C, this.f_5(M)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Donchian Channels",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
},
|
|
plot_1: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
},
|
|
plot_2: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#FF6D00"
|
|
}
|
|
},
|
|
filledAreasStyle: {
|
|
fill_0: {
|
|
color: "#2196F3",
|
|
transparency: 95,
|
|
visible: !0
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 20
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_1",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_2",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Lower",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
plot_1: {
|
|
title: "Upper",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
plot_2: {
|
|
title: "Basis",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Donchian Channels",
|
|
shortDescription: "DC",
|
|
is_price_study: !0,
|
|
filledAreas: [{
|
|
id: "fill_0",
|
|
objAId: "plot_1",
|
|
objBId: "plot_0",
|
|
type: "plot_plot",
|
|
title: "Plots Background"
|
|
}],
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "length",
|
|
defval: 20,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}],
|
|
id: "Donchian Channels@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Donchian Channels",
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0),
|
|
r = s.Std.low(this._context),
|
|
n = this._context.new_var(r),
|
|
o = s.Std.lowest(n, i, this._context),
|
|
a = s.Std.high(this._context),
|
|
l = this._context.new_var(a),
|
|
c = s.Std.highest(l, i, this._context);
|
|
return [o, c, s.Std.avg(c, o)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Double Exponential Moving Average",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#43A047"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 9
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Double EMA",
|
|
shortDescription: "DEMA",
|
|
is_price_study: !0,
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "length",
|
|
defval: 9,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e4
|
|
}],
|
|
id: "Double Exponential Moving Average@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Double Exponential Moving Average",
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t) {
|
|
return 2 * e - t
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0);
|
|
this._context.setMinimumAdditionalDepth(2 * i);
|
|
var r = s.Std.close(this._context),
|
|
n = this._context.new_var(r),
|
|
o = s.Std.ema(n, i, this._context),
|
|
a = this._context.new_var(o),
|
|
l = s.Std.ema(a, i, this._context);
|
|
return [this.f_0(o, l)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Ease of Movement",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#43A047"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 1e4,
|
|
in_1: 14
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Ease Of Movement",
|
|
shortDescription: "EOM",
|
|
is_price_study: !1,
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "Divisor",
|
|
defval: 1e4,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e9
|
|
}, {
|
|
id: "in_1",
|
|
name: "length",
|
|
defval: 14,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}],
|
|
id: "Ease of Movement@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Ease of Movement",
|
|
format: {
|
|
type: "volume"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t, i, s, r) {
|
|
return e * t * (i - s) / r
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0),
|
|
r = this._input(1),
|
|
n = s.Std.hl2(this._context),
|
|
o = this._context.new_var(n),
|
|
a = s.Std.change(o),
|
|
l = this.f_0(i, a, s.Std.high(this._context), s.Std.low(this
|
|
._context), s.Std.volume(this._context)),
|
|
c = this._context.new_var(l);
|
|
return [s.Std.sma(c, r, this._context)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Elders Force Index",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#F44336"
|
|
}
|
|
},
|
|
bands: [{
|
|
color: "#787B86",
|
|
linestyle: 2,
|
|
linewidth: 1,
|
|
visible: !0,
|
|
value: 0
|
|
}],
|
|
inputs: {
|
|
in_0: 13
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Elder's Force Index",
|
|
shortDescription: "EFI",
|
|
is_price_study: !1,
|
|
bands: [{
|
|
id: "hline_0",
|
|
name: "Zero"
|
|
}],
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "length",
|
|
defval: 13,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}],
|
|
id: "Elders Force Index@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Elders Force Index",
|
|
format: {
|
|
type: "volume"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t) {
|
|
return e * t
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0),
|
|
r = s.Std.close(this._context),
|
|
n = this._context.new_var(r),
|
|
o = s.Std.change(n),
|
|
a = this.f_0(o, s.Std.volume(this._context)),
|
|
l = this._context.new_var(a);
|
|
return [s.Std.ema(l, i, this._context)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "EMA Cross",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#FF6D00"
|
|
},
|
|
plot_1: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#43A047"
|
|
},
|
|
plot_2: {
|
|
linestyle: 0,
|
|
linewidth: 4,
|
|
plottype: 3,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 9,
|
|
in_1: 26
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_1",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_2",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Short",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
plot_1: {
|
|
title: "Long",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
plot_2: {
|
|
title: "Crosses",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "EMA Cross",
|
|
shortDescription: "EMA Cross",
|
|
is_price_study: !0,
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "Short",
|
|
defval: 9,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}, {
|
|
id: "in_1",
|
|
name: "Long",
|
|
defval: 26,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}],
|
|
id: "EMA Cross@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "EMA Cross",
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t) {
|
|
return e ? t : s.Std.na()
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0),
|
|
r = this._input(1),
|
|
n = s.Std.close(this._context),
|
|
o = this._context.new_var(n),
|
|
a = s.Std.ema(o, i, this._context),
|
|
l = this._context.new_var(n),
|
|
c = s.Std.ema(l, r, this._context),
|
|
h = a,
|
|
u = c,
|
|
d = s.Std.cross(a, c, this._context);
|
|
return [h, u, this.f_0(d, a)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Envelopes",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#FF6D00"
|
|
},
|
|
plot_1: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
},
|
|
plot_2: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
filledAreasStyle: {
|
|
fill_0: {
|
|
color: "#2196F3",
|
|
transparency: 95,
|
|
visible: !0
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 20,
|
|
in_1: 10,
|
|
in_2: 10,
|
|
in_3: "Simple",
|
|
in_4: "close"
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_1",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_2",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Average",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
plot_1: {
|
|
title: "Upper",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
plot_2: {
|
|
title: "Lower",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Envelopes",
|
|
shortDescription: "Envelopes",
|
|
is_price_study: !0,
|
|
filledAreas: [{
|
|
id: "fill_0",
|
|
objAId: "plot_1",
|
|
objBId: "plot_2",
|
|
type: "plot_plot",
|
|
title: "Plots Background"
|
|
}],
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "Length",
|
|
defval: 20,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}, {
|
|
id: "in_1",
|
|
name: "Upper Percentage",
|
|
defval: 2,
|
|
type: "float",
|
|
min: 0
|
|
}, {
|
|
id: "in_2",
|
|
name: "Lower Percentage",
|
|
defval: 2,
|
|
type: "float",
|
|
min: 0
|
|
}, {
|
|
id: "in_3",
|
|
name: "Method",
|
|
type: "text",
|
|
defval: "Simple",
|
|
options: ["Simple", "Exponential", "Weighted"]
|
|
}, {
|
|
id: "in_4",
|
|
name: "Source",
|
|
defval: "close",
|
|
type: "source",
|
|
options: ["open", "high", "low", "close", "hl2", "hlc3", "ohlc4"]
|
|
}],
|
|
id: "Envelope@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Envelopes",
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t) {
|
|
return e * (1 + t)
|
|
}, this.f_1 = function(e, t) {
|
|
return e * (1 - t)
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._context.new_var(s.Std[this._input(4)](this._context)),
|
|
r = s.Std.sma(i, this._input(0), this._context);
|
|
return "Exponential" === this._input(3) ? r = s.Std.ema(i, this
|
|
._input(0), this._context) : "Weighted" === this._input(
|
|
3) && (r = s.Std.wma(i, this._input(0), this._context)), [
|
|
this
|
|
.f_0(r, this._input(1) / 100), r, this.f_1(r, this._input(
|
|
2) / 100)
|
|
]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Standard Error",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
is_price_study: !1,
|
|
id: "Standard Error@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Standard Error",
|
|
description: "Standard Error",
|
|
shortDescription: "Standard Error",
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
visible: !0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
color: "#FF6D00"
|
|
}
|
|
},
|
|
inputs: {
|
|
length: 14
|
|
}
|
|
},
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot"
|
|
}
|
|
},
|
|
inputs: [{
|
|
id: "length",
|
|
type: "integer",
|
|
name: "Length"
|
|
}],
|
|
format: {
|
|
precision: 2,
|
|
type: "price"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.init = function(e, t) {
|
|
this._context = e, this._input = t, this.period = this._input(0)
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
for (var i, r, n = this._context.new_var(s.Std.close(this
|
|
._context)), o = 0, a = 0, l = 0; l < this.period; l++) o +=
|
|
l + 1, a += n.get(l);
|
|
i = o / this.period, r = a / this.period;
|
|
var c = 0,
|
|
h = 0,
|
|
u = 0;
|
|
for (l = 0; l < this.period; l++) u += Math.pow(r - n.get(l), 2),
|
|
h += (i - l - 1) * (r - n.get(l)), c += Math.pow(i - l - 1, 2);
|
|
return h = Math.pow(h, 2), [Math.sqrt((u - h / c) / (this.period -
|
|
2))]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Standard Error Bands",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
is_price_study: !0,
|
|
id: "Standard Error Bands@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Standard Error Bands",
|
|
description: "Standard Error Bands",
|
|
shortDescription: "Standard Error Bands",
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_1",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_2",
|
|
type: "line"
|
|
}],
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
visible: !0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
transparency: 0,
|
|
trackPrice: !1,
|
|
color: "#2196F3"
|
|
},
|
|
plot_1: {
|
|
linestyle: 0,
|
|
visible: !0,
|
|
linewidth: 1,
|
|
transparency: 0,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
color: "#FF6D00"
|
|
},
|
|
plot_2: {
|
|
linestyle: 0,
|
|
visible: !0,
|
|
linewidth: 1,
|
|
transparency: 0,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
filledAreasStyle: {
|
|
fill_0: {
|
|
color: "#2196F3",
|
|
transparency: 95,
|
|
visible: !0
|
|
}
|
|
},
|
|
inputs: {
|
|
periods: 21,
|
|
errors: 2,
|
|
method: "Simple",
|
|
averagePeriods: 3
|
|
}
|
|
},
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot 1"
|
|
},
|
|
plot_1: {
|
|
title: "Plot 2"
|
|
},
|
|
plot_2: {
|
|
title: "Plot 3"
|
|
}
|
|
},
|
|
filledAreas: [{
|
|
id: "fill_0",
|
|
objAId: "plot_0",
|
|
objBId: "plot_2",
|
|
type: "plot_plot",
|
|
title: "Background"
|
|
}],
|
|
inputs: [{
|
|
id: "periods",
|
|
type: "integer",
|
|
name: "Periods"
|
|
}, {
|
|
id: "errors",
|
|
type: "float",
|
|
name: "Standard Errors"
|
|
}, {
|
|
id: "method",
|
|
name: "Method",
|
|
type: "text",
|
|
defval: "Simple",
|
|
options: ["Simple", "Exponential", "Weighted"]
|
|
}, {
|
|
id: "averagePeriods",
|
|
type: "integer",
|
|
name: "Averaging Periods"
|
|
}],
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.init = function(e, t) {
|
|
this._context = e, this._input = t, this.period = this._input(0),
|
|
this.errorDeviation = this._input(1), this.maMethod = this
|
|
._input(2), this.averagePeriod = this._input(3)
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
for (var i, r, n = this._context.new_var(s.Std.close(this
|
|
._context)), o = 0, a = 0, l = 0; l < this.period; l++) o +=
|
|
l + 1, a += n.get(l);
|
|
i = o / this.period, r = a / this.period;
|
|
var c = 0,
|
|
h = 0,
|
|
u = 0;
|
|
for (l = 0; l < this.period; l++) u += Math.pow(r - n.get(l), 2),
|
|
h += (i - l - 1) * (r - n.get(l)), c += Math.pow(i - l - 1, 2);
|
|
h = Math.pow(h, 2);
|
|
var d, p, _, m = Math.sqrt((u - h / c) / (this.period - 2)),
|
|
f = s.Std.linreg(n, this.period, 0),
|
|
g = this._context.new_var(f + this.errorDeviation * m),
|
|
b = this._context.new_var(f),
|
|
v = this._context.new_var(f - this.errorDeviation * m);
|
|
return "Simple" === this.maMethod ? (d = s.Std.sma(g, this
|
|
.averagePeriod, this._context), p = s.Std.sma(b, this
|
|
.averagePeriod, this._context), _ = s.Std.sma(v, this
|
|
.averagePeriod, this._context)) : "Exponential" === this
|
|
.maMethod ? (d = s.Std.ema(g, this.averagePeriod, this
|
|
._context), p = s.Std.ema(b, this.averagePeriod, this
|
|
._context), _ = s.Std.ema(v, this.averagePeriod, this
|
|
._context)) : (d = s.Std.wma(g, this.averagePeriod, this
|
|
._context), p = s.Std.wma(b, this.averagePeriod, this
|
|
._context), _ = s.Std.wma(v, this.averagePeriod, this
|
|
._context)), [d, p, _]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Fisher Transform",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
},
|
|
plot_1: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#FF6D00"
|
|
}
|
|
},
|
|
bands: [{
|
|
color: "#E91E63",
|
|
linestyle: 2,
|
|
linewidth: 1,
|
|
visible: !0,
|
|
value: 1.5
|
|
}, {
|
|
color: "#787B86",
|
|
linestyle: 2,
|
|
linewidth: 1,
|
|
visible: !0,
|
|
value: .75
|
|
}, {
|
|
color: "#E91E63",
|
|
linestyle: 2,
|
|
linewidth: 1,
|
|
visible: !0,
|
|
value: 0
|
|
}, {
|
|
color: "#787B86",
|
|
linestyle: 2,
|
|
linewidth: 1,
|
|
visible: !0,
|
|
value: -.75
|
|
}, {
|
|
color: "#E91E63",
|
|
linestyle: 2,
|
|
linewidth: 1,
|
|
visible: !0,
|
|
value: -1.5
|
|
}],
|
|
inputs: {
|
|
in_0: 9
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_1",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Fisher",
|
|
histogramBase: 0,
|
|
joinPoints: !1,
|
|
isHidden: !1
|
|
},
|
|
plot_1: {
|
|
title: "Trigger",
|
|
histogramBase: 0,
|
|
joinPoints: !1,
|
|
isHidden: !1
|
|
}
|
|
},
|
|
description: "Fisher Transform",
|
|
shortDescription: "Fisher",
|
|
is_price_study: !1,
|
|
bands: [{
|
|
id: "hline_0",
|
|
name: "Level",
|
|
isHidden: !1
|
|
}, {
|
|
id: "hline_1",
|
|
name: "Level",
|
|
isHidden: !1
|
|
}, {
|
|
id: "hline_2",
|
|
name: "Level",
|
|
isHidden: !1
|
|
}, {
|
|
id: "hline_3",
|
|
name: "Level",
|
|
isHidden: !1
|
|
}, {
|
|
id: "hline_4",
|
|
name: "Level",
|
|
isHidden: !1
|
|
}],
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "Length",
|
|
defval: 9,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e12
|
|
}],
|
|
id: "fisher_transform@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Fisher Transform",
|
|
format: {
|
|
precision: 2,
|
|
type: "price"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e) {
|
|
var t = s.Std.lt(e, -.99) ? -.999 : e;
|
|
return [s.Std.gt(e, .99) ? .999 : t]
|
|
}, this.f_1 = function() {
|
|
var e = this._input(0),
|
|
t = this._context.new_var(s.Std.hl2(this._context)),
|
|
i = s.Std.highest(t, e, this._context),
|
|
r = this._context.new_var(s.Std.hl2(this._context)),
|
|
n = s.Std.lowest(r, e, this._context),
|
|
o = this._context.new_var(),
|
|
a = this.f_0(.66 * ((s.Std.hl2(this._context) - n) / s.Std.max(
|
|
i - n, .001) - .5) + .67 * s.Std.nz(o.get(1)));
|
|
o.set(a[0]);
|
|
var l = this._context.new_var();
|
|
l.set(.5 * s.Std.log((1 + o.get(0)) / s.Std.max(1 - o.get(0),
|
|
.001)) + .5 * s.Std.nz(l.get(1)));
|
|
var c = l.get(1);
|
|
return [l.get(0), c]
|
|
}, this.main = function(e, t) {
|
|
return this._context = e, this._input = t, this.f_1()
|
|
}
|
|
}
|
|
}, {
|
|
name: "Historical Volatility",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 10
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1,
|
|
isHidden: !1
|
|
}
|
|
},
|
|
description: "Historical Volatility",
|
|
shortDescription: "HV",
|
|
is_price_study: !1,
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "length",
|
|
defval: 10,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e12
|
|
}],
|
|
id: "historical_volatility@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Historical Volatility",
|
|
format: {
|
|
precision: 2,
|
|
type: "price"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function() {
|
|
var e = this._input(0),
|
|
t = s.Std.or(s.Std.isintraday(this._context), s.Std.and(s.Std
|
|
.isdaily(this._context), s.Std.eq(s.Std.interval(this
|
|
._context), 1))) ? 1 : 7,
|
|
i = this._context.new_var(s.Std.close(this._context)),
|
|
r = this._context.new_var(s.Std.log(s.Std.close(this._context) /
|
|
i.get(1)));
|
|
return [100 * s.Std.stdev(r, e, this._context) * s.Std.sqrt(365 /
|
|
t)]
|
|
}, this.main = function(e, t) {
|
|
return this._context = e, this._input = t, this.f_0()
|
|
}
|
|
}
|
|
}, {
|
|
name: "Hull MA",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 9
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Hull Moving Average",
|
|
shortDescription: "HMA",
|
|
is_price_study: !0,
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "length",
|
|
defval: 9,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e4
|
|
}],
|
|
id: "Hull MA@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Hull MA",
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t) {
|
|
return 2 * e - t
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = s.Std.close(this._context),
|
|
r = this._input(0),
|
|
n = r / 2;
|
|
this._context.setMinimumAdditionalDepth(Math.ceil(r + n));
|
|
var o = this._context.new_var(i),
|
|
a = s.Std.wma(o, n, this._context),
|
|
l = this._context.new_var(i),
|
|
c = s.Std.wma(l, r, this._context),
|
|
h = this.f_0(a, c),
|
|
u = s.Std.sqrt(r),
|
|
d = s.Std.round(u),
|
|
p = this._context.new_var(h);
|
|
return [s.Std.wma(p, d, this._context)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Ichimoku Cloud",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
},
|
|
plot_1: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#B71C1C"
|
|
},
|
|
plot_2: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#43A047"
|
|
},
|
|
plot_3: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#A5D6A7"
|
|
},
|
|
plot_4: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#EF9A9A"
|
|
}
|
|
},
|
|
palettes: {
|
|
palette_0: {
|
|
colors: {
|
|
0: {
|
|
color: "#43A047",
|
|
width: 1,
|
|
style: 0
|
|
},
|
|
1: {
|
|
color: "#F44336",
|
|
width: 1,
|
|
style: 0
|
|
}
|
|
}
|
|
}
|
|
},
|
|
filledAreasStyle: {
|
|
fill_0: {
|
|
color: "#000080",
|
|
transparency: 90,
|
|
visible: !0
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 9,
|
|
in_1: 26,
|
|
in_2: 52,
|
|
in_3: 26
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_1",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_2",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_3",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_4",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_5",
|
|
palette: "palette_0",
|
|
target: "fill_0",
|
|
type: "colorer"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Conversion Line",
|
|
histogramBase: 0,
|
|
joinPoints: !1,
|
|
isHidden: !1
|
|
},
|
|
plot_1: {
|
|
title: "Base Line",
|
|
histogramBase: 0,
|
|
joinPoints: !1,
|
|
isHidden: !1
|
|
},
|
|
plot_2: {
|
|
title: "Lagging Span",
|
|
histogramBase: 0,
|
|
joinPoints: !1,
|
|
isHidden: !1
|
|
},
|
|
plot_3: {
|
|
title: "Lead 1",
|
|
histogramBase: 0,
|
|
joinPoints: !1,
|
|
isHidden: !1
|
|
},
|
|
plot_4: {
|
|
title: "Lead 2",
|
|
histogramBase: 0,
|
|
joinPoints: !1,
|
|
isHidden: !1
|
|
}
|
|
},
|
|
description: "Ichimoku Cloud",
|
|
shortDescription: "Ichimoku",
|
|
is_price_study: !0,
|
|
is_hidden_study: !1,
|
|
id: "Ichimoku Cloud@tv-basicstudies-1",
|
|
palettes: {
|
|
palette_0: {
|
|
colors: {
|
|
0: {
|
|
name: "Color 0"
|
|
},
|
|
1: {
|
|
name: "Color 1"
|
|
}
|
|
},
|
|
valToIndex: {
|
|
0: 0,
|
|
1: 1
|
|
}
|
|
}
|
|
},
|
|
filledAreas: [{
|
|
id: "fill_0",
|
|
objAId: "plot_3",
|
|
objBId: "plot_4",
|
|
type: "plot_plot",
|
|
title: "Plots Background",
|
|
isHidden: !1,
|
|
palette: "palette_0"
|
|
}],
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "Conversion Line Periods",
|
|
defval: 9,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e12
|
|
}, {
|
|
id: "in_1",
|
|
name: "Base Line Periods",
|
|
defval: 26,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e12
|
|
}, {
|
|
id: "in_2",
|
|
name: "Lagging Span 2 Periods",
|
|
defval: 52,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e12
|
|
}, {
|
|
id: "in_3",
|
|
name: "Displacement",
|
|
defval: 26,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e12
|
|
}],
|
|
scriptIdPart: "",
|
|
name: "Ichimoku Cloud",
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.donchian = function(e) {
|
|
var t = this._context.new_var(s.Std.low(this._context)),
|
|
i = this._context.new_var(s.Std.high(this._context));
|
|
return s.Std.avg(s.Std.lowest(t, e, this._context), s.Std.highest(i,
|
|
e, this._context))
|
|
}, this.f_1 = function() {
|
|
var e = this._input(0),
|
|
t = this._input(1),
|
|
i = this._input(2),
|
|
r = this._input(3),
|
|
n = this.donchian(e),
|
|
o = this.donchian(t),
|
|
a = s.Std.avg(n, o),
|
|
l = this.donchian(i);
|
|
return [n, o, s.Std.close(this._context), a, l, 1 - r, r - 1, r - 1,
|
|
s.Std.gt(a, l) ? 0 : 1
|
|
]
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this.f_1();
|
|
return [i[0], i[1], {
|
|
value: i[2],
|
|
offset: i[5]
|
|
}, {
|
|
value: i[3],
|
|
offset: i[6]
|
|
}, {
|
|
value: i[4],
|
|
offset: i[7]
|
|
}, i[8]]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Keltner Channels",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
},
|
|
plot_1: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
},
|
|
plot_2: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
filledAreasStyle: {
|
|
fill_0: {
|
|
color: "#2196F3",
|
|
transparency: 95,
|
|
visible: !0
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: !0,
|
|
in_1: 20,
|
|
in_2: 1
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_1",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_2",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Upper",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
plot_1: {
|
|
title: "Middle",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
plot_2: {
|
|
title: "Lower",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Keltner Channels",
|
|
shortDescription: "KC",
|
|
is_price_study: !0,
|
|
filledAreas: [{
|
|
id: "fill_0",
|
|
objAId: "plot_0",
|
|
objBId: "plot_2",
|
|
type: "plot_plot",
|
|
title: "Plots Background"
|
|
}],
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "useTrueRange",
|
|
defval: !0,
|
|
type: "bool"
|
|
}, {
|
|
id: "in_1",
|
|
name: "length",
|
|
defval: 20,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}, {
|
|
id: "in_2",
|
|
name: "mult",
|
|
defval: 1,
|
|
type: "float",
|
|
min: -1e12,
|
|
max: 1e12
|
|
}],
|
|
id: "Keltner Channels@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Keltner Channels",
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t, i, s) {
|
|
return e ? t : i - s
|
|
}, this.f_1 = function(e, t, i) {
|
|
return e + t * i
|
|
}, this.f_2 = function(e, t, i) {
|
|
return e - t * i
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = s.Std.close(this._context),
|
|
r = this._input(0),
|
|
n = this._input(1),
|
|
o = this._input(2),
|
|
a = this._context.new_var(i),
|
|
l = s.Std.ema(a, n, this._context),
|
|
c = this.f_0(r, s.Std.tr(this._context), s.Std.high(this
|
|
._context), s.Std.low(this._context)),
|
|
h = this._context.new_var(c),
|
|
u = s.Std.ema(h, n, this._context);
|
|
return [this.f_1(l, u, o), l, this.f_2(l, u, o)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Klinger Oscillator",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
},
|
|
plot_1: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#43A047"
|
|
}
|
|
},
|
|
inputs: {}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_1",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
plot_1: {
|
|
title: "Signal",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Klinger Oscillator",
|
|
shortDescription: "Klinger Oscillator",
|
|
is_price_study: !1,
|
|
inputs: [],
|
|
id: "Klinger Oscillator@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Klinger Oscillator",
|
|
format: {
|
|
type: "volume"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t) {
|
|
return s.Std.ge(e, 0) ? t : -t
|
|
}, this.f_1 = function(e, t) {
|
|
return e - t
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = s.Std.hlc3(this._context);
|
|
this._context.setMinimumAdditionalDepth(66);
|
|
var r = this._context.new_var(i),
|
|
n = s.Std.change(r),
|
|
o = this.f_0(n, s.Std.volume(this._context)),
|
|
a = this._context.new_var(o),
|
|
l = s.Std.ema(a, 34, this._context),
|
|
c = this._context.new_var(o),
|
|
h = s.Std.ema(c, 55, this._context),
|
|
u = this.f_1(l, h),
|
|
d = this._context.new_var(u);
|
|
return [u, s.Std.ema(d, 13, this._context)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Know Sure Thing",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#009688"
|
|
},
|
|
plot_1: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#F44336"
|
|
}
|
|
},
|
|
bands: [{
|
|
color: "#787B86",
|
|
linestyle: 2,
|
|
linewidth: 1,
|
|
visible: !0,
|
|
value: 0
|
|
}],
|
|
inputs: {
|
|
in_0: 10,
|
|
in_1: 15,
|
|
in_2: 20,
|
|
in_3: 30,
|
|
in_4: 10,
|
|
in_5: 10,
|
|
in_6: 10,
|
|
in_7: 15,
|
|
in_8: 9
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_1",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "KST",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
plot_1: {
|
|
title: "Signal",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Know Sure Thing",
|
|
shortDescription: "KST",
|
|
is_price_study: !1,
|
|
bands: [{
|
|
id: "hline_0",
|
|
name: "Zero"
|
|
}],
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "roclen1",
|
|
defval: 10,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}, {
|
|
id: "in_1",
|
|
name: "roclen2",
|
|
defval: 15,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}, {
|
|
id: "in_2",
|
|
name: "roclen3",
|
|
defval: 20,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}, {
|
|
id: "in_3",
|
|
name: "roclen4",
|
|
defval: 30,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}, {
|
|
id: "in_4",
|
|
name: "smalen1",
|
|
defval: 10,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}, {
|
|
id: "in_5",
|
|
name: "smalen2",
|
|
defval: 10,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}, {
|
|
id: "in_6",
|
|
name: "smalen3",
|
|
defval: 10,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}, {
|
|
id: "in_7",
|
|
name: "smalen4",
|
|
defval: 15,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}, {
|
|
id: "in_8",
|
|
name: "siglen",
|
|
defval: 9,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}],
|
|
id: "Know Sure Thing@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Know Sure Thing",
|
|
format: {
|
|
type: "price",
|
|
precision: 4
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t, i, s) {
|
|
return e + 2 * t + 3 * i + 4 * s
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0),
|
|
r = this._input(1),
|
|
n = this._input(2),
|
|
o = this._input(3),
|
|
a = this._input(4),
|
|
l = this._input(5),
|
|
c = this._input(6),
|
|
h = this._input(7),
|
|
u = this._input(8);
|
|
this._context.setMinimumAdditionalDepth(Math.max(a + i, l + r, c +
|
|
n, h + o) + u);
|
|
var d = s.Std.close(this._context),
|
|
p = i,
|
|
_ = this._context.new_var(d),
|
|
m = s.Std.roc(_, p),
|
|
f = a,
|
|
g = this._context.new_var(m),
|
|
b = s.Std.sma(g, f, this._context),
|
|
v = r,
|
|
S = this._context.new_var(d),
|
|
y = s.Std.roc(S, v),
|
|
w = l,
|
|
P = this._context.new_var(y),
|
|
C = s.Std.sma(P, w, this._context),
|
|
x = n,
|
|
T = this._context.new_var(d),
|
|
I = s.Std.roc(T, x),
|
|
M = c,
|
|
O = this._context.new_var(I),
|
|
L = s.Std.sma(O, M, this._context),
|
|
A = o,
|
|
E = this._context.new_var(d),
|
|
k = s.Std.roc(E, A),
|
|
D = h,
|
|
V = this._context.new_var(k),
|
|
B = s.Std.sma(V, D, this._context),
|
|
R = this.f_0(b, C, L, B),
|
|
N = this._context.new_var(R);
|
|
return [R, s.Std.sma(N, u, this._context)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Least Squares Moving Average",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 25,
|
|
in_1: 0
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Least Squares Moving Average",
|
|
shortDescription: "LSMA",
|
|
is_price_study: !0,
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "Length",
|
|
defval: 25,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e12
|
|
}, {
|
|
id: "in_1",
|
|
name: "Offset",
|
|
defval: 0,
|
|
type: "integer",
|
|
min: -1e12,
|
|
max: 1e12
|
|
}],
|
|
id: "Least Squares Moving Average@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Least Squares Moving Average",
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0),
|
|
r = this._input(1),
|
|
n = s.Std.close(this._context),
|
|
o = this._context.new_var(n);
|
|
return [s.Std.linreg(o, i, r)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Linear Regression Curve",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 9
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Linear Regression Curve",
|
|
shortDescription: "LRC",
|
|
is_price_study: !0,
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "Length",
|
|
defval: 9,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}],
|
|
id: "Linear Regression Curve@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Linear Regression Curve",
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = s.Std.close(this._context),
|
|
r = this._input(0),
|
|
n = this._context.new_var(i);
|
|
return [s.Std.linreg(n, r, 0)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Linear Regression Slope",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
is_price_study: !1,
|
|
id: "Linear Regression Slope@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Linear Regression Slope",
|
|
description: "Linear Regression Slope",
|
|
shortDescription: "Linear Regression Slope",
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
visible: !0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
color: "#FF5252"
|
|
}
|
|
},
|
|
inputs: {
|
|
periods: 14
|
|
}
|
|
},
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot"
|
|
}
|
|
},
|
|
inputs: [{
|
|
id: "periods",
|
|
type: "integer",
|
|
name: "Periods"
|
|
}],
|
|
format: {
|
|
precision: 2,
|
|
type: "price"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.init = function(e, t) {
|
|
this._context = e, this._input = t, this.period = this._input(0)
|
|
}, this.linregSlope = function(e, t, i) {
|
|
var s, r, n, o = 0,
|
|
a = 0,
|
|
l = 0,
|
|
c = 0;
|
|
for (s = 0; s < t; ++s) o += n = t - 1 - s + 1, a += r = e.get(s),
|
|
l += n * n, c += r * n;
|
|
return (t * c - o * a) / (t * l - o * o)
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._context.new_var(s.Std.close(this._context));
|
|
return [this.linregSlope(i, this.period, 0)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "MA Cross",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#43A047"
|
|
},
|
|
plot_1: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#FF6D00"
|
|
},
|
|
plot_2: {
|
|
linestyle: 0,
|
|
linewidth: 4,
|
|
plottype: 3,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 9,
|
|
in_1: 26
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_1",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_2",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Short",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
plot_1: {
|
|
title: "Long",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
plot_2: {
|
|
title: "Crosses",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "MA Cross",
|
|
shortDescription: "MA Cross",
|
|
is_price_study: !0,
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "Short",
|
|
defval: 9,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}, {
|
|
id: "in_1",
|
|
name: "Long",
|
|
defval: 26,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}],
|
|
id: "MA Cross@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "MA Cross",
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t) {
|
|
return e ? t : s.Std.na()
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0),
|
|
r = this._input(1),
|
|
n = s.Std.close(this._context),
|
|
o = this._context.new_var(n),
|
|
a = s.Std.sma(o, i, this._context),
|
|
l = this._context.new_var(n),
|
|
c = s.Std.sma(l, r, this._context),
|
|
h = a,
|
|
u = c,
|
|
d = s.Std.cross(a, c, this._context);
|
|
return [h, u, this.f_0(d, a)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "MA with EMA Cross",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#FF6D00"
|
|
},
|
|
plot_1: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#43A047"
|
|
},
|
|
plot_2: {
|
|
linestyle: 0,
|
|
linewidth: 4,
|
|
plottype: 3,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 10,
|
|
in_1: 10
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_1",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_2",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "MA",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
plot_1: {
|
|
title: "EMA",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
plot_2: {
|
|
title: "Crosses",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "MA with EMA Cross",
|
|
shortDescription: "MA/EMA Cross",
|
|
is_price_study: !0,
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "Length MA",
|
|
defval: 10,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}, {
|
|
id: "in_1",
|
|
name: "Length EMA",
|
|
defval: 10,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}],
|
|
id: "MA with EMA Cross@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "MA with EMA Cross",
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t) {
|
|
return e ? t : s.Std.na()
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0),
|
|
r = this._input(1),
|
|
n = s.Std.close(this._context),
|
|
o = this._context.new_var(n),
|
|
a = s.Std.sma(o, i, this._context),
|
|
l = this._context.new_var(n),
|
|
c = s.Std.ema(l, r, this._context),
|
|
h = a,
|
|
u = c,
|
|
d = s.Std.cross(a, c, this._context);
|
|
return [h, u, this.f_0(d, a)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Mass Index",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 10
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Mass Index",
|
|
shortDescription: "Mass Index",
|
|
is_price_study: !1,
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "length",
|
|
defval: 10,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}],
|
|
id: "Mass Index@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Mass Index",
|
|
format: {
|
|
precision: 2,
|
|
type: "price"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t) {
|
|
return e - t
|
|
}, this.f_1 = function(e, t) {
|
|
return e / t
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0),
|
|
r = this.f_0(s.Std.high(this._context), s.Std.low(this
|
|
._context)),
|
|
n = this._context.new_var(r),
|
|
o = s.Std.ema(n, 9, this._context),
|
|
a = this._context.new_var(o),
|
|
l = s.Std.ema(a, 9, this._context),
|
|
c = this.f_1(o, l),
|
|
h = this._context.new_var(c);
|
|
return [s.Std.sum(h, i, this._context)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "McGinley Dynamic",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 14
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1,
|
|
isHidden: !1
|
|
}
|
|
},
|
|
description: "McGinley Dynamic",
|
|
shortDescription: "McGinley Dynamic",
|
|
is_price_study: !0,
|
|
is_hidden_study: !1,
|
|
id: "mcginley_dynamic@tv-basicstudies-1",
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "length",
|
|
defval: 14,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e12
|
|
}],
|
|
scriptIdPart: "",
|
|
name: "McGinley Dynamic",
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function() {
|
|
var e = this._input(0),
|
|
t = s.Std.close(this._context),
|
|
i = this._context.new_var(t),
|
|
r = s.Std.ema(i, e, this._context),
|
|
n = this._context.new_var(),
|
|
o = n.get(1) + (t - n.get(1)) / (e * s.Std.pow(t / n.get(1),
|
|
4));
|
|
return n.set(s.Std.na(n.get(1)) ? r : o), [n.get(0)]
|
|
}, this.main = function(e, t) {
|
|
return this._context = e, this._input = t, this.f_0()
|
|
}
|
|
}
|
|
}, {
|
|
name: "Median Price",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
id: "Median Price@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Median Price",
|
|
description: "Median Price",
|
|
shortDescription: "Median Price",
|
|
is_price_study: !0,
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
visible: !0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
color: "#FF6D00"
|
|
}
|
|
},
|
|
inputs: {}
|
|
},
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot"
|
|
}
|
|
},
|
|
inputs: [],
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.main = function(e, t) {
|
|
return this._context = e, this._input = t, [s.Std.hl2(this
|
|
._context)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Momentum",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 10,
|
|
in_1: "close"
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Mom",
|
|
histogramBase: 0,
|
|
joinPoints: !1,
|
|
isHidden: !1
|
|
}
|
|
},
|
|
description: "Momentum",
|
|
shortDescription: "Mom",
|
|
is_price_study: !1,
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "Length",
|
|
defval: 10,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}, {
|
|
id: "in_1",
|
|
name: "Source",
|
|
defval: "close",
|
|
type: "source",
|
|
options: ["open", "high", "low", "close", "hl2", "hlc3", "ohlc4"]
|
|
}],
|
|
id: "Momentum@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Momentum",
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0),
|
|
r = s.Std[this._input(1)](this._context),
|
|
n = this._context.new_var(r).get(i);
|
|
return [n ? r - n : null]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Money Flow Index",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#7E57C2"
|
|
}
|
|
},
|
|
bands: [{
|
|
color: "#787B86",
|
|
linestyle: 2,
|
|
linewidth: 1,
|
|
visible: !0,
|
|
value: 80
|
|
}, {
|
|
color: "#787B86",
|
|
linestyle: 2,
|
|
linewidth: 1,
|
|
visible: !0,
|
|
value: 20
|
|
}],
|
|
filledAreasStyle: {
|
|
fill_0: {
|
|
color: "#7E57C2",
|
|
transparency: 90,
|
|
visible: !0
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 14
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Money Flow Index",
|
|
shortDescription: "MFI",
|
|
is_price_study: !1,
|
|
bands: [{
|
|
id: "hline_0",
|
|
name: "UpperLimit"
|
|
}, {
|
|
id: "hline_1",
|
|
name: "LowerLimit"
|
|
}],
|
|
filledAreas: [{
|
|
id: "fill_0",
|
|
objAId: "hline_0",
|
|
objBId: "hline_1",
|
|
type: "hline_hline",
|
|
title: "Hlines Background"
|
|
}],
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "Length",
|
|
defval: 14,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}],
|
|
id: "Money Flow@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Money Flow Index",
|
|
format: {
|
|
precision: 2,
|
|
type: "price"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t, i) {
|
|
return e * (s.Std.le(t, 0) ? 0 : i)
|
|
}, this.f_1 = function(e, t, i) {
|
|
return e * (s.Std.ge(t, 0) ? 0 : i)
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0),
|
|
r = s.Std.hlc3(this._context),
|
|
n = this._context.new_var(r),
|
|
o = s.Std.change(n),
|
|
a = this.f_0(s.Std.volume(this._context), o, r),
|
|
l = this._context.new_var(a),
|
|
c = s.Std.sum(l, i, this._context),
|
|
h = this.f_1(s.Std.volume(this._context), o, r),
|
|
u = this._context.new_var(h),
|
|
d = s.Std.sum(u, i, this._context);
|
|
return [s.Std.rsi(c, d)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Moving Average",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
},
|
|
smoothedMA: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !1
|
|
}
|
|
},
|
|
inputs: {
|
|
length: 9,
|
|
source: "close",
|
|
offset: 0,
|
|
smoothingLine: "SMA",
|
|
smoothingLength: 9
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "smoothedMA",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
smoothedMA: {
|
|
title: "Smoothed MA",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Moving Average",
|
|
shortDescription: "MA",
|
|
is_price_study: !0,
|
|
inputs: [{
|
|
id: "length",
|
|
name: "Length",
|
|
defval: 9,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e4
|
|
}, {
|
|
id: "source",
|
|
name: "Source",
|
|
defval: "close",
|
|
type: "source",
|
|
options: ["open", "high", "low", "close", "hl2", "hlc3", "ohlc4"]
|
|
}, {
|
|
id: "offset",
|
|
name: "Offset",
|
|
defval: 0,
|
|
type: "integer",
|
|
min: -1e4,
|
|
max: 1e4
|
|
}, {
|
|
id: "smoothingLine",
|
|
name: "Smoothing Line",
|
|
defval: "SMA",
|
|
type: "text",
|
|
options: ["SMA", "EMA", "WMA"]
|
|
}, {
|
|
id: "smoothingLength",
|
|
name: "Smoothing Length",
|
|
defval: 9,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e4
|
|
}],
|
|
id: "Moving Average@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Moving Average",
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = s.Std[this._input(1)](this._context),
|
|
r = this._input(0),
|
|
n = this._input(2),
|
|
o = this._input(3),
|
|
a = this._input(4);
|
|
this._context.setMinimumAdditionalDepth(r + a);
|
|
var l, c = this._context.new_var(i),
|
|
h = s.Std.sma(c, r, this._context),
|
|
u = this._context.new_var(h);
|
|
return "EMA" === o ? l = s.Std.ema(u, a, this._context) : "WMA" ===
|
|
o ? l = s.Std.wma(u, a, this._context) : "SMA" === o && (l = s
|
|
.Std.sma(u, a, this._context)), [{
|
|
value: h,
|
|
offset: n
|
|
}, {
|
|
value: l,
|
|
offset: n
|
|
}]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Moving Average Channel",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
},
|
|
plot_1: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#FF6D00"
|
|
}
|
|
},
|
|
filledAreasStyle: {
|
|
fill_0: {
|
|
color: "#2196F3",
|
|
transparency: 90,
|
|
visible: !0
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 20,
|
|
in_1: 20,
|
|
in_2: 0,
|
|
in_3: 0
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_1",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Upper",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
plot_1: {
|
|
title: "Lower",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
filledAreas: [{
|
|
id: "fill_0",
|
|
objAId: "plot_0",
|
|
objBId: "plot_1",
|
|
type: "plot_plot",
|
|
title: "Plots Background"
|
|
}],
|
|
description: "Moving Average Channel",
|
|
shortDescription: "MAC",
|
|
is_price_study: !0,
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "Upper Length",
|
|
defval: 20,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e4
|
|
}, {
|
|
id: "in_1",
|
|
name: "Lower Length",
|
|
defval: 20,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e4
|
|
}, {
|
|
id: "in_2",
|
|
name: "Upper Offset",
|
|
defval: 0,
|
|
type: "integer",
|
|
min: -1e4,
|
|
max: 1e4
|
|
}, {
|
|
id: "in_3",
|
|
name: "Lower Offset",
|
|
defval: 0,
|
|
type: "integer",
|
|
min: -1e4,
|
|
max: 1e4
|
|
}],
|
|
id: "Moving Average Channel@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Moving Average Channel",
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = s.Std.high(this._context),
|
|
r = s.Std.low(this._context),
|
|
n = this._input(0),
|
|
o = this._input(1),
|
|
a = this._input(2),
|
|
l = this._input(3),
|
|
c = this._context.new_var(i),
|
|
h = this._context.new_var(r);
|
|
return [{
|
|
value: s.Std.sma(c, n, this._context),
|
|
offset: a
|
|
}, {
|
|
value: s.Std.sma(h, o, this._context),
|
|
offset: l
|
|
}]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Moving Average Convergence/Divergence",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 5,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#FF5252"
|
|
},
|
|
plot_1: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
},
|
|
plot_2: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#FF6D00"
|
|
}
|
|
},
|
|
palettes: {
|
|
palette_0: {
|
|
colors: {
|
|
0: {
|
|
color: "#26A69A",
|
|
width: 1,
|
|
style: 0
|
|
},
|
|
1: {
|
|
color: "#B2DFDB",
|
|
width: 1,
|
|
style: 0
|
|
},
|
|
2: {
|
|
color: "#FFCDD2",
|
|
width: 1,
|
|
style: 0
|
|
},
|
|
3: {
|
|
color: "#FF5252",
|
|
width: 1,
|
|
style: 0
|
|
}
|
|
}
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 12,
|
|
in_1: 26,
|
|
in_3: "close",
|
|
in_2: 9
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_1",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_2",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_3",
|
|
palette: "palette_0",
|
|
target: "plot_0",
|
|
type: "colorer"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Histogram",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
plot_1: {
|
|
title: "MACD",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
plot_2: {
|
|
title: "Signal",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "MACD",
|
|
shortDescription: "MACD",
|
|
is_price_study: !1,
|
|
palettes: {
|
|
palette_0: {
|
|
colors: {
|
|
0: {
|
|
name: "Color 0"
|
|
},
|
|
1: {
|
|
name: "Color 1"
|
|
},
|
|
2: {
|
|
name: "Color 2"
|
|
},
|
|
3: {
|
|
name: "Color 3"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "fastLength",
|
|
defval: 12,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}, {
|
|
id: "in_1",
|
|
name: "slowLength",
|
|
defval: 26,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}, {
|
|
id: "in_3",
|
|
name: "Source",
|
|
defval: "close",
|
|
type: "source",
|
|
options: ["open", "high", "low", "close", "hl2", "hlc3", "ohlc4"]
|
|
}, {
|
|
id: "in_2",
|
|
name: "signalLength",
|
|
defval: 9,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 50
|
|
}],
|
|
id: "Moving Average Convergence/Divergence@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "MACD",
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t) {
|
|
return e - t
|
|
}, this.f_1 = function(e) {
|
|
var t = e > 0 ? 1 : 3,
|
|
i = s.Std.change(this._context.new_var(e));
|
|
return t - (s.Std.le(i, 0) ? 0 : 1)
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = s.Std[this._input(2)](this._context),
|
|
r = this._input(0),
|
|
n = this._input(1),
|
|
o = this._input(3);
|
|
this._context.setMinimumAdditionalDepth(Math.max(r, n) + o);
|
|
var a = this._context.new_var(i),
|
|
l = s.Std.ema(a, r, this._context),
|
|
c = this._context.new_var(i),
|
|
h = s.Std.ema(c, n, this._context),
|
|
u = this.f_0(l, h),
|
|
d = this._context.new_var(u),
|
|
p = s.Std.ema(d, o, this._context),
|
|
_ = this.f_0(u, p);
|
|
return [_, u, p, this.f_1(_)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Moving Average Exponential",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
},
|
|
smoothedMA: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !1
|
|
}
|
|
},
|
|
inputs: {
|
|
length: 9,
|
|
source: "close",
|
|
offset: 0,
|
|
smoothingLine: "SMA",
|
|
smoothingLength: 9
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "smoothedMA",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
smoothedMA: {
|
|
title: "Smoothed MA",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Moving Average Exponential",
|
|
shortDescription: "EMA",
|
|
is_price_study: !0,
|
|
inputs: [{
|
|
id: "length",
|
|
name: "Length",
|
|
defval: 9,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e4
|
|
}, {
|
|
id: "source",
|
|
name: "Source",
|
|
defval: "close",
|
|
type: "source",
|
|
options: ["open", "high", "low", "close", "hl2", "hlc3", "ohlc4"]
|
|
}, {
|
|
id: "offset",
|
|
name: "Offset",
|
|
defval: 0,
|
|
type: "integer",
|
|
min: -1e4,
|
|
max: 1e4
|
|
}, {
|
|
id: "smoothingLine",
|
|
name: "Smoothing Line",
|
|
defval: "SMA",
|
|
type: "text",
|
|
options: ["SMA", "EMA", "WMA"]
|
|
}, {
|
|
id: "smoothingLength",
|
|
name: "Smoothing Length",
|
|
defval: 9,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e4
|
|
}],
|
|
id: "Moving Average Exponential@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Moving Average Exponential",
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = s.Std[this._input(1)](this._context),
|
|
r = this._input(0),
|
|
n = this._input(2),
|
|
o = this._input(3),
|
|
a = this._input(4);
|
|
this._context.setMinimumAdditionalDepth(r + a);
|
|
var l, c = this._context.new_var(i),
|
|
h = s.Std.ema(c, r, this._context),
|
|
u = this._context.new_var(h);
|
|
return "EMA" === o ? l = s.Std.ema(u, a, this._context) : "WMA" ===
|
|
o ? l = s.Std.wma(u, a, this._context) : "SMA" === o && (l = s
|
|
.Std.sma(u, a, this._context)), [{
|
|
value: h,
|
|
offset: n
|
|
}, {
|
|
value: l,
|
|
offset: n
|
|
}]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Moving Average Weighted",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 9,
|
|
in_1: "close",
|
|
in_2: 0
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Moving Average Weighted",
|
|
shortDescription: "WMA",
|
|
is_price_study: !0,
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "Length",
|
|
defval: 9,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}, {
|
|
id: "in_1",
|
|
name: "Source",
|
|
defval: "close",
|
|
type: "source",
|
|
options: ["open", "high", "low", "close", "hl2", "hlc3", "ohlc4"]
|
|
}, {
|
|
id: "in_2",
|
|
name: "Offset",
|
|
defval: 0,
|
|
type: "integer",
|
|
min: -1e4,
|
|
max: 1e4
|
|
}],
|
|
id: "Moving Average Weighted@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Moving Average Weighted",
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = s.Std[this._input(1)](this._context),
|
|
r = this._input(0),
|
|
n = this._input(2),
|
|
o = this._context.new_var(i);
|
|
return [{
|
|
value: s.Std.wma(o, r, this._context),
|
|
offset: n
|
|
}]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Moving Average Double",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
id: "Moving Average Double@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Moving Average Double",
|
|
description: "Moving Average Double",
|
|
shortDescription: "Moving Average Double",
|
|
is_price_study: !0,
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_1",
|
|
type: "line"
|
|
}],
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
visible: !0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
color: "#FF6D00"
|
|
},
|
|
plot_1: {
|
|
linestyle: 0,
|
|
visible: !0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
inputs: {
|
|
firstPeriods: 14,
|
|
secondPeriods: 21,
|
|
method: "Simple"
|
|
}
|
|
},
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot 1"
|
|
},
|
|
plot_1: {
|
|
title: "Plot 2"
|
|
}
|
|
},
|
|
inputs: [{
|
|
id: "firstPeriods",
|
|
name: "1st Period",
|
|
type: "integer",
|
|
defval: 14,
|
|
min: 1,
|
|
max: 1e4
|
|
}, {
|
|
id: "secondPeriods",
|
|
name: "2nd Period",
|
|
type: "integer",
|
|
defval: 21,
|
|
min: 1,
|
|
max: 1e4
|
|
}, {
|
|
id: "method",
|
|
name: "Method",
|
|
type: "text",
|
|
defval: "Simple",
|
|
options: ["Simple", "Exponential", "Weighted"]
|
|
}],
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i, r, n = this._context.new_var(s.Std.close(this._context));
|
|
return "Exponential" === this._input(2) ? (i = s.Std.ema(n, this
|
|
._input(0), this._context), r = s.Std.ema(n, this
|
|
._input(1), this._context)) : "Weighted" === this._input(
|
|
2) ? (i = s.Std.wma(n, this._input(0), this._context), r = s
|
|
.Std
|
|
.wma(n, this._input(1), this._context)) : (i = s.Std.sma(n,
|
|
this._input(0), this._context), r = s.Std.sma(n, this
|
|
._input(1), this._context)), [i, r]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Moving Average Triple",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
is_price_study: !0,
|
|
id: "Moving Average Triple@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Moving Average Triple",
|
|
description: "Moving Average Triple",
|
|
shortDescription: "Moving Average Triple",
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_1",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_2",
|
|
type: "line"
|
|
}],
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
visible: !0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
transparency: 0,
|
|
trackPrice: !1,
|
|
color: "#FF6D00"
|
|
},
|
|
plot_1: {
|
|
linestyle: 0,
|
|
visible: !0,
|
|
linewidth: 1,
|
|
transparency: 0,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
color: "#2196F3"
|
|
},
|
|
plot_2: {
|
|
linestyle: 0,
|
|
visible: !0,
|
|
linewidth: 1,
|
|
transparency: 0,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
color: "#26C6DA"
|
|
}
|
|
},
|
|
inputs: {
|
|
firstPeriods: 14,
|
|
secondPeriods: 21,
|
|
thirdPeriods: 35,
|
|
method: "Simple"
|
|
}
|
|
},
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot 1"
|
|
},
|
|
plot_1: {
|
|
title: "Plot 2"
|
|
},
|
|
plot_2: {
|
|
title: "Plot 3"
|
|
}
|
|
},
|
|
inputs: [{
|
|
id: "firstPeriods",
|
|
name: "1st Period",
|
|
type: "integer",
|
|
defval: 14,
|
|
min: 1,
|
|
max: 1e4
|
|
}, {
|
|
id: "secondPeriods",
|
|
name: "2nd Period",
|
|
type: "integer",
|
|
defval: 21,
|
|
min: 1,
|
|
max: 1e4
|
|
}, {
|
|
id: "thirdPeriods",
|
|
name: "3rd Period",
|
|
type: "integer",
|
|
defval: 35,
|
|
min: 1,
|
|
max: 1e4
|
|
}, {
|
|
id: "method",
|
|
name: "Method",
|
|
type: "text",
|
|
defval: "Simple",
|
|
options: ["Simple", "Exponential", "Weighted"]
|
|
}],
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i, r, n, o = this._context.new_var(s.Std.close(this._context));
|
|
return "Exponential" === this._input(3) ? (i = s.Std.ema(o, this
|
|
._input(0), this._context), r = s.Std.ema(o, this
|
|
._input(1), this._context), n = s.Std.ema(o, this
|
|
._input(2), this._context)) : "Weighted" === this._input(
|
|
3) ? (i = s.Std.wma(o, this._input(0), this._context), r = s
|
|
.Std
|
|
.wma(o, this._input(1), this._context), n = s.Std.wma(o,
|
|
this._input(2), this._context)) : (i = s.Std.sma(o, this
|
|
._input(0), this._context), r = s.Std.sma(o, this
|
|
._input(1), this._context), n = s.Std.sma(o, this
|
|
._input(2), this._context)), [i, r, n]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Moving Average Adaptive",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
is_price_study: !0,
|
|
id: "Moving Average Adaptive@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Moving Average Adaptive",
|
|
description: "Moving Average Adaptive",
|
|
shortDescription: "Moving Average Adaptive",
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
visible: !0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
transparency: 0,
|
|
trackPrice: !1,
|
|
color: "#AB47BC"
|
|
}
|
|
},
|
|
inputs: {
|
|
periods: 10
|
|
}
|
|
},
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot 1"
|
|
}
|
|
},
|
|
inputs: [{
|
|
id: "periods",
|
|
name: "Period",
|
|
type: "integer",
|
|
defval: 10,
|
|
min: 1,
|
|
max: 1e4
|
|
}],
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.init = function(e, t) {
|
|
this._context = e, this._input = t, this.periods = this._input(0)
|
|
}, this.ama = function(e, t) {
|
|
var i = this.periods,
|
|
r = this._context.new_var(),
|
|
n = e.get(),
|
|
o = s.Std.stdev(t, i, this._context),
|
|
a = s.Std.log(n / e.get(i)) / (o * Math.sqrt(i)),
|
|
l = .1 * Math.abs(a),
|
|
c = (n - r.get(1)) * l + r.get(1);
|
|
return r.set(isNaN(c) ? n : c), c
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._context.new_var(s.Std.close(this._context)),
|
|
r = this._context.new_var(s.Std.log(i.get() / i.get(1)));
|
|
return [this.ama(i, r)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Moving Average Hamming",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
is_price_study: !0,
|
|
id: "Moving Average Hamming@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Moving Average Hamming",
|
|
description: "Moving Average Hamming",
|
|
shortDescription: "Moving Average Hamming",
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
visible: !0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
transparency: 0,
|
|
trackPrice: !1,
|
|
color: "#4CAF50"
|
|
}
|
|
},
|
|
inputs: {
|
|
periods: 10
|
|
}
|
|
},
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot 1"
|
|
}
|
|
},
|
|
inputs: [{
|
|
id: "periods",
|
|
name: "Period",
|
|
type: "integer",
|
|
defval: 10,
|
|
min: 1,
|
|
max: 1e4
|
|
}],
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.init = function(e, t) {
|
|
this._context = e, this._input = t, this.periods = this._input(0);
|
|
for (var i = [], s = 0, r = 1; r <= this.periods; ++r) {
|
|
var n = Math.sin((1 + r) / this.periods * Math.PI / 2);
|
|
i.unshift(n), s += n
|
|
}
|
|
this.hmaFactors = i, this.hmaFactorsSum = s
|
|
}, this.hma = function(e) {
|
|
for (var t = this.periods, i = 0, s = 0; s < t; ++s) i += e.get(t -
|
|
s - 1) * this.hmaFactors[s];
|
|
return i /= this.hmaFactorsSum
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._context.new_var(s.Std.close(this._context));
|
|
return [this.hma(i)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Moving Average Multiple",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
is_price_study: !0,
|
|
id: "Moving Average Multiple@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Moving Average Multiple",
|
|
description: "Moving Average Multiple",
|
|
shortDescription: "Moving Average Multiple",
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_1",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_2",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_3",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_4",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_5",
|
|
type: "line"
|
|
}],
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
visible: !0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
transparency: 0,
|
|
trackPrice: !1,
|
|
color: "#9C27B0"
|
|
},
|
|
plot_1: {
|
|
linestyle: 0,
|
|
visible: !0,
|
|
linewidth: 1,
|
|
transparency: 0,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
color: "#FF6D00"
|
|
},
|
|
plot_2: {
|
|
linestyle: 0,
|
|
visible: !0,
|
|
linewidth: 1,
|
|
transparency: 0,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
color: "#43A047"
|
|
},
|
|
plot_3: {
|
|
linestyle: 0,
|
|
visible: !0,
|
|
linewidth: 1,
|
|
transparency: 0,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
color: "#26C6DA"
|
|
},
|
|
plot_4: {
|
|
linestyle: 0,
|
|
visible: !0,
|
|
linewidth: 1,
|
|
transparency: 0,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
color: "#F50057"
|
|
},
|
|
plot_5: {
|
|
linestyle: 0,
|
|
visible: !0,
|
|
linewidth: 1,
|
|
transparency: 0,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
inputs: {
|
|
firstPeriods: 14,
|
|
secondPeriods: 21,
|
|
thirdPeriods: 35,
|
|
fourthPeriods: 50,
|
|
fifthPeriods: 100,
|
|
sixthPeriods: 200,
|
|
method: "Simple"
|
|
}
|
|
},
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot 1"
|
|
},
|
|
plot_1: {
|
|
title: "Plot 2"
|
|
},
|
|
plot_2: {
|
|
title: "Plot 3"
|
|
},
|
|
plot_3: {
|
|
title: "Plot 4"
|
|
},
|
|
plot_4: {
|
|
title: "Plot 5"
|
|
},
|
|
plot_5: {
|
|
title: "Plot 6"
|
|
}
|
|
},
|
|
inputs: [{
|
|
id: "firstPeriods",
|
|
name: "1st Period",
|
|
type: "integer",
|
|
defval: 14,
|
|
min: 1,
|
|
max: 1e4
|
|
}, {
|
|
id: "secondPeriods",
|
|
name: "2nd Period",
|
|
type: "integer",
|
|
defval: 21,
|
|
min: 1,
|
|
max: 1e4
|
|
}, {
|
|
id: "thirdPeriods",
|
|
name: "3rd Period",
|
|
type: "integer",
|
|
defval: 35,
|
|
min: 1,
|
|
max: 1e4
|
|
}, {
|
|
id: "fourthPeriods",
|
|
name: "4th Period",
|
|
type: "integer",
|
|
defval: 50,
|
|
min: 1,
|
|
max: 1e4
|
|
}, {
|
|
id: "fifthPeriods",
|
|
name: "5th Period",
|
|
type: "integer",
|
|
defval: 100,
|
|
min: 1,
|
|
max: 1e4
|
|
}, {
|
|
id: "sixthPeriods",
|
|
name: "6th Period",
|
|
type: "integer",
|
|
defval: 200,
|
|
min: 1,
|
|
max: 1e4
|
|
}, {
|
|
id: "method",
|
|
name: "Method",
|
|
type: "text",
|
|
defval: "Simple",
|
|
options: ["Simple", "Exponential", "Weighted"]
|
|
}],
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i, r, n, o, a, l, c = this._context.new_var(s.Std.close(this
|
|
._context));
|
|
return "Exponential" === this._input(6) ? (i = s.Std.ema(c, this
|
|
._input(0), this._context), r = s.Std.ema(c, this
|
|
._input(1), this._context), n = s.Std.ema(c, this
|
|
._input(2), this._context), o = s.Std.ema(c, this
|
|
._input(3), this._context), a = s.Std.ema(c, this
|
|
._input(4), this._context), l = s.Std.ema(c, this
|
|
._input(5), this._context)) : "Weighted" === this._input(
|
|
6) ? (i = s.Std.wma(c, this._input(0), this._context), r = s
|
|
.Std
|
|
.wma(c, this._input(1), this._context), n = s.Std.wma(c,
|
|
this._input(2), this._context), o = s.Std.wma(c, this
|
|
._input(3), this._context), a = s.Std.wma(c, this
|
|
._input(4), this._context), l = s.Std.wma(c, this
|
|
._input(5), this._context)) : (i = s.Std.sma(c, this
|
|
._input(0), this._context), r = s.Std.sma(c, this
|
|
._input(1), this._context), n = s.Std.sma(c, this
|
|
._input(2), this._context), o = s.Std.sma(c, this
|
|
._input(3), this._context), a = s.Std.sma(c, this
|
|
._input(4), this._context), l = s.Std.sma(c, this
|
|
._input(5), this._context)), [i, r, n, o, a, l]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Majority Rule",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
is_price_study: !1,
|
|
id: "Majority Rule@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Majority Rule",
|
|
description: "Majority Rule",
|
|
shortDescription: "Majority Rule",
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
visible: !0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
color: "#FF5252"
|
|
}
|
|
},
|
|
inputs: {
|
|
rollingPeriod: 14
|
|
}
|
|
},
|
|
styles: {
|
|
plot_0: {
|
|
title: "Majority Rule"
|
|
}
|
|
},
|
|
inputs: [{
|
|
id: "rollingPeriod",
|
|
type: "integer",
|
|
name: "Rolling Period"
|
|
}],
|
|
format: {
|
|
precision: 2,
|
|
type: "price"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.init = function(e, t) {
|
|
this._context = e, this._input = t, this.rollingPeriod = this
|
|
._input(0)
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i, r = s.Std.close(this._context);
|
|
return i = r > this._context.new_var(r).get(1) ? 1 : 0, [100 * s.Std
|
|
.sma(this._context.new_var(i), this.rollingPeriod, this
|
|
._context)
|
|
]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Net Volume",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
inputs: {}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Net Volume",
|
|
shortDescription: "Net Volume",
|
|
is_price_study: !1,
|
|
inputs: [],
|
|
id: "Net Volume@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Net Volume",
|
|
format: {
|
|
type: "volume"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t, i) {
|
|
return s.Std.gt(e, 0) ? t : s.Std.lt(i, 0) ? -t : 0 * t
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = s.Std.close(this._context),
|
|
r = this._context.new_var(i),
|
|
n = s.Std.change(r);
|
|
return [this.f_0(n, s.Std.volume(this._context), n)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "On Balance Volume",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
},
|
|
smoothedMA: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !1
|
|
}
|
|
},
|
|
inputs: {
|
|
smoothingLine: "SMA",
|
|
smoothingLength: 9
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "smoothedMA",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
smoothedMA: {
|
|
title: "Smoothed MA",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "On Balance Volume",
|
|
shortDescription: "OBV",
|
|
is_price_study: !1,
|
|
inputs: [{
|
|
id: "smoothingLine",
|
|
name: "Smoothing Line",
|
|
defval: "SMA",
|
|
type: "text",
|
|
options: ["SMA", "EMA", "WMA"]
|
|
}, {
|
|
id: "smoothingLength",
|
|
name: "Smoothing Length",
|
|
defval: 9,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e4
|
|
}],
|
|
id: "On Balance Volume@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "On Balance Volume",
|
|
format: {
|
|
type: "volume"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t, i) {
|
|
return s.Std.gt(e, 0) ? t : s.Std.lt(i, 0) ? -t : 0 * t
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0),
|
|
r = this._input(1),
|
|
n = s.Std.close(this._context),
|
|
o = this._context.new_var(n),
|
|
a = s.Std.change(o),
|
|
l = this.f_0(a, s.Std.volume(this._context), a),
|
|
c = s.Std.cum(l, this._context);
|
|
this._context.setMinimumAdditionalDepth(r);
|
|
var h, u = this._context.new_var(c);
|
|
return "EMA" === i ? h = s.Std.ema(u, r, this._context) : "WMA" ===
|
|
i ? h = s.Std.wma(u, r, this._context) : "SMA" === i && (h = s
|
|
.Std.sma(u, r, this._context)), [c, h]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Parabolic SAR",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 3,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: .02,
|
|
in_1: .02,
|
|
in_2: .2
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Parabolic SAR",
|
|
shortDescription: "SAR",
|
|
is_price_study: !0,
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "start",
|
|
defval: .02,
|
|
type: "float",
|
|
min: -1e12,
|
|
max: 1e12
|
|
}, {
|
|
id: "in_1",
|
|
name: "increment",
|
|
defval: .02,
|
|
type: "float",
|
|
min: -1e12,
|
|
max: 1e12
|
|
}, {
|
|
id: "in_2",
|
|
name: "maximum",
|
|
defval: .2,
|
|
type: "float",
|
|
min: -1e12,
|
|
max: 1e12
|
|
}],
|
|
id: "Parabolic SAR@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Parabolic SAR",
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0),
|
|
r = this._input(1),
|
|
n = this._input(2);
|
|
return [s.Std.sar(i, r, n, this._context)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Price Channel",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#F50057"
|
|
},
|
|
plot_1: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#F50057"
|
|
},
|
|
plot_2: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 20,
|
|
in_1: 0
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_1",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_2",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Highprice Line",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
plot_1: {
|
|
title: "Lowprice Line",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
plot_2: {
|
|
title: "Centerprice Line",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Price Channel",
|
|
shortDescription: "PC",
|
|
is_price_study: !0,
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "Length",
|
|
defval: 20,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}, {
|
|
id: "in_1",
|
|
name: "Offset Length",
|
|
defval: 0,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}],
|
|
id: "Price Channel@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Price Channel",
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = s.Std.high(this._context),
|
|
r = this._context.new_var(i),
|
|
n = s.Std.low(this._context),
|
|
o = this._context.new_var(n),
|
|
a = this._input(0),
|
|
l = this._input(1),
|
|
c = s.Std.highest(r, a, this._context),
|
|
h = s.Std.lowest(o, a, this._context);
|
|
return [{
|
|
value: c,
|
|
offset: l
|
|
}, {
|
|
value: h,
|
|
offset: l
|
|
}, {
|
|
value: s.Std.avg(c, h),
|
|
offset: l
|
|
}]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Price Oscillator",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#009688"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 10,
|
|
in_1: 21
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Price Oscillator",
|
|
shortDescription: "PPO",
|
|
is_price_study: !1,
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "shortlen",
|
|
defval: 10,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}, {
|
|
id: "in_1",
|
|
name: "longlen",
|
|
defval: 21,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}],
|
|
id: "Price Oscillator@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Price Oscillator",
|
|
format: {
|
|
type: "price",
|
|
precision: 2
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t) {
|
|
return (e - t) / t * 100
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = s.Std.close(this._context),
|
|
r = this._input(0),
|
|
n = this._input(1),
|
|
o = this._context.new_var(i),
|
|
a = s.Std.sma(o, r, this._context),
|
|
l = this._context.new_var(i),
|
|
c = s.Std.sma(l, n, this._context);
|
|
return [this.f_0(a, c)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Price Volume Trend",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
inputs: {}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "PVT",
|
|
histogramBase: 0,
|
|
joinPoints: !1,
|
|
isHidden: !1
|
|
}
|
|
},
|
|
description: "Price Volume Trend",
|
|
shortDescription: "PVT",
|
|
is_price_study: !1,
|
|
is_hidden_study: !1,
|
|
id: "price_volume_trend@tv-basicstudies-1",
|
|
inputs: [],
|
|
scriptIdPart: "",
|
|
name: "Price Volume Trend",
|
|
format: {
|
|
type: "volume"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function() {
|
|
var e = this._context.new_var(s.Std.close(this._context));
|
|
return [s.Std.cum(s.Std.change(e) / e.get(1) * s.Std.volume(this
|
|
._context), this._context)]
|
|
}, this.main = function(e, t) {
|
|
return this._context = e, this._input = t, [this.f_0()[0]]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Rate Of Change",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
bands: [{
|
|
color: "#787B86",
|
|
linestyle: 2,
|
|
linewidth: 1,
|
|
visible: !0,
|
|
value: 0
|
|
}],
|
|
inputs: {
|
|
in_0: 9
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "ROC",
|
|
histogramBase: 0,
|
|
joinPoints: !1,
|
|
isHidden: !1
|
|
}
|
|
},
|
|
description: "Rate Of Change",
|
|
shortDescription: "ROC",
|
|
is_price_study: !1,
|
|
bands: [{
|
|
id: "hline_0",
|
|
name: "Zero Line",
|
|
isHidden: !1
|
|
}],
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "length",
|
|
defval: 9,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e12
|
|
}],
|
|
id: "rate_of_change@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Rate Of Change",
|
|
format: {
|
|
precision: 2,
|
|
type: "price"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._context.new_var(s.Std.close(this._context)),
|
|
r = this._input(0);
|
|
return [100 * (i.get(0) - i.get(r)) / i.get(r)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Relative Strength Index",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#7E57C2"
|
|
},
|
|
smoothedMA: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !1
|
|
}
|
|
},
|
|
bands: [{
|
|
color: "#787B86",
|
|
linestyle: 2,
|
|
linewidth: 1,
|
|
visible: !0,
|
|
value: 70
|
|
}, {
|
|
color: "#787B86",
|
|
linestyle: 2,
|
|
linewidth: 1,
|
|
visible: !0,
|
|
value: 30
|
|
}],
|
|
filledAreasStyle: {
|
|
fill_0: {
|
|
color: "#7E57C2",
|
|
transparency: 90,
|
|
visible: !0
|
|
}
|
|
},
|
|
inputs: {
|
|
length: 14,
|
|
smoothingLine: "SMA",
|
|
smoothingLength: 14
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "smoothedMA",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
smoothedMA: {
|
|
title: "Smoothed MA",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Relative Strength Index",
|
|
shortDescription: "RSI",
|
|
is_price_study: !1,
|
|
bands: [{
|
|
id: "hline_0",
|
|
name: "UpperLimit"
|
|
}, {
|
|
id: "hline_1",
|
|
name: "LowerLimit"
|
|
}],
|
|
filledAreas: [{
|
|
id: "fill_0",
|
|
objAId: "hline_0",
|
|
objBId: "hline_1",
|
|
type: "hline_hline",
|
|
title: "Hlines Background"
|
|
}],
|
|
inputs: [{
|
|
id: "length",
|
|
name: "Length",
|
|
defval: 14,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}, {
|
|
id: "smoothingLine",
|
|
name: "Smoothing Line",
|
|
defval: "SMA",
|
|
type: "text",
|
|
options: ["SMA", "EMA", "WMA"]
|
|
}, {
|
|
id: "smoothingLength",
|
|
name: "Smoothing Length",
|
|
defval: 14,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e4
|
|
}],
|
|
id: "Relative Strength Index@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Relative Strength Index",
|
|
format: {
|
|
precision: 2,
|
|
type: "price"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e) {
|
|
return s.Std.max(e, 0)
|
|
}, this.f_1 = function(e) {
|
|
return -s.Std.min(e, 0)
|
|
}, this.f_2 = function(e, t) {
|
|
return s.Std.eq(e, 0) ? 100 : s.Std.eq(t, 0) ? 0 : 100 - 100 / (1 +
|
|
t / e)
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = s.Std.close(this._context),
|
|
r = this._input(0),
|
|
n = this._input(1),
|
|
o = this._input(2);
|
|
this._context.setMinimumAdditionalDepth(r + o);
|
|
var a, l = this._context.new_var(i),
|
|
c = s.Std.change(l),
|
|
h = this.f_0(c),
|
|
u = this._context.new_var(h),
|
|
d = s.Std.rma(u, r, this._context),
|
|
p = this.f_1(c),
|
|
_ = this._context.new_var(p),
|
|
m = s.Std.rma(_, r, this._context),
|
|
f = this.f_2(m, d),
|
|
g = this._context.new_var(f);
|
|
return "EMA" === n ? a = s.Std.ema(g, o, this._context) : "WMA" ===
|
|
n ? a = s.Std.wma(g, o, this._context) : "SMA" === n && (a = s
|
|
.Std.sma(g, o, this._context)), [{
|
|
value: f
|
|
}, {
|
|
value: a
|
|
}]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Relative Vigor Index",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#009688"
|
|
},
|
|
plot_1: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#F44336"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 10
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_1",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "RVGI",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
plot_1: {
|
|
title: "Signal",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Relative Vigor Index",
|
|
shortDescription: "RVGI",
|
|
is_price_study: !1,
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "Length",
|
|
defval: 10,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}],
|
|
id: "Relative Vigor Index@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Relative Vigor Index",
|
|
format: {
|
|
precision: 4,
|
|
type: "price"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t) {
|
|
return e - t
|
|
}, this.f_1 = function(e, t) {
|
|
return e / t
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0),
|
|
r = this.f_0(s.Std.close(this._context), s.Std.open(this
|
|
._context)),
|
|
n = this._context.new_var(r),
|
|
o = s.Std.swma(n, this._context),
|
|
a = this._context.new_var(o),
|
|
l = s.Std.sum(a, i, this._context),
|
|
c = this.f_0(s.Std.high(this._context), s.Std.low(this
|
|
._context)),
|
|
h = this._context.new_var(c),
|
|
u = s.Std.swma(h, this._context),
|
|
d = this._context.new_var(u),
|
|
p = s.Std.sum(d, i, this._context),
|
|
_ = this.f_1(l, p),
|
|
m = this._context.new_var(_);
|
|
return [_, s.Std.swma(m, this._context)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Relative Volatility Index",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#7E57C2"
|
|
}
|
|
},
|
|
bands: [{
|
|
color: "#787B86",
|
|
linestyle: 2,
|
|
linewidth: 1,
|
|
visible: !0,
|
|
value: 80
|
|
}, {
|
|
color: "#787B86",
|
|
linestyle: 2,
|
|
linewidth: 1,
|
|
visible: !0,
|
|
value: 20
|
|
}],
|
|
filledAreasStyle: {
|
|
fill_0: {
|
|
color: "#7E57C2",
|
|
transparency: 90,
|
|
visible: !0
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 10
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Relative Volatility Index",
|
|
shortDescription: "RVI",
|
|
is_price_study: !1,
|
|
bands: [{
|
|
id: "hline_0",
|
|
name: "UpperLimit"
|
|
}, {
|
|
id: "hline_1",
|
|
name: "LowerLimit"
|
|
}],
|
|
filledAreas: [{
|
|
id: "fill_0",
|
|
objAId: "hline_0",
|
|
objBId: "hline_1",
|
|
type: "hline_hline",
|
|
title: "Hlines Background"
|
|
}],
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "length",
|
|
defval: 10,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}],
|
|
id: "Relative Volatility Index@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Relative Volatility Index",
|
|
format: {
|
|
precision: 2,
|
|
type: "price"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t) {
|
|
return s.Std.le(e, 0) ? 0 : t
|
|
}, this.f_1 = function(e, t) {
|
|
return s.Std.gt(e, 0) ? 0 : t
|
|
}, this.f_2 = function(e, t) {
|
|
return e / (e + t) * 100
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0);
|
|
this._context.setMinimumAdditionalDepth(i + 12);
|
|
var r = s.Std.close(this._context),
|
|
n = this._context.new_var(r),
|
|
o = s.Std.stdev(n, i, this._context),
|
|
a = this._context.new_var(r),
|
|
l = s.Std.change(a),
|
|
c = this.f_0(l, o),
|
|
h = this._context.new_var(c),
|
|
u = s.Std.ema(h, 14, this._context),
|
|
d = this.f_1(l, o),
|
|
p = this._context.new_var(d),
|
|
_ = s.Std.ema(p, 14, this._context);
|
|
return [this.f_2(u, _)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "SMI Ergodic Indicator/Oscillator",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
},
|
|
plot_1: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#FF6D00"
|
|
},
|
|
plot_2: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 1,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#FF5252"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 5,
|
|
in_1: 20,
|
|
in_2: 5
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_1",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_2",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Indicator",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
plot_1: {
|
|
title: "Signal",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
plot_2: {
|
|
title: "Oscillator",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "SMI Ergodic Indicator/Oscillator",
|
|
shortDescription: "SMIIO",
|
|
is_price_study: !1,
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "shortlen",
|
|
defval: 5,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}, {
|
|
id: "in_1",
|
|
name: "longlen",
|
|
defval: 20,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}, {
|
|
id: "in_2",
|
|
name: "siglen",
|
|
defval: 5,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}],
|
|
id: "SMI Ergodic Indicator/Oscillator@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "SMI Ergodic Indicator/Oscillator",
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t) {
|
|
return e - t
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0),
|
|
r = this._input(1),
|
|
n = this._input(2);
|
|
this._context.setMinimumAdditionalDepth(i + r + n);
|
|
var o = s.Std.close(this._context),
|
|
a = this._context.new_var(o),
|
|
l = s.Std.tsi(a, i, r, this._context),
|
|
c = this._context.new_var(l),
|
|
h = s.Std.ema(c, n, this._context);
|
|
return [l, h, this.f_0(l, h)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Smoothed Moving Average",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#673AB7"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 7,
|
|
in_1: "close"
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1,
|
|
isHidden: !1
|
|
}
|
|
},
|
|
description: "Smoothed Moving Average",
|
|
shortDescription: "SMMA",
|
|
is_price_study: !0,
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "Length",
|
|
defval: 7,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e12
|
|
}, {
|
|
id: "in_1",
|
|
name: "Source",
|
|
defval: "close",
|
|
type: "source",
|
|
options: ["open", "high", "low", "close", "hl2", "hlc3", "ohlc4"]
|
|
}],
|
|
id: "smoothed_moving_average@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Smoothed Moving Average",
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function() {
|
|
var e = this._input(0),
|
|
t = s.Std[this._input(1)](this._context);
|
|
return [s.Std.smma(t, e, this._context)]
|
|
}, this.main = function(e, t) {
|
|
return this._context = e, this._input = t, this.f_0()
|
|
}
|
|
}
|
|
}, {
|
|
name: "Standard Deviation",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
id: "Standard Deviation@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Standard Deviation",
|
|
description: "Standard Deviation",
|
|
shortDescription: "Standard Deviation",
|
|
is_price_study: !1,
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
visible: !0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
color: "#009688"
|
|
}
|
|
},
|
|
inputs: {
|
|
periods: 5,
|
|
deviations: 1
|
|
}
|
|
},
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot"
|
|
}
|
|
},
|
|
inputs: [{
|
|
id: "periods",
|
|
name: "Periods",
|
|
type: "integer"
|
|
}, {
|
|
id: "deviations",
|
|
name: "Deviations",
|
|
type: "float"
|
|
}],
|
|
format: {
|
|
precision: 2,
|
|
type: "price"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0),
|
|
r = this._input(1),
|
|
n = this._context.new_var(s.Std.close(this._context));
|
|
return [s.Std.stdev(n, i, this._context) * r]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Stochastic",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
},
|
|
plot_1: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#FF6D00"
|
|
}
|
|
},
|
|
bands: [{
|
|
color: "#787B86",
|
|
linestyle: 2,
|
|
linewidth: 1,
|
|
visible: !0,
|
|
value: 80
|
|
}, {
|
|
color: "#787B86",
|
|
linestyle: 2,
|
|
linewidth: 1,
|
|
visible: !0,
|
|
value: 20
|
|
}],
|
|
filledAreasStyle: {
|
|
fill_0: {
|
|
color: "#2196F3",
|
|
transparency: 90,
|
|
visible: !0
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 14,
|
|
in_1: 1,
|
|
in_2: 3
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_1",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "%K",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
plot_1: {
|
|
title: "%D",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Stochastic",
|
|
shortDescription: "Stoch",
|
|
is_price_study: !1,
|
|
bands: [{
|
|
id: "hline_0",
|
|
name: "UpperLimit"
|
|
}, {
|
|
id: "hline_1",
|
|
name: "LowerLimit"
|
|
}],
|
|
filledAreas: [{
|
|
id: "fill_0",
|
|
objAId: "hline_0",
|
|
objBId: "hline_1",
|
|
type: "hline_hline",
|
|
title: "Hlines Background"
|
|
}],
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "K",
|
|
defval: 14,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e4
|
|
}, {
|
|
id: "in_1",
|
|
name: "D",
|
|
defval: 1,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e4
|
|
}, {
|
|
id: "in_2",
|
|
name: "smooth",
|
|
defval: 3,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e4
|
|
}],
|
|
id: "Stochastic@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Stochastic",
|
|
format: {
|
|
precision: 2,
|
|
type: "price"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0),
|
|
r = this._input(1),
|
|
n = this._input(2);
|
|
this._context.setMinimumAdditionalDepth(i + r + n);
|
|
var o = s.Std.close(this._context),
|
|
a = s.Std.high(this._context),
|
|
l = s.Std.low(this._context),
|
|
c = this._context.new_var(o),
|
|
h = this._context.new_var(a),
|
|
u = this._context.new_var(l),
|
|
d = s.Std.stoch(c, h, u, i, this._context),
|
|
p = this._context.new_var(d),
|
|
_ = s.Std.sma(p, r, this._context),
|
|
m = this._context.new_var(_);
|
|
return [_, s.Std.sma(m, n, this._context)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Stochastic RSI",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
},
|
|
plot_1: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#FF6D00"
|
|
}
|
|
},
|
|
bands: [{
|
|
color: "#787B86",
|
|
linestyle: 2,
|
|
linewidth: 1,
|
|
visible: !0,
|
|
value: 80
|
|
}, {
|
|
color: "#787B86",
|
|
linestyle: 2,
|
|
linewidth: 1,
|
|
visible: !0,
|
|
value: 20
|
|
}],
|
|
filledAreasStyle: {
|
|
fill_0: {
|
|
color: "#2196F3",
|
|
transparency: 90,
|
|
visible: !0
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 14,
|
|
in_1: 14,
|
|
in_2: 3,
|
|
in_3: 3
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_1",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "%K",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
plot_1: {
|
|
title: "%D",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Stochastic RSI",
|
|
shortDescription: "Stoch RSI",
|
|
is_price_study: !1,
|
|
bands: [{
|
|
id: "hline_0",
|
|
name: "UpperLimit"
|
|
}, {
|
|
id: "hline_1",
|
|
name: "LowerLimit"
|
|
}],
|
|
filledAreas: [{
|
|
id: "fill_0",
|
|
objAId: "hline_0",
|
|
objBId: "hline_1",
|
|
type: "hline_hline",
|
|
title: "Hlines Background"
|
|
}],
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "lengthRSI",
|
|
defval: 14,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e4
|
|
}, {
|
|
id: "in_1",
|
|
name: "lengthStoch",
|
|
defval: 14,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e4
|
|
}, {
|
|
id: "in_2",
|
|
name: "smoothK",
|
|
defval: 3,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e4
|
|
}, {
|
|
id: "in_3",
|
|
name: "smoothD",
|
|
defval: 3,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e4
|
|
}],
|
|
id: "Stochastic RSI@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Stochastic RSI",
|
|
format: {
|
|
precision: 2,
|
|
type: "price"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_1 = function(e, t, i) {
|
|
var r = i.new_var(s.Std.max(s.Std.change(e), 0));
|
|
return s.Std.rma(r, t, i)
|
|
}, this.f_2 = function(e, t, i) {
|
|
var r = i.new_var(-s.Std.min(s.Std.change(e), 0));
|
|
return s.Std.rma(r, t, i)
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = s.Std.close(this._context),
|
|
r = this._input(0),
|
|
n = this._input(1),
|
|
o = this._input(2),
|
|
a = this._input(3);
|
|
e.setMinimumAdditionalDepth(r + n + o + a);
|
|
var l = this._context.new_var(i),
|
|
c = s.Std.rsi(this.f_1(l, r, this._context), this.f_2(l, r, this
|
|
._context)),
|
|
h = this._context.new_var(c),
|
|
u = this._context.new_var(c),
|
|
d = this._context.new_var(c),
|
|
p = s.Std.stoch(h, u, d, n, this._context),
|
|
_ = this._context.new_var(p),
|
|
m = s.Std.sma(_, o, this._context),
|
|
f = this._context.new_var(m);
|
|
return [m, s.Std.sma(f, a, this._context)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "TRIX",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#F44336"
|
|
}
|
|
},
|
|
bands: [{
|
|
color: "#787B86",
|
|
linestyle: 2,
|
|
linewidth: 1,
|
|
visible: !0,
|
|
value: 0
|
|
}],
|
|
inputs: {
|
|
in_0: 18
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "TRIX",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "TRIX",
|
|
shortDescription: "TRIX",
|
|
is_price_study: !1,
|
|
bands: [{
|
|
id: "hline_0",
|
|
name: "Zero"
|
|
}],
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "length",
|
|
defval: 18,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}],
|
|
id: "TRIX@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "TRIX",
|
|
format: {
|
|
precision: 2,
|
|
type: "price"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e) {
|
|
return s.Std.log(e)
|
|
}, this.f_1 = function(e) {
|
|
return 1e4 * e
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0);
|
|
e.setMinimumAdditionalDepth(3 * i);
|
|
var r = this.f_0(s.Std.close(this._context)),
|
|
n = this._context.new_var(r),
|
|
o = s.Std.ema(n, i, this._context),
|
|
a = this._context.new_var(o),
|
|
l = s.Std.ema(a, i, this._context),
|
|
c = this._context.new_var(l),
|
|
h = s.Std.ema(c, i, this._context),
|
|
u = this._context.new_var(h),
|
|
d = s.Std.change(u);
|
|
return [this.f_1(d)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Triple EMA",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 9
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Triple EMA",
|
|
shortDescription: "TEMA",
|
|
is_price_study: !0,
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "length",
|
|
defval: 9,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e4
|
|
}],
|
|
id: "Triple EMA@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Triple EMA",
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t, i) {
|
|
return 3 * (e - t) + i
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0);
|
|
this._context.setMinimumAdditionalDepth(3 * i);
|
|
var r = s.Std.close(this._context),
|
|
n = this._context.new_var(r),
|
|
o = s.Std.ema(n, i, this._context),
|
|
a = this._context.new_var(o),
|
|
l = s.Std.ema(a, i, this._context),
|
|
c = this._context.new_var(l),
|
|
h = s.Std.ema(c, i, this._context);
|
|
return [this.f_0(o, l, h)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "True Strength Indicator",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
},
|
|
plot_1: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#E91E63"
|
|
}
|
|
},
|
|
bands: [{
|
|
color: "#787B86",
|
|
linestyle: 2,
|
|
linewidth: 1,
|
|
visible: !0,
|
|
value: 0
|
|
}],
|
|
inputs: {
|
|
in_0: 25,
|
|
in_1: 13,
|
|
in_2: 13
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_1",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
plot_1: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "True Strength Indicator",
|
|
shortDescription: "True Strength Indicator",
|
|
is_price_study: !1,
|
|
bands: [{
|
|
id: "hline_0",
|
|
name: "Zero"
|
|
}],
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "long",
|
|
defval: 25,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 4999
|
|
}, {
|
|
id: "in_1",
|
|
name: "short",
|
|
defval: 13,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 4999
|
|
}, {
|
|
id: "in_2",
|
|
name: "siglen",
|
|
defval: 13,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 4999
|
|
}],
|
|
id: "True Strength Indicator@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "True Strength Indicator",
|
|
format: {
|
|
precision: 4,
|
|
type: "price"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0),
|
|
r = this._input(1),
|
|
n = this._input(2);
|
|
this._context.setMinimumAdditionalDepth(this._input(0) + this
|
|
._input(1) + this._input(2));
|
|
var o = s.Std.close(this._context),
|
|
a = this._context.new_var(o),
|
|
l = s.Std.tsi(a, r, i, this._context),
|
|
c = this._context.new_var(l);
|
|
return [l, s.Std.ema(c, n, this._context)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Trend Strength Index",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
is_price_study: !1,
|
|
id: "Trend Strength Index@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Trend Strength Index",
|
|
description: "Trend Strength Index",
|
|
shortDescription: "Trend Strength Index",
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
visible: !0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
color: "#FF5252"
|
|
}
|
|
},
|
|
inputs: {
|
|
periods: 14
|
|
}
|
|
},
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot"
|
|
}
|
|
},
|
|
inputs: [{
|
|
id: "periods",
|
|
type: "integer",
|
|
name: "Periods"
|
|
}],
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.init = function(e, t) {
|
|
this._context = e, this._input = t, this.period = this._input(0),
|
|
this.invertedPeriod = 1 / this.period, this.sumX = (this
|
|
.period - 1) * this.period / 2, this.sumXX = (this.period -
|
|
1) * this.period * (2 * this.period - 1) / 6, this
|
|
.invertedPeriodSumXSumX = this.invertedPeriod * this.sumX * this
|
|
.sumX
|
|
}, this.trendStrengthIndex = function() {
|
|
for (var e = this._context.new_var(s.Std.close(this._context)), t =
|
|
s.Std.sum(e, this.period, this._context), i = 0, r = 0, n =
|
|
0; n < this.period; n++) {
|
|
var o = e.get(n);
|
|
r += (this.period - 1 - n) * o, i += o * o
|
|
}
|
|
var a = r - this.invertedPeriod * this.sumX * t,
|
|
l = (this.sumXX - this.invertedPeriodSumXSumX) * (i - this
|
|
.invertedPeriod * t * t);
|
|
return l < 0 ? 0 == a ? 0 : a > 0 ? 1 : -1 : a / (l = Math.sqrt(l))
|
|
}, this.main = function(e, t) {
|
|
return this._context = e, this._input = t, [this
|
|
.trendStrengthIndex()
|
|
]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Typical Price",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
id: "TypicalPrice@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Typical Price",
|
|
description: "Typical Price",
|
|
shortDescription: "Typical Price",
|
|
is_price_study: !0,
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
visible: !0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
color: "#FF6D00"
|
|
}
|
|
},
|
|
inputs: {}
|
|
},
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot"
|
|
}
|
|
},
|
|
inputs: [],
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.main = function(e, t) {
|
|
return this._context = e, this._input = t, [s.Std.hlc3(this
|
|
._context)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Ultimate Oscillator",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#F44336"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 7,
|
|
in_1: 14,
|
|
in_2: 28
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "UO",
|
|
histogramBase: 0,
|
|
joinPoints: !1,
|
|
isHidden: !1
|
|
}
|
|
},
|
|
description: "Ultimate Oscillator",
|
|
shortDescription: "UO",
|
|
is_price_study: !1,
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "length7",
|
|
defval: 7,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e12
|
|
}, {
|
|
id: "in_1",
|
|
name: "length14",
|
|
defval: 14,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e12
|
|
}, {
|
|
id: "in_2",
|
|
name: "length28",
|
|
defval: 28,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e12
|
|
}],
|
|
id: "ultimate_oscillator@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Ultimate Oscillator",
|
|
format: {
|
|
precision: 2,
|
|
type: "price"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t, i) {
|
|
var r = this._context.new_var(e),
|
|
n = this._context.new_var(t);
|
|
return [s.Std.sum(r, i, this._context) / s.Std.sum(n, i, this
|
|
._context)]
|
|
}, this.f_1 = function() {
|
|
var e = this._input(0),
|
|
t = this._input(1),
|
|
i = this._input(2),
|
|
r = this._context.new_var(s.Std.close(this._context)),
|
|
n = s.Std.max(s.Std.high(this._context), r.get(1)),
|
|
o = this._context.new_var(s.Std.close(this._context)),
|
|
a = s.Std.min(s.Std.low(this._context), o.get(1)),
|
|
l = s.Std.close(this._context) - a,
|
|
c = n - a,
|
|
h = this.f_0(l, c, e),
|
|
u = this.f_0(l, c, t),
|
|
d = this.f_0(l, c, i);
|
|
return [100 * (4 * h[0] + 2 * u[0] + d[0]) / 7]
|
|
}, this.main = function(e, t) {
|
|
return this._context = e, this._input = t, this.f_1()
|
|
}
|
|
}
|
|
}, {
|
|
name: "Volatility Close-to-Close",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
is_price_study: !1,
|
|
id: "Volatility Close-to-Close@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Volatility Close-to-Close",
|
|
description: "Volatility Close-to-Close",
|
|
shortDescription: "Volatility Close-to-Close",
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
visible: !0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
inputs: {
|
|
periods: 10,
|
|
daysPerYear: 252
|
|
}
|
|
},
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot"
|
|
}
|
|
},
|
|
inputs: [{
|
|
id: "periods",
|
|
name: "Periods",
|
|
type: "integer",
|
|
defval: 10
|
|
}, {
|
|
id: "daysPerYear",
|
|
name: "Days Per Year",
|
|
type: "integer",
|
|
defval: 252
|
|
}],
|
|
format: {
|
|
precision: 2,
|
|
type: "percent"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.init = function(e, t) {
|
|
this._context = e, this._input = t, this.period = this._input(0),
|
|
this.daysPerYear = this._input(1)
|
|
}, this.stdev = function(e, t, i) {
|
|
var r = this.variance(e, t, i);
|
|
return s.Std.sqrt(r)
|
|
}, this.variance = function(e, t, i) {
|
|
var r = s.Std.sma(e, t, i);
|
|
return this.variance2(e, r, t)
|
|
}, this.variance2 = function(e, t, i) {
|
|
var s, r, n = 0;
|
|
for (s = 0; s < i; s++) n += (r = e.get(s) - t) * r;
|
|
return n / (i - 1)
|
|
}, this.standardHistVol = function() {
|
|
var e = this._context.new_var(s.Std.close(this._context)),
|
|
t = this._context.new_var(s.Std.log(e.get() / e.get(1)));
|
|
return 100 * this.stdev(t, this.period, this._context) * s.Std.sqrt(
|
|
this.daysPerYear)
|
|
}, this.main = function(e, t) {
|
|
return this._context = e, this._input = t, [this.standardHistVol()]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Volatility Zero Trend Close-to-Close",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
is_price_study: !1,
|
|
id: "Volatility Zero Trend Close-to-Close@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Volatility Zero Trend Close-to-Close",
|
|
description: "Volatility Zero Trend Close-to-Close",
|
|
shortDescription: "Volatility Zero Trend Close-to-Close",
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
visible: !0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
inputs: {
|
|
periods: 10,
|
|
daysPerYear: 252
|
|
}
|
|
},
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot"
|
|
}
|
|
},
|
|
inputs: [{
|
|
id: "periods",
|
|
name: "Periods",
|
|
type: "integer",
|
|
min: 0,
|
|
max: 1e4
|
|
}, {
|
|
id: "daysPerYear",
|
|
name: "Days Per Year",
|
|
type: "integer"
|
|
}],
|
|
format: {
|
|
precision: 2,
|
|
type: "percent"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.init = function(e, t) {
|
|
this._context = e, this._input = t, this.period = this._input(0),
|
|
this.daysPerYear = this._input(1)
|
|
}, this.volatliityZTCTC = function() {
|
|
this._context.setMinimumAdditionalDepth(this._input(0) + 1);
|
|
for (var e = this._context.new_var(s.Std.close(this._context)), t =
|
|
this._context.new_var(e.symbol.time), i = Math.sqrt((t.get(
|
|
0) - t.get(1)) / 864e5 / this.daysPerYear), r = Math
|
|
.log(s.Std.close(this._context) / e.get(1)), n = this
|
|
._context.new_var(r / i), o = this._context.new_var(Math
|
|
.pow(n, 2)), a = 0, l = 0; l < this.period; l++) a += o
|
|
.get(l);
|
|
return 100 * Math.sqrt(a / this.period)
|
|
}, this.main = function(e, t) {
|
|
return this._context = e, this._input = t, [this.volatliityZTCTC()]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Volatility O-H-L-C",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
is_price_study: !1,
|
|
id: "Volatility O-H-L-C@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Volatility O-H-L-C",
|
|
description: "Volatility O-H-L-C",
|
|
shortDescription: "Volatility O-H-L-C",
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
visible: !0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
color: "#FF5252"
|
|
}
|
|
},
|
|
inputs: {
|
|
periods: 10,
|
|
marketClosedPercentage: 0,
|
|
daysPerYear: 252
|
|
}
|
|
},
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot"
|
|
}
|
|
},
|
|
inputs: [{
|
|
id: "periods",
|
|
type: "integer",
|
|
name: "Periods"
|
|
}, {
|
|
id: "marketClosedPercentage",
|
|
type: "float",
|
|
name: "Market Closed Percentage",
|
|
min: 0,
|
|
max: .999
|
|
}, {
|
|
id: "daysPerYear",
|
|
type: "integer",
|
|
name: "Days Per Year"
|
|
}],
|
|
format: {
|
|
precision: 2,
|
|
type: "percent"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.init = function(e, t) {
|
|
this._context = e, this._input = t, this.period = this._input(0),
|
|
this.marketClosedPercentage = this._input(1), this.daysPerYear =
|
|
this._input(2), this.secondsPerYear = 86400 * this.daysPerYear
|
|
}, this.square = function(e) {
|
|
return e * e
|
|
}, this.volatilityOHLC = function() {
|
|
var e = this._context.new_var(Math.log(s.Std.open(this._context))),
|
|
t = this._context.new_var(Math.log(s.Std.high(this._context))),
|
|
i = this._context.new_var(Math.log(s.Std.low(this._context))),
|
|
r = this._context.new_var(Math.log(s.Std.close(this._context))),
|
|
n = this._context.new_var(s.Std.close(this._context)),
|
|
o = this._context.new_var(n.symbol.time),
|
|
a = (o.get(0) - o.get(1)) / 1e3,
|
|
l = .5 * this.square(t.get() - i.get());
|
|
l -= (Math.log(4) - 1) * this.square(r.get() - e.get()), this
|
|
.marketClosedPercentage > 0 && (l = .12 * this.square(e.get() -
|
|
r.get(1)) / this.marketClosedPercentage + .88 * l / (1 -
|
|
this.marketClosedPercentage)), l /= a, l *= this
|
|
.secondsPerYear;
|
|
var c = this._context.new_var(l);
|
|
return 100 * Math.sqrt(s.Std.sum(c, this.period, this._context) /
|
|
this.period)
|
|
}, this.main = function(e, t) {
|
|
return this._context = e, this._input = t, [this.volatilityOHLC()]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Volatility Index",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
is_price_study: !0,
|
|
id: "Volatility Index@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Volatility Index",
|
|
description: "Volatility Index",
|
|
shortDescription: "Volatility Index",
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
visible: !0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
color: "#FF5252"
|
|
}
|
|
},
|
|
inputs: {
|
|
periods: 10,
|
|
atrMult: 3,
|
|
method: "Wilder Smoothing"
|
|
}
|
|
},
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot"
|
|
}
|
|
},
|
|
inputs: [{
|
|
id: "periods",
|
|
name: "Periods",
|
|
type: "integer"
|
|
}, {
|
|
id: "atrMult",
|
|
name: "ATR Mult",
|
|
type: "float"
|
|
}, {
|
|
id: "method",
|
|
name: "Method",
|
|
type: "text",
|
|
defval: "Exponential",
|
|
options: ["Exponential", "Wilder Smoothing"]
|
|
}],
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.init = function(e, t) {
|
|
this._context = e, this._input = t, this.period = this._input(0),
|
|
this.atrMult = this._input(1), this.maMethod = this._input(2),
|
|
this.nextsar = null, this.position = null, this.sic = null, this
|
|
.bars = [], this.count = 0, this.lastSar = null, this._context
|
|
.setMinimumAdditionalDepth("Exponential" === this.maMethod ? 2 *
|
|
this.period + 2 : this.period)
|
|
}, this.computeATR = function() {
|
|
var e = s.Std.high(this._context) - s.Std.low(this._context),
|
|
t = s.Std.high(this._context) - this.bars[this.bars.length - 2],
|
|
i = this.bars[this.bars.length - 2] - s.Std.low(this._context);
|
|
return this.tr = Math.max(e, t, i), "Exponential" === this
|
|
.maMethod ? this.atr = s.Std.ema(this._context.new_var(this.tr),
|
|
this.period, this._context) : this.atr = this.tr / this
|
|
.period + (1 - 1 / this.period) * this.atr,
|
|
this.atr * this.atrMult
|
|
}, this.calculateVolatility = function() {
|
|
if (s.Std.close(this._context) === this.bars[this.bars.length - 1])
|
|
return this.lastSar;
|
|
if (this.bars.push(s.Std.close(this._context)), 1 === this.count)
|
|
this.atr = s.Std.high(this._context) - s.Std.low(this._context),
|
|
this.sic = s.Std.close(this._context);
|
|
else if (this.count < this.period) {
|
|
var e = s.Std.high(this._context) - s.Std.low(this._context),
|
|
t = s.Std.high(this._context) - this.bars[this.bars.length -
|
|
2],
|
|
i = this.bars[this.bars.length - 2] - s.Std.low(this
|
|
._context);
|
|
this.atr += Math.max(e, t, i), s.Std.close(this._context) > this
|
|
.sic && (this.sic = s.Std.close(this._context))
|
|
} else if (this.count === this.period) {
|
|
e = s.Std.high(this._context) - s.Std.low(this._context), t = s
|
|
.Std.high(this._context) - this.bars[this.bars.length - 2],
|
|
i = this.bars[this.bars.length - 2] - s.Std.low(this
|
|
._context);
|
|
this.atr += Math.max(e, t, i), this.atr *= 1 / this.period, s
|
|
.Std.close(this._context) > this.sic && (this.sic = s.Std
|
|
.close(this._context)), this.position = "LONG", this
|
|
.nextsar = this.sic - this.atr * this.atrMult
|
|
} else {
|
|
var r = this.nextsar;
|
|
"LONG" === this.position ? s.Std.close(this._context) < r ? (
|
|
this.position = "SHORT", this.sic = s.Std.close(this
|
|
._context), this.nextsar = this.sic + this
|
|
.computeATR()) : (this.position = "LONG", this.sic =
|
|
Math.max(s.Std.close(this._context), this.sic), this
|
|
.nextsar = this.sic - this.computeATR()) : "SHORT" ===
|
|
this.position && (s.Std.close(this._context) > r ? (this
|
|
.position = "LONG", this.sic = s.Std.close(this
|
|
._context), this.nextsar = this.sic - this
|
|
.computeATR()) : (this.position = "SHORT", this
|
|
.sic = Math.min(s.Std.close(this._context), this
|
|
.sic), this.nextsar = this.sic + this
|
|
.computeATR())), this.lastSar = r
|
|
}
|
|
return this.count++, r
|
|
}, this.main = function(e, t) {
|
|
return this._context = e, this._input = t, this._context.select_sym(
|
|
0), [this.calculateVolatility()]
|
|
}
|
|
}
|
|
}, {
|
|
name: "VWAP",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: 0,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
}
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "VWAP",
|
|
histogramBase: 0,
|
|
joinPoints: !1,
|
|
isHidden: !1
|
|
}
|
|
},
|
|
description: "VWAP",
|
|
shortDescription: "VWAP",
|
|
is_price_study: !0,
|
|
inputs: [],
|
|
id: "VWAP@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "VWAP",
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_1 = function(e) {
|
|
e.hist = null, e.add_hist()
|
|
}, this.init = function(e, t) {
|
|
this._isNewSession = null
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = e.new_var(),
|
|
r = e.new_var(),
|
|
n = this._context.symbol.time;
|
|
return n && (null === this._isNewSession && (this._isNewSession = s
|
|
.Std.createNewSessionCheck(e)), this._isNewSession(n) &&
|
|
(this.f_1(i), this.f_1(r))), i.set(s.Std.nz(i.get(1)) + s
|
|
.Std.hlc3(this._context) * s.Std.volume(this._context)), r
|
|
.set(s.Std.nz(r.get(1)) + s.Std.volume(this._context)), [i.get(
|
|
0) / r.get(0)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "VWMA",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 20
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "VWMA",
|
|
shortDescription: "VWMA",
|
|
is_price_study: !0,
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "len",
|
|
defval: 20,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 1e4
|
|
}],
|
|
id: "VWMA@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "VWMA",
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = s.Std.close(this._context),
|
|
r = this._input(0),
|
|
n = this._context.new_var(i);
|
|
return [s.Std.vwma(n, r, this._context)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Volume Oscillator",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
bands: [{
|
|
color: "#787B86",
|
|
linestyle: 2,
|
|
linewidth: 1,
|
|
visible: !0,
|
|
value: 0
|
|
}],
|
|
inputs: {
|
|
in_0: 5,
|
|
in_1: 10
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Volume Oscillator",
|
|
shortDescription: "Volume Osc",
|
|
is_price_study: !1,
|
|
bands: [{
|
|
id: "hline_0",
|
|
name: "Zero"
|
|
}],
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "shortlen",
|
|
defval: 5,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 4999
|
|
}, {
|
|
id: "in_1",
|
|
name: "longlen",
|
|
defval: 10,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 4999
|
|
}],
|
|
id: "Volume Oscillator@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Volume Oscillator",
|
|
format: {
|
|
precision: 2,
|
|
type: "percent"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t) {
|
|
return 100 * (e - t) / t
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0),
|
|
r = this._input(1),
|
|
n = s.Std.volume(this._context),
|
|
o = this._context.new_var(n),
|
|
a = s.Std.ema(o, i, this._context),
|
|
l = this._context.new_var(n),
|
|
c = s.Std.ema(l, r, this._context);
|
|
return [this.f_0(a, c)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Vortex Indicator",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
},
|
|
plot_1: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#E91E63"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 14
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_1",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "VI +",
|
|
histogramBase: 0,
|
|
joinPoints: !1,
|
|
isHidden: !1
|
|
},
|
|
plot_1: {
|
|
title: "VI -",
|
|
histogramBase: 0,
|
|
joinPoints: !1,
|
|
isHidden: !1
|
|
}
|
|
},
|
|
description: "Vortex Indicator",
|
|
shortDescription: "VI",
|
|
is_price_study: !1,
|
|
is_hidden_study: !1,
|
|
id: "vortex_indicator@tv-basicstudies-1",
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "Period",
|
|
defval: 14,
|
|
type: "integer",
|
|
min: 2,
|
|
max: 1e12
|
|
}],
|
|
scriptIdPart: "",
|
|
name: "Vortex Indicator",
|
|
format: {
|
|
precision: 4,
|
|
type: "price"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function() {
|
|
var e = this._input(0),
|
|
t = this._context.new_var(s.Std.low(this._context)),
|
|
i = this._context.new_var(s.Std.abs(s.Std.high(this._context) -
|
|
t.get(1))),
|
|
r = s.Std.sum(i, e, this._context),
|
|
n = this._context.new_var(s.Std.high(this._context)),
|
|
o = this._context.new_var(s.Std.abs(s.Std.low(this._context) - n
|
|
.get(1))),
|
|
a = s.Std.sum(o, e, this._context),
|
|
l = this._context.new_var(s.Std.atr(1, this._context)),
|
|
c = s.Std.sum(l, e, this._context);
|
|
return [r / c, a / c]
|
|
}, this.main = function(e, t) {
|
|
return this._context = e, this._input = t, this.f_0()
|
|
}
|
|
}
|
|
}, {
|
|
name: "Willams %R",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#7E57C2"
|
|
}
|
|
},
|
|
bands: [{
|
|
color: "#787B86",
|
|
linestyle: 2,
|
|
linewidth: 1,
|
|
visible: !0,
|
|
value: -20
|
|
}, {
|
|
color: "#787B86",
|
|
linestyle: 2,
|
|
linewidth: 1,
|
|
visible: !0,
|
|
value: -80
|
|
}],
|
|
filledAreasStyle: {
|
|
fill_0: {
|
|
color: "#7E57C2",
|
|
transparency: 90,
|
|
visible: !0
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 14
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Williams %R",
|
|
shortDescription: "%R",
|
|
is_price_study: !1,
|
|
bands: [{
|
|
id: "hline_0",
|
|
name: "UpperLimit"
|
|
}, {
|
|
id: "hline_1",
|
|
name: "LowerLimit"
|
|
}],
|
|
filledAreas: [{
|
|
id: "fill_0",
|
|
objAId: "hline_0",
|
|
objBId: "hline_1",
|
|
type: "hline_hline",
|
|
title: "Hlines Background"
|
|
}],
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "length",
|
|
defval: 14,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}],
|
|
id: "Willams %R@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Willams %R",
|
|
format: {
|
|
precision: 2,
|
|
type: "price"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t, i) {
|
|
return 100 * (e - t) / (t - i)
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0),
|
|
r = s.Std.high(this._context),
|
|
n = this._context.new_var(r),
|
|
o = s.Std.highest(n, i, this._context),
|
|
a = s.Std.low(this._context),
|
|
l = this._context.new_var(a),
|
|
c = s.Std.lowest(l, i, this._context);
|
|
return [this.f_0(s.Std.close(this._context), o, c)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Williams Alligator",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
},
|
|
plot_1: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#E91E63"
|
|
},
|
|
plot_2: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#66BB6A"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 21,
|
|
in_1: 13,
|
|
in_2: 8,
|
|
in_3: 8,
|
|
in_4: 5,
|
|
in_5: 3
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_1",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_2",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Jaw",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
plot_1: {
|
|
title: "Teeth",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
},
|
|
plot_2: {
|
|
title: "Lips",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Williams Alligator",
|
|
shortDescription: "Alligator",
|
|
is_price_study: !0,
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "Jaw Length",
|
|
defval: 21,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}, {
|
|
id: "in_1",
|
|
name: "Teeth Length",
|
|
defval: 13,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}, {
|
|
id: "in_2",
|
|
name: "Lips Length",
|
|
defval: 8,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}, {
|
|
id: "in_3",
|
|
name: "Jaw Offset",
|
|
defval: 8,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}, {
|
|
id: "in_4",
|
|
name: "Teeth Offset",
|
|
defval: 5,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}, {
|
|
id: "in_5",
|
|
name: "Lips Offset",
|
|
defval: 3,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}],
|
|
id: "Williams Alligator@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "Williams Alligator",
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0),
|
|
r = this._input(1),
|
|
n = this._input(2),
|
|
o = this._input(3),
|
|
a = this._input(4),
|
|
l = this._input(5),
|
|
c = s.Std.hl2(this._context);
|
|
return [{
|
|
value: s.Std.smma(c, i, this._context),
|
|
offset: o
|
|
}, {
|
|
value: s.Std.smma(c, r, this._context),
|
|
offset: a
|
|
}, {
|
|
value: s.Std.smma(c, n, this._context),
|
|
offset: l
|
|
}]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Williams Fractals",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
plottype: "shape_triangle_down",
|
|
visible: !0,
|
|
location: "BelowBar",
|
|
transparency: 0,
|
|
color: "#F44336"
|
|
},
|
|
plot_1: {
|
|
plottype: "shape_triangle_up",
|
|
visible: !0,
|
|
location: "AboveBar",
|
|
transparency: 0,
|
|
color: "#009688"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 2
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "shapes"
|
|
}, {
|
|
id: "plot_1",
|
|
type: "shapes"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Down fractals",
|
|
isHidden: !1
|
|
},
|
|
plot_1: {
|
|
title: "Up fractals",
|
|
isHidden: !1
|
|
}
|
|
},
|
|
description: "Williams Fractal",
|
|
shortDescription: "Fractals",
|
|
is_price_study: !0,
|
|
is_hidden_study: !1,
|
|
id: "Williams Fractals@tv-basicstudies-1",
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "Periods",
|
|
defval: 2,
|
|
type: "integer",
|
|
min: 2,
|
|
max: 1e12
|
|
}],
|
|
scriptIdPart: "",
|
|
name: "Williams Fractals",
|
|
isCustomIndicator: !0,
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function() {
|
|
for (var e = this._input(0), t = this._context.new_var(s.Std.high(
|
|
this._context)), i = !0, r = !0, n = !0, o = !0, a = !0,
|
|
l = !0, c = 1; c <= e; c++) i = s.Std.and(i, s.Std.lt(t.get(
|
|
e - c), t.get(e))), r = s.Std.and(r, s.Std.lt(t.get(e + c),
|
|
t.get(e))), n = s.Std.and(n, s.Std.and(s.Std.le(t.get(e +
|
|
1), t.get(e)), s.Std.lt(t.get(e + c + 1), t.get(e)))), o = s
|
|
.Std.and(o, s.Std.and(s.Std.le(t.get(e + 1), t.get(e)), s.Std
|
|
.and(s.Std.le(t.get(e + 2), t.get(e)), s.Std.lt(t.get(
|
|
e + c + 2), t.get(e))))), a = s.Std.and(a, s.Std.and(s
|
|
.Std.le(t.get(e + 1), t.get(e)), s.Std.and(s.Std.le(t
|
|
.get(e + 2), t.get(e)), s.Std.and(s.Std.le(t
|
|
.get(e + 3), t.get(e)), s.Std.lt(t.get(e +
|
|
c + 3), t.get(e)))))), l = s.Std.and(l, s.Std.and(s.Std
|
|
.le(t.get(e + 1), t.get(e)), s.Std.and(s.Std.le(t.get(
|
|
e + 2), t.get(e)), s.Std.and(s.Std.le(t.get(e +
|
|
3), t.get(e)), s.Std.and(s.Std.le(t.get(e +
|
|
4), t.get(e)), s.Std.lt(t.get(e + c +
|
|
4), t.get(e)))))));
|
|
var h = s.Std.or(r, s.Std.or(n, s.Std.or(o, s.Std.or(a, l)))),
|
|
u = s.Std.and(i, h),
|
|
d = this._context.new_var(s.Std.low(this._context)),
|
|
p = 1,
|
|
_ = 1,
|
|
m = 1,
|
|
f = 1,
|
|
g = 1,
|
|
b = 1;
|
|
for (c = 1; c <= e; c++) p = s.Std.and(p, s.Std.gt(d.get(e - c), d
|
|
.get(e))), _ = s.Std.and(_, s.Std.gt(d.get(e + c), d.get(
|
|
e))), m = s.Std.and(m, s.Std.and(s.Std.ge(d.get(e + 1), d
|
|
.get(e)), s.Std.gt(d.get(e + c + 1), d.get(e)))), f = s.Std
|
|
.and(f, s.Std.and(s.Std.ge(d.get(e + 1), d.get(e)), s.Std.and(s
|
|
.Std.ge(d.get(e + 2), d.get(e)), s.Std.gt(d.get(e +
|
|
c + 2), d.get(e))))), g = s.Std.and(g, s.Std.and(s.Std
|
|
.ge(d.get(e + 1), d.get(e)), s.Std.and(s.Std.ge(d.get(
|
|
e + 2), d.get(e)), s.Std.and(s.Std.ge(d.get(e +
|
|
3), d.get(e)), s.Std.gt(d.get(e + c + 3), d
|
|
.get(e)))))), b = s.Std.and(b, s.Std.and(s.Std.ge(d.get(
|
|
e + 1), d.get(e)), s.Std.and(s.Std.ge(d.get(e + 2),
|
|
d.get(e)), s.Std.and(s.Std.ge(d.get(e + 3), d
|
|
.get(e)), s.Std.and(s.Std.ge(d.get(e + 4), d
|
|
.get(e)), s.Std.gt(d.get(e + c + 4), d
|
|
.get(e)))))));
|
|
var v = s.Std.or(_, s.Std.or(m, s.Std.or(f, s.Std.or(g, b))));
|
|
return [s.Std.and(p, v), u]
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this.f_0();
|
|
return [{
|
|
value: i[0],
|
|
offset: -this._input(0)
|
|
}, {
|
|
value: i[1],
|
|
offset: -this._input(0)
|
|
}]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Guppy Multiple Moving Average",
|
|
metainfo: {
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
description: "Guppy Multiple Moving Average",
|
|
shortDescription: "GMMA",
|
|
is_price_study: !0,
|
|
id: "Guppy Multiple Moving Average@tv-basicstudies-1",
|
|
_metainfoVersion: 52,
|
|
format: {
|
|
type: "inherit"
|
|
},
|
|
defaults: {
|
|
inputs: {
|
|
traderEMA1Length: 3,
|
|
traderEMA2Length: 5,
|
|
traderEMA3Length: 8,
|
|
traderEMA4Length: 10,
|
|
traderEMA5Length: 12,
|
|
traderEMA6Length: 15,
|
|
investorEMA1Length: 30,
|
|
investorEMA2Length: 35,
|
|
investorEMA3Length: 40,
|
|
investorEMA4Length: 45,
|
|
investorEMA5Length: 50,
|
|
investorEMA6Length: 60
|
|
},
|
|
styles: {
|
|
traderEMA1: {
|
|
color: "#00FFFF",
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 15,
|
|
visible: !0
|
|
},
|
|
traderEMA2: {
|
|
color: "#00FFFF",
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 12,
|
|
visible: !0
|
|
},
|
|
traderEMA3: {
|
|
color: "#00FFFF",
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 9,
|
|
visible: !0
|
|
},
|
|
traderEMA4: {
|
|
color: "#00FFFF",
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 6,
|
|
visible: !0
|
|
},
|
|
traderEMA5: {
|
|
color: "#00FFFF",
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 3,
|
|
visible: !0
|
|
},
|
|
traderEMA6: {
|
|
color: "#00FFFF",
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0
|
|
},
|
|
investorEMA1: {
|
|
color: "#FF0000",
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 15,
|
|
visible: !0
|
|
},
|
|
investorEMA2: {
|
|
color: "#FF0000",
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 12,
|
|
visible: !0
|
|
},
|
|
investorEMA3: {
|
|
color: "#FF0000",
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 9,
|
|
visible: !0
|
|
},
|
|
investorEMA4: {
|
|
color: "#FF0000",
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 6,
|
|
visible: !0
|
|
},
|
|
investorEMA5: {
|
|
color: "#FF0000",
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 3,
|
|
visible: !0
|
|
},
|
|
investorEMA6: {
|
|
color: "#FF0000",
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0
|
|
}
|
|
}
|
|
},
|
|
inputs: [{
|
|
defval: 3,
|
|
id: "traderEMA1Length",
|
|
max: 1e3,
|
|
min: 1,
|
|
name: "Trader EMA 1 length",
|
|
type: "integer"
|
|
}, {
|
|
defval: 5,
|
|
id: "traderEMA2Length",
|
|
max: 1e3,
|
|
min: 1,
|
|
name: "Trader EMA 2 length",
|
|
type: "integer"
|
|
}, {
|
|
defval: 8,
|
|
id: "traderEMA3Length",
|
|
max: 1e3,
|
|
min: 1,
|
|
name: "Trader EMA 3 length",
|
|
type: "integer"
|
|
}, {
|
|
defval: 10,
|
|
id: "traderEMA4Length",
|
|
max: 1e3,
|
|
min: 1,
|
|
name: "Trader EMA 4 length",
|
|
type: "integer"
|
|
}, {
|
|
defval: 12,
|
|
id: "traderEMA5Length",
|
|
max: 1e3,
|
|
min: 1,
|
|
name: "Trader EMA 5 length",
|
|
type: "integer"
|
|
}, {
|
|
defval: 15,
|
|
id: "traderEMA6Length",
|
|
max: 1e3,
|
|
min: 1,
|
|
name: "Trader EMA 6 length",
|
|
type: "integer"
|
|
}, {
|
|
defval: 30,
|
|
id: "investorEMA1Length",
|
|
max: 1e3,
|
|
min: 1,
|
|
name: "Investor EMA 1 length",
|
|
type: "integer"
|
|
}, {
|
|
defval: 35,
|
|
id: "investorEMA2Length",
|
|
max: 1e3,
|
|
min: 1,
|
|
name: "Investor EMA 2 length",
|
|
type: "integer"
|
|
}, {
|
|
defval: 40,
|
|
id: "investorEMA3Length",
|
|
max: 1e3,
|
|
min: 1,
|
|
name: "Investor EMA 3 length",
|
|
type: "integer"
|
|
}, {
|
|
defval: 45,
|
|
id: "investorEMA4Length",
|
|
max: 1e3,
|
|
min: 1,
|
|
name: "Investor EMA 4 length",
|
|
type: "integer"
|
|
}, {
|
|
defval: 50,
|
|
id: "investorEMA5Length",
|
|
max: 1e3,
|
|
min: 1,
|
|
name: "Investor EMA 5 length",
|
|
type: "integer"
|
|
}, {
|
|
defval: 60,
|
|
id: "investorEMA6Length",
|
|
max: 1e3,
|
|
min: 1,
|
|
name: "Investor EMA 6 length",
|
|
type: "integer"
|
|
}],
|
|
plots: [{
|
|
id: "traderEMA1",
|
|
type: "line"
|
|
}, {
|
|
id: "traderEMA2",
|
|
type: "line"
|
|
}, {
|
|
id: "traderEMA3",
|
|
type: "line"
|
|
}, {
|
|
id: "traderEMA4",
|
|
type: "line"
|
|
}, {
|
|
id: "traderEMA5",
|
|
type: "line"
|
|
}, {
|
|
id: "traderEMA6",
|
|
type: "line"
|
|
}, {
|
|
id: "investorEMA1",
|
|
type: "line"
|
|
}, {
|
|
id: "investorEMA2",
|
|
type: "line"
|
|
}, {
|
|
id: "investorEMA3",
|
|
type: "line"
|
|
}, {
|
|
id: "investorEMA4",
|
|
type: "line"
|
|
}, {
|
|
id: "investorEMA5",
|
|
type: "line"
|
|
}, {
|
|
id: "investorEMA6",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
traderEMA1: {
|
|
histogramBase: 0,
|
|
isHidden: !1,
|
|
joinPoints: !1,
|
|
title: "Trader EMA 1"
|
|
},
|
|
traderEMA2: {
|
|
histogramBase: 0,
|
|
isHidden: !1,
|
|
joinPoints: !1,
|
|
title: "Trader EMA 2"
|
|
},
|
|
traderEMA3: {
|
|
histogramBase: 0,
|
|
isHidden: !1,
|
|
joinPoints: !1,
|
|
title: "Trader EMA 3"
|
|
},
|
|
traderEMA4: {
|
|
histogramBase: 0,
|
|
isHidden: !1,
|
|
joinPoints: !1,
|
|
title: "Trader EMA 4"
|
|
},
|
|
traderEMA5: {
|
|
histogramBase: 0,
|
|
isHidden: !1,
|
|
joinPoints: !1,
|
|
title: "Trader EMA 5"
|
|
},
|
|
traderEMA6: {
|
|
histogramBase: 0,
|
|
isHidden: !1,
|
|
joinPoints: !1,
|
|
title: "Trader EMA 6"
|
|
},
|
|
investorEMA1: {
|
|
histogramBase: 0,
|
|
isHidden: !1,
|
|
joinPoints: !1,
|
|
title: "Investor EMA 1"
|
|
},
|
|
investorEMA2: {
|
|
histogramBase: 0,
|
|
isHidden: !1,
|
|
joinPoints: !1,
|
|
title: "Investor EMA 2"
|
|
},
|
|
investorEMA3: {
|
|
histogramBase: 0,
|
|
isHidden: !1,
|
|
joinPoints: !1,
|
|
title: "Investor EMA 3"
|
|
},
|
|
investorEMA4: {
|
|
histogramBase: 0,
|
|
isHidden: !1,
|
|
joinPoints: !1,
|
|
title: "Investor EMA 4"
|
|
},
|
|
investorEMA5: {
|
|
histogramBase: 0,
|
|
isHidden: !1,
|
|
joinPoints: !1,
|
|
title: "Investor EMA 5"
|
|
},
|
|
investorEMA6: {
|
|
histogramBase: 0,
|
|
isHidden: !1,
|
|
joinPoints: !1,
|
|
title: "Investor EMA 6"
|
|
}
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._context.new_var(s.Std.close(this._context)),
|
|
r = this._input(0),
|
|
n = this._input(1),
|
|
o = this._input(2),
|
|
a = this._input(3),
|
|
l = this._input(4),
|
|
c = this._input(5),
|
|
h = s.Std.ema(i, r, this._context),
|
|
u = s.Std.ema(i, n, this._context),
|
|
d = s.Std.ema(i, o, this._context),
|
|
p = s.Std.ema(i, a, this._context),
|
|
_ = s.Std.ema(i, l, this._context),
|
|
m = s.Std.ema(i, c, this._context),
|
|
f = this._input(6),
|
|
g = this._input(7),
|
|
b = this._input(8),
|
|
v = this._input(9),
|
|
S = this._input(10),
|
|
y = this._input(11);
|
|
return [h, u, d, p, _, m, s.Std.ema(i, f, this._context), s.Std.ema(
|
|
i, g, this._context), s.Std.ema(i, b, this._context), s
|
|
.Std.ema(i, v, this._context), s.Std.ema(i, S, this
|
|
._context), s.Std.ema(i, y, this._context)
|
|
]
|
|
}
|
|
}
|
|
}]
|
|
},
|
|
"2ijp": function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return n
|
|
}));
|
|
var s = i("l4sv"),
|
|
r = i("8Uy/");
|
|
class n {
|
|
constructor() {
|
|
this._lineRendererData = {
|
|
y: 0,
|
|
color: "rgba(0, 0, 0, 0)",
|
|
linewidth: 1,
|
|
linestyle: r.LINESTYLE_SOLID,
|
|
visible: !1
|
|
}, this._lineRenderer = new s.HorizontalLineRenderer, this._invalidated = !0,
|
|
this._lineRenderer.setData(this._lineRendererData)
|
|
}
|
|
update() {
|
|
this._invalidated = !0
|
|
}
|
|
renderer() {
|
|
return this._invalidated && (this._updateImpl(), this._invalidated = !1), this
|
|
._lineRenderer
|
|
}
|
|
}
|
|
},
|
|
"2jXJ": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "supportedLineTools", (function() {
|
|
return s
|
|
}));
|
|
const s = {
|
|
cursor: {
|
|
name: "cursor",
|
|
onlySelectable: !0
|
|
},
|
|
dot: {
|
|
name: "dot",
|
|
onlySelectable: !0
|
|
},
|
|
arrow_cursor: {
|
|
name: "arrow",
|
|
onlySelectable: !0
|
|
},
|
|
eraser: {
|
|
name: "eraser",
|
|
onlySelectable: !0
|
|
},
|
|
measure: {
|
|
name: "measure",
|
|
onlySelectable: !0
|
|
},
|
|
zoom: {
|
|
name: "zoom",
|
|
onlySelectable: !0
|
|
},
|
|
brush: {
|
|
name: "LineToolBrush"
|
|
},
|
|
highlighter: {
|
|
name: "LineToolHighlighter"
|
|
},
|
|
text: {
|
|
name: "LineToolText"
|
|
},
|
|
anchored_text: {
|
|
name: "LineToolTextAbsolute"
|
|
},
|
|
note: {
|
|
name: "LineToolNote"
|
|
},
|
|
anchored_note: {
|
|
name: "LineToolNoteAbsolute"
|
|
},
|
|
signpost: {
|
|
name: "LineToolSignpost"
|
|
},
|
|
callout: {
|
|
name: "LineToolCallout"
|
|
},
|
|
balloon: {
|
|
name: "LineToolBalloon"
|
|
},
|
|
arrow_up: {
|
|
name: "LineToolArrowMarkUp"
|
|
},
|
|
arrow_down: {
|
|
name: "LineToolArrowMarkDown"
|
|
},
|
|
arrow_left: {
|
|
name: "LineToolArrowMarkLeft"
|
|
},
|
|
arrow_right: {
|
|
name: "LineToolArrowMarkRight"
|
|
},
|
|
price_label: {
|
|
name: "LineToolPriceLabel"
|
|
},
|
|
price_note: {
|
|
name: "LineToolPriceNote"
|
|
},
|
|
arrow_marker: {
|
|
name: "LineToolArrowMarker"
|
|
},
|
|
flag: {
|
|
name: "LineToolFlagMark"
|
|
},
|
|
vertical_line: {
|
|
name: "LineToolVertLine"
|
|
},
|
|
horizontal_line: {
|
|
name: "LineToolHorzLine"
|
|
},
|
|
cross_line: {
|
|
name: "LineToolCrossLine"
|
|
},
|
|
horizontal_ray: {
|
|
name: "LineToolHorzRay"
|
|
},
|
|
trend_line: {
|
|
name: "LineToolTrendLine"
|
|
},
|
|
info_line: {
|
|
name: "LineToolInfoLine"
|
|
},
|
|
trend_angle: {
|
|
name: "LineToolTrendAngle"
|
|
},
|
|
arrow: {
|
|
name: "LineToolArrow"
|
|
},
|
|
ray: {
|
|
name: "LineToolRay"
|
|
},
|
|
extended: {
|
|
name: "LineToolExtended"
|
|
},
|
|
parallel_channel: {
|
|
name: "LineToolParallelChannel"
|
|
},
|
|
disjoint_angle: {
|
|
name: "LineToolDisjointAngle"
|
|
},
|
|
flat_bottom: {
|
|
name: "LineToolFlatBottom"
|
|
},
|
|
pitchfork: {
|
|
name: "LineToolPitchfork"
|
|
},
|
|
schiff_pitchfork_modified: {
|
|
name: "LineToolSchiffPitchfork"
|
|
},
|
|
schiff_pitchfork: {
|
|
name: "LineToolSchiffPitchfork2"
|
|
},
|
|
inside_pitchfork: {
|
|
name: "LineToolInsidePitchfork"
|
|
},
|
|
pitchfan: {
|
|
name: "LineToolPitchfan"
|
|
},
|
|
gannbox: {
|
|
name: "LineToolGannSquare"
|
|
},
|
|
gannbox_square: {
|
|
name: "LineToolGannComplex"
|
|
},
|
|
gannbox_fixed: {
|
|
name: "LineToolGannFixed"
|
|
},
|
|
gannbox_fan: {
|
|
name: "LineToolGannFan"
|
|
},
|
|
fib_retracement: {
|
|
name: "LineToolFibRetracement"
|
|
},
|
|
fib_trend_ext: {
|
|
name: "LineToolTrendBasedFibExtension"
|
|
},
|
|
fib_speed_resist_fan: {
|
|
name: "LineToolFibSpeedResistanceFan"
|
|
},
|
|
fib_timezone: {
|
|
name: "LineToolFibTimeZone"
|
|
},
|
|
fib_trend_time: {
|
|
name: "LineToolTrendBasedFibTime"
|
|
},
|
|
fib_circles: {
|
|
name: "LineToolFibCircles"
|
|
},
|
|
fib_spiral: {
|
|
name: "LineToolFibSpiral"
|
|
},
|
|
fib_speed_resist_arcs: {
|
|
name: "LineToolFibSpeedResistanceArcs"
|
|
},
|
|
fib_wedge: {
|
|
name: "LineToolFibWedge"
|
|
},
|
|
fib_channel: {
|
|
name: "LineToolFibChannel"
|
|
},
|
|
xabcd_pattern: {
|
|
name: "LineTool5PointsPattern"
|
|
},
|
|
cypher_pattern: {
|
|
name: "LineToolCypherPattern"
|
|
},
|
|
abcd_pattern: {
|
|
name: "LineToolABCD"
|
|
},
|
|
triangle_pattern: {
|
|
name: "LineToolTrianglePattern"
|
|
},
|
|
"3divers_pattern": {
|
|
name: "LineToolThreeDrivers"
|
|
},
|
|
head_and_shoulders: {
|
|
name: "LineToolHeadAndShoulders"
|
|
},
|
|
elliott_impulse_wave: {
|
|
name: "LineToolElliottImpulse"
|
|
},
|
|
elliott_triangle_wave: {
|
|
name: "LineToolElliottTriangle"
|
|
},
|
|
elliott_triple_combo: {
|
|
name: "LineToolElliottTripleCombo"
|
|
},
|
|
elliott_correction: {
|
|
name: "LineToolElliottCorrection"
|
|
},
|
|
elliott_double_combo: {
|
|
name: "LineToolElliottDoubleCombo"
|
|
},
|
|
cyclic_lines: {
|
|
name: "LineToolCircleLines"
|
|
},
|
|
time_cycles: {
|
|
name: "LineToolTimeCycles"
|
|
},
|
|
sine_line: {
|
|
name: "LineToolSineLine"
|
|
},
|
|
long_position: {
|
|
name: "LineToolRiskRewardLong"
|
|
},
|
|
short_position: {
|
|
name: "LineToolRiskRewardShort"
|
|
},
|
|
forecast: {
|
|
name: "LineToolPrediction"
|
|
},
|
|
date_range: {
|
|
name: "LineToolDateRange"
|
|
},
|
|
price_range: {
|
|
name: "LineToolPriceRange"
|
|
},
|
|
date_and_price_range: {
|
|
name: "LineToolDateAndPriceRange"
|
|
},
|
|
bars_pattern: {
|
|
name: "LineToolBarsPattern"
|
|
},
|
|
ghost_feed: {
|
|
name: "LineToolGhostFeed"
|
|
},
|
|
projection: {
|
|
name: "LineToolProjection"
|
|
},
|
|
rectangle: {
|
|
name: "LineToolRectangle"
|
|
},
|
|
rotated_rectangle: {
|
|
name: "LineToolRotatedRectangle"
|
|
},
|
|
ellipse: {
|
|
name: "LineToolEllipse"
|
|
},
|
|
triangle: {
|
|
name: "LineToolTriangle"
|
|
},
|
|
polyline: {
|
|
name: "LineToolPolyline"
|
|
},
|
|
path: {
|
|
name: "LineToolPath"
|
|
},
|
|
curve: {
|
|
name: "LineToolBezierQuadro"
|
|
},
|
|
double_curve: {
|
|
name: "LineToolBezierCubic"
|
|
},
|
|
arc: {
|
|
name: "LineToolArc"
|
|
},
|
|
icon: {
|
|
name: "LineToolIcon"
|
|
},
|
|
regression_trend: {
|
|
name: "LineToolRegressionTrend"
|
|
},
|
|
fixed_range_volume_profile: {
|
|
name: "LineToolFixedRangeVolumeProfile"
|
|
}
|
|
}
|
|
},
|
|
"2jby": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "reorderCollection", (function() {
|
|
return S
|
|
})), i.d(t, "reorderDataSourcesStateZOrder", (function() {
|
|
return y
|
|
})), i.d(t, "reorderDataSourcesZOrder", (function() {
|
|
return w
|
|
})), i.d(t, "newLineToolZOrder", (function() {
|
|
return x
|
|
})), i.d(t, "newLineToolStateZOrder", (function() {
|
|
return T
|
|
})), i.d(t, "newStudyZOrder", (function() {
|
|
return I
|
|
})), i.d(t, "isReorderRequired", (function() {
|
|
return L
|
|
})),
|
|
i.d(t, "moveAtIndex", (function() {
|
|
return E
|
|
})), i.d(t, "moveAfterItem", (function() {
|
|
return k
|
|
})), i.d(t, "moveBeforeItem", (function() {
|
|
return D
|
|
})), i.d(t, "moveAfterSource", (function() {
|
|
return V
|
|
})), i.d(t, "moveBeforeSource", (function() {
|
|
return B
|
|
})), i.d(t, "moveAfterSourceState", (function() {
|
|
return R
|
|
})), i.d(t, "moveBeforeSourceState", (function() {
|
|
return N
|
|
}));
|
|
var s = i("CW80"),
|
|
r = i("3ClC"),
|
|
n = i("qJq3"),
|
|
o = i("s1Gx"),
|
|
a = i("Vs8b"),
|
|
l = i("Y7w9");
|
|
|
|
function c(e) {
|
|
return e instanceof n.Series
|
|
}
|
|
|
|
function h(e) {
|
|
return Object(s.isLineTool)(e) && !e.isSpeciallyZOrderedSource()
|
|
}
|
|
|
|
function u(e) {
|
|
return Object(r.isStudy)(e) && !e.isSpeciallyZOrderedSource()
|
|
}
|
|
|
|
function d(e, t) {
|
|
return e.zorder - t.zorder
|
|
}
|
|
|
|
function p(e, t) {
|
|
return e.zorder() - t.zorder()
|
|
}
|
|
|
|
function _(e, t) {
|
|
Object(a.isMainSeriesState)(e) ? e.zorder = 0 : e.zorder = t
|
|
}
|
|
|
|
function m(e, t) {
|
|
e.setZorder(t)
|
|
}
|
|
|
|
function f(e) {
|
|
return e.zorder
|
|
}
|
|
|
|
function g(e) {
|
|
return e.zorder()
|
|
}
|
|
|
|
function b(e, t, i, s, r, n, o) {
|
|
let a = 0;
|
|
for (let l = t; l >= 0; --l) {
|
|
const t = e[l];
|
|
void 0 !== o && o(t) || (n(t) ? (r(t, i), a = Math.max(a, M(i)), s = i - 1, i -= 1e4,
|
|
0 === s && (i -= 1e4)) : (r(t, s), a = Math.max(a, O(s)), s -= 1))
|
|
}
|
|
return a
|
|
}
|
|
|
|
function v(e, t, i, s, r, n, o) {
|
|
let a = 0;
|
|
for (let l = t; l < e.length; ++l) {
|
|
const t = e[l];
|
|
void 0 !== o && o(t) || (n(t) ? (r(t, i), a = Math.max(a, M(i)), s = i + 1, 0 === (i +=
|
|
1e4) && (s += 1e4)) : (r(t, s), a = Math.max(a, O(s)), s += 1))
|
|
}
|
|
return a
|
|
}
|
|
|
|
function S(e, t, i, s, r, n) {
|
|
let o = null;
|
|
const a = [];
|
|
for (const r of e) t(r) ? (a.push(r), o = r) : (i(r) || s(r)) && a.push(r);
|
|
a.sort(n), null !== o && r(o, 0);
|
|
const l = null === o ? -1 : a.indexOf(o),
|
|
c = b(a, l - 1, -1e4, -1, r, i),
|
|
h = v(a, l + 1, 1e4, 1, r, i);
|
|
return Math.max(c, h) < .7
|
|
}
|
|
|
|
function y(e) {
|
|
return S(e, a.isMainSeriesState, a.isStudyState, a.isLineToolState, _, d)
|
|
}
|
|
|
|
function w(e) {
|
|
return S(e, c, u, h, m, p)
|
|
}
|
|
|
|
function P(e, t) {
|
|
const i = Math.floor(e / 1e4);
|
|
let s = t.get(i);
|
|
return void 0 === s && (s = [], t.set(i, s)), s
|
|
}
|
|
|
|
function C(e, t, i, s, r, n) {
|
|
let o = -1 / 0,
|
|
a = 1 / 0,
|
|
l = 0;
|
|
const c = new Map;
|
|
for (let s = 0; s < e.length; ++s) {
|
|
const n = e[s],
|
|
h = r(n);
|
|
t(n) ? (o = Math.max(o, h), P(h, c).push(n)) : i(n) && (h < 0 && (a = Math.min(a, h)),
|
|
l = Math.max(l, h))
|
|
}
|
|
if (n) {
|
|
return Math.max(l, o) + 1
|
|
}
|
|
if (o === -1 / 0) return a === 1 / 0 ? -1 : a - 1;
|
|
if (o > 0 || o % 1e4 < -1) return o + 1;
|
|
for (const e of P(o, c)) s(e, r(e) - 1);
|
|
return o
|
|
}
|
|
|
|
function x(e, t) {
|
|
return C(e, h, u, m, g, t)
|
|
}
|
|
|
|
function T(e, t) {
|
|
return C(e, a.isLineToolState, a.isStudyState, _, f, t)
|
|
}
|
|
|
|
function I(e) {
|
|
let t = -1e4;
|
|
for (const i of e) u(i) && (t = Math.min(t, i.zorder() - 1e4));
|
|
return 0 === t ? -1e4 : t
|
|
}
|
|
|
|
function M(e) {
|
|
return Math.abs(e / o.specialZOrderBase)
|
|
}
|
|
|
|
function O(e) {
|
|
return Math.abs(e % 1e4 / 1e4)
|
|
}
|
|
|
|
function L(e, t) {
|
|
return null !== e && M(e) >= .7 || null !== t && O(t) > .7
|
|
}
|
|
|
|
function A(e, t) {
|
|
const i = 1e4 * ((s = e / 1e4) >= 0 ? Math.ceil(s) : Math.floor(s));
|
|
var s;
|
|
return i === e ? i + 1e4 * t : i
|
|
}
|
|
|
|
function E(e, t, i, s, r, n, a, c, h) {
|
|
if (s(t[0])) return void(i < e.length && c(e[i]) < 0 ? v(e, i, 1e4, 1, a, r, s) : b(e, Math
|
|
.max(0, Math.min(i - 1, e.length - 1)), -1e4, -1, a, r, s));
|
|
const {
|
|
newItems: u,
|
|
movedItemsStartIndex: d
|
|
} = i > 0 ? Object(l.moveAfter)(e, t, i - 1) : Object(l.moveBefore)(e, t, 0), p = d, _ = d +
|
|
t.length - 1, m = p > 0 ? c(u[p - 1]) : c(u[p]) - 1, f = _ < e.length - 1 ? c(u[_ +
|
|
1]) : c(u[_]) + 1;
|
|
if (m >= 0 && f > 0) v(u, p, A(m, 1), m + 1, a, r, s);
|
|
else if (f <= 0 && m < 0) b(u, _, A(f, -1), f - 1, a, r, s);
|
|
else {
|
|
let e = -o.specialZOrderBase;
|
|
for (const t of u) s(t) ? e = 1 : (a(t, e), e += 1);
|
|
S(u, s, r, n, a, h)
|
|
}
|
|
}
|
|
|
|
function k(e, t, i, s, r, n, o, a, l) {
|
|
const c = e.indexOf(i) + 1;
|
|
E(e, t, c, s, r, n, o, a, l)
|
|
}
|
|
|
|
function D(e, t, i, s, r, n, o, a, l) {
|
|
const c = e.indexOf(i);
|
|
E(e, t, c, s, r, n, o, a, l)
|
|
}
|
|
|
|
function V(e, t, i) {
|
|
k(e, t, i, c, u, h, m, g, p)
|
|
}
|
|
|
|
function B(e, t, i) {
|
|
D(e, t, i, c, u, h, m, g, p)
|
|
}
|
|
|
|
function R(e, t, i) {
|
|
k(e, t, i, a.isMainSeriesState, a.isStudyState, a.isLineToolState, _, f, d)
|
|
}
|
|
|
|
function N(e, t, i) {
|
|
D(e, t, i, a.isMainSeriesState, a.isStudyState, a.isLineToolState, _, f, d)
|
|
}
|
|
},
|
|
"2kV1": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "StudyStatusView", (function() {
|
|
return r
|
|
}));
|
|
var s = i("nBJD");
|
|
class r extends s.a {
|
|
constructor(e) {
|
|
super(e.statusProvider())
|
|
}
|
|
color() {
|
|
return this._statusProvider.color()
|
|
}
|
|
getSplitTitle() {
|
|
return this._statusProvider.getSplitTitle()
|
|
}
|
|
update() {
|
|
this._text = this._statusProvider.text()
|
|
}
|
|
}
|
|
},
|
|
"2uTr": function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e) {
|
|
return e + "…"
|
|
}
|
|
i.r(t), i.d(t, "appendEllipsis", (function() {
|
|
return s
|
|
}))
|
|
},
|
|
"3/8U": function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return n
|
|
}));
|
|
var s = i("HGP3"),
|
|
r = i("Tmoa");
|
|
const n = Object(r.generateColor)(s.colorsPalette["color-tv-blue-500"], 75)
|
|
},
|
|
"38az": function(e, t, i) {
|
|
"use strict";
|
|
var s = i("k9/m").PlotRowSearchMode,
|
|
r = i("Tmoa").rgbaFromInteger;
|
|
|
|
function n() {
|
|
this.backColorers = []
|
|
}
|
|
|
|
function o(e) {
|
|
n.call(this), this._series = e
|
|
}
|
|
|
|
function a(e, t) {
|
|
n.call(this), this._study = e, this._plotIndex = t
|
|
}
|
|
n.prototype.barStyle = function(e, t, i) {
|
|
for (var s = {}, r = this.backColorers.length - 1; r >= 0; r--) this.backColorers[r]
|
|
.applyBarStyle(e, t, s, i);
|
|
return this.applyBarStyle(e, t, s, i), s
|
|
}, n.prototype.pushBackBarColorer = function(e) {
|
|
this.backColorers.push(e)
|
|
}, n.prototype.applyBarStyle = function(e, t, i) {
|
|
throw new Error("This function is supposed to be reimplemented in a subclass")
|
|
}, inherit(o, n), o.upColor = function(e, t) {
|
|
switch (e.style.value()) {
|
|
case TradingView.Series.STYLE_LINE:
|
|
return e.lineStyle.color.value();
|
|
case TradingView.Series.STYLE_AREA:
|
|
return e.areaStyle.linecolor.value();
|
|
case TradingView.Series.STYLE_BARS:
|
|
return e.barStyle.upColor.value();
|
|
case TradingView.Series.STYLE_CANDLES:
|
|
return e.candleStyle.upColor.value();
|
|
case TradingView.Series.STYLE_HOLLOW_CANDLES:
|
|
return e.hollowCandleStyle.upColor.value();
|
|
case TradingView.Series.STYLE_HEIKEN_ASHI:
|
|
return e.haStyle.upColor.value();
|
|
case TradingView.Series.STYLE_BASELINE:
|
|
return e.baselineStyle.topLineColor.value();
|
|
case TradingView.Series.STYLE_HILO:
|
|
return e.hiloStyle.color.value()
|
|
}
|
|
throw new Error("Unknown series style")
|
|
}, o.downColor = function(e, t) {
|
|
switch (e.style.value()) {
|
|
case TradingView.Series.STYLE_LINE:
|
|
return e.lineStyle.color.value();
|
|
case TradingView.Series.STYLE_AREA:
|
|
return e.areaStyle.linecolor.value();
|
|
case TradingView.Series.STYLE_BARS:
|
|
return e.barStyle.downColor.value();
|
|
case TradingView.Series.STYLE_CANDLES:
|
|
return e.candleStyle.downColor.value();
|
|
case TradingView.Series.STYLE_HOLLOW_CANDLES:
|
|
return e.hollowCandleStyle.downColor.value();
|
|
case TradingView.Series.STYLE_HEIKEN_ASHI:
|
|
return e.haStyle.downColor.value();
|
|
case TradingView.Series.STYLE_BASELINE:
|
|
return e.baselineStyle.bottomLineColor.value();
|
|
case TradingView.Series.STYLE_HILO:
|
|
return e.hiloStyle.color.value()
|
|
}
|
|
throw new Error("Unknown series style")
|
|
}, o.prototype._applyLineStyle = function(e, t, i, s, r) {
|
|
i.barColor = o.upColor(r)
|
|
}, o.prototype._applyAreaStyle = function(e, t, i, s, r) {
|
|
i.barColor = o.upColor(r)
|
|
}, o.prototype._applyBarStyle = function(e, t, i, s, r) {
|
|
var n = o.upColor(r),
|
|
a = o.downColor(r),
|
|
l = this.findBar(e, !1, s);
|
|
if (r.barStyle.barColorsOnPrevClose.value()) {
|
|
var c = this.findPrevBar(e, !1, s);
|
|
i.barColor = c[TradingView.CLOSE_PLOT] <= l[TradingView.CLOSE_PLOT] ? n : a, i
|
|
.barBorderColor = c[TradingView.CLOSE_PLOT] <= l[TradingView.CLOSE_PLOT] ? n : a
|
|
} else i.barColor = l[TradingView.OPEN_PLOT] <= l[TradingView.CLOSE_PLOT] ? n : a, i
|
|
.barBorderColor = l[TradingView.OPEN_PLOT] <= l[TradingView.CLOSE_PLOT] ? n : a
|
|
}, o.prototype._applyCandleStyle = function(e, t, i, s, r) {
|
|
var n, a = o.upColor(r, t),
|
|
l = o.downColor(r, t),
|
|
c = r.candleStyle.borderUpColor ? r.candleStyle.borderUpColor.value() : r
|
|
.candleStyle.borderColor.value(),
|
|
h = r.candleStyle.borderDownColor ? r.candleStyle.borderDownColor.value() : r
|
|
.candleStyle.borderColor.value(),
|
|
u = r.candleStyle.wickUpColor ? r.candleStyle.wickUpColor.value() : r.candleStyle
|
|
.wickColor.value(),
|
|
d = r.candleStyle.wickDownColor ? r.candleStyle.wickDownColor.value() : r
|
|
.candleStyle.wickColor.value(),
|
|
p = this.findBar(e, !1, s);
|
|
r.candleStyle.barColorsOnPrevClose.value() ? n = this.findPrevBar(e, !1, s)[TradingView
|
|
.CLOSE_PLOT] <= p[TradingView.CLOSE_PLOT] : n = p[TradingView.OPEN_PLOT] <= p[
|
|
TradingView.CLOSE_PLOT];
|
|
i.barColor = n ? a : l, i.barBorderColor = n ? c : h, i.barWickColor = n ? u : d
|
|
}, o.prototype._applyHollowCandleStyle = function(e, t, i, s, r) {
|
|
var n = o.upColor(r, t),
|
|
a = o.downColor(r, t),
|
|
l = r.hollowCandleStyle.borderUpColor ? r.hollowCandleStyle.borderUpColor.value() :
|
|
r.hollowCandleStyle.borderColor.value(),
|
|
c = r.hollowCandleStyle.borderDownColor ? r.hollowCandleStyle.borderDownColor
|
|
.value() : r.hollowCandleStyle.borderColor.value(),
|
|
h = r.hollowCandleStyle.wickUpColor ? r.hollowCandleStyle.wickUpColor.value() : r
|
|
.hollowCandleStyle.wickColor.value(),
|
|
u = r.hollowCandleStyle.wickDownColor ? r.hollowCandleStyle.wickDownColor.value() :
|
|
r.hollowCandleStyle.wickColor.value(),
|
|
d = this.findBar(e, !1, s);
|
|
this.findPrevBar(e, !1, s)[TradingView.CLOSE_PLOT] <= d[TradingView.CLOSE_PLOT] ? (i
|
|
.barColor = n, i.barBorderColor = l, i.barWickColor = h) : (i.barColor = a, i
|
|
.barBorderColor = c, i.barWickColor = u), i.isBarHollow = d[TradingView
|
|
.OPEN_PLOT] <= d[TradingView.CLOSE_PLOT]
|
|
}, o.prototype._applyHAStyle = function(e, t, i, s, r) {
|
|
var n, a = o.upColor(r, t),
|
|
l = o.downColor(r, t),
|
|
c = r.haStyle.borderUpColor.value(),
|
|
h = r.haStyle.borderDownColor.value(),
|
|
u = r.haStyle.wickUpColor.value(),
|
|
d = r.haStyle.wickDownColor.value(),
|
|
p = this.findBar(e, t, s);
|
|
r.haStyle.barColorsOnPrevClose.value() ? n = this.findPrevBar(e, t, s)[TradingView
|
|
.CLOSE_PLOT] <= p[TradingView.CLOSE_PLOT] : n = p[TradingView.OPEN_PLOT] <= p[
|
|
TradingView.CLOSE_PLOT];
|
|
i.barColor = n ? a : l, i.barBorderColor = n ? c : h, i.barWickColor = n ? u : d
|
|
}, o.prototype._applyBaseLineStyle = function(e, t, i, s, r) {
|
|
var n = this.findBar(e, t, s),
|
|
a = r.baselineStyle,
|
|
l = this._series.priceScale(),
|
|
c = Math.round(l.height() * (Math.abs(100 - a.baseLevelPercentage.value()) / 100)),
|
|
h = this._series.firstValue(),
|
|
u = l.coordinateToPrice(c, h);
|
|
n[TradingView.CLOSE_PLOT] > u ? i.barColor = o.upColor(r, t) : i.barColor = o.downColor(
|
|
r, t)
|
|
}, o.prototype._applyHiLoStyle = function(e, t, i, s, r) {
|
|
i.barColor = o.upColor(r, t), i.barBorderColor = r.hiloStyle.borderColor.value()
|
|
}, o.prototype.applyBarStyle = function(e, t, i, s) {
|
|
i || (i = {}),
|
|
i.barColor = null, i.barBorderColor = null, i.barWickColor = null, i.isBarHollow =
|
|
null, i.isBarUp = null, i.upColor = null, i.downColor = null, i.isTwoColorBar =
|
|
null, i.isMergedBar = null;
|
|
var r = this._series.properties();
|
|
switch (r.style.value()) {
|
|
case TradingView.Series.STYLE_LINE:
|
|
this._applyLineStyle(e, t, i, s, r);
|
|
break;
|
|
case TradingView.Series.STYLE_AREA:
|
|
this._applyAreaStyle(e, t, i, s, r);
|
|
break;
|
|
case TradingView.Series.STYLE_BARS:
|
|
this._applyBarStyle(e, t, i, s, r);
|
|
break;
|
|
case TradingView.Series.STYLE_CANDLES:
|
|
this._applyCandleStyle(e, t, i, s, r);
|
|
break;
|
|
case TradingView.Series.STYLE_HOLLOW_CANDLES:
|
|
this._applyHollowCandleStyle(e, t, i, s, r);
|
|
break;
|
|
case TradingView.Series.STYLE_HEIKEN_ASHI:
|
|
this._applyHAStyle(e, t, i, s, r);
|
|
break;
|
|
case TradingView.Series.STYLE_BASELINE:
|
|
this._applyBaseLineStyle(e, t, i, s, r);
|
|
break;
|
|
case TradingView.Series.STYLE_HILO:
|
|
this._applyHiLoStyle(e, t, i, s, r)
|
|
}
|
|
return i
|
|
}, o.prototype.getSeriesBars = function(e) {
|
|
return e ? this._series.nsBars() : this._series.bars()
|
|
}, o.prototype._findBarFieldValue = function(e, t, i) {
|
|
var s = this.getSeriesBars(i).valueAt(e);
|
|
if (null !== s) return s[t]
|
|
}, o.prototype.findBar = function(e, t, i) {
|
|
return i ? i.value : this.getSeriesBars(t).valueAt(e) || []
|
|
}, o.prototype.findPrevBar = function(e, t, i) {
|
|
if (i && i.previousValue) return i.previousValue;
|
|
var r = this._series.bars().search(e - 1, s.NearestLeft, TradingView.CLOSE_PLOT);
|
|
return null !== r ? r.value : []
|
|
}, inherit(a, n), a.prototype.getBars = function() {
|
|
return this._study.series().bars()
|
|
}, a.prototype.firstColoredBar = function(e) {
|
|
for (var t = e, i = 0; i < this.backColorers.length; i++) t = Math.min(t, this
|
|
.backColorers[i].firstColoredBar(e));
|
|
var s = this.getOffset(this._plotIndex);
|
|
t = Math.min(t, e + s);
|
|
var r = this.getBars().firstIndex();
|
|
return Math.max(t, r)
|
|
}, a.prototype.getOffset = function() {
|
|
var e = this._study.metaInfo().plots[this._plotIndex];
|
|
return this._study.offset(e.id)
|
|
}, a.prototype.applyBarStyle = function(e, t, i) {
|
|
if (i || (i = {}), t) return i;
|
|
var s = this._study.properties();
|
|
if (!s.visible.value()) return i;
|
|
var n = this._study.metaInfo(),
|
|
o = this._study.data();
|
|
if (!o || 0 === o.size()) return i;
|
|
var a = n.plots[this._plotIndex],
|
|
l = this.getOffset();
|
|
if (this._study.getMinFirstBarIndexForPlot(a.id) > e + l) return i;
|
|
var c = s.styles[a.id];
|
|
if (c.visible && !c.visible.value()) return i;
|
|
var h = o.valueAt(e - l);
|
|
if (null === h) return i;
|
|
var u = h[this._plotIndex + 1];
|
|
if (null == u) return i;
|
|
if (u = Math.round(u), n.isRGB) i.barColor = r(u), i.upColor = i.barColor, i.downColor =
|
|
i.barColor;
|
|
else {
|
|
var d = n.plots[this._plotIndex].palette,
|
|
p = s.palettes[d],
|
|
_ = n.palettes[d].valToIndex ? n.palettes[d].valToIndex[u] : u,
|
|
m = p.colors[_].color.value();
|
|
i.barColor = m, i.upColor = m.color, i.downColor = m.color
|
|
}
|
|
return i
|
|
}, t.SeriesBarColorer = o, t.StudyBarColorer = a
|
|
},
|
|
"3ClC": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("0YCj"),
|
|
r = i.n(s),
|
|
n = i("GVHu"),
|
|
o = i("PL0c"),
|
|
a = i("cKqi"),
|
|
l = i("YzC7"),
|
|
c = i("TMWk"),
|
|
h = i("8sOK");
|
|
class u extends n.Study {
|
|
constructor(e, t, i, s) {
|
|
super(e, t, i, s), this.properties().styles.vol_ma.visible.listeners()
|
|
.subscribe(this, () => this.invalidateTitleCache())
|
|
}
|
|
base() {
|
|
return 1
|
|
}
|
|
destroy() {
|
|
this.properties().styles.vol_ma.visible.listeners().unsubscribeAll(this), super
|
|
.destroy()
|
|
}
|
|
_titleInputs() {
|
|
const e = {
|
|
symbolsForDisplay: !0,
|
|
skipHiddenInputs: !0,
|
|
fakeInputsForDisplay: !0,
|
|
asObject: !1
|
|
};
|
|
return this.properties().styles.vol_ma.visible.value() ? this.inputs(e) : this
|
|
.inputs({
|
|
...e,
|
|
skippedInputs: ["length"]
|
|
})
|
|
}
|
|
}
|
|
var d = i("Eyy1"),
|
|
p = i("Qb4w");
|
|
class _ extends n.Study {
|
|
priceRange(e, t) {
|
|
let i = !1;
|
|
this.graphics().hhists().forEach((e, t) => {
|
|
i = i || this.properties().child("graphics").child("hhists").child(
|
|
t).child("showValues").value()
|
|
});
|
|
const s = function(e, t, i, s) {
|
|
let r = null;
|
|
return e.forEach((e, s) => {
|
|
e.forEach(e => {
|
|
e.firstBarTime <= i && e.lastBarTime >= t && (
|
|
null === r ? r = {
|
|
low: {
|
|
l: e.priceLow,
|
|
h: e.priceHigh
|
|
},
|
|
high: {
|
|
h: e.priceHigh
|
|
}
|
|
} : (e.priceLow < r.low.l && (r.low.l =
|
|
e.priceLow, r.low.h = e
|
|
.priceHigh), r.high.h = Math
|
|
.max(r.high.h, e.priceHigh)))
|
|
})
|
|
}), null === r ? null : s ? new p.PriceRange(r.low.l - .8 * (r.low
|
|
.h - r.low.l), r.high.h) : new p.PriceRange(r.low.l, r.high.h)
|
|
}(this.graphics().hhists(), e, t, i);
|
|
if (null === s) return null;
|
|
const r = Object(d.ensureNotNull)(this.priceScale());
|
|
return r.isLog() ? new p.PriceRange(r.priceToLogical(s.minValue()), r
|
|
.priceToLogical(s.maxValue())) : s
|
|
}
|
|
}
|
|
|
|
function m(e, t = "shift", i) {
|
|
return {
|
|
studyConstructor: e,
|
|
colorRotationMode: t,
|
|
colorRotationComparator: i
|
|
}
|
|
}
|
|
i.d(t, "isStudy", (function() {
|
|
return g
|
|
})), i.d(t, "isStudyStrategy", (function() {
|
|
return b
|
|
})), i.d(t, "isStudyStub", (function() {
|
|
return v
|
|
})), i.d(t, "isFundamentalStudy", (function() {
|
|
return S
|
|
})), i.d(t, "isESDStudy", (function() {
|
|
return y
|
|
})), i.d(t, "isFundamentalStudyMetaInfo", (function() {
|
|
return w
|
|
})), i.d(t, "createStudy", (function() {
|
|
return C
|
|
})), i.d(t, "studyColorRotationMode", (function() {
|
|
return x
|
|
})), i.d(t, "useSameColorRotationComparator", (function() {
|
|
return I
|
|
}));
|
|
const f = {
|
|
study_PivotPointsStandard: m(o.study_PivotPointsStandard),
|
|
study_Overlay: m(a.study_Overlay, "loop"),
|
|
study_Compare: m(l.a, "loop"),
|
|
study_Volume: m(u),
|
|
study_VbPVisible: m(class extends _ {}),
|
|
study_ScriptWithDataOffset: m(c.study_ScriptWithDataOffset)
|
|
};
|
|
for (const e in f) f.hasOwnProperty(e) && (TradingView[e] = f[e].studyConstructor);
|
|
|
|
function g(e) {
|
|
return e instanceof n.Study
|
|
}
|
|
|
|
function b(e) {
|
|
return !1
|
|
}
|
|
|
|
function v(e) {
|
|
return e instanceof h.StudyStub
|
|
}
|
|
|
|
function S(e) {
|
|
return e instanceof Fundamental
|
|
}
|
|
|
|
function y(e) {
|
|
return !1
|
|
}
|
|
|
|
function w(e) {
|
|
return "study_Internal$STD;Fund_" === P(e)
|
|
}
|
|
|
|
function P(e) {
|
|
const t = "study_" + (e.classId || e.shortId);
|
|
return t.startsWith("study_Internal$STD;Fund_") ? "study_Internal$STD;Fund_" : t
|
|
}
|
|
|
|
function C(e, t, i, s, r) {
|
|
const o = P(s),
|
|
a = new(o in f ? f[o].studyConstructor : n.Study)(e, t, i, s);
|
|
return void 0 !== r && a.setId(r), a
|
|
}
|
|
|
|
function x(e) {
|
|
const t = P(e);
|
|
return t in f ? f[t].colorRotationMode : void 0 === e.pine || r.a.isStandardPine(e.id) ?
|
|
1 !== e.plots.length ? "shift" : "loop" : null
|
|
}
|
|
|
|
function T(e, t) {
|
|
return e.id === t.id && (s = t, ((i = e).pine ? i.pine.version : void 0) === (s.pine ? s
|
|
.pine.version : void 0));
|
|
var i, s
|
|
}
|
|
|
|
function I(e) {
|
|
const t = P(e);
|
|
if (t in f) {
|
|
const e = f[t].colorRotationComparator;
|
|
if (void 0 !== e) return e
|
|
}
|
|
return T
|
|
}
|
|
},
|
|
"3UA0": function(e, t) {
|
|
e.exports.tzData = {
|
|
"America/New_York": {
|
|
time: [-2717668562, -1633298400, -1615154400, -1601848800, -1583704800, -1570399200,
|
|
-1551650400, -1536530400, -1523224800, -1504476e3, -1491775200, -1473026400,
|
|
-1459720800, -1441576800, -1428271200, -1410127200, -1396821600, -
|
|
1378677600, -1365372e3, -1347228e3, -1333922400, -1315173600, -1301868e3, -
|
|
1283724e3, -1270418400, -1252274400, -1238968800, -1220824800, -1207519200,
|
|
-1189375200, -1176069600, -1157320800, -114462e4, -1125871200, -1112565600,
|
|
-1094421600, -1081116e3, -1062972e3, -1049666400, -1031522400, -1018216800,
|
|
-1000072800, -986767200, -968018400, -955317600, -936568800, -923263200, -
|
|
905119200, -891813600, -880236e3, -76941e4, -765410400, -747266400, -
|
|
733960800, -715816800, -702511200, -684367200, -671061600, -652917600, -
|
|
639612e3, -620863200, -608162400, -589413600, -576108e3, -557964e3, -
|
|
544658400, -526514400, -513208800, -495064800, -481759200, -463615200, -
|
|
447285600, -431560800, -415836e3, -400111200, -384386400, -368661600, -
|
|
352936800, -337212e3, -321487200, -305762400, -289432800, -273708e3, -
|
|
257983200, -242258400, -226533600, -210808800, -195084e3, -179359200, -
|
|
163634400, -147909600, -13158e4, -11646e4, -100130400, -84405600, -68680800,
|
|
-52956e3, -37231200, -21506400, -5781600, 9943200, 25668e3, 41392800,
|
|
57722400, 73447200, 89172e3, 104896800, 120621600, 126669600, 152071200,
|
|
162352800, 183520800, 199245600, 215575200, 230695200, 247024800, 262749600,
|
|
278474400, 294199200, 309924e3, 325648800, 341373600, 357098400, 372823200,
|
|
388548e3, 404877600, 419997600, 436327200, 452052e3, 467776800, 483501600,
|
|
499226400, 514951200, 530676e3, 544586400, 562125600, 576036e3, 59418e4,
|
|
607485600, 625629600, 638935200, 657079200, 670989600, 688528800, 702439200,
|
|
719978400, 733888800, 752032800, 765338400, 783482400, 796788e3, 814932e3,
|
|
828842400, 846381600, 860292e3, 877831200, 891741600, 909280800, 923191200,
|
|
941335200, 954640800, 972784800, 986090400, 1004234400, 1018144800,
|
|
1035684e3, 1049594400, 1067133600, 1081044e3, 1099188e3, 1112493600,
|
|
1130637600, 1143943200, 1162087200, 1173578400, 1194141600, 1205028e3,
|
|
1225591200, 1236477600, 1257040800, 1268532e3, 1289095200, 1299981600,
|
|
1320544800, 1331431200, 1351994400, 1362880800, 1383444e3, 1394330400,
|
|
1414893600, 142578e4, 1446343200, 1457834400, 1478397600, 1489284e3,
|
|
1509847200, 1520733600, 1541296800, 1552183200, 1572746400, 1583632800,
|
|
1604196e3, 1615687200, 1636250400, 1647136800, 16677e5, 1678586400,
|
|
1699149600, 1710036e3, 1730599200, 1741485600, 1762048800, 1772935200,
|
|
1793498400, 1804989600, 1825552800, 1836439200, 1857002400, 1867888800,
|
|
1888452e3, 1899338400, 1919901600, 1930788e3
|
|
],
|
|
offset: [-17762, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3,
|
|
-14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
|
|
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
|
|
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
|
|
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
|
|
14400, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -
|
|
18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -
|
|
18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -
|
|
18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -
|
|
18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -
|
|
18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -
|
|
18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -
|
|
18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -
|
|
18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -
|
|
18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -
|
|
18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -
|
|
18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -
|
|
18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -
|
|
18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -
|
|
18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -
|
|
18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -
|
|
18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -
|
|
18e3, -14400, -18e3
|
|
]
|
|
},
|
|
"America/Los_Angeles": {
|
|
time: [-2717668378, -1633298400, -1615154400, -1601848800, -1583704800, -880236e3, -
|
|
769420800, -765410400, -687995940, -662680800, -620866800, -608162400, -
|
|
589417200, -576108e3, -557967600, -544658400, -526518e3, -513208800, -
|
|
495068400, -481759200, -463618800, -450309600, -431564400, -418255200, -
|
|
400114800, -386805600, -368665200, -355356e3, -337215600, -323906400, -
|
|
305766e3, -292456800, -273711600, -261007200, -242262e3, -226533600, -
|
|
210812400, -195084e3, -179362800, -163634400, -147913200, -13158e4, -
|
|
116463600, -100130400, -84405600, -68680800, -52956e3, -37231200, -21506400,
|
|
-5781600, 9943200, 25668e3, 41392800, 57722400, 73447200, 89172e3,
|
|
104896800, 120621600, 126669600, 152071200, 162352800, 183520800, 199245600,
|
|
215575200, 230695200, 247024800, 262749600, 278474400, 294199200, 309924e3,
|
|
325648800, 341373600, 357098400, 372823200, 388548e3, 404877600, 419997600,
|
|
436327200, 452052e3, 467776800, 483501600, 499226400, 514951200, 530676e3,
|
|
544586400, 562125600, 576036e3, 59418e4, 607485600, 625629600, 638935200,
|
|
657079200, 670989600, 688528800, 702439200, 719978400, 733888800, 752032800,
|
|
765338400, 783482400, 796788e3, 814932e3, 828842400, 846381600, 860292e3,
|
|
877831200, 891741600, 909280800, 923191200, 941335200, 954640800, 972784800,
|
|
986090400, 1004234400, 1018144800, 1035684e3, 1049594400, 1067133600,
|
|
1081044e3, 1099188e3, 1112493600, 1130637600, 1143943200, 1162087200,
|
|
1173578400, 1194141600, 1205028e3, 1225591200, 1236477600, 1257040800,
|
|
1268532e3, 1289095200, 1299981600, 1320544800, 1331431200, 1351994400,
|
|
1362880800, 1383444e3, 1394330400, 1414893600, 142578e4, 1446343200,
|
|
1457834400, 1478397600, 1489284e3, 1509847200, 1520733600, 1541296800,
|
|
1552183200, 1572746400, 1583632800, 1604196e3, 1615687200, 1636250400,
|
|
1647136800, 16677e5, 1678586400, 1699149600, 1710036e3, 1730599200,
|
|
1741485600, 1762048800, 1772935200, 1793498400, 1804989600, 1825552800,
|
|
1836439200, 1857002400, 1867888800, 1888452e3, 1899338400, 1919901600,
|
|
1930788e3
|
|
],
|
|
offset: [-28378, -28800, -25200, -28800, -25200, -28800, -25200, -25200, -28800, -
|
|
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
|
|
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
|
|
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
|
|
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
|
|
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
|
|
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
|
|
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
|
|
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
|
|
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
|
|
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
|
|
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
|
|
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
|
|
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
|
|
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
|
|
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
|
|
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
|
|
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
|
|
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
|
|
25200, -28800
|
|
]
|
|
},
|
|
"America/Chicago": {
|
|
time: [-2717668236, -1633298400, -1615154400, -1601848800, -1583704800, -1563746400,
|
|
-1551650400, -1538949600, -1520200800, -1504476e3, -1491775200, -1473026400,
|
|
-1459720800, -1441576800, -1428271200, -1410127200, -1396821600, -
|
|
1378677600, -1365372e3, -1347228e3, -1333922400, -1315173600, -1301868e3, -
|
|
1283724e3, -1270418400, -1252274400, -1238968800, -1220824800, -1207519200,
|
|
-1189375200, -1176069600, -1157320800, -114462e4, -1125871200, -1112565600,
|
|
-1094421600, -1081116e3, -1067810400, -1045432800, -1031522400, -1018216800,
|
|
-1000072800, -986767200, -968018400, -955317600, -936568800, -923263200, -
|
|
905119200, -891813600, -880236e3, -769413600, -765410400, -747266400, -
|
|
733960800, -715816800, -702511200, -684367200, -671061600, -652917600, -
|
|
639612e3, -620863200, -608162400, -589413600, -576108e3, -557964e3, -
|
|
544658400, -526514400, -513208800, -495064800, -481759200, -463615200, -
|
|
447285600, -431560800, -415836e3, -400111200, -384386400, -368661600, -
|
|
352936800, -337212e3, -321487200, -305762400, -289432800, -273708e3, -
|
|
257983200, -242258400, -226533600, -210808800, -195084e3, -179359200, -
|
|
163634400, -147909600, -13158e4, -11646e4, -100130400, -84405600, -68680800,
|
|
-52956e3, -37231200, -21506400, -5781600, 9943200, 25668e3, 41392800,
|
|
57722400, 73447200, 89172e3, 104896800, 120621600, 126669600, 152071200,
|
|
162352800, 183520800, 199245600, 215575200, 230695200, 247024800, 262749600,
|
|
278474400, 294199200, 309924e3, 325648800, 341373600, 357098400, 372823200,
|
|
388548e3, 404877600, 419997600, 436327200, 452052e3, 467776800, 483501600,
|
|
499226400, 514951200, 530676e3, 544586400, 562125600, 576036e3, 59418e4,
|
|
607485600, 625629600, 638935200, 657079200, 670989600, 688528800, 702439200,
|
|
719978400, 733888800, 752032800, 765338400, 783482400, 796788e3, 814932e3,
|
|
828842400, 846381600, 860292e3, 877831200, 891741600, 909280800, 923191200,
|
|
941335200, 954640800, 972784800, 986090400, 1004234400, 1018144800,
|
|
1035684e3, 1049594400, 1067133600, 1081044e3, 1099188e3, 1112493600,
|
|
1130637600, 1143943200, 1162087200, 1173578400, 1194141600, 1205028e3,
|
|
1225591200, 1236477600, 1257040800, 1268532e3, 1289095200, 1299981600,
|
|
1320544800, 1331431200, 1351994400, 1362880800, 1383444e3, 1394330400,
|
|
1414893600, 142578e4, 1446343200, 1457834400, 1478397600, 1489284e3,
|
|
1509847200, 1520733600, 1541296800, 1552183200, 1572746400, 1583632800,
|
|
1604196e3, 1615687200, 1636250400, 1647136800, 16677e5, 1678586400,
|
|
1699149600, 1710036e3, 1730599200, 1741485600, 1762048800, 1772935200,
|
|
1793498400, 1804989600, 1825552800, 1836439200, 1857002400, 1867888800,
|
|
1888452e3, 1899338400, 1919901600, 1930788e3
|
|
],
|
|
offset: [-21036, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600,
|
|
-18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -
|
|
18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -
|
|
18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -
|
|
18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -
|
|
18e3, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -
|
|
21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -
|
|
21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -
|
|
21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -
|
|
21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -
|
|
21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -
|
|
21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -
|
|
21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -
|
|
21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -
|
|
21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -
|
|
21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -
|
|
21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -
|
|
21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -
|
|
21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -
|
|
21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -
|
|
21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -
|
|
21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -
|
|
21600, -18e3, -21600
|
|
]
|
|
},
|
|
"America/Phoenix": {
|
|
time: [-2717670498, -1633298400, -1615154400, -1601848800, -1583704800, -880236e3, -
|
|
820540740, -812678340, -796867140, -84405600, -68680800, 1924966800
|
|
],
|
|
offset: [-26898, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -
|
|
25200, -21600, -25200
|
|
]
|
|
},
|
|
"America/Toronto": {
|
|
time: [-2366755200, -1632088800, -1615154400, -1601771400, -1583712e3, -1567375200,
|
|
-1554681600, -1534716e3, -1524088800, -1503266400, -149238e4, -1471816800, -
|
|
1460930400, -1440972e3, -1428876e3, -1409522400, -1397426400, -1378072800, -
|
|
1365976800, -1346623200, -1333922400, -1315173600, -1301868e3, -1283724e3, -
|
|
1270418400, -1252274400, -1238968800, -1220824800, -1207519200, -1188770400,
|
|
-1176069600, -1157320800, -1144015200, -1125871200, -1112565600, -
|
|
1094421600, -1081116e3, -1062972e3, -1049666400, -1031522400, -1018216800, -
|
|
1000072800, -986767200, -968018400, -955317600, -936568800, -880232400, -
|
|
76941e4, -765410400, -747266400, -733960800, -715824e3, -702518400, -
|
|
684374400, -671068800, -652924800, -634176e3, -620863200, -602719200, -
|
|
589413600, -576108e3, -557964e3, -544658400, -526514400, -513208800, -
|
|
495064800, -481759200, -463615200, -450309600, -431560800, -418255200, -
|
|
400111200, -384386400, -368661600, -352936800, -337212e3, -321487200, -
|
|
305762400, -289432800, -273708e3, -257983200, -242258400, -226533600, -
|
|
210808800, -195084e3, -179359200, -163634400, -147909600, -13158e4, -
|
|
11646e4, -100130400, -84405600, -68680800, -52956e3, -37231200, -21506400, -
|
|
5781600, 9943200, 25668e3, 41392800, 57722400, 73447200, 89172e3, 104896800,
|
|
120621600, 136346400, 152071200, 167796e3, 183520800, 199245600, 215575200,
|
|
230695200, 247024800, 262749600, 278474400, 294199200, 309924e3, 325648800,
|
|
341373600, 357098400, 372823200, 388548e3, 404877600, 419997600, 436327200,
|
|
452052e3, 467776800, 483501600, 499226400, 514951200, 530676e3, 544586400,
|
|
562125600, 576036e3, 59418e4, 607485600, 625629600, 638935200, 657079200,
|
|
670989600, 688528800, 702439200, 719978400, 733888800, 752032800, 765338400,
|
|
783482400, 796788e3, 814932e3, 828842400, 846381600, 860292e3, 877831200,
|
|
891741600, 909280800, 923191200, 941335200, 954640800, 972784800, 986090400,
|
|
1004234400, 1018144800, 1035684e3, 1049594400, 1067133600, 1081044e3,
|
|
1099188e3, 1112493600, 1130637600, 1143943200, 1162087200, 1173578400,
|
|
1194141600, 1205028e3, 1225591200, 1236477600, 1257040800, 1268532e3,
|
|
1289095200, 1299981600, 1320544800, 1331431200, 1351994400, 1362880800,
|
|
1383444e3, 1394330400, 1414893600, 142578e4, 1446343200, 1457834400,
|
|
1478397600, 1489284e3, 1509847200, 1520733600, 1541296800, 1552183200,
|
|
1572746400, 1583632800, 1604196e3, 1615687200, 1636250400, 1647136800,
|
|
16677e5, 1678586400, 1699149600, 1710036e3, 1730599200, 1741485600,
|
|
1762048800, 1772935200, 1793498400, 1804989600, 1825552800, 1836439200,
|
|
1857002400, 1867888800, 1888452e3, 1899338400, 1919901600, 1930788e3
|
|
],
|
|
offset: [-19052, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3,
|
|
-14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
|
|
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
|
|
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
|
|
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -14400, -14400, -18e3, -
|
|
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
|
|
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
|
|
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
|
|
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
|
|
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
|
|
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
|
|
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
|
|
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
|
|
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
|
|
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
|
|
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
|
|
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
|
|
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
|
|
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
|
|
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
|
|
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
|
|
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3
|
|
]
|
|
},
|
|
"America/Vancouver": {
|
|
time: [-2713910400, -1632088800, -1615154400, -880236e3, -769420800, -765410400, -
|
|
747266400, -733960800, -715816800, -702511200, -684367200, -671061600, -
|
|
652917600, -639612e3, -620863200, -608162400, -589413600, -576108e3, -
|
|
557964e3, -544658400, -526514400, -513208800, -495064800, -481759200, -
|
|
463615200, -450309600, -431560800, -418255200, -400111200, -386805600, -
|
|
368661600, -355356e3, -337212e3, -323906400, -305762400, -292456800, -
|
|
273708e3, -261007200, -242258400, -226533600, -210808800, -195084e3, -
|
|
179359200, -163634400, -147909600, -13158e4, -11646e4, -100130400, -
|
|
84405600, -68680800, -52956e3, -37231200, -21506400, -5781600, 9943200,
|
|
25668e3, 41392800, 57722400, 73447200, 89172e3, 104896800, 120621600,
|
|
136346400, 152071200, 167796e3, 183520800, 199245600, 215575200, 230695200,
|
|
247024800, 262749600, 278474400, 294199200, 309924e3, 325648800, 341373600,
|
|
357098400, 372823200, 388548e3, 404877600, 419997600, 436327200, 452052e3,
|
|
467776800, 483501600, 499226400, 514951200, 530676e3, 544586400, 562125600,
|
|
576036e3, 59418e4, 607485600, 625629600, 638935200, 657079200, 670989600,
|
|
688528800, 702439200, 719978400, 733888800, 752032800, 765338400, 783482400,
|
|
796788e3, 814932e3, 828842400, 846381600, 860292e3, 877831200, 891741600,
|
|
909280800, 923191200, 941335200, 954640800, 972784800, 986090400,
|
|
1004234400, 1018144800, 1035684e3, 1049594400, 1067133600, 1081044e3,
|
|
1099188e3, 1112493600, 1130637600, 1143943200, 1162087200, 1173578400,
|
|
1194141600, 1205028e3, 1225591200, 1236477600, 1257040800, 1268532e3,
|
|
1289095200, 1299981600, 1320544800, 1331431200, 1351994400, 1362880800,
|
|
1383444e3, 1394330400, 1414893600, 142578e4, 1446343200, 1457834400,
|
|
1478397600, 1489284e3, 1509847200, 1520733600, 1541296800, 1552183200,
|
|
1572746400, 1583632800, 1604196e3, 1615687200, 1636250400, 1647136800,
|
|
16677e5, 1678586400, 1699149600, 1710036e3, 1730599200, 1741485600,
|
|
1762048800, 1772935200, 1793498400, 1804989600, 1825552800, 1836439200,
|
|
1857002400, 1867888800, 1888452e3, 1899338400, 1919901600, 1930788e3
|
|
],
|
|
offset: [-29548, -28800, -25200, -28800, -25200, -25200, -28800, -25200, -28800, -
|
|
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
|
|
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
|
|
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
|
|
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
|
|
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
|
|
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
|
|
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
|
|
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
|
|
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
|
|
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
|
|
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
|
|
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
|
|
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
|
|
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
|
|
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
|
|
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
|
|
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
|
|
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
|
|
25200, -28800, -25200, -28800, -25200, -28800
|
|
]
|
|
},
|
|
"America/Argentina/Buenos_Aires": {
|
|
time: [-2372112e3, -1567468800, -1233446400, -1222992e3, -1205971200, -1194048e3, -
|
|
117288e4, -1162512e3, -1141344e3, -1130976e3, -1109808e3, -109944e4, -
|
|
1078272e3, -1067817600, -1046649600, -1036281600, -1015113600, -1004745600,
|
|
-983577600, -973209600, -952041600, -941587200, -931046400, -900892800, -
|
|
890352e3, -83376e4, -82728e4, -752284800, -733795200, -197337600, -
|
|
190857600, -184204800, -164505600, -152668800, -132969600, -121132800, -
|
|
101433600, -86832e3, -71107200, -54777600, -39052800, -23328e3, -7603200,
|
|
128131200, 136598400, 596937600, 605059200, 624412800, 636508800, 656467200,
|
|
667958400, 687916800, 699408e3, 719366400, 731462400, 938908800, 952041600,
|
|
1198972800, 1205625600, 1224374400, 1237075200, 1924981200
|
|
],
|
|
offset: [-14028, -15408, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -
|
|
10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -
|
|
14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -
|
|
10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -
|
|
14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -7200, -
|
|
10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, -
|
|
10800, -10800, -10800, -7200, -10800, -7200, -10800
|
|
]
|
|
},
|
|
"America/El_Salvador": {
|
|
time: [-1546300800, 546998400, 559699200, 578448e3, 591148800, 1924970400],
|
|
offset: [-21408, -21600, -18e3, -21600, -18e3, -21600]
|
|
},
|
|
"America/Sao_Paulo": {
|
|
time: [-1767225600, -1206968400, -1191369600, -1175385600, -1159833600, -633830400,
|
|
-622076400, -602294400, -59184e4, -570758400, -560217600, -539136e3, -
|
|
53136e4, -195436800, -184204800, -155174400, -150076800, -128908800, -
|
|
121132800, -99964800, -89596800, -68428800, -57974400, 499737600, 511228800,
|
|
530582400, 540259200, 562118400, 571190400, 592963200, 602035200, 624412800,
|
|
634694400, 656467200, 666748800, 687916800, 697593600, 719971200, 728438400,
|
|
750816e3, 761702400, 782265600, 793152e3, 813715200, 823996800, 84456e4,
|
|
856051200, 876096e3, 888710400, 908064e3, 919555200, 938908800, 951609600,
|
|
970963200, 982454400, 1003017600, 1013904e3, 1036281600, 1045353600,
|
|
1066521600, 1076803200, 1099353600, 1108857600, 1129420800, 1140307200,
|
|
1162684800, 1172361600, 119232e4, 1203206400, 1224374400, 1234656e3,
|
|
1255824e3, 1266710400, 1287273600, 129816e4, 1318723200, 1330214400,
|
|
1350777600, 1361059200, 1382227200, 1392508800, 1413676800, 1424563200,
|
|
1445126400, 1456012800, 1476576e3, 1487462400, 1508025600, 1518912e3,
|
|
1541289600, 1550361600, 1924981200
|
|
],
|
|
offset: [-11188, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800,
|
|
-7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -
|
|
7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -
|
|
7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -
|
|
7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -
|
|
7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -
|
|
7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -
|
|
7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -
|
|
7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -
|
|
7200, -10800
|
|
]
|
|
},
|
|
"America/Bogota": {
|
|
time: [-2707689600, -1739059200, 704851200, 733881600, 1924974e3],
|
|
offset: [-17776, -17776, -18e3, -14400, -18e3]
|
|
},
|
|
"America/Caracas": {
|
|
time: [-2524521600, -1826755200, -157766400, 1197169200, 1462069800, 1924977600],
|
|
offset: [-16064, -16060, -16200, -14400, -16200, -14400]
|
|
},
|
|
"Europe/Moscow": {
|
|
time: [-2840140800, -1688256e3, -165681e4, -1641340800, -1627956e3, -1618700400, -
|
|
1596416400, -1593804521, -1589846400, -1542416400, -1539478800, -1525305600,
|
|
-1522713600, -1491177600, -1247529600, 354931200, 370742400, 386467200,
|
|
402278400, 418003200, 433814400, 449625600, 465361200, 481082400, 496810800,
|
|
512532e3, 528260400, 543981600, 55971e4, 575431200, 591159600, 606880800,
|
|
622609200, 638330400, 654663600, 670384800, 686113200, 695786400, 701834400,
|
|
717562800, 733284e3, 749012400, 764733600, 780462e3, 796183200, 811911600,
|
|
828237600, 846385200, 859687200, 877834800, 891136800, 909284400, 922586400,
|
|
941338800, 954036e3, 972788400, 985485600, 1004238e3, 101754e4, 1035687600,
|
|
1048989600, 1067137200, 1080439200, 1099191600, 1111888800, 1130641200,
|
|
1143338400, 1162090800, 1174788e3, 1193540400, 1206842400, 122499e4,
|
|
1238292e3, 1256439600, 1269741600, 1288494e3, 1301191200, 1414288800,
|
|
1925002800
|
|
],
|
|
offset: [9017, 9017, 9079, 12679, 9079, 16279, 12679, 16279, 14400, 10800, 14400,
|
|
18e3, 14400, 10800, 7200, 10800, 14400, 10800, 14400, 10800, 14400, 10800,
|
|
14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400,
|
|
10800, 14400, 10800, 10800, 7200, 10800, 14400, 10800, 14400, 10800, 14400,
|
|
10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800,
|
|
14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400,
|
|
10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800,
|
|
14400, 10800
|
|
]
|
|
},
|
|
"Europe/Athens": {
|
|
time: [-2344636800, -1686095940, -1182988800, -1178150400, -906854400, -904867200, -
|
|
85725e4, -844473600, -828230400, -812419200, -552355200, -541641600,
|
|
166492800, 186195600, 198036e3, 213764400, 228880800, 244090800, 260330400,
|
|
275457600, 291805200, 307418400, 323395200, 338947200, 354682800, 370411200,
|
|
386132400, 401860800, 417582e3, 433310400, 449031600, 465364800, 481086e3,
|
|
496814400, 512535600, 528264e3, 543985200, 559713600, 575434800, 591163200,
|
|
606884400, 622612800, 638334e3, 654667200, 670388400, 686116800, 701838e3,
|
|
717566400, 733287600, 749016e3, 764737200, 780465600, 796186800, 811915200,
|
|
828241200, 846388800, 859690800, 877838400, 891140400, 909288e3, 92259e4,
|
|
941342400, 954039600, 972792e3, 985489200, 1004241600, 1017543600,
|
|
1035691200, 1048993200, 1067140800, 1080442800, 1099195200, 1111892400,
|
|
1130644800, 1143342e3, 1162094400, 1174791600, 1193544e3, 1206846e3,
|
|
1224993600, 1238295600, 1256443200, 1269745200, 1288497600, 1301194800,
|
|
1319947200, 1332644400, 1351396800, 1364698800, 1382846400, 1396148400,
|
|
1414296e3, 1427598e3, 1445745600, 1459047600, 14778e5, 1490497200,
|
|
1509249600, 1521946800, 1540699200, 1554001200, 1572148800, 1585450800,
|
|
1603598400, 1616900400, 1635652800, 164835e4, 1667102400, 1679799600,
|
|
1698552e3, 1711854e3, 1730001600, 1743303600, 1761451200, 1774753200,
|
|
1792900800, 1806202800, 1824955200, 1837652400, 1856404800, 1869102e3,
|
|
1887854400, 1901156400, 1919304e3, 1932606e3
|
|
],
|
|
offset: [5692, 5692, 7200, 10800, 7200, 10800, 7200, 3600, 7200, 3600, 7200, 10800,
|
|
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
|
|
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
|
|
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
|
|
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
|
|
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
|
|
7200, 10800, 7200
|
|
]
|
|
},
|
|
"Europe/Belgrade": {
|
|
time: [-2713910400, -905821200, -85725e4, -844552800, -828219600, -812498400, -
|
|
79677e4, -777938400, -766616400, 417578400, 433306800, 449028e3, 465361200,
|
|
481082400, 496810800, 512532e3, 528260400, 543981600, 55971e4, 575431200,
|
|
591159600, 606880800, 622609200, 638330400, 654663600, 670384800, 686113200,
|
|
701834400, 717562800, 733284e3, 749012400, 764733600, 780462e3, 796183200,
|
|
811911600, 828237600, 846385200, 859687200, 877834800, 891136800, 909284400,
|
|
922586400, 941338800, 954036e3, 972788400, 985485600, 1004238e3, 101754e4,
|
|
1035687600, 1048989600, 1067137200, 1080439200, 1099191600, 1111888800,
|
|
1130641200, 1143338400, 1162090800, 1174788e3, 1193540400, 1206842400,
|
|
122499e4, 1238292e3, 1256439600, 1269741600, 1288494e3, 1301191200,
|
|
1319943600, 1332640800, 1351393200, 1364695200, 1382842800, 1396144800,
|
|
1414292400, 1427594400, 1445742e3, 1459044e3, 1477796400, 1490493600,
|
|
1509246e3, 1521943200, 1540695600, 1553997600, 1572145200, 1585447200,
|
|
1603594800, 1616896800, 1635649200, 1648346400, 1667098800, 1679796e3,
|
|
1698548400, 1711850400, 1729998e3, 17433e5, 1761447600, 1774749600,
|
|
1792897200, 1806199200, 1824951600, 1837648800, 1856401200, 1869098400,
|
|
1887850800, 1901152800, 1919300400, 1932602400
|
|
],
|
|
offset: [4920, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600
|
|
]
|
|
},
|
|
"Europe/Berlin": {
|
|
time: [-2422051200, -1693702800, -1680476400, -1663452e3, -1650142800, -1632002400,
|
|
-1618693200, -938901600, -85725e4, -844552800, -828219600, -812498400, -
|
|
79677e4, -781048800, -776556e3, -765925200, -761173200, -748476e3, -
|
|
733266e3, -717627600, -714603600, -71037e4, -701902800, -684972e3, -
|
|
670453200, -654127200, -639003600, 323834400, 338958e3, 354679200,
|
|
370407600, 386128800, 401857200, 417578400, 433306800, 449028e3, 465361200,
|
|
481082400, 496810800, 512532e3, 528260400, 543981600, 55971e4, 575431200,
|
|
591159600, 606880800, 622609200, 638330400, 654663600, 670384800, 686113200,
|
|
701834400, 717562800, 733284e3, 749012400, 764733600, 780462e3, 796183200,
|
|
811911600, 828237600, 846385200, 859687200, 877834800, 891136800, 909284400,
|
|
922586400, 941338800, 954036e3, 972788400, 985485600, 1004238e3, 101754e4,
|
|
1035687600, 1048989600, 1067137200, 1080439200, 1099191600, 1111888800,
|
|
1130641200, 1143338400, 1162090800, 1174788e3, 1193540400, 1206842400,
|
|
122499e4, 1238292e3, 1256439600, 1269741600, 1288494e3, 1301191200,
|
|
1319943600, 1332640800, 1351393200, 1364695200, 1382842800, 1396144800,
|
|
1414292400, 1427594400, 1445742e3, 1459044e3, 1477796400, 1490493600,
|
|
1509246e3, 1521943200, 1540695600, 1553997600, 1572145200, 1585447200,
|
|
1603594800, 1616896800, 1635649200, 1648346400, 1667098800, 1679796e3,
|
|
1698548400, 1711850400, 1729998e3, 17433e5, 1761447600, 1774749600,
|
|
1792897200, 1806199200, 1824951600, 1837648800, 1856401200, 1869098400,
|
|
1887850800, 1901152800, 1919300400, 1932602400
|
|
],
|
|
offset: [3208, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 10800, 7200, 3600, 7200, 3600, 7200, 10800, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600
|
|
]
|
|
},
|
|
"Europe/London": {
|
|
time: [-3852662400, -1691964e3, -1680469200, -1664143200, -1650142800, -1633903200,
|
|
-1617483600, -1601848800, -1586034e3, -1570399200, -1552165200, -1538344800,
|
|
-152253e4, -15075e5, -1490562e3, -1473631200, -1460926800, -1442786400, -
|
|
1428872400, -1410732e3, -1396213200, -1379282400, -1364763600, -1348437600,
|
|
-1333314e3, -1315778400, -1301259600, -1284328800, -126981e4, -1253484e3, -
|
|
1238360400, -1221429600, -1206910800, -118998e4, -1175461200, -1159135200, -
|
|
1143406800, -1126476e3, -1111957200, -1095631200, -1080507600, -1063576800,
|
|
-1049058e3, -1032127200, -1017608400, -1001282400, -986158800, -969228e3, -
|
|
950475600, -942012e3, -904514400, -896043600, -875484e3, -864594e3, -
|
|
844034400, -832539600, -812584800, -798066e3, -781048800, -772059600, -
|
|
764802e3, -748476e3, -733352400, -719445600, -717026400, -706741200, -
|
|
699483600, -687996e3, -668034e3, -654732e3, -636584400, -622072800, -
|
|
605739600, -590623200, -57429e4, -558568800, -542235600, -527119200, -
|
|
512600400, -496274400, -481150800, -46422e4, -449701200, -432165600, -
|
|
417646800, -401320800, -386197200, -369266400, -354747600, -337816800, -
|
|
323298e3, -306972e3, -291848400, -276732e3, -257979600, -245282400, -
|
|
22653e4, -213228e3, -195080400, -182383200, -163630800, -150933600, -
|
|
132181200, -119484e3, -100731600, -88034400, -68677200, -59004e3, -37238400,
|
|
57726e3, 69818400, 89175600, 101268e3, 120625200, 132717600, 152074800,
|
|
164167200, 183524400, 196221600, 214974e3, 227671200, 246423600, 259120800,
|
|
278478e3, 290570400, 309927600, 32202e4, 341377200, 354675600, 372823200,
|
|
386125200, 404272800, 417574800, 435722400, 449024400, 467776800, 481078800,
|
|
499226400, 512528400, 530676e3, 543978e3, 562125600, 575427600, 593575200,
|
|
606877200, 625629600, 638326800, 657079200, 670381200, 688528800, 701830800,
|
|
719978400, 733280400, 751428e3, 76473e4, 782877600, 796179600, 814327200,
|
|
828234e3, 846381600, 859683600, 877831200, 891133200, 909280800, 922582800,
|
|
941335200, 954032400, 972784800, 985482e3, 1004234400, 1017536400,
|
|
1035684e3, 1048986e3, 1067133600, 1080435600, 1099188e3, 1111885200,
|
|
1130637600, 1143334800, 1162087200, 1174784400, 1193536800, 1206838800,
|
|
1224986400, 1238288400, 1256436e3, 1269738e3, 1288490400, 1301187600,
|
|
131994e4, 1332637200, 1351389600, 1364691600, 1382839200, 1396141200,
|
|
1414288800, 1427590800, 1445738400, 1459040400, 1477792800, 149049e4,
|
|
1509242400, 1521939600, 1540692e3, 1553994e3, 1572141600, 1585443600,
|
|
1603591200, 1616893200, 1635645600, 1648342800, 1667095200, 1679792400,
|
|
1698544800, 1711846800, 1729994400, 1743296400, 1761444e3, 1774746e3,
|
|
1792893600, 1806195600, 1824948e3, 1837645200, 1856397600, 1869094800,
|
|
1887847200, 1901149200, 1919296800, 1932598800
|
|
],
|
|
offset: [-75, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
0, 3600, 0, 3600, 7200, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600,
|
|
0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 3600,
|
|
0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0
|
|
]
|
|
},
|
|
"Europe/Luxembourg": {
|
|
time: [-2069712e3, -1692493200, -1680476400, -1662339600, -165015e4, -1632002400, -
|
|
1618693200, -1612656e3, -1604278800, -1585515600, -1574038800, -1552255200,
|
|
-1539997200, -1520546400, -1507510800, -1490569200, -1473642e3, -1459116e3,
|
|
-1444006800, -142767e4, -1411866e3, -1396220400, -1379293200, -1364770800, -
|
|
1348448400, -1333321200, -1316394e3, -1301266800, -1284339600, -126981e4, -
|
|
1253484e3, -1238360400, -1221429600, -1206910800, -1191189600, -1175461200,
|
|
-1160344800, -1143406800, -1127685600, -1111957200, -1096840800, -
|
|
1080507600, -1063576800, -1049058e3, -1033336800, -1017608400, -1002492e3, -
|
|
986158800, -969228e3, -950475600, -942012e3, -935182800, -85725e4, -
|
|
844552800, -828219600, -812498400, -797979600, -781048800, -766616400, -
|
|
745452e3, -733266e3, 228880800, 244004400, 260330400, 276058800, 29178e4,
|
|
307508400, 323834400, 338958e3, 354679200, 370407600, 386128800, 401857200,
|
|
417578400, 433306800, 449028e3, 465361200, 481082400, 496810800, 512532e3,
|
|
528260400, 543981600, 55971e4, 575431200, 591159600, 606880800, 622609200,
|
|
638330400, 654663600, 670384800, 686113200, 701834400, 717562800, 733284e3,
|
|
749012400, 764733600, 780462e3, 796183200, 811911600, 828237600, 846385200,
|
|
859687200, 877834800, 891136800, 909284400, 922586400, 941338800, 954036e3,
|
|
972788400, 985485600, 1004238e3, 101754e4, 1035687600, 1048989600,
|
|
1067137200, 1080439200, 1099191600, 1111888800, 1130641200, 1143338400,
|
|
1162090800, 1174788e3, 1193540400, 1206842400, 122499e4, 1238292e3,
|
|
1256439600, 1269741600, 1288494e3, 1301191200, 1319943600, 1332640800,
|
|
1351393200, 1364695200, 1382842800, 1396144800, 1414292400, 1427594400,
|
|
1445742e3, 1459044e3, 1477796400, 1490493600, 1509246e3, 1521943200,
|
|
1540695600, 1553997600, 1572145200, 1585447200, 1603594800, 1616896800,
|
|
1635649200, 1648346400, 1667098800, 1679796e3, 1698548400, 1711850400,
|
|
1729998e3, 17433e5, 1761447600, 1774749600, 1792897200, 1806199200,
|
|
1824951600, 1837648800, 1856401200, 1869098400, 1887850800, 1901152800,
|
|
1919300400, 1932602400
|
|
],
|
|
offset: [1476, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 0, 3600, 0, 3600, 0, 3600,
|
|
0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600
|
|
]
|
|
},
|
|
"Europe/Madrid": {
|
|
time: [-2177453684, -1631926800, -1616886e3, -1601168400, -158535e4, -1442451600, -
|
|
142767e4, -1379293200, -1364770800, -1348448400, -1333321200, -1316390400, -
|
|
1301266800, -1284339600, -1269817200, -1026954e3, -1017615600, -1001898e3, -
|
|
999478800, -986083200, -951433200, -940208400, -873075600, -862614e3, -
|
|
842835600, -828313200, -811386e3, -796863600, -779936400, -765414e3, -
|
|
748486800, -733964400, -652323600, -639010800, 135126e3, 150253200,
|
|
166575600, 181702800, 196815600, 212547600, 22887e4, 243997200, 260330400,
|
|
276058800, 29178e4, 307508400, 323834400, 338958e3, 354679200, 370407600,
|
|
386128800, 401857200, 417578400, 433306800, 449028e3, 465361200, 481082400,
|
|
496810800, 512532e3, 528260400, 543981600, 55971e4, 575431200, 591159600,
|
|
606880800, 622609200, 638330400, 654663600, 670384800, 686113200, 701834400,
|
|
717562800, 733284e3, 749012400, 764733600, 780462e3, 796183200, 811911600,
|
|
828237600, 846385200, 859687200, 877834800, 891136800, 909284400, 922586400,
|
|
941338800, 954036e3, 972788400, 985485600, 1004238e3, 101754e4, 1035687600,
|
|
1048989600, 1067137200, 1080439200, 1099191600, 1111888800, 1130641200,
|
|
1143338400, 1162090800, 1174788e3, 1193540400, 1206842400, 122499e4,
|
|
1238292e3, 1256439600, 1269741600, 1288494e3, 1301191200, 1319943600,
|
|
1332640800, 1351393200, 1364695200, 1382842800, 1396144800, 1414292400,
|
|
1427594400, 1445742e3, 1459044e3, 1477796400, 1490493600, 1509246e3,
|
|
1521943200, 1540695600, 1553997600, 1572145200, 1585447200, 1603594800,
|
|
1616896800, 1635649200, 1648346400, 1667098800, 1679796e3, 1698548400,
|
|
1711850400, 1729998e3, 17433e5, 1761447600, 1774749600, 1792897200,
|
|
1806199200, 1824951600, 1837648800, 1856401200, 1869098400, 1887850800,
|
|
1901152800, 1919300400, 1932602400
|
|
],
|
|
offset: [-884, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 7200, 3600, 0, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600
|
|
]
|
|
},
|
|
"Europe/Paris": {
|
|
time: [-2486678340, -1855958340, -1689814800, -1680393600, -1665363600, -1648339200,
|
|
-1635123600, -1616889600, -1604278800, -158544e4, -1574038800, -1552262400,
|
|
-1539997200, -1520553600, -1507510800, -1490572800, -1470618e3, -1459123200,
|
|
-1444006800, -1427673600, -1411952400, -1396224e3, -1379293200, -1364774400,
|
|
-1348448400, -1333324800, -1316394e3, -1301270400, -1284339600, -1269820800,
|
|
-1253494800, -1238371200, -1221440400, -1206921600, -1191200400, -1175472e3,
|
|
-1160355600, -1143417600, -1127696400, -1111968e3, -1096851600, -1080518400,
|
|
-1063587600, -1049068800, -1033347600, -1017619200, -1002502800, -986169600,
|
|
-969238800, -950486400, -942012e3, -932432400, -85725e4, -844552800, -
|
|
828219600, -812498400, -800064e3, -796258800, -781048800, -766616400,
|
|
196822800, 212547600, 228880800, 244004400, 260330400, 276058800, 29178e4,
|
|
307508400, 323834400, 338958e3, 354679200, 370407600, 386128800, 401857200,
|
|
417578400, 433306800, 449028e3, 465361200, 481082400, 496810800, 512532e3,
|
|
528260400, 543981600, 55971e4, 575431200, 591159600, 606880800, 622609200,
|
|
638330400, 654663600, 670384800, 686113200, 701834400, 717562800, 733284e3,
|
|
749012400, 764733600, 780462e3, 796183200, 811911600, 828237600, 846385200,
|
|
859687200, 877834800, 891136800, 909284400, 922586400, 941338800, 954036e3,
|
|
972788400, 985485600, 1004238e3, 101754e4, 1035687600, 1048989600,
|
|
1067137200, 1080439200, 1099191600, 1111888800, 1130641200, 1143338400,
|
|
1162090800, 1174788e3, 1193540400, 1206842400, 122499e4, 1238292e3,
|
|
1256439600, 1269741600, 1288494e3, 1301191200, 1319943600, 1332640800,
|
|
1351393200, 1364695200, 1382842800, 1396144800, 1414292400, 1427594400,
|
|
1445742e3, 1459044e3, 1477796400, 1490493600, 1509246e3, 1521943200,
|
|
1540695600, 1553997600, 1572145200, 1585447200, 1603594800, 1616896800,
|
|
1635649200, 1648346400, 1667098800, 1679796e3, 1698548400, 1711850400,
|
|
1729998e3, 17433e5, 1761447600, 1774749600, 1792897200, 1806199200,
|
|
1824951600, 1837648800, 1856401200, 1869098400, 1887850800, 1901152800,
|
|
1919300400, 1932602400
|
|
],
|
|
offset: [561, 561, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 7200, 3600, 7200, 3600, 7200, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600
|
|
]
|
|
},
|
|
"Europe/Rome": {
|
|
time: [-3252096e3, -2403562204, -1690761600, -168048e4, -1664755200, -1648944e3, -
|
|
163512e4, -1616889600, -1604275200, -1585526400, -1571011200, -1555286400, -
|
|
932428800, -85725e4, -844552800, -828219600, -812498400, -798066e3, -
|
|
781048800, -76671e4, -750895200, -733352400, -719452800, -70191e4, -
|
|
689205600, -670453200, -114048e3, -103161600, -81993600, -71708400, -
|
|
50544e3, -40258800, -18489600, -8204400, 1296e4, 23245200, 43804800,
|
|
54694800, 75859200, 86749200, 107913600, 118198800, 138758400, 149648400,
|
|
170812800, 181098e3, 202262400, 212547600, 233107200, 243997200, 265161600,
|
|
276051600, 296611200, 307501200, 323834400, 338958e3, 354679200, 370407600,
|
|
386128800, 401857200, 417578400, 433306800, 449028e3, 465361200, 481082400,
|
|
496810800, 512532e3, 528260400, 543981600, 55971e4, 575431200, 591159600,
|
|
606880800, 622609200, 638330400, 654663600, 670384800, 686113200, 701834400,
|
|
717562800, 733284e3, 749012400, 764733600, 780462e3, 796183200, 811911600,
|
|
828237600, 846385200, 859687200, 877834800, 891136800, 909284400, 922586400,
|
|
941338800, 954036e3, 972788400, 985485600, 1004238e3, 101754e4, 1035687600,
|
|
1048989600, 1067137200, 1080439200, 1099191600, 1111888800, 1130641200,
|
|
1143338400, 1162090800, 1174788e3, 1193540400, 1206842400, 122499e4,
|
|
1238292e3, 1256439600, 1269741600, 1288494e3, 1301191200, 1319943600,
|
|
1332640800, 1351393200, 1364695200, 1382842800, 1396144800, 1414292400,
|
|
1427594400, 1445742e3, 1459044e3, 1477796400, 1490493600, 1509246e3,
|
|
1521943200, 1540695600, 1553997600, 1572145200, 1585447200, 1603594800,
|
|
1616896800, 1635649200, 1648346400, 1667098800, 1679796e3, 1698548400,
|
|
1711850400, 1729998e3, 17433e5, 1761447600, 1774749600, 1792897200,
|
|
1806199200, 1824951600, 1837648800, 1856401200, 1869098400, 1887850800,
|
|
1901152800, 1919300400, 1932602400
|
|
],
|
|
offset: [2996, 2996, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600
|
|
]
|
|
},
|
|
"Europe/Warsaw": {
|
|
time: [-2840140800, -1717027200, -1693702800, -1680476400, -1663452e3, -1650142800,
|
|
-1632002400, -1618693200, -1600466400, -1587157200, -1501718400, -931730400,
|
|
-85725e4, -844552800, -828219600, -812498400, -796600800, -778723200, -
|
|
762652800, -748483200, -733266e3, -715212e3, -701902800, -684972e3, -
|
|
670453200, -654127200, -639003600, -397090800, -386805600, -371084400, -
|
|
355356e3, -334191600, -323301600, -307580400, -291852e3, -271292400, -
|
|
260402400, -239842800, -228952800, -208393200, -197503200, -176338800, -
|
|
166053600, 228877200, 244000800, 260326800, 276055200, 291776400, 307504800,
|
|
323830800, 338954400, 354675600, 370404e3, 386125200, 401853600, 417574800,
|
|
433303200, 449024400, 465357600, 481078800, 496807200, 512528400, 528256800,
|
|
543978e3, 559706400, 575431200, 591159600, 606880800, 622609200, 638330400,
|
|
654663600, 670384800, 686113200, 701834400, 717562800, 733284e3, 749012400,
|
|
764733600, 780462e3, 796183200, 811911600, 828237600, 846385200, 859687200,
|
|
877834800, 891136800, 909284400, 922586400, 941338800, 954036e3, 972788400,
|
|
985485600, 1004238e3, 101754e4, 1035687600, 1048989600, 1067137200,
|
|
1080439200, 1099191600, 1111888800, 1130641200, 1143338400, 1162090800,
|
|
1174788e3, 1193540400, 1206842400, 122499e4, 1238292e3, 1256439600,
|
|
1269741600, 1288494e3, 1301191200, 1319943600, 1332640800, 1351393200,
|
|
1364695200, 1382842800, 1396144800, 1414292400, 1427594400, 1445742e3,
|
|
1459044e3, 1477796400, 1490493600, 1509246e3, 1521943200, 1540695600,
|
|
1553997600, 1572145200, 1585447200, 1603594800, 1616896800, 1635649200,
|
|
1648346400, 1667098800, 1679796e3, 1698548400, 1711850400, 1729998e3,
|
|
17433e5, 1761447600, 1774749600, 1792897200, 1806199200, 1824951600,
|
|
1837648800, 1856401200, 1869098400, 1887850800, 1901152800, 1919300400,
|
|
1932602400
|
|
],
|
|
offset: [5040, 5040, 3600, 7200, 3600, 7200, 3600, 7200, 7200, 10800, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600
|
|
]
|
|
},
|
|
"Europe/Istanbul": {
|
|
time: [-2840140800, -1869868800, -1693699200, -168048e4, -1570406400, -1552176e3, -
|
|
1538352e3, -1522540800, -1507507200, -1490572800, -1440201600, -1428019200,
|
|
-1409702400, -1396483200, -931046400, -922665600, -917827200, -892425600, -
|
|
875836800, -764726400, -744336e3, -733795200, -716428800, -701913600, -
|
|
684979200, -670464e3, -654134400, -639014400, -62208e4, -60696e4, -
|
|
590025600, -575510400, -235612800, -194832e3, -177724800, -165715200,
|
|
107917200, 121226400, 133927200, 152676e3, 164685600, 184125600, 196221600,
|
|
215575200, 228880800, 245815200, 260330400, 267926400, 428464800, 433908e3,
|
|
468122400, 482806800, 496720800, 512528400, 528256800, 543978e3, 559706400,
|
|
575427600, 591156e3, 606877200, 622605600, 638326800, 65466e4, 670381200,
|
|
686109600, 701830800, 717559200, 733280400, 749008800, 764125200, 780458400,
|
|
796179600, 811908e3, 828234e3, 846381600, 859683600, 877831200, 891133200,
|
|
909280800, 922582800, 941335200, 954032400, 972784800, 985482e3, 1004234400,
|
|
1017536400, 1035684e3, 1048986e3, 1067133600, 1080435600, 1099188e3,
|
|
1111885200, 1130637600, 1143334800, 1162087200, 1174791600, 1193544e3,
|
|
1206846e3, 1224993600, 1238295600, 1256443200, 1269745200, 1288497600,
|
|
1301281200, 1319947200, 1332644400, 1351396800, 1364698800, 1382846400,
|
|
1396234800, 1414296e3, 1427598e3, 1446955200, 1459047600, 1473206400,
|
|
1925002800
|
|
],
|
|
offset: [6952, 7016, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
|
|
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
|
|
7200, 10800, 7200, 10800, 10800, 14400, 10800, 7200, 10800, 7200, 10800,
|
|
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
|
|
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
|
|
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 10800, 7200, 10800, 10800
|
|
]
|
|
},
|
|
"Europe/Zurich": {
|
|
time: [-3675196800, -2385244800, -904431600, -891122400, -872982e3, -859672800,
|
|
354679200, 370407600, 386128800, 401857200, 417578400, 433306800, 449028e3,
|
|
465361200, 481082400, 496810800, 512532e3, 528260400, 543981600, 55971e4,
|
|
575431200, 591159600, 606880800, 622609200, 638330400, 654663600, 670384800,
|
|
686113200, 701834400, 717562800, 733284e3, 749012400, 764733600, 780462e3,
|
|
796183200, 811911600, 828237600, 846385200, 859687200, 877834800, 891136800,
|
|
909284400, 922586400, 941338800, 954036e3, 972788400, 985485600, 1004238e3,
|
|
101754e4, 1035687600, 1048989600, 1067137200, 1080439200, 1099191600,
|
|
1111888800, 1130641200, 1143338400, 1162090800, 1174788e3, 1193540400,
|
|
1206842400, 122499e4, 1238292e3, 1256439600, 1269741600, 1288494e3,
|
|
1301191200, 1319943600, 1332640800, 1351393200, 1364695200, 1382842800,
|
|
1396144800, 1414292400, 1427594400, 1445742e3, 1459044e3, 1477796400,
|
|
1490493600, 1509246e3, 1521943200, 1540695600, 1553997600, 1572145200,
|
|
1585447200, 1603594800, 1616896800, 1635649200, 1648346400, 1667098800,
|
|
1679796e3, 1698548400, 1711850400, 1729998e3, 17433e5, 1761447600,
|
|
1774749600, 1792897200, 1806199200, 1824951600, 1837648800, 1856401200,
|
|
1869098400, 1887850800, 1901152800, 1919300400, 1932602400
|
|
],
|
|
offset: [2048, 1786, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600
|
|
]
|
|
},
|
|
"Australia/Sydney": {
|
|
time: [-2364076800, -1672531140, -1665352800, -883605600, -876088800, -860364e3, -
|
|
844639200, -828309600, -813189600, 57722400, 68007600, 89172e3, 100062e3,
|
|
120621600, 131511600, 152071200, 162961200, 183520800, 195015600, 215575200,
|
|
226465200, 247024800, 257914800, 278474400, 289364400, 309924e3, 320814e3,
|
|
341373600, 352263600, 372823200, 386737200, 404877600, 415767600, 436327200,
|
|
447217200, 467776800, 478666800, 499226400, 511326e3, 530071200, 542775600,
|
|
562125600, 57483e4, 59418e4, 606279600, 625629600, 636519600, 657079200,
|
|
667969200, 688528800, 699418800, 719978400, 731473200, 752032800, 762922800,
|
|
783482400, 794372400, 814932e3, 828241200, 846381600, 859690800, 877831200,
|
|
891140400, 909280800, 92259e4, 941335200, 954039600, 967341600, 985489200,
|
|
1004234400, 1017543600, 1035684e3, 1048993200, 1067133600, 1080442800,
|
|
1099188e3, 1111892400, 1130637600, 1143946800, 1162087200, 1174791600,
|
|
1193536800, 1207450800, 1223172e3, 1238900400, 1254621600, 127035e4,
|
|
1286071200, 1301799600, 1317520800, 1333249200, 1349575200, 1365303600,
|
|
1381024800, 1396753200, 1412474400, 1428202800, 1443924e3, 1459652400,
|
|
1475373600, 1491102e3, 1506823200, 1522551600, 1538877600, 1554606e3,
|
|
1570327200, 1586055600, 1601776800, 1617505200, 1633226400, 1648954800,
|
|
1664676e3, 1680404400, 1696125600, 1712458800, 172818e4, 1743908400,
|
|
1759629600, 1775358e3, 1791079200, 1806807600, 1822528800, 1838257200,
|
|
1853978400, 1869706800, 1886032800, 1901761200, 1917482400, 1933210800
|
|
],
|
|
offset: [36292, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600,
|
|
36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3,
|
|
39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600,
|
|
36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3,
|
|
39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600,
|
|
36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3,
|
|
39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600,
|
|
36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3,
|
|
39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600,
|
|
36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3,
|
|
39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600,
|
|
36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600
|
|
]
|
|
},
|
|
"Australia/Brisbane": {
|
|
time: [-2366755200, -1672531140, -1665352800, -883605600, -876088800, -860364e3, -
|
|
844639200, -828309600, -813189600, 57722400, 68007600, 625629600, 636519600,
|
|
657079200, 667969200, 688528800, 699418800, 1925028e3
|
|
],
|
|
offset: [36728, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600,
|
|
36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3
|
|
]
|
|
},
|
|
"Australia/Adelaide": {
|
|
time: [-2364076800, -2230156800, -1672531140, -1665352800, -883605600, -876088800, -
|
|
860364e3, -844639200, -828309600, -813189600, 57722400, 68007600, 89172e3,
|
|
100062e3, 120621600, 131511600, 152071200, 162961200, 183520800, 195015600,
|
|
215575200, 226465200, 247024800, 257914800, 278474400, 289364400, 309924e3,
|
|
320814e3, 341373600, 352263600, 372823200, 384318e3, 404877600, 415767600,
|
|
436327200, 447217200, 467776800, 478666800, 499226400, 511326e3, 530071200,
|
|
542775600, 562125600, 57483e4, 59418e4, 606279600, 625629600, 637729200,
|
|
657079200, 667969200, 688528800, 701233200, 719978400, 731473200, 752032800,
|
|
764132400, 783482400, 796186800, 814932e3, 828241200, 846381600, 859690800,
|
|
877831200, 891140400, 909280800, 92259e4, 941335200, 954039600, 972784800,
|
|
985489200, 1004234400, 1017543600, 1035684e3, 1048993200, 1067133600,
|
|
1080442800, 1099188e3, 1111892400, 1130637600, 1143946800, 1162087200,
|
|
1174791600, 1193536800, 1207450800, 1223172e3, 1238900400, 1254621600,
|
|
127035e4, 1286071200, 1301799600, 1317520800, 1333249200, 1349575200,
|
|
1365303600, 1381024800, 1396753200, 1412474400, 1428202800, 1443924e3,
|
|
1459652400, 1475373600, 1491102e3, 1506823200, 1522551600, 1538877600,
|
|
1554606e3, 1570327200, 1586055600, 1601776800, 1617505200, 1633226400,
|
|
1648954800, 1664676e3, 1680404400, 1696125600, 1712458800, 172818e4,
|
|
1743908400, 1759629600, 1775358e3, 1791079200, 1806807600, 1822528800,
|
|
1838257200, 1853978400, 1869706800, 1886032800, 1901761200, 1917482400,
|
|
1933210800
|
|
],
|
|
offset: [33260, 32400, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800,
|
|
34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200,
|
|
37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800,
|
|
34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200,
|
|
37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800,
|
|
34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200,
|
|
37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800,
|
|
34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200,
|
|
37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800,
|
|
34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200,
|
|
37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800,
|
|
34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800
|
|
]
|
|
},
|
|
"Australia/ACT": {
|
|
time: [-2364076800, -1672531140, -1665352800, -883605600, -876088800, -860364e3, -
|
|
844639200, -828309600, -813189600, 57722400, 68007600, 89172e3, 100062e3,
|
|
120621600, 131511600, 152071200, 162961200, 183520800, 195015600, 215575200,
|
|
226465200, 247024800, 257914800, 278474400, 289364400, 309924e3, 320814e3,
|
|
341373600, 352263600, 372823200, 386737200, 404877600, 415767600, 436327200,
|
|
447217200, 467776800, 478666800, 499226400, 511326e3, 530071200, 542775600,
|
|
562125600, 57483e4, 59418e4, 606279600, 625629600, 636519600, 657079200,
|
|
667969200, 688528800, 699418800, 719978400, 731473200, 752032800, 762922800,
|
|
783482400, 794372400, 814932e3, 828241200, 846381600, 859690800, 877831200,
|
|
891140400, 909280800, 92259e4, 941335200, 954039600, 967341600, 985489200,
|
|
1004234400, 1017543600, 1035684e3, 1048993200, 1067133600, 1080442800,
|
|
1099188e3, 1111892400, 1130637600, 1143946800, 1162087200, 1174791600,
|
|
1193536800, 1207450800, 1223172e3, 1238900400, 1254621600, 127035e4,
|
|
1286071200, 1301799600, 1317520800, 1333249200, 1349575200, 1365303600,
|
|
1381024800, 1396753200, 1412474400, 1428202800, 1443924e3, 1459652400,
|
|
1475373600, 1491102e3, 1506823200, 1522551600, 1538877600, 1554606e3,
|
|
1570327200, 1586055600, 1601776800, 1617505200, 1633226400, 1648954800,
|
|
1664676e3, 1680404400, 1696125600, 1712458800, 172818e4, 1743908400,
|
|
1759629600, 1775358e3, 1791079200, 1806807600, 1822528800, 1838257200,
|
|
1853978400, 1869706800, 1886032800, 1901761200, 1917482400, 1933210800
|
|
],
|
|
offset: [36292, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600,
|
|
36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3,
|
|
39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600,
|
|
36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3,
|
|
39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600,
|
|
36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3,
|
|
39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600,
|
|
36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3,
|
|
39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600,
|
|
36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3,
|
|
39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600,
|
|
36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600
|
|
]
|
|
},
|
|
"Asia/Almaty": {
|
|
time: [-1441152e3, -1247529600, 354931200, 370742400, 386467200, 402278400,
|
|
418003200, 433814400, 449625600, 465361200, 481082400, 496810800, 512532e3,
|
|
528260400, 543981600, 55971e4, 575431200, 591159600, 606880800, 622609200,
|
|
638330400, 654663600, 670384800, 686113200, 695786400, 701834400, 717562800,
|
|
733284e3, 749012400, 764733600, 780462e3, 796183200, 811911600, 828237600,
|
|
846385200, 859687200, 877834800, 891136800, 909284400, 922586400, 941338800,
|
|
954036e3, 972788400, 985485600, 1004238e3, 101754e4, 1035687600, 1048989600,
|
|
1067137200, 1080439200, 1099191600, 1925013600
|
|
],
|
|
offset: [18468, 18e3, 21600, 25200, 21600, 25200, 21600, 25200, 21600, 25200, 21600,
|
|
25200, 21600, 25200, 21600, 25200, 21600, 25200, 21600, 25200, 21600, 25200,
|
|
21600, 21600, 18e3, 21600, 25200, 21600, 25200, 21600, 25200, 21600, 25200,
|
|
21600, 25200, 21600, 25200, 21600, 25200, 21600, 25200, 21600, 25200, 21600,
|
|
25200, 21600, 25200, 21600, 25200, 21600, 25200, 21600
|
|
]
|
|
},
|
|
"Asia/Ashkhabad": {
|
|
time: [-1441152e3, -1247529600, 354931200, 370742400, 386467200, 402278400,
|
|
418003200, 433814400, 449625600, 465361200, 481082400, 496810800, 512532e3,
|
|
528260400, 543981600, 55971e4, 575431200, 591159600, 606880800, 622609200,
|
|
638330400, 654663600, 670384800, 686113200, 695786400, 192501e4
|
|
],
|
|
offset: [14012, 14400, 18e3, 21600, 18e3, 21600, 18e3, 21600, 18e3, 21600, 18e3,
|
|
21600, 18e3, 21600, 18e3, 21600, 18e3, 21600, 18e3, 21600, 18e3, 21600,
|
|
18e3, 18e3, 14400, 18e3
|
|
]
|
|
},
|
|
"Asia/Tokyo": {
|
|
time: [-2587678861, -683769600, -672274800, -654739200, -640825200, -620265600, -
|
|
609375600, -588816e3, -577926e3, 1925024400
|
|
],
|
|
offset: [33539, 32400, 36e3, 32400, 36e3, 32400, 36e3, 32400, 36e3, 32400]
|
|
},
|
|
"Asia/Taipei": {
|
|
time: [-2335219200, -1017792e3, -766191600, -745804800, -733795200, -716860800, -
|
|
699580800, -683856e3, -670636800, -65232e4, -639100800, -620784e3, -
|
|
607564800, -589248e3, -576028800, -562896e3, -541728e3, -528681600, -
|
|
510192e3, -497145600, -478656e3, -465609600, -449798400, -433987200, -
|
|
418176e3, -402451200, -38664e4, -370915200, -355104e3, -339379200, -
|
|
323568e3, -302486400, -291945600, -270950400, -260409600, 134006400,
|
|
149817600, 165542400, 181353600, 299635200, 307584e3, 1925020800
|
|
],
|
|
offset: [29160, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800,
|
|
32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400,
|
|
28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800,
|
|
32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800
|
|
]
|
|
},
|
|
"Asia/Singapore": {
|
|
time: [-2177452800, -2038176e3, -1167609600, -1073001600, -894153600, -879638400, -
|
|
766972800, 378691200, 1925020800
|
|
],
|
|
offset: [24925, 24925, 25200, 26400, 26400, 27e3, 32400, 27e3, 28800]
|
|
},
|
|
"Asia/Shanghai": {
|
|
time: [-2177452800, -1600646400, -1585872e3, -933638400, -922060800, -908841600, -
|
|
888796800, -881020800, -767836800, -745804800, -733795200, -716860800, -
|
|
699580800, -683856e3, -670636800, -65232e4, -649987200, 515556e3, 527047200,
|
|
545191200, 558496800, 577245600, 589946400, 608695200, 622000800, 640144800,
|
|
653450400, 671594400, 6849e5, 1925020800
|
|
],
|
|
offset: [29143, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800,
|
|
32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400,
|
|
28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800
|
|
]
|
|
},
|
|
"Asia/Seoul": {
|
|
time: [-1948752e3, -1830384e3, -767318400, -681177600, -672192e3, -654739200, -
|
|
640828800, -623376e3, -609379200, -588816e3, -577929600, -498096e3, -
|
|
462672e3, -451699200, -429753600, -418262400, -399513600, -387417600, -
|
|
368064e3, -355968e3, -336614400, -324518400, -305164800, -293068800, -
|
|
264902400, 547610400, 560919600, 57906e4, 592369200, 1925024400
|
|
],
|
|
offset: [30472, 30600, 32400, 32400, 36e3, 32400, 36e3, 32400, 36e3, 32400, 36e3,
|
|
32400, 30600, 34200, 30600, 34200, 30600, 34200, 30600, 34200, 30600, 34200,
|
|
30600, 34200, 30600, 32400, 36e3, 32400, 36e3, 32400
|
|
]
|
|
},
|
|
"Asia/Tehran": {
|
|
time: [-1704153600, -757382400, 247190400, 259286400, 277776e3, 283996800,
|
|
290822400, 306547200, 322444800, 338515200, 673228800, 685497600, 701222400,
|
|
71712e4, 732758400, 748656e3, 764294400, 780192e3, 795830400, 811728e3,
|
|
827366400, 843264e3, 858988800, 874886400, 890524800, 906422400, 922060800,
|
|
937958400, 953596800, 969494400, 985219200, 1001116800, 1016755200,
|
|
1032652800, 1048291200, 1064188800, 1079827200, 1095724800, 1111449600,
|
|
1127347200, 1206057600, 1221955200, 123768e4, 1253577600, 1269216e3,
|
|
1285113600, 1300752e3, 1316649600, 1332288e3, 1348185600, 1363910400,
|
|
1379808e3, 1395446400, 1411344e3, 1426982400, 144288e4, 1458518400,
|
|
1474416e3, 1490140800, 1506038400, 1521676800, 1537574400, 1553212800,
|
|
1569110400, 1584748800, 1600646400, 1616371200, 1632268800, 1647907200,
|
|
1663804800, 1679443200, 1695340800, 1710979200, 1726876800, 1742601600,
|
|
1758499200, 1774137600, 1790035200, 1805673600, 1821571200, 1837209600,
|
|
1853107200, 1868745600, 1884643200, 1900368e3, 1916265600, 1931904e3
|
|
],
|
|
offset: [12344, 12344, 12600, 14400, 18e3, 14400, 12600, 16200, 12600, 16200, 12600,
|
|
16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200,
|
|
12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600,
|
|
16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200,
|
|
12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600,
|
|
16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200,
|
|
12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600,
|
|
16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600
|
|
]
|
|
},
|
|
"Asia/Dubai": {
|
|
time: [-1577923200, 1925006400],
|
|
offset: [13272, 14400]
|
|
},
|
|
"Asia/Kolkata": {
|
|
time: [-3645216e3, -3155673600, -2019686400, -891561600, -872035200, -862617600, -
|
|
764121600, 1925011800
|
|
],
|
|
offset: [21208, 21200, 19270, 19800, 23400, 19800, 23400, 19800]
|
|
},
|
|
"Asia/Hong_Kong": {
|
|
time: [-2056663398, -900882e3, -891547200, -884217600, -761176800, -747878400, -
|
|
728508600, -717021e3, -697059e3, -683757e3, -668028600, -654726600, -
|
|
636579e3, -623277e3, -605129400, -591827400, -573679800, -559773e3, -
|
|
541625400, -528323400, -510179400, -498083400, -478729800, -466633800, -
|
|
446675400, -435184200, -415225800, -403129800, -383776200, -371680200, -
|
|
352326600, -340230600, -320877e3, -308781e3, -288822600, -277331400, -
|
|
257373e3, -245881800, -225923400, -213827400, -194473800, -182377800, -
|
|
163024200, -148509e3, -132784200, -117059400, -101334600, -85609800, -
|
|
69280200, -53555400, -37830600, -22105800, -6381e3, 9343800, 25068600,
|
|
40793400, 56518200, 72243e3, 88572600, 104297400, 120022200, 126070200,
|
|
151471800, 167196600, 182921400, 198646200, 214371e3, 295414200, 309324600,
|
|
1925020800
|
|
],
|
|
offset: [27402, 28800, 32400, 30600, 32400, 28800, 32400, 28800, 32400, 28800,
|
|
32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400,
|
|
28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800,
|
|
32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400,
|
|
28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800,
|
|
32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400,
|
|
28800, 32400, 28800, 32400, 28800
|
|
]
|
|
},
|
|
"Asia/Bangkok": {
|
|
time: [-2840140800, -1570060800, 1925017200],
|
|
offset: [24124, 24124, 25200]
|
|
},
|
|
"Asia/Chongqing": {
|
|
time: [-2177452800, -1600646400, -1585872e3, -933638400, -922060800, -908841600, -
|
|
888796800, -881020800, -767836800, -745804800, -733795200, -716860800, -
|
|
699580800, -683856e3, -670636800, -65232e4, -649987200, 515556e3, 527047200,
|
|
545191200, 558496800, 577245600, 589946400, 608695200, 622000800, 640144800,
|
|
653450400, 671594400, 6849e5, 1925020800
|
|
],
|
|
offset: [29143, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800,
|
|
32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400,
|
|
28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800
|
|
]
|
|
},
|
|
"Asia/Jerusalem": {
|
|
time: [-2840140800, -1640995200, -933638400, -857347200, -844293600, -825811200, -
|
|
812678400, -794188800, -779846400, -762645600, -748303200, -731116800, -
|
|
681955200, -673228800, -667951200, -65232e4, -636415200, -62208e4, -
|
|
608936400, -59184e4, -572475600, -558568800, -542840400, -527724e3, -
|
|
514414800, -490838400, -482976e3, -459468e3, -451526400, -428544e3, -
|
|
418251600, -400024800, -387417600, 142387200, 150854400, 167184e3,
|
|
178675200, 334022400, 337654800, 452563200, 462243600, 482284800, 495590400,
|
|
516758400, 526435200, 545443200, 558489600, 576633600, 589334400, 609897600,
|
|
620784e3, 638323200, 651628800, 669772800, 683683200, 701827200, 715737600,
|
|
733708800, 747187200, 765158400, 778032e3, 796608e3, 810086400, 826848e3,
|
|
842832e3, 858902400, 874195200, 890352e3, 90504e4, 923018400, 936324e3,
|
|
955677600, 970794e3, 986778e3, 1001293200, 1017363600, 1033952400,
|
|
1048813200, 1065142800, 1081299600, 1095814800, 1112320800, 1128823200,
|
|
1143770400, 1159668e3, 117522e4, 1189908e3, 1206669600, 1223172e3,
|
|
1238119200, 1254016800, 1269568800, 1284256800, 1301623200, 1317520800,
|
|
1333072800, 1348365600, 1364522400, 1382839200, 1395972e3, 1414288800,
|
|
1427421600, 1445738400, 1458871200, 1477792800, 1490320800, 1509242400,
|
|
1521770400, 1540692e3, 1553824800, 1572141600, 1585274400, 1603591200,
|
|
1616724e3, 1635645600, 1648173600, 1667095200, 1679623200, 1698544800,
|
|
1711677600, 1729994400, 1743127200, 1761444e3, 1774576800, 1792893600,
|
|
1806026400, 1824948e3, 1837476e3, 1856397600, 1868925600, 1887847200,
|
|
190098e4, 1919296800, 1932429600
|
|
],
|
|
offset: [8454, 8440, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 14400, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
|
|
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
|
|
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
|
|
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
|
|
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
|
|
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200
|
|
]
|
|
},
|
|
"Asia/Kuwait": {
|
|
time: [-719625600, 1925002800],
|
|
offset: [11212, 10800]
|
|
},
|
|
"Asia/Muscat": {
|
|
time: [-1577923200, 1925006400],
|
|
offset: [13272, 14400]
|
|
},
|
|
"Asia/Qatar": {
|
|
time: [-1577923200, 76204800, 1925002800],
|
|
offset: [12368, 14400, 10800]
|
|
},
|
|
"Asia/Riyadh": {
|
|
time: [-719625600, 1925002800],
|
|
offset: [11212, 10800]
|
|
},
|
|
"Pacific/Auckland": {
|
|
time: [-3192393600, -1330293600, -1320012e3, -1300658400, -1287352800, -1269208800,
|
|
-1255903200, -1237759200, -1224453600, -1206309600, -1192399200, -117486e4,
|
|
-1160949600, -1143410400, -1125871200, -1112565600, -1094421600, -1081116e3,
|
|
-1062972e3, -1049666400, -1031522400, -1018216800, -1000072800, -986767200,
|
|
-968018400, -955317600, -936568800, -923263200, -757382400, 152676e3,
|
|
162356400, 183520800, 195015600, 215575200, 226465200, 247024800, 257914800,
|
|
278474400, 289364400, 309924e3, 320814e3, 341373600, 352263600, 372823200,
|
|
384318e3, 404877600, 415767600, 436327200, 447217200, 467776800, 478666800,
|
|
499226400, 510116400, 530676e3, 541566e3, 562125600, 573620400, 59418e4,
|
|
60507e4, 623815200, 637729200, 655264800, 669178800, 686714400, 700628400,
|
|
718164e3, 732682800, 749613600, 764132400, 781063200, 795582e3, 812512800,
|
|
827031600, 844567200, 858481200, 876016800, 889930800, 907466400, 921985200,
|
|
938916e3, 953434800, 970365600, 984884400, 100242e4, 1016334e3, 1033869600,
|
|
1047783600, 1065319200, 1079838e3, 1096768800, 1111287600, 1128218400,
|
|
1142737200, 1159668e3, 1174186800, 1191117600, 1207450800, 1222567200,
|
|
1238900400, 1254016800, 127035e4, 1285466400, 1301799600, 1316916e3,
|
|
1333249200, 1348970400, 1365303600, 138042e4, 1396753200, 1411869600,
|
|
1428202800, 1443319200, 1459652400, 1474768800, 1491102e3, 1506218400,
|
|
1522551600, 1538272800, 1554606e3, 1569722400, 1586055600, 1601172e3,
|
|
1617505200, 1632621600, 1648954800, 1664071200, 1680404400, 1695520800,
|
|
1712458800, 1727575200, 1743908400, 1759024800, 1775358e3, 1790474400,
|
|
1806807600, 1821924e3, 1838257200, 1853373600, 1869706800, 1885428e3,
|
|
1901761200, 1916877600, 1933210800
|
|
],
|
|
offset: [41944, 41400, 45e3, 41400, 43200, 41400, 43200, 41400, 43200, 41400, 43200,
|
|
41400, 43200, 41400, 43200, 41400, 43200, 41400, 43200, 41400, 43200, 41400,
|
|
43200, 41400, 43200, 41400, 43200, 41400, 43200, 43200, 46800, 43200, 46800,
|
|
43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200,
|
|
46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800,
|
|
43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200,
|
|
46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800,
|
|
43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200,
|
|
46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800,
|
|
43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200,
|
|
46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800,
|
|
43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200,
|
|
46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800
|
|
]
|
|
},
|
|
"Pacific/Chatham": {
|
|
time: [-3192393600, -757382400, 152678700, 162359100, 183523500, 195018300,
|
|
215577900, 226467900, 247027500, 257917500, 278477100, 289367100, 309926700,
|
|
320816700, 341376300, 352266300, 372825900, 384320700, 404880300, 415770300,
|
|
436329900, 447219900, 467779500, 478669500, 499229100, 510119100, 530678700,
|
|
541568700, 562128300, 573623100, 594182700, 605072700, 623817900, 637731900,
|
|
655267500, 669181500, 686717100, 700631100, 718166700, 732685500, 749616300,
|
|
764135100, 781065900, 795584700, 812515500, 827034300, 844569900, 858483900,
|
|
876019500, 889933500, 907469100, 921987900, 938918700, 953437500, 970368300,
|
|
984887100, 1002422700, 1016336700, 1033872300, 1047786300, 1065321900,
|
|
1079840700, 1096771500, 1111290300, 1128221100, 1142739900, 1159670700,
|
|
1174189500, 1191120300, 1207453500, 1222569900, 1238903100, 1254019500,
|
|
1270352700, 1285469100, 1301802300, 1316918700, 1333251900, 1348973100,
|
|
1365306300, 1380422700, 1396755900, 1411872300, 1428205500, 1443321900,
|
|
1459655100, 1474771500, 1491104700, 1506221100, 1522554300, 1538275500,
|
|
1554608700, 1569725100, 1586058300, 1601174700, 1617507900, 1632624300,
|
|
1648957500, 1664073900, 1680407100, 1695523500, 1712461500, 1727577900,
|
|
1743911100, 1759027500, 1775360700, 1790477100, 1806810300, 1821926700,
|
|
1838259900, 1853376300, 1869709500, 1885430700, 1901763900, 1916880300,
|
|
1933213500
|
|
],
|
|
offset: [44028, 44100, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500,
|
|
45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900,
|
|
49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500,
|
|
45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900,
|
|
49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500,
|
|
45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900,
|
|
49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500,
|
|
45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900,
|
|
49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500,
|
|
45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900,
|
|
49500, 45900, 49500, 45900, 49500, 45900, 49500
|
|
]
|
|
},
|
|
"Pacific/Fakaofo": {
|
|
time: [-2177452800, 1325203200, 1925038800],
|
|
offset: [-41096, -39600, 46800]
|
|
},
|
|
"Pacific/Honolulu": {
|
|
time: [-2334139200, -1157320800, -1155470400, -880236e3, -769429800, -765410400, -
|
|
712188e3, 1924956e3
|
|
],
|
|
offset: [-37886, -37800, -34200, -37800, -34200, -34200, -37800, -36e3]
|
|
},
|
|
"America/Mexico_City": {
|
|
time: [-1514763396, -1343091600, -1234828800, -1220317200, -1207180800, -1191369600,
|
|
-975283200, -963187200, -917136e3, -907372800, -821923200, -810086400, -
|
|
627523200, -613008e3, 828842400, 846381600, 860292e3, 877831200, 891741600,
|
|
909280800, 923191200, 941335200, 954640800, 972784800, 989114400,
|
|
1001815200, 1018144800, 1035684e3, 1049594400, 1067133600, 1081044e3,
|
|
1099188e3, 1112493600, 1130637600, 1143943200, 1162087200, 1175392800,
|
|
1193536800, 1207447200, 1224986400, 1238896800, 1256436e3, 1270346400,
|
|
1288490400, 1301796e3, 131994e4, 1333245600, 1351389600, 13653e5,
|
|
1382839200, 1396749600, 1414288800, 1428199200, 1445738400, 1459648800,
|
|
1477792800, 1491098400, 1509242400, 1522548e3, 1540692e3, 1554602400,
|
|
1572141600, 1586052e3, 1603591200, 1617501600, 1635645600, 1648951200,
|
|
1667095200, 1680400800, 1698544800, 1712455200, 1729994400, 1743904800,
|
|
1761444e3, 1775354400, 1792893600, 1806804e3, 1824948e3, 1838253600,
|
|
1856397600, 1869703200, 1887847200, 1901757600, 1919296800, 1933207200
|
|
],
|
|
offset: [-23796, -25200, -21600, -25200, -21600, -25200, -21600, -18e3, -21600, -
|
|
18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -
|
|
18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -
|
|
18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -
|
|
18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -
|
|
18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -
|
|
18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -
|
|
18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -
|
|
18e3, -21600, -18e3, -21600, -18e3, -21600
|
|
]
|
|
},
|
|
"Africa/Cairo": {
|
|
time: [-2185401600, -929836800, -923097600, -906163200, -892857600, -875836800, -
|
|
857779200, -844300800, -825811200, -812678400, -794188800, -779846400, -
|
|
762652800, -399081600, -38664e4, -368323200, -355104e3, -336783600, -
|
|
323643600, -305161200, -292021200, -273625200, -260485200, -242089200, -
|
|
228949200, -210553200, -197413200, -178930800, -165790800, -147394800, -
|
|
134254800, -115858800, -102632400, -84322800, -71096400, -52700400, -
|
|
39474e3, -21164400, -7938e3, 10371600, 23598e3, 41907600, 55134e3, 7353e4,
|
|
86756400, 105066e3, 118292400, 136602e3, 149828400, 168138e3, 181364400,
|
|
199760400, 212986800, 231296400, 244522800, 262832400, 276058800, 294368400,
|
|
307594800, 325990800, 339217200, 357526800, 370753200, 396406800, 402289200,
|
|
426819600, 433825200, 452221200, 465447600, 483757200, 496983600, 515293200,
|
|
528519600, 546829200, 560055600, 578451600, 591678e3, 610419600, 623214e3,
|
|
641523600, 65475e4, 673059600, 686286e3, 704682e3, 717908400, 736218e3,
|
|
749444400, 767754e3, 780980400, 799027200, 812332800, 830476800, 843782400,
|
|
861926400, 875232e3, 893376e3, 906681600, 925430400, 938736e3, 95688e4,
|
|
970185600, 988329600, 1001635200, 1019779200, 1033084800, 1051228800,
|
|
1064534400, 1083283200, 1096588800, 1114732800, 1128038400, 1146182400,
|
|
1158883200, 1177632e3, 1189123200, 1209081600, 1219968e3, 1240531200,
|
|
1250812800, 1272585600, 1281484800, 1284076800, 1285891200, 1400198400,
|
|
1403827200, 1406851200, 1411689600, 1924999200
|
|
],
|
|
offset: [7509, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
|
|
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
|
|
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
|
|
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
|
|
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
|
|
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
|
|
7200, 10800, 7200, 10800, 7200, 10800, 7200
|
|
]
|
|
},
|
|
"Africa/Johannesburg": {
|
|
time: [-2458166400, -2109283200, -860968800, -845244e3, -829519200, -813794400,
|
|
1924999200
|
|
],
|
|
offset: [6720, 5400, 7200, 10800, 7200, 10800, 7200]
|
|
},
|
|
"Asia/Kathmandu": {
|
|
time: [-1577923200, 504921600, 1925012700],
|
|
offset: [20476, 19800, 20700]
|
|
},
|
|
"US/Mountain": {
|
|
time: [-2717668796, -1633298400, -1615154400, -1601848800, -1583704800, -1570399200,
|
|
-1551650400, -1538949600, -1534111200, -880236e3, -769417200, -765410400, -
|
|
147909600, -13158e4, -11646e4, -100130400, -84405600, -68680800, -52956e3, -
|
|
37231200, -21506400, -5781600, 9943200, 25668e3, 41392800, 57722400,
|
|
73447200, 89172e3, 104896800, 120621600, 126669600, 152071200, 162352800,
|
|
183520800, 199245600, 215575200, 230695200, 247024800, 262749600, 278474400,
|
|
294199200, 309924e3, 325648800, 341373600, 357098400, 372823200, 388548e3,
|
|
404877600, 419997600, 436327200, 452052e3, 467776800, 483501600, 499226400,
|
|
514951200, 530676e3, 544586400, 562125600, 576036e3, 59418e4, 607485600,
|
|
625629600, 638935200, 657079200, 670989600, 688528800, 702439200, 719978400,
|
|
733888800, 752032800, 765338400, 783482400, 796788e3, 814932e3, 828842400,
|
|
846381600, 860292e3, 877831200, 891741600, 909280800, 923191200, 941335200,
|
|
954640800, 972784800, 986090400, 1004234400, 1018144800, 1035684e3,
|
|
1049594400, 1067133600, 1081044e3, 1099188e3, 1112493600, 1130637600,
|
|
1143943200, 1162087200, 1173578400, 1194141600, 1205028e3, 1225591200,
|
|
1236477600, 1257040800, 1268532e3, 1289095200, 1299981600, 1320544800,
|
|
1331431200, 1351994400, 1362880800, 1383444e3, 1394330400, 1414893600,
|
|
142578e4, 1446343200, 1457834400, 1478397600, 1489284e3, 1509847200,
|
|
1520733600, 1541296800, 1552183200, 1572746400, 1583632800, 1604196e3,
|
|
1615687200, 1636250400, 1647136800, 16677e5, 1678586400, 1699149600,
|
|
1710036e3, 1730599200, 1741485600, 1762048800, 1772935200, 1793498400,
|
|
1804989600, 1825552800, 1836439200, 1857002400, 1867888800, 1888452e3,
|
|
1899338400, 1919901600, 1930788e3
|
|
],
|
|
offset: [-25196, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -
|
|
25200, -21600, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -
|
|
25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -
|
|
21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -
|
|
25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -
|
|
21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -
|
|
25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -
|
|
21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -
|
|
25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -
|
|
21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -
|
|
25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -
|
|
21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -
|
|
25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -
|
|
21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -
|
|
25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -
|
|
21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -
|
|
25200
|
|
]
|
|
},
|
|
"Europe/Helsinki": {
|
|
time: [-2890252800, -1535932800, -875664e3, -859762800, 354679200, 370407600,
|
|
386128800, 401857200, 417582e3, 433310400, 449031600, 465364800, 481086e3,
|
|
496814400, 512535600, 528264e3, 543985200, 559713600, 575434800, 591163200,
|
|
606884400, 622612800, 638334e3, 654667200, 670388400, 686116800, 701838e3,
|
|
717566400, 733287600, 749016e3, 764737200, 780465600, 796186800, 811915200,
|
|
828241200, 846388800, 859690800, 877838400, 891140400, 909288e3, 92259e4,
|
|
941342400, 954039600, 972792e3, 985489200, 1004241600, 1017543600,
|
|
1035691200, 1048993200, 1067140800, 1080442800, 1099195200, 1111892400,
|
|
1130644800, 1143342e3, 1162094400, 1174791600, 1193544e3, 1206846e3,
|
|
1224993600, 1238295600, 1256443200, 1269745200, 1288497600, 1301194800,
|
|
1319947200, 1332644400, 1351396800, 1364698800, 1382846400, 1396148400,
|
|
1414296e3, 1427598e3, 1445745600, 1459047600, 14778e5, 1490497200,
|
|
1509249600, 1521946800, 1540699200, 1554001200, 1572148800, 1585450800,
|
|
1603598400, 1616900400, 1635652800, 164835e4, 1667102400, 1679799600,
|
|
1698552e3, 1711854e3, 1730001600, 1743303600, 1761451200, 1774753200,
|
|
1792900800, 1806202800, 1824955200, 1837652400, 1856404800, 1869102e3,
|
|
1887854400, 1901156400, 1919304e3, 1932606e3
|
|
],
|
|
offset: [5989, 5989, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
|
|
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
|
|
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
|
|
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
|
|
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 10800, 7200, 10800, 7200
|
|
]
|
|
},
|
|
"Europe/Stockholm": {
|
|
time: [-2871676800, -2208988800, -1692493200, -1680476400, 323834400, 338958e3,
|
|
354679200, 370407600, 386128800, 401857200, 417578400, 433306800, 449028e3,
|
|
465361200, 481082400, 496810800, 512532e3, 528260400, 543981600, 55971e4,
|
|
575431200, 591159600, 606880800, 622609200, 638330400, 654663600, 670384800,
|
|
686113200, 701834400, 717562800, 733284e3, 749012400, 764733600, 780462e3,
|
|
796183200, 811911600, 828237600, 846385200, 859687200, 877834800, 891136800,
|
|
909284400, 922586400, 941338800, 954036e3, 972788400, 985485600, 1004238e3,
|
|
101754e4, 1035687600, 1048989600, 1067137200, 1080439200, 1099191600,
|
|
1111888800, 1130641200, 1143338400, 1162090800, 1174788e3, 1193540400,
|
|
1206842400, 122499e4, 1238292e3, 1256439600, 1269741600, 1288494e3,
|
|
1301191200, 1319943600, 1332640800, 1351393200, 1364695200, 1382842800,
|
|
1396144800, 1414292400, 1427594400, 1445742e3, 1459044e3, 1477796400,
|
|
1490493600, 1509246e3, 1521943200, 1540695600, 1553997600, 1572145200,
|
|
1585447200, 1603594800, 1616896800, 1635649200, 1648346400, 1667098800,
|
|
1679796e3, 1698548400, 1711850400, 1729998e3, 17433e5, 1761447600,
|
|
1774749600, 1792897200, 1806199200, 1824951600, 1837648800, 1856401200,
|
|
1869098400, 1887850800, 1901152800, 1919300400, 1932602400
|
|
],
|
|
offset: [4332, 3614, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600
|
|
]
|
|
},
|
|
"Europe/Copenhagen": {
|
|
time: [-2524521600, -2398291200, -1692493200, -1680483600, -935107200, -85725e4, -
|
|
844552800, -828219600, -812498400, -79677e4, -781048800, -769381200, -
|
|
747007200, -736376400, -715212e3, -706741200, -683157600, -675291600,
|
|
323834400, 338958e3, 354679200, 370407600, 386128800, 401857200, 417578400,
|
|
433306800, 449028e3, 465361200, 481082400, 496810800, 512532e3, 528260400,
|
|
543981600, 55971e4, 575431200, 591159600, 606880800, 622609200, 638330400,
|
|
654663600, 670384800, 686113200, 701834400, 717562800, 733284e3, 749012400,
|
|
764733600, 780462e3, 796183200, 811911600, 828237600, 846385200, 859687200,
|
|
877834800, 891136800, 909284400, 922586400, 941338800, 954036e3, 972788400,
|
|
985485600, 1004238e3, 101754e4, 1035687600, 1048989600, 1067137200,
|
|
1080439200, 1099191600, 1111888800, 1130641200, 1143338400, 1162090800,
|
|
1174788e3, 1193540400, 1206842400, 122499e4, 1238292e3, 1256439600,
|
|
1269741600, 1288494e3, 1301191200, 1319943600, 1332640800, 1351393200,
|
|
1364695200, 1382842800, 1396144800, 1414292400, 1427594400, 1445742e3,
|
|
1459044e3, 1477796400, 1490493600, 1509246e3, 1521943200, 1540695600,
|
|
1553997600, 1572145200, 1585447200, 1603594800, 1616896800, 1635649200,
|
|
1648346400, 1667098800, 1679796e3, 1698548400, 1711850400, 1729998e3,
|
|
17433e5, 1761447600, 1774749600, 1792897200, 1806199200, 1824951600,
|
|
1837648800, 1856401200, 1869098400, 1887850800, 1901152800, 1919300400,
|
|
1932602400
|
|
],
|
|
offset: [3020, 3020, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600
|
|
]
|
|
},
|
|
"Atlantic/Reykjavik": {
|
|
time: [-1956614400, -1668214800, -1647212400, -1636678800, -161343e4, -1605142800, -
|
|
1581894e3, -1539565200, -153135e4, -968029200, -952293600, -942012e3, -
|
|
920239200, -909961200, -888789600, -877906800, -857944800, -846457200, -
|
|
826495200, -815007600, -795045600, -783558e3, -762991200, -752108400, -
|
|
731541600, -717634800, -700092e3, -686185200, -668642400, -654735600, -
|
|
636588e3, -623286e3, -605743200, -591836400, -573688800, -559782e3, -
|
|
542239200, -528332400, -510789600, -496882800, -47934e4, -465433200, -
|
|
447890400, -433983600, -415836e3, -401929200, -384386400, -370479600, -
|
|
352936800, -33903e4, -321487200, -307580400, -290037600, -276130800, -
|
|
258588e3, -244681200, -226533600, -212626800, -195084e3, -181177200, -
|
|
163634400, -149727600, -132184800, -118278e3, -100735200, -86828400, -
|
|
68680800, -54774e3, 1924992e3
|
|
],
|
|
offset: [-5280, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600,
|
|
0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -
|
|
3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600,
|
|
0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -
|
|
3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0
|
|
]
|
|
},
|
|
"Europe/Tallinn": {
|
|
time: [-2840140800, -1638316800, -1632002400, -1618693200, -1593820800, -1535932800,
|
|
-927936e3, -892944e3, -85725e4, -844552800, -828219600, -812498400, -
|
|
797644800, 354931200, 370742400, 386467200, 402278400, 418003200, 433814400,
|
|
449625600, 465361200, 481082400, 496810800, 512532e3, 528260400, 543981600,
|
|
55971e4, 575431200, 591159600, 606880800, 622609200, 638330400, 654663600,
|
|
670384800, 686113200, 701834400, 717562800, 733284e3, 749012400, 764733600,
|
|
780462e3, 796183200, 811911600, 828237600, 846385200, 859687200, 877834800,
|
|
891136800, 909288e3, 92259e4, 941342400, 1017543600, 1035691200, 1048993200,
|
|
1067140800, 1080442800, 1099195200, 1111892400, 1130644800, 1143342e3,
|
|
1162094400, 1174791600, 1193544e3, 1206846e3, 1224993600, 1238295600,
|
|
1256443200, 1269745200, 1288497600, 1301194800, 1319947200, 1332644400,
|
|
1351396800, 1364698800, 1382846400, 1396148400, 1414296e3, 1427598e3,
|
|
1445745600, 1459047600, 14778e5, 1490497200, 1509249600, 1521946800,
|
|
1540699200, 1554001200, 1572148800, 1585450800, 1603598400, 1616900400,
|
|
1635652800, 164835e4, 1667102400, 1679799600, 1698552e3, 1711854e3,
|
|
1730001600, 1743303600, 1761451200, 1774753200, 1792900800, 1806202800,
|
|
1824955200, 1837652400, 1856404800, 1869102e3, 1887854400, 1901156400,
|
|
1919304e3, 1932606e3
|
|
],
|
|
offset: [5940, 5940, 3600, 7200, 3600, 5940, 7200, 10800, 7200, 3600, 7200, 3600,
|
|
7200, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400,
|
|
10800, 14400, 10800, 14400, 10800, 14400, 10800, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
|
|
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
|
|
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
|
|
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200
|
|
]
|
|
},
|
|
"Europe/Riga": {
|
|
time: [-2840140800, -1632002400, -1618693200, -1601676e3, -1597266e3, -1377302400, -
|
|
928022400, -899510400, -85725e4, -844552800, -828219600, -812498400, -
|
|
79677e4, -795830400, 354931200, 370742400, 386467200, 402278400, 418003200,
|
|
433814400, 449625600, 465361200, 481082400, 496810800, 512532e3, 528260400,
|
|
543981600, 55971e4, 575431200, 591159600, 606880800, 622609200, 638330400,
|
|
654663600, 670384800, 686113200, 701834400, 717562800, 733284e3, 749012400,
|
|
764733600, 780462e3, 796183200, 811911600, 828237600, 843966e3, 859690800,
|
|
877838400, 891140400, 909288e3, 92259e4, 941342400, 985489200, 1004241600,
|
|
1017543600, 1035691200, 1048993200, 1067140800, 1080442800, 1099195200,
|
|
1111892400, 1130644800, 1143342e3, 1162094400, 1174791600, 1193544e3,
|
|
1206846e3, 1224993600, 1238295600, 1256443200, 1269745200, 1288497600,
|
|
1301194800, 1319947200, 1332644400, 1351396800, 1364698800, 1382846400,
|
|
1396148400, 1414296e3, 1427598e3, 1445745600, 1459047600, 14778e5,
|
|
1490497200, 1509249600, 1521946800, 1540699200, 1554001200, 1572148800,
|
|
1585450800, 1603598400, 1616900400, 1635652800, 164835e4, 1667102400,
|
|
1679799600, 1698552e3, 1711854e3, 1730001600, 1743303600, 1761451200,
|
|
1774753200, 1792900800, 1806202800, 1824955200, 1837652400, 1856404800,
|
|
1869102e3, 1887854400, 1901156400, 1919304e3, 1932606e3
|
|
],
|
|
offset: [5794, 5794, 9394, 5794, 9394, 5794, 7200, 10800, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800,
|
|
14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 10800, 7200, 10800,
|
|
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
|
|
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
|
|
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
|
|
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200
|
|
]
|
|
},
|
|
"Europe/Vilnius": {
|
|
time: [-2840140800, -1672531200, -1585094400, -1561248e3, -1553558400, -928195200, -
|
|
900115200, -85725e4, -844552800, -828219600, -812498400, -802137600,
|
|
354931200, 370742400, 386467200, 402278400, 418003200, 433814400, 449625600,
|
|
465361200, 481082400, 496810800, 512532e3, 528260400, 543981600, 55971e4,
|
|
575431200, 591159600, 606880800, 622609200, 638330400, 654663600, 670384800,
|
|
686113200, 701834400, 717562800, 733284e3, 749012400, 764733600, 780462e3,
|
|
796183200, 811911600, 828237600, 846385200, 859687200, 877834800, 891140400,
|
|
909284400, 922586400, 941338800, 1048993200, 1067140800, 1080442800,
|
|
1099195200, 1111892400, 1130644800, 1143342e3, 1162094400, 1174791600,
|
|
1193544e3, 1206846e3, 1224993600, 1238295600, 1256443200, 1269745200,
|
|
1288497600, 1301194800, 1319947200, 1332644400, 1351396800, 1364698800,
|
|
1382846400, 1396148400, 1414296e3, 1427598e3, 1445745600, 1459047600,
|
|
14778e5, 1490497200, 1509249600, 1521946800, 1540699200, 1554001200,
|
|
1572148800, 1585450800, 1603598400, 1616900400, 1635652800, 164835e4,
|
|
1667102400, 1679799600, 1698552e3, 1711854e3, 1730001600, 1743303600,
|
|
1761451200, 1774753200, 1792900800, 1806202800, 1824955200, 1837652400,
|
|
1856404800, 1869102e3, 1887854400, 1901156400, 1919304e3, 1932606e3
|
|
],
|
|
offset: [6076, 5040, 5736, 3600, 7200, 3600, 10800, 7200, 3600, 7200, 3600, 7200,
|
|
10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800,
|
|
14400, 10800, 14400, 10800, 14400, 10800, 10800, 7200, 10800, 7200, 10800,
|
|
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 7200, 3600, 7200, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
|
|
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
|
|
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
|
|
10800, 7200, 10800, 7200, 10800, 7200
|
|
]
|
|
},
|
|
"America/Lima": {
|
|
time: [-2524521600, -1938556800, -1009843200, -1002067200, -986774400, -971049600, -
|
|
955324800, -9396e5, 504921600, 512697600, 536457600, 544233600, 631152e3,
|
|
638928e3, 757382400, 765158400, 1924974e3
|
|
],
|
|
offset: [-18492, -18516, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400,
|
|
-18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3
|
|
]
|
|
},
|
|
"America/Santiago": {
|
|
time: [-2524521600, -1892678400, -1688428800, -1619222400, -1593820800, -1336003200,
|
|
-13176e5, -1304380800, -1286064e3, -1272844800, -1254528e3, -1241308800, -
|
|
1222992e3, -1209772800, -1191369600, -1178150400, -870566400, -865296e3, -
|
|
740534400, -736387200, -718070400, -713667600, -36633600, -23932800, -
|
|
3369600, 7516800, 24451200, 37756800, 55900800, 69206400, 87955200,
|
|
100656e3, 118195200, 132105600, 150854400, 163555200, 182304e3, 195609600,
|
|
213753600, 227059200, 245203200, 258508800, 277257600, 289958400, 308707200,
|
|
321408e3, 340156800, 353462400, 371606400, 384912e3, 403056e3, 416361600,
|
|
434505600, 447811200, 46656e4, 479260800, 498009600, 510710400, 529459200,
|
|
545184e3, 560908800, 574214400, 592358400, 605664e3, 624412800, 637113600,
|
|
653443200, 668563200, 687312e3, 700617600, 718761600, 732067200, 750211200,
|
|
763516800, 781660800, 794966400, 813715200, 826416e3, 845164800, 85968e4,
|
|
876614400, 88992e4, 906854400, 923184e3, 939513600, 952819200, 971568e3,
|
|
984268800, 1003017600, 1015718400, 1034467200, 1047168e3, 1065916800,
|
|
1079222400, 1097366400, 1110672e3, 1128816e3, 1142121600, 1160870400,
|
|
1173571200, 119232e4, 1206835200, 1223769600, 1237075200, 1255219200,
|
|
1270339200, 1286668800, 1304812800, 1313884800, 1335657600, 1346544e3,
|
|
1367107200, 1378598400, 1398556800, 1410048e3, 1463270400, 1471132800,
|
|
149472e4, 1502582400, 1526169600, 1534032e3, 1554595200, 1567900800,
|
|
1586044800, 1599350400, 1617494400, 16308e5, 1648944e3, 1662249600,
|
|
1680393600, 1693699200, 1712448e3, 1725753600, 1743897600, 1757203200,
|
|
1775347200, 1788652800, 1806796800, 1820102400, 1838246400, 1851552e3,
|
|
1870300800, 1883001600, 1901750400, 1915056e3, 19332e5
|
|
],
|
|
offset: [-16966, -16966, -18e3, -16966, -14400, -16966, -14400, -18e3, -14400, -
|
|
18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -
|
|
10800, -14400, -18e3, -14400, -10800, -14400, -10800, -14400, -10800, -
|
|
14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -
|
|
10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -
|
|
14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -
|
|
10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -
|
|
14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -
|
|
10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -
|
|
14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -
|
|
10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -
|
|
14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -
|
|
10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -
|
|
14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -
|
|
10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -
|
|
14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -
|
|
10800
|
|
]
|
|
},
|
|
"Asia/Bahrain": {
|
|
time: [-1577923200, 76204800, 1925002800],
|
|
offset: [12368, 14400, 10800]
|
|
},
|
|
"Asia/Jakarta": {
|
|
time: [-3231273600, -1451693568, -117288e4, -876614400, -766022400, -683856e3, -
|
|
620784e3, -189388800, 1925017200
|
|
],
|
|
offset: [25632, 25632, 26400, 27e3, 32400, 27e3, 28800, 27e3, 25200]
|
|
},
|
|
"Africa/Lagos": {
|
|
time: [-1588464e3, 1924995600],
|
|
offset: [816, 3600]
|
|
},
|
|
"Pacific/Norfolk": {
|
|
time: [-2177452800, -599616e3, 152071200, 162961200, 1443924e3, 1570327200,
|
|
1586055600, 1601776800, 1617505200, 1633226400, 1648954800, 1664676e3,
|
|
1680404400, 1696125600, 1712458800, 172818e4, 1743908400, 1759629600,
|
|
1775358e3, 1791079200, 1806807600, 1822528800, 1838257200, 1853978400,
|
|
1869706800, 1886032800, 1901761200, 1917482400, 1933210800
|
|
],
|
|
offset: [40312, 40320, 41400, 45e3, 41400, 39600, 43200, 39600, 43200, 39600, 43200,
|
|
39600, 43200, 39600, 43200, 39600, 43200, 39600, 43200, 39600, 43200, 39600,
|
|
43200, 39600, 43200, 39600, 43200, 39600, 43200
|
|
]
|
|
},
|
|
"America/Juneau": {
|
|
time: [-3225169588, -2188987200, -880236e3, -769420800, -765410400, -21506400, -
|
|
5781600, 9943200, 25668e3, 41392800, 57722400, 73447200, 89172e3, 104896800,
|
|
120621600, 126669600, 152071200, 162352800, 183520800, 199245600, 215575200,
|
|
230695200, 247024800, 262749600, 278474400, 294199200, 309924e3, 325648800,
|
|
341373600, 357098400, 372823200, 388548e3, 404877600, 419997600, 436327200,
|
|
438998400, 452052e3, 467776800, 483501600, 499226400, 514951200, 530676e3,
|
|
544586400, 562125600, 576036e3, 59418e4, 607485600, 625629600, 638935200,
|
|
657079200, 670989600, 688528800, 702439200, 719978400, 733888800, 752032800,
|
|
765338400, 783482400, 796788e3, 814932e3, 828842400, 846381600, 860292e3,
|
|
877831200, 891741600, 909280800, 923191200, 941335200, 954640800, 972784800,
|
|
986090400, 1004234400, 1018144800, 1035684e3, 1049594400, 1067133600,
|
|
1081044e3, 1099188e3, 1112493600, 1130637600, 1143943200, 1162087200,
|
|
1173578400, 1194141600, 1205028e3, 1225591200, 1236477600, 1257040800,
|
|
1268532e3, 1289095200, 1299981600, 1320544800, 1331431200, 1351994400,
|
|
1362880800, 1383444e3, 1394330400, 1414893600, 142578e4, 1446343200,
|
|
1457834400, 1478397600, 1489284e3, 1509847200, 1520733600, 1541296800,
|
|
1552183200, 1572746400, 1583632800, 1604196e3, 1615687200, 1636250400,
|
|
1647136800, 16677e5, 1678586400, 1699149600, 1710036e3, 1730599200,
|
|
1741485600, 1762048800, 1772935200, 1793498400, 1804989600, 1825552800,
|
|
1836439200, 1857002400, 1867888800, 1888452e3, 1899338400, 1919901600,
|
|
1930788e3
|
|
],
|
|
offset: [54139, -32261, -28800, -25200, -25200, -28800, -25200, -28800, -25200, -
|
|
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
|
|
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
|
|
28800, -28800, -28800, -25200, -28800, -25200, -28800, -25200, -32400, -
|
|
32400, -28800, -32400, -28800, -32400, -28800, -32400, -28800, -32400, -
|
|
28800, -32400, -28800, -32400, -28800, -32400, -28800, -32400, -28800, -
|
|
32400, -28800, -32400, -28800, -32400, -28800, -32400, -28800, -32400, -
|
|
28800, -32400, -28800, -32400, -28800, -32400, -28800, -32400, -28800, -
|
|
32400, -28800, -32400, -28800, -32400, -28800, -32400, -28800, -32400, -
|
|
28800, -32400, -28800, -32400, -28800, -32400, -28800, -32400, -28800, -
|
|
32400, -28800, -32400, -28800, -32400, -28800, -32400, -28800, -32400, -
|
|
28800, -32400, -28800, -32400, -28800, -32400, -28800, -32400, -28800, -
|
|
32400, -28800, -32400, -28800, -32400, -28800, -32400, -28800, -32400, -
|
|
28800, -32400, -28800, -32400, -28800, -32400, -28800, -32400, -28800, -
|
|
32400, -28800, -32400, -28800, -32400
|
|
]
|
|
},
|
|
"Asia/Ho_Chi_Minh": {
|
|
time: [-2004048e3, -1851552e3, -852080400, -782614800, -767836800, -718070400, -
|
|
457747200, -315622800, 171849600, 1925017200
|
|
],
|
|
offset: [25600, 25590, 25200, 28800, 32400, 25200, 28800, 25200, 28800, 25200]
|
|
},
|
|
"Australia/Perth": {
|
|
time: [-2337897600, -1672531140, -1665352800, -883605600, -876088800, -860364e3, -
|
|
844639200, 152071200, 162961200, 436327200, 447217200, 690343200, 699418800,
|
|
1165111200, 1174791600, 1193536800, 1206846e3, 1224986400, 1238295600,
|
|
1925020800
|
|
],
|
|
offset: [27804, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800,
|
|
32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800
|
|
]
|
|
},
|
|
"Europe/Malta": {
|
|
time: [-2403475200, -1690761600, -168048e4, -1664755200, -1648944e3, -163512e4, -
|
|
1616889600, -1604275200, -1585526400, -1571011200, -1555286400, -932428800,
|
|
-85725e4, -844552800, -828219600, -812584800, -798066e3, -781048800, -
|
|
76671e4, -750895200, -733352400, -719452800, -70191e4, -689205600, -
|
|
670453200, -114048e3, -103161600, -81993600, -71708400, -50544e3, -40258800,
|
|
-18489600, -8204400, 1296e4, 23245200, 43804800, 54694800, 75859200,
|
|
86749200, 102384e3, 118112400, 135734400, 148525200, 167191200, 180496800,
|
|
198640800, 211946400, 230090400, 243396e3, 26154e4, 274845600, 292989600,
|
|
306295200, 323316e3, 338349600, 354679200, 370407600, 386128800, 401857200,
|
|
417578400, 433306800, 449028e3, 465361200, 481082400, 496810800, 512532e3,
|
|
528260400, 543981600, 55971e4, 575431200, 591159600, 606880800, 622609200,
|
|
638330400, 654663600, 670384800, 686113200, 701834400, 717562800, 733284e3,
|
|
749012400, 764733600, 780462e3, 796183200, 811911600, 828237600, 846385200,
|
|
859687200, 877834800, 891136800, 909284400, 922586400, 941338800, 954036e3,
|
|
972788400, 985485600, 1004238e3, 101754e4, 1035687600, 1048989600,
|
|
1067137200, 1080439200, 1099191600, 1111888800, 1130641200, 1143338400,
|
|
1162090800, 1174788e3, 1193540400, 1206842400, 122499e4, 1238292e3,
|
|
1256439600, 1269741600, 1288494e3, 1301191200, 1319943600, 1332640800,
|
|
1351393200, 1364695200, 1382842800, 1396144800, 1414292400, 1427594400,
|
|
1445742e3, 1459044e3, 1477796400, 1490493600, 1509246e3, 1521943200,
|
|
1540695600, 1553997600, 1572145200, 1585447200, 1603594800, 1616896800,
|
|
1635649200, 1648346400, 1667098800, 1679796e3, 1698548400, 1711850400,
|
|
1729998e3, 17433e5, 1761447600, 1774749600, 1792897200, 1806199200,
|
|
1824951600, 1837648800, 1856401200, 1869098400, 1887850800, 1901152800,
|
|
1919300400, 1932602400
|
|
],
|
|
offset: [3484, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600
|
|
]
|
|
},
|
|
"Europe/Amsterdam": {
|
|
time: [-4260211200, -1693699200, -168048e4, -1663452e3, -1650142800, -1633212e3, -
|
|
1617483600, -1601157600, -1586034e3, -1569708e3, -1554584400, -1538258400, -
|
|
1523134800, -15075e5, -1490562e3, -1470175200, -1459112400, -1443996e3, -
|
|
1427662800, -1406671200, -1396213200, -1376949600, -1364763600, -1345413600,
|
|
-1333314e3, -1313791200, -1301259600, -1282255200, -126981e4, -1250719200, -
|
|
1238360400, -1219183200, -1206910800, -1186956e3, -1175461200, -1156024800,
|
|
-1143406800, -1124488800, -1111957200, -1092952800, -1080507600, -
|
|
1061330400, -1049058e3, -1029189600, -1025740800, -1017608400, -998258400, -
|
|
986158800, -966722400, -954104400, -935020800, -85725e4, -844552800, -
|
|
828219600, -812498400, -79677e4, -781048800, -766616400, 228880800,
|
|
244004400, 260330400, 276058800, 29178e4, 307508400, 323834400, 338958e3,
|
|
354679200, 370407600, 386128800, 401857200, 417578400, 433306800, 449028e3,
|
|
465361200, 481082400, 496810800, 512532e3, 528260400, 543981600, 55971e4,
|
|
575431200, 591159600, 606880800, 622609200, 638330400, 654663600, 670384800,
|
|
686113200, 701834400, 717562800, 733284e3, 749012400, 764733600, 780462e3,
|
|
796183200, 811911600, 828237600, 846385200, 859687200, 877834800, 891136800,
|
|
909284400, 922586400, 941338800, 954036e3, 972788400, 985485600, 1004238e3,
|
|
101754e4, 1035687600, 1048989600, 1067137200, 1080439200, 1099191600,
|
|
1111888800, 1130641200, 1143338400, 1162090800, 1174788e3, 1193540400,
|
|
1206842400, 122499e4, 1238292e3, 1256439600, 1269741600, 1288494e3,
|
|
1301191200, 1319943600, 1332640800, 1351393200, 1364695200, 1382842800,
|
|
1396144800, 1414292400, 1427594400, 1445742e3, 1459044e3, 1477796400,
|
|
1490493600, 1509246e3, 1521943200, 1540695600, 1553997600, 1572145200,
|
|
1585447200, 1603594800, 1616896800, 1635649200, 1648346400, 1667098800,
|
|
1679796e3, 1698548400, 1711850400, 1729998e3, 17433e5, 1761447600,
|
|
1774749600, 1792897200, 1806199200, 1824951600, 1837648800, 1856401200,
|
|
1869098400, 1887850800, 1901152800, 1919300400, 1932602400
|
|
],
|
|
offset: [1172, 1172, 4772, 1172, 4772, 1172, 4772, 1172, 4772, 1172, 4772, 1172,
|
|
4772, 1172, 4772, 1172, 4772, 1172, 4772, 1172, 4772, 1172, 4772, 1172,
|
|
4772, 1172, 4772, 1172, 4772, 1172, 4772, 1172, 4772, 1172, 4772, 1172,
|
|
4772, 1172, 4772, 1172, 4772, 1172, 4772, 1172, 4772, 4800, 1200, 4800,
|
|
1200, 4800, 1200, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600
|
|
]
|
|
},
|
|
"Europe/Brussels": {
|
|
time: [-2840140800, -2450994150, -1740355200, -1693699200, -1680476400, -1663452e3,
|
|
-1650142800, -1632002400, -1618693200, -1613822400, -1604278800, -
|
|
1585526400, -1574038800, -1552262400, -1539997200, -1520553600, -1507510800,
|
|
-1490572800, -1473642e3, -1459123200, -1444006800, -1427673600, -1411952400,
|
|
-1396224e3, -1379293200, -1364774400, -1348448400, -1333324800, -1316394e3,
|
|
-1301259600, -1284328800, -126981e4, -1253484e3, -1238360400, -1221429600, -
|
|
1206910800, -1191189600, -1175461200, -1160344800, -1143406800, -1127685600,
|
|
-1111957200, -1096840800, -1080507600, -1063576800, -1049058e3, -1033336800,
|
|
-1017608400, -1002492e3, -986158800, -969228e3, -950475600, -942012e3, -
|
|
934664400, -85725e4, -844552800, -828219600, -812498400, -798066e3, -
|
|
781048800, -766616400, -745452e3, -733266e3, 228880800, 244004400,
|
|
260330400, 276058800, 29178e4, 307508400, 323834400, 338958e3, 354679200,
|
|
370407600, 386128800, 401857200, 417578400, 433306800, 449028e3, 465361200,
|
|
481082400, 496810800, 512532e3, 528260400, 543981600, 55971e4, 575431200,
|
|
591159600, 606880800, 622609200, 638330400, 654663600, 670384800, 686113200,
|
|
701834400, 717562800, 733284e3, 749012400, 764733600, 780462e3, 796183200,
|
|
811911600, 828237600, 846385200, 859687200, 877834800, 891136800, 909284400,
|
|
922586400, 941338800, 954036e3, 972788400, 985485600, 1004238e3, 101754e4,
|
|
1035687600, 1048989600, 1067137200, 1080439200, 1099191600, 1111888800,
|
|
1130641200, 1143338400, 1162090800, 1174788e3, 1193540400, 1206842400,
|
|
122499e4, 1238292e3, 1256439600, 1269741600, 1288494e3, 1301191200,
|
|
1319943600, 1332640800, 1351393200, 1364695200, 1382842800, 1396144800,
|
|
1414292400, 1427594400, 1445742e3, 1459044e3, 1477796400, 1490493600,
|
|
1509246e3, 1521943200, 1540695600, 1553997600, 1572145200, 1585447200,
|
|
1603594800, 1616896800, 1635649200, 1648346400, 1667098800, 1679796e3,
|
|
1698548400, 1711850400, 1729998e3, 17433e5, 1761447600, 1774749600,
|
|
1792897200, 1806199200, 1824951600, 1837648800, 1856401200, 1869098400,
|
|
1887850800, 1901152800, 1919300400, 1932602400
|
|
],
|
|
offset: [1050, 1050, 0, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 0, 3600, 0, 3600,
|
|
0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
|
|
3600, 7200, 3600
|
|
]
|
|
},
|
|
"Europe/Lisbon": {
|
|
time: [-1830386205, -1689555600, -1677798e3, -1667437200, -1647734400, -1635814800,
|
|
-1616198400, -1604365200, -1584662400, -1572742800, -155304e4, -1541206800,
|
|
-1521504e3, -1442451600, -1426809600, -1379293200, -1364774400, -1348448400,
|
|
-1333324800, -1316394e3, -1301270400, -1284339600, -1269820800, -1221440400,
|
|
-1206921600, -1191200400, -1175472e3, -1127696400, -1111968e3, -1096851600,
|
|
-1080518400, -1063587600, -1049068800, -1033347600, -1017619200, -
|
|
1002502800, -986169600, -969238800, -950486400, -942022800, -922665600, -
|
|
906944400, -891129600, -877309200, -873680400, -864e6, -857952e3, -
|
|
845859600, -842835600, -831340800, -825897600, -81441e4, -810781200, -
|
|
799891200, -794448e3, -782960400, -779331600, -768441600, -762998400, -
|
|
749091600, -733363200, -717631200, -701902800, -686181600, -670453200, -
|
|
654732e3, -639003600, -591832800, -575499600, -559778400, -54405e4, -
|
|
528328800, -512600400, -496879200, -481150800, -465429600, -449701200, -
|
|
43398e4, -417646800, -401925600, -386197200, -370476e3, -354747600, -
|
|
339026400, -323298e3, -307576800, -291848400, -276127200, -260398800, -
|
|
244677600, -228344400, -212623200, -196894800, -181173600, -165445200, -
|
|
149724e3, -133995600, -118274400, 212547600, 228268800, 243997200,
|
|
260323200, 276051600, 291772800, 307504800, 323222400, 338954400, 354675600,
|
|
370404e3, 386125200, 401853600, 417578400, 433303200, 449024400, 465357600,
|
|
481078800, 496807200, 512528400, 528256800, 543978e3, 559706400, 575427600,
|
|
591156e3, 606877200, 622605600, 638326800, 65466e4, 670381200, 686109600,
|
|
701830800, 717559200, 733284e3, 749012400, 764733600, 780462e3, 796183200,
|
|
811911600, 828237600, 846381600, 859683600, 877831200, 891133200, 909280800,
|
|
922582800, 941335200, 954032400, 972784800, 985482e3, 1004234400,
|
|
1017536400, 1035684e3, 1048986e3, 1067133600, 1080435600, 1099188e3,
|
|
1111885200, 1130637600, 1143334800, 1162087200, 1174784400, 1193536800,
|
|
1206838800, 1224986400, 1238288400, 1256436e3, 1269738e3, 1288490400,
|
|
1301187600, 131994e4, 1332637200, 1351389600, 1364691600, 1382839200,
|
|
1396141200, 1414288800, 1427590800, 1445738400, 1459040400, 1477792800,
|
|
149049e4, 1509242400, 1521939600, 1540692e3, 1553994e3, 1572141600,
|
|
1585443600, 1603591200, 1616893200, 1635645600, 1648342800, 1667095200,
|
|
1679792400, 1698544800, 1711846800, 1729994400, 1743296400, 1761444e3,
|
|
1774746e3, 1792893600, 1806195600, 1824948e3, 1837645200, 1856397600,
|
|
1869094800, 1887847200, 1901149200, 1919296800, 1932598800
|
|
],
|
|
offset: [-2205, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 7200, 3600, 0,
|
|
3600, 7200, 3600, 0, 3600, 7200, 3600, 0, 3600, 7200, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0
|
|
]
|
|
},
|
|
"Europe/Dublin": {
|
|
time: [-2821651200, -1691964e3, -1680469200, -1664143200, -1650142800, -1633903200,
|
|
-1617483600, -1601848800, -1586034e3, -1570399200, -1552165200, -1538344800,
|
|
-152253e4, -15075e5, -1490562e3, -1473631200, -1460926800, -1442786400, -
|
|
1428872400, -1410732e3, -1396213200, -1379282400, -1364763600, -1348437600,
|
|
-1333314e3, -1315778400, -1301259600, -1284328800, -126981e4, -1253484e3, -
|
|
1238360400, -1221429600, -1206910800, -118998e4, -1175461200, -1159135200, -
|
|
1143406800, -1126476e3, -1111957200, -1095631200, -1080507600, -1063576800,
|
|
-1049058e3, -1032127200, -1017608400, -1001282400, -986158800, -969228e3, -
|
|
950475600, -942012e3, -733352400, -719445600, -699483600, -684972e3, -
|
|
668034e3, -654732e3, -636584400, -622072800, -605739600, -590623200, -
|
|
57429e4, -558568800, -542235600, -527119200, -512600400, -496274400, -
|
|
481150800, -46422e4, -449701200, -432165600, -417646800, -401320800, -
|
|
386197200, -369266400, -354747600, -337816800, -323298e3, -306972e3, -
|
|
291848400, -276732e3, -257979600, -245282400, -22653e4, -213228e3, -
|
|
195080400, -182383200, -163630800, -150933600, -132181200, -119484e3, -
|
|
100731600, -88034400, -68677200, -59004e3, 57726e3, 69818400, 89175600,
|
|
101268e3, 120625200, 132717600, 152074800, 164167200, 183524400, 196221600,
|
|
214974e3, 227671200, 246423600, 259120800, 278478e3, 290570400, 309927600,
|
|
32202e4, 341377200, 354675600, 372823200, 386125200, 404272800, 417574800,
|
|
435722400, 449024400, 467776800, 481078800, 499226400, 512528400, 530676e3,
|
|
543978e3, 562125600, 575427600, 593575200, 606877200, 625629600, 638326800,
|
|
657079200, 670381200, 688528800, 701830800, 719978400, 733280400, 751428e3,
|
|
76473e4, 782877600, 796179600, 814327200, 828234e3, 846381600, 859683600,
|
|
877831200, 891133200, 909280800, 922582800, 941335200, 954032400, 972784800,
|
|
985482e3, 1004234400, 1017536400, 1035684e3, 1048986e3, 1067133600,
|
|
1080435600, 1099188e3, 1111885200, 1130637600, 1143334800, 1162087200,
|
|
1174784400, 1193536800, 1206838800, 1224986400, 1238288400, 1256436e3,
|
|
1269738e3, 1288490400, 1301187600, 131994e4, 1332637200, 1351389600,
|
|
1364691600, 1382839200, 1396141200, 1414288800, 1427590800, 1445738400,
|
|
1459040400, 1477792800, 149049e4, 1509242400, 1521939600, 1540692e3,
|
|
1553994e3, 1572141600, 1585443600, 1603591200, 1616893200, 1635645600,
|
|
1648342800, 1667095200, 1679792400, 1698544800, 1711846800, 1729994400,
|
|
1743296400, 1761444e3, 1774746e3, 1792893600, 1806195600, 1824948e3,
|
|
1837645200, 1856397600, 1869094800, 1887847200, 1901149200, 1919296800,
|
|
1932598800
|
|
],
|
|
offset: [-1500, -1521, 2079, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600,
|
|
0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
|
|
3600, 0, 3600, 0, 3600, 0
|
|
]
|
|
},
|
|
"Europe/Oslo": {
|
|
time: [-2366755200, -1691881200, -1680566400, -927507600, -85725e4, -844552800, -
|
|
828219600, -812498400, -79677e4, -781048800, -765320400, -340840800, -
|
|
324507600, -308786400, -293058e3, -277336800, -261608400, -245887200, -
|
|
230158800, -214437600, -198709200, -182988e3, -166654800, -147909600, -
|
|
135205200, 323834400, 338958e3, 354679200, 370407600, 386128800, 401857200,
|
|
417578400, 433306800, 449028e3, 465361200, 481082400, 496810800, 512532e3,
|
|
528260400, 543981600, 55971e4, 575431200, 591159600, 606880800, 622609200,
|
|
638330400, 654663600, 670384800, 686113200, 701834400, 717562800, 733284e3,
|
|
749012400, 764733600, 780462e3, 796183200, 811911600, 828237600, 846385200,
|
|
859687200, 877834800, 891136800, 909284400, 922586400, 941338800, 954036e3,
|
|
972788400, 985485600, 1004238e3, 101754e4, 1035687600, 1048989600,
|
|
1067137200, 1080439200, 1099191600, 1111888800, 1130641200, 1143338400,
|
|
1162090800, 1174788e3, 1193540400, 1206842400, 122499e4, 1238292e3,
|
|
1256439600, 1269741600, 1288494e3, 1301191200, 1319943600, 1332640800,
|
|
1351393200, 1364695200, 1382842800, 1396144800, 1414292400, 1427594400,
|
|
1445742e3, 1459044e3, 1477796400, 1490493600, 1509246e3, 1521943200,
|
|
1540695600, 1553997600, 1572145200, 1585447200, 1603594800, 1616896800,
|
|
1635649200, 1648346400, 1667098800, 1679796e3, 1698548400, 1711850400,
|
|
1729998e3, 17433e5, 1761447600, 1774749600, 1792897200, 1806199200,
|
|
1824951600, 1837648800, 1856401200, 1869098400, 1887850800, 1901152800,
|
|
1919300400, 1932602400
|
|
],
|
|
offset: [2580, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
|
|
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600
|
|
]
|
|
}
|
|
}
|
|
},
|
|
"3t3b": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "dateFormatProperty", (function() {
|
|
return a
|
|
})), i.d(t, "restoreDateFormatSettingsValue", (function() {
|
|
return l
|
|
}));
|
|
var s = i("Vdly"),
|
|
r = i("m/cY"),
|
|
n = i("e1ZQ");
|
|
|
|
function o() {
|
|
return s.getValue("date_format", Object(n.c)())
|
|
}
|
|
const a = Object(r.a)(o());
|
|
|
|
function l() {
|
|
a.setValue(Object(n.c)()), s.remove("date_format")
|
|
}
|
|
s.onSync.subscribe(null, () => a.setValue(o())), a.listeners().subscribe(null, () => s.setValue(
|
|
"date_format", a.value()))
|
|
},
|
|
"3u3j": function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return n
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("RDU5");
|
|
class n extends r.UndoCommand {
|
|
constructor(e, t, i) {
|
|
super(i), this._chartModel = e, this._sourceId = t.id();
|
|
const r = Object(s.ensureNotNull)(t.priceScale());
|
|
this._initialPriceScaleId = r.id(), this._initialPriceScaleState = Object(s
|
|
.ensureNotNull)(t.priceScale()).state();
|
|
const n = Object(s.ensureNotNull)(e.paneForSource(t));
|
|
this._initialPriceScalePosition = n.priceScalePosition(r), this
|
|
._initialPriceScaleIndex = n.priceScaleIndex(r, this
|
|
._initialPriceScalePosition), this._initialPaneIndex = e.panes()
|
|
.indexOf(n)
|
|
}
|
|
_newPriceScaleState(e) {
|
|
const t = {
|
|
...this._initialPriceScaleState
|
|
};
|
|
return delete t.m_isLockScale, delete t.id, delete t.m_topMargin, delete t
|
|
.m_bottomMargin, t
|
|
}
|
|
_originalPriceScaleState() {
|
|
return this._initialPriceScaleState
|
|
}
|
|
}
|
|
},
|
|
"4GHa": function(e, t) {
|
|
e.exports =
|
|
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 28" width="36" height="28"><path fill="currentColor" d="M14 22H7V11H0V4h14v18zM28 22h-8l7.5-18h8L28 22z"/><circle fill="currentColor" cx="20" cy="8" r="4"/></svg>'
|
|
},
|
|
"4TVt": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineToolPriceAxisView", (function() {
|
|
return o
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("KcY8"),
|
|
n = i("Ulff");
|
|
class o extends r.a {
|
|
constructor(e, t) {
|
|
super(), this._active = !1, this._source = e, this._data = t
|
|
}
|
|
setActive(e) {
|
|
this._active = e
|
|
}
|
|
_updateRendererData(e, t, i) {
|
|
e.visible = !1;
|
|
const s = this._source.model();
|
|
if (!s.timeScale() || s.timeScale().isEmpty()) return;
|
|
const r = this._source.priceScale();
|
|
if (null === r || r.isEmpty()) return;
|
|
if (!s.selection().isSelected(this._source) && !this._source
|
|
.isForcedDrawPriceAxisLabel()) return;
|
|
if (null === s.timeScale().visibleBarsStrictRange()) return;
|
|
const o = this._source.priceAxisPoints(),
|
|
a = this._data.pointIndex;
|
|
if (o.length <= a) return;
|
|
const l = o[a];
|
|
if (!isFinite(l.price)) return;
|
|
const c = this._source.ownerSource(),
|
|
h = null !== c ? c.firstValue() : null;
|
|
if (null === h) return;
|
|
let u = this._active ? n.a.active : n.a.common;
|
|
this._data.backgroundProperty ? u = this._data.backgroundProperty.value() : this
|
|
._data.backgroundPropertyGetter && (u = this._data
|
|
.backgroundPropertyGetter()), i.background = u, i.borderColor =
|
|
"#2E84A6", i
|
|
.textColor = this.generateTextColor(u), i.coordinate = r.priceToCoordinate(l
|
|
.price, h), e.text = this._formatPrice(l.price, h), e.visible = !0
|
|
}
|
|
_formatPrice(e, t) {
|
|
return Object(s.ensureNotNull)(this._source.priceScale()).formatPrice(e, t)
|
|
}
|
|
}
|
|
},
|
|
"4bfY": function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Ss5c").LineDataSource,
|
|
r = i("5rJj"),
|
|
n = i("j3hX"),
|
|
o = n.LineToolWidthsProperty,
|
|
a = n.LineToolColorsProperty;
|
|
class l extends s {
|
|
constructor(e, t) {
|
|
super(e, t || l.createProperties()), i.e("lt-pane-views").then(i.t.bind(null,
|
|
"FzRY", 7)).then(({
|
|
FibCirclesPaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
levelsCount() {
|
|
return l.LevelsCount
|
|
}
|
|
pointsCount() {
|
|
return 2
|
|
}
|
|
name() {
|
|
return "Fib Circles"
|
|
}
|
|
processErase(e, t) {
|
|
var i = "level" + t,
|
|
s = this.properties()[i].visible;
|
|
e.setProperty(s, !1, "Erase level line")
|
|
}
|
|
static createProperties(e) {
|
|
var t = new r("linetoolfibcircles", e, !1, {
|
|
range: [1, 11]
|
|
});
|
|
return l._configureProperties(t), t
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "6U6r")))
|
|
.FibCirclesDefinitionsViewModel
|
|
}
|
|
_snapTo45DegreesAvailable() {
|
|
return !0
|
|
}
|
|
static _configureProperties(e) {
|
|
s._configureProperties(e);
|
|
for (var t = [e.child("trendline").child("linewidth")], i = [e.child("trendline")
|
|
.child("color")
|
|
], r = 1; r <= l.LevelsCount; r++) t.push(e.child("level" + r).child(
|
|
"linewidth")), i.push(e.child("level" + r).child("color"));
|
|
e.addChild("linesColors", new a(i)), e.addChild("linesWidths", new o(t))
|
|
}
|
|
}
|
|
l.LevelsCount = 11, t.LineToolFibCircles = l
|
|
},
|
|
"4kQX": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "TimeFormatter", (function() {
|
|
return n
|
|
}));
|
|
var s = i("iboI"),
|
|
r = i("kcTO");
|
|
class n {
|
|
constructor(e) {
|
|
this._formatStr = e || "%h:%m:%s"
|
|
}
|
|
format(e) {
|
|
return s.customFormatters.timeFormatter ? s.customFormatters.timeFormatter.format(
|
|
e) : this._formatStr.replace("%h", Object(r.numberToStringWithLeadingZero)(e
|
|
.getUTCHours(), 2)).replace("%m", Object(r.numberToStringWithLeadingZero)(e
|
|
.getUTCMinutes(), 2)).replace("%s", Object(r.numberToStringWithLeadingZero)(
|
|
e.getUTCSeconds(), 2))
|
|
}
|
|
formatLocal(e) {
|
|
return s.customFormatters.timeFormatter ? s.customFormatters.timeFormatter
|
|
.formatLocal ? s.customFormatters.timeFormatter.formatLocal(e) : s
|
|
.customFormatters.timeFormatter.format(e) : this._formatStr.replace("%h",
|
|
Object(r.numberToStringWithLeadingZero)(e.getHours(), 2)).replace("%m",
|
|
Object(r.numberToStringWithLeadingZero)(e.getMinutes(), 2)).replace("%s",
|
|
Object(r.numberToStringWithLeadingZero)(e.getSeconds(), 2))
|
|
}
|
|
}
|
|
},
|
|
"4miz": function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return s
|
|
})), i.d(t, "b", (function() {
|
|
return r
|
|
}));
|
|
class s {
|
|
constructor(e, t) {
|
|
this._visible = !0, this._title = e, this._value = t
|
|
}
|
|
title() {
|
|
return this._title
|
|
}
|
|
setTitle(e) {
|
|
this._title = e
|
|
}
|
|
text() {
|
|
return this._value
|
|
}
|
|
value() {
|
|
return this._value
|
|
}
|
|
setValue(e) {
|
|
this._value = e
|
|
}
|
|
visible() {
|
|
return this._visible
|
|
}
|
|
setVisible(e) {
|
|
this._visible = e
|
|
}
|
|
color() {
|
|
return this._color
|
|
}
|
|
setColor(e) {
|
|
this._color = e
|
|
}
|
|
}
|
|
class r {
|
|
constructor() {
|
|
this._items = [], this._header = "", this._title = ""
|
|
}
|
|
header() {
|
|
return this._header
|
|
}
|
|
title() {
|
|
return this._title
|
|
}
|
|
items() {
|
|
return this._items
|
|
}
|
|
update() {}
|
|
}
|
|
},
|
|
"4o++": function(e, t, i) {
|
|
"use strict";
|
|
var s;
|
|
i.r(t), i.d(t, "MagnetMode", (function() {
|
|
return s
|
|
})),
|
|
function(e) {
|
|
e[e.WeakMagnet = 0] = "WeakMagnet", e[e.StrongMagnet = 1] = "StrongMagnet"
|
|
}(s || (s = {}))
|
|
},
|
|
"4u8j": function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Ss5c").LineDataSource,
|
|
r = i("5rJj"),
|
|
n = i("j3hX"),
|
|
o = n.LineToolWidthsProperty,
|
|
a = n.LineToolColorsProperty;
|
|
class l extends s {
|
|
constructor(e, t) {
|
|
super(e, t || l.createProperties()), i.e("lt-pane-views").then(i.t.bind(null,
|
|
"ZJWf", 7)).then(({
|
|
GannFanPaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
levelsCount() {
|
|
return l.LevelsCount
|
|
}
|
|
pointsCount() {
|
|
return 2
|
|
}
|
|
name() {
|
|
return "Gann Fan"
|
|
}
|
|
processErase(e, t) {
|
|
var i = "level" + t,
|
|
s = this.properties()[i].visible;
|
|
e.setProperty(s, !1, "Erase level line")
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "ASG6")))
|
|
.GannFanDefinitionsViewModel
|
|
}
|
|
static createProperties(e) {
|
|
var t = new r("linetoolgannfan", e, !1, {
|
|
range: [1, 9]
|
|
});
|
|
return l._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
s._configureProperties(e);
|
|
for (var t = [], i = [], r = 1; r <= l.LevelsCount; r++) t.push(e.child("level" + r)
|
|
.child("linewidth")), i.push(e.child("level" + r).child("color"));
|
|
e.addChild("linesColors", new a(i)), e.addChild("linesWidths", new o(t))
|
|
}
|
|
}
|
|
l.LevelsCount = 9, t.LineToolGannFan = l
|
|
},
|
|
"4vW/": function(e, t, i) {
|
|
"use strict";
|
|
var s;
|
|
i.r(t), i.d(t, "ColorType", (function() {
|
|
return s
|
|
})),
|
|
function(e) {
|
|
e.Solid = "solid", e.Gradient = "gradient"
|
|
}(s || (s = {}))
|
|
},
|
|
"53h+": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "findSuitableResolutionToBuildFrom", (function() {
|
|
return a
|
|
}));
|
|
var s = i("LxhU");
|
|
|
|
function r(e) {
|
|
throw console.error(e), e
|
|
}
|
|
|
|
function n(e, t) {
|
|
const i = t.multiplier();
|
|
for (let s = e.length - 1; s >= 0; s--) {
|
|
const r = Number(e[s]);
|
|
if (i % r == 0) return `${r}${t.letter()}`
|
|
}
|
|
return null
|
|
}
|
|
|
|
function o(e, t) {
|
|
const i = n(e, t);
|
|
if (null !== i) return i;
|
|
r(`Misconfiguration error: it is trying to request ${t.value()} but we cannot build it from lower resolution`)
|
|
}
|
|
|
|
function a(e, t) {
|
|
const i = s.Interval.parse(e);
|
|
if ((i.isWeeks() || i.isMonths()) && t.has_weekly_and_monthly) {
|
|
let e = ["1"];
|
|
i.isWeeks() && void 0 !== t.weekly_multipliers && (e = t.weekly_multipliers), i
|
|
.isMonths() && void 0 !== t.monthly_multipliers && (e = t.monthly_multipliers);
|
|
const s = n(e, i);
|
|
if (null !== s) return s
|
|
}
|
|
if (i.isDWM() && (void 0 === t.has_daily || t.has_daily)) return i.isDays() && void 0 !== t
|
|
.daily_multipliers ? o(t.daily_multipliers, i) : (void 0 === t.daily_multipliers ||
|
|
t.daily_multipliers.includes("1") || r(
|
|
"Misconfiguration error: it is trying to request a resolution but symbol does not support it"
|
|
), "1D");
|
|
if (i.isDWM() && r(
|
|
`Misconfiguration error: it is trying to request ${i.value()} but we cannot build it from lower resolution`
|
|
), i.isMinutes() && !t.has_intraday && r(
|
|
"Misconfiguration error: it is trying to request intraday resolution but symbol does not support it"
|
|
), i.isSeconds() && !t.has_seconds && r(
|
|
"Misconfiguration error: it is trying to request seconds resolution but symbol does not support it"
|
|
), i.isTicks()) return (!t.has_ticks || i.multiplier() > 1) && r(
|
|
`Misconfiguration error: it is trying to request ${i.multiplier()} ticks resolution but symbol does not support it`
|
|
), "1T";
|
|
const a = i.isSeconds() ? t.seconds_multipliers : t.intraday_multipliers;
|
|
return void 0 !== a ? o(a, i) : i.value()
|
|
}
|
|
},
|
|
"54XG": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "FavoriteStudyTemplateService", (function() {
|
|
return r
|
|
}));
|
|
var s = i("ulZB");
|
|
class r extends s.b {
|
|
constructor(e, t) {
|
|
super(e, t, "FAVORITE_STUDY_TEMPLATES_CHANGED", "StudyTemplates.quicks", [])
|
|
}
|
|
remove(e) {
|
|
this.set(this.get().filter(t => t !== e))
|
|
}
|
|
}
|
|
},
|
|
"585y": function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return s
|
|
}));
|
|
class s {
|
|
constructor(e) {
|
|
this._value = null, this._series = e, this._series.dataEvents().dataUpdated()
|
|
.subscribe(this, this._onSeriesUpdated)
|
|
}
|
|
destroy() {
|
|
this._series.dataEvents().dataUpdated().unsubscribeAll(this)
|
|
}
|
|
volume(e, t) {
|
|
if (null !== this._value && this._value.from === e && this._value.to === t)
|
|
return this._value.value;
|
|
let i = 0;
|
|
const s = this._series.data().bars(),
|
|
r = s.firstIndex(),
|
|
n = s.lastIndex();
|
|
if (null !== r && e < r && t < r || null !== n && e > n && t > n) i = NaN;
|
|
else {
|
|
const s = this._series.data().bars().rangeIterator(Math.min(e, t), Math.max(e,
|
|
t));
|
|
for (; s.hasNext();) {
|
|
const e = s.next().value[5];
|
|
if (void 0 === e) {
|
|
i = NaN;
|
|
break
|
|
}
|
|
i += e
|
|
}
|
|
}
|
|
return this._value = {
|
|
from: e,
|
|
to: t,
|
|
value: i
|
|
}, i
|
|
}
|
|
_onSeriesUpdated(e, t) {
|
|
if (null === this._value) return;
|
|
if (t) return void(this._value = null);
|
|
const i = this._series.data().bars().lastIndex();
|
|
(null === i || i <= this._value.to) && (this._value = null)
|
|
}
|
|
}
|
|
},
|
|
"5B3K": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "StudyError", (function() {
|
|
return s
|
|
}));
|
|
class s extends Error {
|
|
constructor(e) {
|
|
super(e), this.studyError = !0
|
|
}
|
|
}
|
|
},
|
|
"5C6T": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "PipFormatter", (function() {
|
|
return r
|
|
}));
|
|
var s = i("kcTO");
|
|
class r extends s.PriceFormatter {
|
|
constructor(e, t, i, s) {
|
|
t || (t = 1), "forex" !== i && "cfd" !== i || !s ? (super(1),
|
|
this._isForex = !1) : (super(s), this._isForex = !0), this
|
|
._pipPriceScale = e, this._pipMinMove = t, this._pipMinMove2 = s
|
|
}
|
|
format(e, t, i) {
|
|
let s = this._isForex ? this._pipMinMove2 : this._pipMinMove;
|
|
return void 0 === s && (s = NaN), super.format(e * this._pipPriceScale / s, t,
|
|
i)
|
|
}
|
|
}
|
|
},
|
|
"5JMW": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "isLineToolRiskReward", (function() {
|
|
return a
|
|
})), i.d(t, "LineDataSourceApi", (function() {
|
|
return c
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("ogJP");
|
|
const n = new Map([
|
|
["LineToolRiskRewardLong", 2],
|
|
["LineToolRiskRewardShort", 2],
|
|
["LineToolBezierQuadro", 3],
|
|
["LineToolBezierCubic", 4]
|
|
]);
|
|
|
|
function o(e) {
|
|
const t = n.get(e.toolname);
|
|
if (void 0 !== t) return t;
|
|
const i = e.pointsCount();
|
|
return -1 === i ? e.points().length : i
|
|
}
|
|
|
|
function a(e) {
|
|
return "LineToolRiskRewardLong" === e || "LineToolRiskRewardShort" === e
|
|
}
|
|
const l = ["alwaysShowStats", "entryPrice", "inputs.first bar time", "inputs.last bar time",
|
|
"interval", "linesWidths", "points", "snapTo45Degrees", "stopPrice", "symbol",
|
|
"symbolStateVersion", "currencyId", "unitId", "targetPrice", "zOrderVersion"
|
|
];
|
|
class c {
|
|
constructor(e, t, i) {
|
|
this._source = e, this._model = t, this._pointsConverter = i
|
|
}
|
|
isSelectionEnabled() {
|
|
return this._source.isSelectionEnabled()
|
|
}
|
|
setSelectionEnabled(e) {
|
|
this._source.setSelectionEnabled(e)
|
|
}
|
|
isSavingEnabled() {
|
|
return this._source.isSavedInChart()
|
|
}
|
|
setSavingEnabled(e) {
|
|
this._source.setSavingInChartEnabled(e)
|
|
}
|
|
isShowInObjectsTreeEnabled() {
|
|
return this._source.showInObjectTree()
|
|
}
|
|
setShowInObjectsTreeEnabled(e) {
|
|
this._source.setShowInObjectsTreeEnabled(e)
|
|
}
|
|
isUserEditEnabled() {
|
|
return this._source.userEditEnabled()
|
|
}
|
|
setUserEditEnabled(e) {
|
|
this._source.setUserEditEnabled(e)
|
|
}
|
|
bringToFront() {
|
|
this._model.bringToFront([this._source])
|
|
}
|
|
sendToBack() {
|
|
this._model.sendToBack([this._source])
|
|
}
|
|
getProperties() {
|
|
return this._source.properties().state(l, !0)
|
|
}
|
|
setProperties(e) {
|
|
this._setProps(this._source.properties(), e, "")
|
|
}
|
|
getPoints() {
|
|
let e = this._source.points();
|
|
const t = o(this._source);
|
|
return e.length > t && (Object(s.assert)(a(this._source.toolname)), e = e.slice(0,
|
|
t)), this._pointsConverter.dataSourcePointsToPriced(e)
|
|
}
|
|
setPoints(e) {
|
|
if (this._source.isFixed()) return;
|
|
const t = o(this._source);
|
|
if (t !== e.length) throw new Error(
|
|
`Wrong points count. Required: ${t}, provided: ${e.length}`);
|
|
const i = this._pointsConverter.apiPointsToDataSource(e);
|
|
this._model.startChangingLinetool(this._source), this._model.changeLinePoints(this
|
|
._source, i), this._model.endChangingLinetool(!0), this._source
|
|
.createServerPoints()
|
|
}
|
|
ownerSourceId() {
|
|
return Object(s.ensureNotNull)(this._source.ownerSource()).id()
|
|
}
|
|
changePoint(e, t) {
|
|
if (this._source.isFixed()) return;
|
|
const i = this._pointsConverter.apiPointsToDataSource([e])[0];
|
|
this._model.startChangingLinetool(this._source, {
|
|
...i
|
|
}, t), this._model.changeLinePoint({
|
|
...i
|
|
}), this._model.endChangingLinetool(!1), this._source.createServerPoints()
|
|
}
|
|
isHidden() {
|
|
return this._source.isSourceHidden()
|
|
}
|
|
getRawPoints() {
|
|
return this._source.points()
|
|
}
|
|
setRawPoint(e, t) {
|
|
this._model.startChangingLinetool(this._source, {
|
|
...t
|
|
}, e), this._model.changeLinePoint({
|
|
...t
|
|
}), this._model.endChangingLinetool(!1)
|
|
}
|
|
move(e, t) {
|
|
this._model.startMovingSources([this._source], {
|
|
logical: e
|
|
}, null, new Map), this._model.moveSources({
|
|
logical: t
|
|
}, new Map), this._model.endMovingSources(!1)
|
|
}
|
|
dataAndViewsReady() {
|
|
return this._source.dataAndViewsReady()
|
|
}
|
|
zorder() {
|
|
return this._source.zorder()
|
|
}
|
|
symbol() {
|
|
return this._source.properties().symbol.value()
|
|
}
|
|
currency() {
|
|
return this._source.properties().currencyId.value()
|
|
}
|
|
unit() {
|
|
return this._source.properties().unitId.value()
|
|
}
|
|
_setProps(e, t, i) {
|
|
for (const s in t) {
|
|
if (!t.hasOwnProperty(s)) continue;
|
|
const n = 0 === i.length ? s : `${i}.${s}`;
|
|
if (e.hasOwnProperty(s)) {
|
|
const i = t[s];
|
|
Object(r.isHashObject)(i) ? this._setProps(e[s], i, n) : e[s].setValue(i)
|
|
} else console.warn(`Unknown property "${n}"`)
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"5VQP": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "ContextMenuManager", (function() {
|
|
return s
|
|
}));
|
|
var s, r = i("tWVy");
|
|
! function(e) {
|
|
const t = [];
|
|
|
|
function s() {
|
|
Object(r.b)()
|
|
}
|
|
e.createMenu = async function(e, r = {}, n) {
|
|
const o = new((await Promise.all([i.e("react"), i.e(6), i.e(11), i.e(21), i.e(
|
|
22), i.e(24), i.e(28), i.e(48), i.e(52), i.e(60), i.e(
|
|
0), i.e(5), i.e(54), i.e("context-menu-renderer")]).then(i.bind(
|
|
null, "cbq4"))).ContextMenuRenderer)(e, r, () => {
|
|
const e = t.indexOf(o); - 1 !== e && t.splice(e, 1), void 0 !== n &&
|
|
n()
|
|
}, s);
|
|
return t.push(o), o
|
|
}, e.hideAll = s, e.getShown = function() {
|
|
for (let e = 0; e < t.length; e++)
|
|
if (t[e].isShown()) return t[e];
|
|
return null
|
|
}
|
|
}(s || (s = {}))
|
|
},
|
|
"5ZUI": function(e, t, i) {
|
|
"use strict";
|
|
var s = i("WPQD").LineToolTrendLine,
|
|
r = i("Ocx9").DefaultProperty;
|
|
class n extends s {
|
|
constructor(e, t) {
|
|
super(e, t || n.createProperties())
|
|
}
|
|
name() {
|
|
return "Ray"
|
|
}
|
|
static createProperties(e) {
|
|
var t = new r("linetoolray", e);
|
|
return n._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
s._configureProperties(e)
|
|
}
|
|
}
|
|
t.LineToolRay = n
|
|
},
|
|
"5fI3": function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e) {
|
|
return function(e) {
|
|
return "=" + JSON.stringify(e)
|
|
}(e)
|
|
}
|
|
|
|
function r(e) {
|
|
return "=" === e[0]
|
|
}
|
|
|
|
function n(e) {
|
|
if (!r(e)) return {
|
|
symbol: e
|
|
};
|
|
try {
|
|
return JSON.parse(e.slice(1))
|
|
} catch (t) {
|
|
return {
|
|
symbol: e
|
|
}
|
|
}
|
|
}
|
|
i.r(t), i.d(t, "encodeExtendedSymbolOrGetSimpleSymbolString", (function() {
|
|
return s
|
|
})), i.d(t, "isEncodedExtendedSymbol", (function() {
|
|
return r
|
|
})), i.d(t, "decodeExtendedSymbol", (function() {
|
|
return n
|
|
}))
|
|
},
|
|
"5mo2": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("jCNj"),
|
|
r = i("Y7w9"),
|
|
n = i("txPx"),
|
|
o = i("OBgQ");
|
|
const a = Object(n.getLogger)("Chart.Model.SessionSpec");
|
|
|
|
function l(e) {
|
|
return e >= 48 && e <= 57
|
|
}
|
|
class c {
|
|
constructor() {
|
|
this.entries = [], this.firstDayOfWeek = s.MONDAY, this.weekEndsCount = -1, this
|
|
.maxTradingDayLength = 0
|
|
}
|
|
parseSessions(e, t) {
|
|
var i;
|
|
if (this._clear(), this.timezone = e, "24x7" === (t = this._parseFirstDayOfWeek(t))
|
|
.toLowerCase())
|
|
for (const e of u) this.entries.push(c._createSessionEntry(e, 0, 0, 0, 0));
|
|
else {
|
|
let e = !1;
|
|
const i = new Map;
|
|
for (const s of t.split("|")) {
|
|
const t = s.split(":");
|
|
if (1 !== t.length && 2 !== t.length) {
|
|
a.logError("Bad session section: " + s);
|
|
continue
|
|
}
|
|
const r = 1 === t.length;
|
|
if (r) {
|
|
if (e) {
|
|
a.logError("Duplicated default section: " + s);
|
|
continue
|
|
}
|
|
e = !0
|
|
}
|
|
const n = r ? h : c._parseWorkingDays(t[1]);
|
|
for (const e of n) r && i.has(e) || i.set(e, t[0])
|
|
}
|
|
for (const e of u) {
|
|
const t = i.get(e);
|
|
if (void 0 !== t)
|
|
for (const i of t.split(",")) this.entries.push(c._parseSessionEntry(e,
|
|
i))
|
|
}
|
|
}
|
|
this.entries.sort(p);
|
|
const s = new Map;
|
|
for (const e of this.entries) {
|
|
const t = e.dayOfWeek();
|
|
s.set(t, e.length() + (null !== (i = s.get(t)) && void 0 !== i ? i : 0))
|
|
}
|
|
this.maxTradingDayLength = 0, s.forEach(e => {
|
|
this.maxTradingDayLength = Math.max(this.maxTradingDayLength, e)
|
|
}), this.weekEndsCount = 7 - s.size
|
|
}
|
|
static parseHolidaysAndCorrections(e, t, i) {
|
|
const r = new Map,
|
|
n = new Map,
|
|
o = e => {
|
|
const t = this._parseDay(e),
|
|
i = t.toString(),
|
|
s = n.get(i);
|
|
return void 0 !== s ? s : (n.set(i, t), t)
|
|
};
|
|
if ("" !== t) {
|
|
const e = [];
|
|
for (const i of t.split(",")) {
|
|
if (8 !== i.length) throw new Error("bad holiday date: " + i);
|
|
const t = o(i);
|
|
r.set(t, e)
|
|
}
|
|
}
|
|
if ("" === i) return r;
|
|
const a = s.get_timezone("Etc/UTC");
|
|
for (const e of i.split(";")) {
|
|
const t = e.split(":");
|
|
if (2 !== t.length) throw new Error("bad correction section: " + e);
|
|
const i = [];
|
|
if ("dayoff" !== t[0])
|
|
for (const e of t[0].split(",")) i.push(this._parseSessionEntry(1, e));
|
|
for (const e of t[1].split(",")) {
|
|
if (8 !== e.length) throw new Error("bad correction date: " + e);
|
|
const t = o(e),
|
|
n = s.get_day_of_week(s.get_cal(a, t.year, t.month - 1, t.day)),
|
|
l = [];
|
|
for (const e of i) l.push(new _(n, e.startOffset(), e.length()));
|
|
r.set(t, l)
|
|
}
|
|
}
|
|
return r
|
|
}
|
|
_clear() {
|
|
this.entries = [], this.timezone = "", this.firstDayOfWeek = s.MONDAY, this
|
|
.weekEndsCount = -1
|
|
}
|
|
_parseFirstDayOfWeek(e) {
|
|
const t = e.split(";");
|
|
if (t.length > 2) return a.logError(
|
|
"Only one `first day` specification expected @ session " + e), e;
|
|
if (1 === t.length) return e;
|
|
let i = 1;
|
|
let r = t[0].indexOf("-") >= 0 ? NaN : parseInt(t[0]);
|
|
return isNaN(r) && (i = 0, r = parseInt(t[1])), r < s.SUNDAY || r > s.SATURDAY ? (a
|
|
.logError(`Unexpected day index @ session: ${e}; day index ${r}`), e) : (
|
|
this.firstDayOfWeek = r, t[i])
|
|
}
|
|
static _parseDay(e) {
|
|
const t = parseInt(e.substring(0, 4)),
|
|
i = parseInt(e.substring(4, 6)),
|
|
s = parseInt(e.substring(6, 8));
|
|
return new o.a(t, i, s)
|
|
}
|
|
static _parseSessionEntry(e, t) {
|
|
let i = t.split("-");
|
|
2 !== i.length && (a.logError("Bad sessions entry: " + t), i = ["0000", "0000"]);
|
|
let s = 0,
|
|
r = i[0];
|
|
if (r.includes("F")) {
|
|
const e = r.split("F");
|
|
r = e[0], s = "" !== e[1] ? parseInt(e[1]) : 1
|
|
}
|
|
let n = 0,
|
|
o = i[1];
|
|
if (o.includes("F")) {
|
|
const e = o.split("F");
|
|
o = e[0], n = "" !== e[1] ? parseInt(e[1]) : 1
|
|
}
|
|
if (!this._isCorrectSession(r) || !this._isCorrectSession(o)) throw new Error(
|
|
"Incorrect entry syntax: " + t);
|
|
const l = r,
|
|
h = o;
|
|
return this._createSessionEntry(e, c._minutesFromHHMM(l), c._minutesFromHHMM(h), s,
|
|
n)
|
|
}
|
|
static _isCorrectSession(e) {
|
|
return 4 === e.length && l(e.charCodeAt(0)) && l(e.charCodeAt(1)) && l(e.charCodeAt(
|
|
2)) && l(e.charCodeAt(3))
|
|
}
|
|
static _parseWorkingDays(e) {
|
|
const t = [];
|
|
for (let i = 0; i < e.length; i++) {
|
|
const s = +e[i]; - 1 === t.indexOf(s) && t.push(s)
|
|
}
|
|
return t
|
|
}
|
|
static _minutesFromHHMM(e) {
|
|
return s.get_minutes_from_hhmm(e)
|
|
}
|
|
static _createSessionEntry(e, t, i, r, n) {
|
|
0 === i && (i = s.minutesPerDay), r === n && i <= t && (r += 1), r > 0 && (t -= r *
|
|
s.minutesPerDay), n > 0 && (i -= n * s.minutesPerDay);
|
|
return new _(e, t, i - t)
|
|
}
|
|
}
|
|
i.d(t, "workingDays", (function() {
|
|
return h
|
|
})), i.d(t, "workingDaysAndWeekEnds", (function() {
|
|
return u
|
|
})), i.d(t, "compareSessionEntries", (function() {
|
|
return p
|
|
})), i.d(t, "SessionEntry", (function() {
|
|
return _
|
|
})), i.d(t, "EntryIndex", (function() {
|
|
return m
|
|
})), i.d(t, "SessionSpec", (function() {
|
|
return g
|
|
}));
|
|
const h = [s.MONDAY, s.TUESDAY, s.WEDNESDAY, s.THURSDAY, s.FRIDAY],
|
|
u = [s.SUNDAY, s.MONDAY, s.TUESDAY, s.WEDNESDAY, s.THURSDAY, s.FRIDAY, s.SATURDAY];
|
|
|
|
function d(e, t) {
|
|
return e.compareTo(t) < 0
|
|
}
|
|
|
|
function p(e, t) {
|
|
return e.compareTo(t)
|
|
}
|
|
class _ {
|
|
constructor(e, t, i) {
|
|
this._dayOfWeek = e,
|
|
this._start = t, this._length = i
|
|
}
|
|
start() {
|
|
return this._start + s.minutesPerDay * this.sessionStartDaysOffset()
|
|
}
|
|
startOffset() {
|
|
return this._start
|
|
}
|
|
sessionStartDaysOffset() {
|
|
return this._start >= 0 ? 0 : this._start % s.minutesPerDay == 0 ? -Math.ceil(this
|
|
._start / s.minutesPerDay) : -Math.floor(this._start / s.minutesPerDay)
|
|
}
|
|
sessionEndDaysOffset() {
|
|
const e = this._start + this._length;
|
|
return e >= 0 ? 0 : e % s.minutesPerDay == 0 ? -Math.ceil(e / s.minutesPerDay) : -
|
|
Math.floor(e / s.minutesPerDay)
|
|
}
|
|
isOvernight() {
|
|
return this._start < 0
|
|
}
|
|
dayOfWeek() {
|
|
return this._dayOfWeek
|
|
}
|
|
sessionStartDayOfWeek() {
|
|
let e = this._dayOfWeek - this.sessionStartDaysOffset();
|
|
return e < s.SUNDAY && (e += 7), e
|
|
}
|
|
sessionEndDayOfWeek() {
|
|
let e = this.sessionStartDayOfWeek() + this.sessionEndDaysOffset();
|
|
return e > s.SATURDAY && (e = 1), e
|
|
}
|
|
length() {
|
|
return this._length
|
|
}
|
|
weight() {
|
|
return this._dayOfWeek * s.minutesPerDay + this._start
|
|
}
|
|
compareTo(e) {
|
|
const t = this.weight(),
|
|
i = t + this._length,
|
|
s = e.weight(),
|
|
r = s + e._length;
|
|
return t <= s && s < i || s <= t && t < r ? 0 : t > s ? 1 : -1
|
|
}
|
|
contains(e) {
|
|
const t = 60 * s.get_hours(e) + s.get_minutes(e);
|
|
let i = s.get_day_of_week(e) - this._dayOfWeek;
|
|
i > 0 && (i -= 7);
|
|
const r = i * s.minutesPerDay + t;
|
|
return r >= this._start && r < this._start + this._length
|
|
}
|
|
}
|
|
class m {
|
|
constructor(e, t, i) {
|
|
this.weekIndex = e, this.entryIndex = t, this.entries = i
|
|
}
|
|
getEntry() {
|
|
return this.entries[this.entryIndex]
|
|
}
|
|
}
|
|
|
|
function f(e, t) {
|
|
const i = Object(r.lowerbound)(e, t, (e, t) => -1 === e.day.compareTo(t));
|
|
return i === e.length ? null : e[i]
|
|
}
|
|
class g {
|
|
constructor(e = "Etc/UTC", t = "0000-0000", i = "", r = "") {
|
|
this._entries = [], this._firstDayOfWeek = s.MONDAY, this._entriesHash = new Map,
|
|
this._holidayAndCorrectionMap = new Map, this._holidaySessions = [];
|
|
const n = new c;
|
|
n.parseSessions(e, t), this._entries = n.entries, this._timezone = n.timezone, this
|
|
._firstDayOfWeek = n.firstDayOfWeek, this._weekEndsCount = n.weekEndsCount, this
|
|
._maxTradingDayLength = n.maxTradingDayLength;
|
|
const o = c.parseHolidaysAndCorrections(e, i, r),
|
|
a = s.get_timezone(e);
|
|
this._isThereCorrections = "" !== i || "" !== r, o.forEach((e, t) => {
|
|
this._holidayAndCorrectionMap.set(t.toString(), e), this
|
|
._holidaySessions.push({
|
|
day: t,
|
|
sessions: e
|
|
});
|
|
const i = this.getWeekIndex(t.toCalendar(a));
|
|
this._entriesHash.set(i, null)
|
|
}), this._holidaySessions.sort((e, t) => e.day.compareTo(t.day))
|
|
}
|
|
entries() {
|
|
return this._entries
|
|
}
|
|
timezone() {
|
|
return this._timezone
|
|
}
|
|
firstDayOfWeek() {
|
|
return this._firstDayOfWeek
|
|
}
|
|
addSessionEntry(e, t, i, r, n) {
|
|
0 === i && (i = s.minutesPerDay), r === n && i <= t && (r += 1), r > 0 && (t -= r *
|
|
s.minutesPerDay), n > 0 && (i -= n * s.minutesPerDay);
|
|
const o = i - t;
|
|
this._entries.push(new _(e, t, o))
|
|
}
|
|
longestSessionLength() {
|
|
let e = 0,
|
|
t = 0;
|
|
for (const t of this._holidaySessions) t.sessions.forEach(t => {
|
|
e = Math.max(e, t.length())
|
|
});
|
|
return this._entries.forEach(e => {
|
|
t = Math.max(t, e.length())
|
|
}), Math.max(e, t)
|
|
}
|
|
isWeekEnd(e) {
|
|
const t = Object(r.lowerbound)(this._entries, new _(e, 0, 0), (e, t) => e
|
|
.dayOfWeek() < t.dayOfWeek());
|
|
return t > this._entries.length - 1 || this._entries[t].dayOfWeek() !== e
|
|
}
|
|
isCalWeekEnd(e) {
|
|
const t = s.get_day_of_week(e);
|
|
if (!this._isThereCorrections) return this.isWeekEnd(t);
|
|
const i = o.a.fromCalendar(e),
|
|
r = this._holidayAndCorrectionMap.get(i.toString());
|
|
return void 0 === r ? this.isWeekEnd(t) : 0 === r.length
|
|
}
|
|
hasWeekEnds() {
|
|
return this.weekEndsCount() > 0
|
|
}
|
|
weekEndsCount() {
|
|
return this._weekEndsCount
|
|
}
|
|
maxTradingDayLength() {
|
|
return this._maxTradingDayLength
|
|
}
|
|
holidaysFromYearStart(e) {
|
|
if (!this._isThereCorrections) return 0;
|
|
const t = s.get_timezone(this._timezone),
|
|
i = new o.a(s.get_year(e), s.JANUARY, 1),
|
|
r = o.a.fromCalendar(e);
|
|
let n = 0;
|
|
const a = this._selectHolidays(i, r);
|
|
for (let e = 0; e < a.length; e++) {
|
|
const i = a[e].day.toCalendar(t);
|
|
this.isWeekEnd(s.get_day_of_week(i)) ? n += 0 === a[e].sessions.length ? 0 : -
|
|
1 : n += 0 === a[e].sessions.length ? 1 : 0
|
|
}
|
|
return n
|
|
}
|
|
intradayCanBeBuiltFrom24x7(e) {
|
|
return this._entries.every(t => t.start() % e == 0 && t.length() % e == 0)
|
|
}
|
|
indexOfSession(e, t, i) {
|
|
const n = this._getEntriesForWeek(e);
|
|
let o = Object(r.lowerbound)(n, new _(t, i, 0), d);
|
|
if (o !== n.length) return new m(e, o, n);
|
|
let a = e;
|
|
const l = 7 - t + this._firstDayOfWeek - 1;
|
|
for (i = -(s.minutesPerDay - i + l * s.minutesPerDay);;) {
|
|
a++;
|
|
const e = this._getEntriesForWeek(a);
|
|
if (0 !== e.length) return o = Object(r.lowerbound)(e, new _(this
|
|
._firstDayOfWeek, i, 0), d), new m(a, o, e)
|
|
}
|
|
}
|
|
findSession(e, t, i, s = 0) {
|
|
const r = this.indexOfSession(e, t, i),
|
|
n = r.entries;
|
|
let o = r.entryIndex;
|
|
if (0 !== s) {
|
|
const e = n[o].dayOfWeek(),
|
|
t = s > 0 ? 1 : -1;
|
|
for (;;) {
|
|
const i = o + t;
|
|
if (i < 0 || i >= n.length || n[i].dayOfWeek() !== e) break;
|
|
o = i
|
|
}
|
|
}
|
|
return new m(r.weekIndex, o, n)
|
|
}
|
|
getWeekIndex(e) {
|
|
if (!this._isThereCorrections) return 0;
|
|
const t = s.get_day_of_week(e) - s.SUNDAY,
|
|
i = s.get_timezone("Etc/UTC"),
|
|
r = s.get_cal(i, s.get_year(e), s.get_month(e), s.get_day_of_month(e) - t);
|
|
return Math.floor((r.getTime() + 621672192e5) / 1e3 / 86400 / 7)
|
|
}
|
|
correctTradingDay(e) {
|
|
const t = s.get_day_of_week(e),
|
|
i = 60 * s.get_hours(e) + s.get_minutes(e),
|
|
r = this.getWeekIndex(e),
|
|
n = this.findSession(r, t, i, 0),
|
|
o = n.getEntry().dayOfWeek() - t + 7 * (n.weekIndex - r);
|
|
return 0 !== o && s.add_date(e, o), e
|
|
}
|
|
alignToSessionStart(e, t = 0) {
|
|
const i = s.get_day_of_week(e),
|
|
r = 60 * s.get_hours(e) + s.get_minutes(e),
|
|
n = this.getWeekIndex(e),
|
|
o = this.findSession(n, i, r, t),
|
|
a = o.getEntry(),
|
|
l = a.dayOfWeek() - i + 7 * (o.weekIndex - n);
|
|
0 !== l && s.add_date(e, l);
|
|
const c = a.startOffset();
|
|
return s.set_hms(e, c / 60, c % 60, 0, 0, s.get_timezone(this._timezone)), a
|
|
.length()
|
|
}
|
|
businessDaysToCalendarDays(e, t) {
|
|
let i = this.getWeekIndex(e),
|
|
r = s.get_day_of_week(e),
|
|
n = 0,
|
|
o = 0;
|
|
for (; o < t;) {
|
|
const e = this._getEntriesForWeek(i);
|
|
let a = 0;
|
|
for (let i = r; i <= s.SATURDAY; i++) {
|
|
n++;
|
|
let s = !0;
|
|
for (; a < e.length && !(e[a].dayOfWeek() > i);) e[a].dayOfWeek() < i ||
|
|
s && (s = !1, o++), a++;
|
|
if (o >= t) return n
|
|
}
|
|
i++, r = s.SUNDAY
|
|
}
|
|
return n
|
|
}
|
|
calendarDaysToBusinessDays(e, t) {
|
|
let i = this.getWeekIndex(e),
|
|
r = s.get_day_of_week(e),
|
|
n = 0,
|
|
o = 0;
|
|
for (; n < t;) {
|
|
const e = this._getEntriesForWeek(i);
|
|
let a = 0;
|
|
for (let i = r; i <= s.SATURDAY; i++) {
|
|
n++;
|
|
let s = !0;
|
|
for (; a < e.length && !(e[a].dayOfWeek() > i);) e[a].dayOfWeek() < i ||
|
|
s && (s = !1, o++), a++;
|
|
if (n >= t) return o
|
|
}
|
|
i++, r = s.SUNDAY
|
|
}
|
|
return o
|
|
}
|
|
alignToNearestSessionStart(e, t) {
|
|
return this._alignToNearestSessionValue(e, t, this._entrySessionStart.bind(this))
|
|
}
|
|
alignToNearestSessionEnd(e, t) {
|
|
return this._alignToNearestSessionValue(e, t, this._entrySessionEnd.bind(this))
|
|
}
|
|
leftBorderOfDailyBar(e) {
|
|
const t = this._getEntriesForDay(e);
|
|
return 0 === t.length ? null : (t.sort(p), this._getLeftEntryBorder(e, t[0]))
|
|
}
|
|
bordersOfDailyBar(e) {
|
|
const t = this._getEntriesForDay(e);
|
|
if (0 === t.length) return null;
|
|
t.sort(p);
|
|
const i = this._getLeftEntryBorder(e, t[0]),
|
|
r = t[t.length - 1],
|
|
n = s.clone(e);
|
|
let o = 60 * (r.startOffset() + r.length()) - 1;
|
|
const a = Math.floor(o / 3600);
|
|
return o -= 3600 * a, s.set_hms(n, a, o / 60, o % 60, 0, s.get_timezone(this
|
|
._timezone)), {
|
|
from: i,
|
|
to: n
|
|
}
|
|
}
|
|
getEntriesForWeekByCalendar(e) {
|
|
const t = this.getWeekIndex(e);
|
|
return this._getEntriesForWeek(t)
|
|
}
|
|
_getEntriesForWeek(e) {
|
|
let t = this._entriesHash.get(e);
|
|
if (void 0 === t) return this._entries;
|
|
if (null !== t) return t;
|
|
const i = s.get_timezone(this._timezone);
|
|
t = this._entries.slice();
|
|
const r = this._weekIndexToCalendar(e),
|
|
n = this._weekIndexToCalendar(e + 1),
|
|
a = o.a.fromCalendar(r),
|
|
l = o.a.fromCalendar(n),
|
|
c = this._selectHolidays(a, l);
|
|
for (const e of c) {
|
|
const r = e.day.toCalendar(i),
|
|
n = s.get_day_of_week(r);
|
|
t = t.filter(e => e.dayOfWeek() !== n), t = t.concat(e.sessions)
|
|
}
|
|
return t.sort(p), this._entriesHash.set(e, t), t
|
|
}
|
|
_selectHolidays(e, t) {
|
|
const i = [];
|
|
let s = e;
|
|
for (;;) {
|
|
const e = f(this._holidaySessions, s);
|
|
if (null === e) return i;
|
|
if (!e.day.before(t)) return i;
|
|
i.push(e), s = e.day.addDays(1)
|
|
}
|
|
}
|
|
_weekIndexToCalendar(e) {
|
|
const t = 1e3 * (86400 * e * 7 + 86400) - 621672192e5,
|
|
i = s.get_cal_from_unix_timestamp_ms(s.get_timezone("Etc/UTC"), t),
|
|
r = s.get_timezone("Etc/UTC");
|
|
return s.get_cal(r, s.get_year(i), s.get_month(i), s.get_day_of_month(i))
|
|
}
|
|
_alignToNearestSessionValue(e, t, i) {
|
|
const r = s.get_day_of_week(e),
|
|
n = 60 * s.get_hours(e) + s.get_minutes(e),
|
|
o = this.getWeekIndex(e);
|
|
let a = this.findSession(o, r, n);
|
|
if (a.getEntry().contains(e) && o === a.weekIndex || 1 === t) return i(a, s.clone(
|
|
e), t);
|
|
let l = a.entryIndex - 1;
|
|
if (l < 0) {
|
|
let e = a.weekIndex,
|
|
t = a.entries;
|
|
for (; l < 0;) e--, t = this._getEntriesForWeek(e), l += t.length;
|
|
a = new m(e, l, t)
|
|
} else a = new m(a.weekIndex, l, a.entries);
|
|
return i(a, s.clone(e), t)
|
|
}
|
|
_entrySessionStart(e, t, i) {
|
|
return this._entrySessionValue(e, t, i, e => 60 * e.start())
|
|
}
|
|
_entrySessionEnd(e, t, i) {
|
|
return this._entrySessionValue(e, t, i, e => 60 * (e.start() + e.length()) - 1)
|
|
}
|
|
_entrySessionValue(e, t, i, r) {
|
|
let n = s.get_day_of_week(t);
|
|
const o = e.getEntry();
|
|
let a = o.dayOfWeek() - o.sessionStartDaysOffset();
|
|
const l = this.getWeekIndex(t);
|
|
let c = e.weekIndex - l,
|
|
h = !1;
|
|
if (a < s.SUNDAY && (c <= 0 ? h = !0 : c--, a += 7), (c > 0 && i >= 0 || c < 0 &&
|
|
i < 0) && s.add_date(t, 7 * c), !o.contains(t)) {
|
|
let e = a - n;
|
|
h && i < 0 && (e = -(7 - a + n)), s.add_date(t, e), n = s.get_day_of_week(t)
|
|
}
|
|
o.isOvernight() && n === o.dayOfWeek() && s.add_date(t, -o
|
|
.sessionStartDaysOffset());
|
|
let u = r(o);
|
|
const d = Math.floor(u / 3600);
|
|
return u -= 3600 * d, s.set_hms(t, d, u / 60, u % 60, 0, s.get_timezone(this
|
|
._timezone)), t
|
|
}
|
|
_getEntriesForDay(e) {
|
|
const t = s.get_day_of_week(e);
|
|
return this._getEntriesForWeek(this.getWeekIndex(e)).filter(e => e.dayOfWeek() ===
|
|
t)
|
|
}
|
|
_getLeftEntryBorder(e, t) {
|
|
const i = s.clone(e),
|
|
r = t.startOffset();
|
|
return s.set_hms(i, r / 60, r % 60, 0, 0, s.get_timezone(this._timezone)), i
|
|
}
|
|
}
|
|
},
|
|
"5rJj": function(e, t, i) {
|
|
"use strict";
|
|
(function(t) {
|
|
var s = i("ogJP").isSameType,
|
|
r = i("Ocx9").DefaultProperty;
|
|
|
|
function n(e, t, i, s) {
|
|
this._map = Object.assign({}, this._map, s), t && (t = this.unpackLevels(t)), r
|
|
.call(this, e, t, i)
|
|
}
|
|
inherit(n, r), n.prototype.state = function(e, i) {
|
|
e = e || [];
|
|
var s = t.prototype.state.call(this, e);
|
|
return i ? s : this.packLevels(s)
|
|
}, n.prototype.clone = function() {
|
|
for (var e = this.state(), t = new n(this._defaultName, e), i = 0; i < this
|
|
._exclusions.length; ++i) t.addExclusion(this._exclusions[i]);
|
|
return t
|
|
}, n.prototype.merge = function(e, i) {
|
|
return t.prototype.merge.call(this, this.unpackLevels(e), i)
|
|
}, n.prototype._map = {
|
|
prefixes: [""],
|
|
range: [0, 0],
|
|
names: ["coeff", "color", "visible", "linestyle", "linewidth"],
|
|
typecheck: {
|
|
pack: Object,
|
|
unpack: Array
|
|
}
|
|
}, n.prototype._packLvlTpl = function() {
|
|
return []
|
|
}, n.prototype._unpackLvlTpl = function() {
|
|
return {}
|
|
}, n.prototype._packLvlFill = function(e, t, i, s) {
|
|
return s.push(i[t]), s
|
|
}, n.prototype._unpackLvlFill = function(e, t, i, s) {
|
|
return s[t] = i[e], s
|
|
}, n.prototype._iterateLevels = function(e, t) {
|
|
for (var i in this._map.prefixes)
|
|
for (var r = (this._map.prefixes[i] || "") + "level", n = this._map.range[
|
|
0]; n <= this._map.range[1]; n++)
|
|
if (e[r + n] && s(e[r + n], t.typecheck())) {
|
|
var o = t.tpl();
|
|
for (var a in this._map.names) o = t.fill(a, this._map.names[a], e[
|
|
r + n], o);
|
|
e[r + n] = o
|
|
} return e
|
|
}, n.prototype.packLevels = function(e) {
|
|
return this._iterateLevels(e, {
|
|
tpl: this._packLvlTpl,
|
|
fill: this._packLvlFill,
|
|
typecheck: this._map.typecheck.pack
|
|
})
|
|
}, n.prototype.unpackLevels = function(e) {
|
|
return this._iterateLevels(e, {
|
|
tpl: this._unpackLvlTpl,
|
|
fill: this._unpackLvlFill,
|
|
typecheck: this._map.typecheck.unpack
|
|
})
|
|
}, n.prototype.saveDefaults = function() {
|
|
TradingView.saveDefaults(this._defaultName, this.state(this._exclusions, !0))
|
|
}, e.exports = n
|
|
}).call(this, i("tc+8"))
|
|
},
|
|
"5vwb": function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "b", (function() {
|
|
return n
|
|
})), i.d(t, "a", (function() {
|
|
return o
|
|
}));
|
|
var s = i("tqok"),
|
|
r = i("hsV8");
|
|
|
|
function n(e, t) {
|
|
for (const i of e.points) {
|
|
if (i.index >= t.length) return null;
|
|
if (t[i.index] === s.INVALID_TIME_POINT_INDEX) return null
|
|
}
|
|
return {
|
|
points: e.points.map(e => ({
|
|
index: t[e.index],
|
|
offset: e.offset,
|
|
level: e.level
|
|
}))
|
|
}
|
|
}
|
|
|
|
function o(e, t, i) {
|
|
return {
|
|
id: t,
|
|
points: e.points.map(e => ({
|
|
...e,
|
|
index: Object(r.ensureTimePointIndexIndex)(i.indexOf(e.index))
|
|
}))
|
|
}
|
|
}
|
|
},
|
|
"68at": function(e, t, i) {
|
|
"use strict";
|
|
var s = i("5rJj"),
|
|
r = i("7ADh").LineToolFibWedgeBase,
|
|
n = i("j3hX").LineToolColorsProperty;
|
|
class o extends r {
|
|
constructor(e, t) {
|
|
super(e, t || o.createProperties()), i.e("lt-pane-views").then(i.t.bind(null,
|
|
"jlk4", 7)).then(({
|
|
ProjectionLinePaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
levelsCount() {
|
|
return 1
|
|
}
|
|
name() {
|
|
return "Projection"
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "LzAw")))
|
|
.ProjectionDefinitionsViewModel
|
|
}
|
|
static createProperties(e) {
|
|
var t = new s("linetoolprojection", e, !1, {
|
|
range: [1, 1]
|
|
});
|
|
return o._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
r._configureProperties(e), e.addChild("linesColors", new n([e.trendline.color]))
|
|
}
|
|
}
|
|
t.LineToolProjection = o
|
|
},
|
|
"6I19": function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "b", (function() {
|
|
return w
|
|
})), i.d(t, "c", (function() {
|
|
return P
|
|
})), i.d(t, "a", (function() {
|
|
return C
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("ivNn"),
|
|
n = i("eJTA"),
|
|
o = i("YFKU"),
|
|
a = i("qFKp"),
|
|
l = i("Tmoa"),
|
|
c = i("Ialn"),
|
|
h = i("k9/m"),
|
|
u = i("CW80"),
|
|
d = i("mMWL"),
|
|
p = i("GH0z"),
|
|
_ = i("38az"),
|
|
m = i("7qT/"),
|
|
f = i("xCUR");
|
|
const g = a.CheckMobile.any(),
|
|
b = g && !0,
|
|
v = new p.PercentageFormatter,
|
|
S = window.t("n/a"),
|
|
y = `${S} (${S}%)`;
|
|
|
|
function w(e, t) {
|
|
const i = Object(n.parseRgb)(t),
|
|
s = Object(n.parseRgb)(e);
|
|
return Object(n.distanceRgb)(i, s) < 70 ? Object(n.rgbToHexString)(Object(n.invertRgb)(i)) :
|
|
t
|
|
}
|
|
|
|
function P(e) {
|
|
if (null === e) return null;
|
|
const t = e.properties().child("background");
|
|
return void 0 === t ? null : t.value()
|
|
}
|
|
class C {
|
|
constructor(e, t) {
|
|
this._series = e, this._model = t, this._emptyValues = [{
|
|
title: Object(o.t)("Open"),
|
|
visible: !1,
|
|
value: "",
|
|
index: 0,
|
|
id: ""
|
|
}, {
|
|
title: Object(o.t)("High"),
|
|
visible: !1,
|
|
value: "",
|
|
index: 1,
|
|
id: ""
|
|
}, {
|
|
title: Object(o.t)("Low"),
|
|
visible: !1,
|
|
value: "",
|
|
index: 2,
|
|
id: ""
|
|
}, {
|
|
title: Object(o.t)("Close"),
|
|
visible: !1,
|
|
value: "",
|
|
index: 3,
|
|
id: ""
|
|
}, {
|
|
title: "",
|
|
visible: !1,
|
|
value: "",
|
|
index: 4,
|
|
id: ""
|
|
}, {
|
|
title: "",
|
|
visible: !1,
|
|
value: "",
|
|
index: 5,
|
|
id: ""
|
|
}, {
|
|
title: Object(o.t)("Change"),
|
|
visible: !1,
|
|
value: "",
|
|
index: 6,
|
|
id: ""
|
|
}]
|
|
}
|
|
getItems() {
|
|
return this._emptyValues
|
|
}
|
|
getValues(e) {
|
|
const t = this._showLastPriceAndChangeOnly(),
|
|
i = this._emptyValues.map(e => ({
|
|
...e,
|
|
visible: !t
|
|
}));
|
|
i[0].value = S, i[1].value = S, i[2].value = S, i[3].value = S, i[6].value = y, i[5]
|
|
.visible = !1;
|
|
const n = i[4];
|
|
if (n.value = S, n.visible = !1, this._model.timeScale().isEmpty() || 0 === this
|
|
._series.bars().size() || this._series.priceScale().isEmpty()) return i;
|
|
Object(r.isNumber)(e) || (e = Object(s.ensureNotNull)(this._series.data().last())
|
|
.index);
|
|
const o = this._series.nearestIndex(e, h.PlotRowSearchMode.NearestLeft);
|
|
if (void 0 === o) return i;
|
|
const a = this._series.data().valueAt(o),
|
|
u = P(this._series.model().paneForSource(this._series));
|
|
if (null === a || null === u) return i;
|
|
const d = a[1],
|
|
p = a[2],
|
|
m = a[3],
|
|
g = a[4];
|
|
if (null == d || null == p || null == m || null == g) return i;
|
|
const {
|
|
values: C
|
|
} = this._changesData(g, o, t), x = Object(f.a)(this._series);
|
|
if (Object(f.b)(this._series)) i[6].value = "";
|
|
else if (void 0 !== C) {
|
|
const e = this._series.formatter();
|
|
i[6].value = Object(c.forceLTRStr)(
|
|
`${e.format(C.change, !0)} (${v.format(C.percentChange, !0)})`)
|
|
}
|
|
t ? (i[5].value = x(g), i[5].visible = !0, i[6].visible = !0) : (i[0].value = x(d),
|
|
i[1].value = x(p), i[2].value = x(m), i[3].value = x(g), i[4].value = x(this
|
|
._series.barFunction()(a)));
|
|
let T = null;
|
|
if (t && !b) T = void 0 === C || C.change >= 0 ? _.SeriesBarColorer.upColor(this
|
|
._series.properties()) : _.SeriesBarColorer.downColor(this._series
|
|
.properties());
|
|
else {
|
|
const e = this._series.barColorer().barStyle(o, !1);
|
|
T = w(u, null != e.barBorderColor ? e.barBorderColor : e.barColor)
|
|
}
|
|
T = Object(l.resetTransparency)(w(u, T));
|
|
for (const e of i) e.color = T;
|
|
return i
|
|
}
|
|
_showLastPriceAndChangeOnly() {
|
|
return g && (null === this._model.crossHairSource().pane || Object(u.isLineToolName)
|
|
(d.tool.value()) || null !== this._model.lineBeingEdited())
|
|
}
|
|
_changesData(e, t, i) {
|
|
var s;
|
|
if (i && !b) {
|
|
const e = this._series.quotes();
|
|
if (null !== e) return {
|
|
values: {
|
|
change: e.change,
|
|
percentChange: e.change_percent
|
|
}
|
|
}
|
|
} else {
|
|
const i = this._series.data().search(t - 1, h.PlotRowSearchMode.NearestLeft),
|
|
r = null !== (s = null == i ? void 0 : i.value[4]) && void 0 !== s ? s :
|
|
null;
|
|
if (null !== r) return {
|
|
values: {
|
|
change: e - r,
|
|
percentChange: Object(m.a)(r, e)
|
|
}
|
|
}
|
|
}
|
|
return {}
|
|
}
|
|
}
|
|
},
|
|
"6KAu": function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s() {
|
|
return Promise.all([i.e("react"), i.e(1), i.e(3), i.e(16), i.e(93), i.e(0), i.e(2), i.e(15),
|
|
i.e("change-interval-dialog")
|
|
]).then(i.bind(null, "iT0o"))
|
|
}
|
|
i.d(t, "a", (function() {
|
|
return s
|
|
}))
|
|
},
|
|
"6ctS": function(e, t) {
|
|
e.exports =
|
|
'<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28"><g fill="none" fill-rule="evenodd" stroke="currentColor" transform="translate(3 6)"><path d="M.964 8C3 4 6.679.5 11 .5 15.32.5 19 4 21.036 8 19 12 15.32 15.5 11 15.5 6.679 15.5 3 12 .964 8z"/><circle cx="11" cy="8" r="3.5"/></g></svg>'
|
|
},
|
|
"6sst": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "OverlayStudyPriceLineAxisView", (function() {
|
|
return r
|
|
}));
|
|
var s = i("TmNs");
|
|
class r extends s.PriceLineAxisView {
|
|
constructor(e) {
|
|
super(), this._study = e
|
|
}
|
|
_value() {
|
|
return this._study.lastValueData("", !0)
|
|
}
|
|
_priceLineColor(e) {
|
|
return e
|
|
}
|
|
_lineWidth() {
|
|
return 1
|
|
}
|
|
_isVisible() {
|
|
const e = this._study.model().properties().scalesProperties.showSeriesLastValue
|
|
.value();
|
|
return this._study.properties().childs().showPriceLine.value() && e
|
|
}
|
|
}
|
|
},
|
|
"6vtU": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "setAdditionalSymbolInfoFields", (function() {
|
|
return r
|
|
})), i.d(t, "getAdditionalSymbolInfoFields", (function() {
|
|
return n
|
|
}));
|
|
let s = [];
|
|
|
|
function r(e) {
|
|
s = e
|
|
}
|
|
|
|
function n() {
|
|
return s
|
|
}
|
|
},
|
|
"704P": function(e, t, i) {
|
|
"use strict";
|
|
(function(e) {
|
|
var s = i("Ss5c").LineDataSource,
|
|
r = i("jkoZ"),
|
|
n = i("Ocx9").DefaultProperty,
|
|
o = i("k9/m").PlotRowSearchMode,
|
|
a = i("s1Gx").sortSourcesPreOrdered.LineToolExecution;
|
|
class l {
|
|
constructor(e, t) {
|
|
this._pane = e, this._timeScale = t
|
|
}
|
|
static recreateOrderedByBarsSourcesCache(e) {
|
|
l.clearOrderedByBarsSourcesCache();
|
|
for (var t = l.prototype, i = e.sourcesByGroup().all(), s = 0; s < i
|
|
.length; ++s) {
|
|
var r = i[s];
|
|
if (r._adapter && void 0 !== r._adapter._index) {
|
|
var n = t._cachedByBarIndexOrderedExecutions[r._adapter._index];
|
|
t._cachedByBarIndexOrderedExecutions[r._adapter._index] = n || [], t
|
|
._cachedByBarIndexOrderedExecutions[r._adapter._index].push(r)
|
|
}
|
|
}
|
|
}
|
|
static clearOrderedByBarsSourcesCache() {
|
|
l.prototype._cachedByBarIndexOrderedExecutions = {}
|
|
}
|
|
getXYCoordinate(e, t, i) {
|
|
var s = 0,
|
|
r = e.getDirection(),
|
|
n = "buy" === r,
|
|
a = this._pane.model().mainSeries();
|
|
if (a.bars) {
|
|
var l = n ? 10 : -10,
|
|
c = a.bars().search(i, o.NearestLeft);
|
|
if (null !== c) {
|
|
i = c.index;
|
|
var u = n ? c.value[TradingView.LOW_PLOT] : c.value[TradingView
|
|
.HIGH_PLOT],
|
|
d = a.priceScale(),
|
|
p = a.firstValue();
|
|
s = d.priceToCoordinate(u, p) + l
|
|
}
|
|
}
|
|
e._index = i;
|
|
var _ = t.visibleBarsStrictRange();
|
|
if (!isFinite(i) || null === _ || i > _.lastBar() || i < _.firstBar())
|
|
return {
|
|
x: -1,
|
|
y: -1
|
|
};
|
|
for (var m = this._cachedByBarIndexOrderedExecutions[i] || this._pane
|
|
.sourcesByGroup().all(), f = m.length - 1; f >= 0; --f) {
|
|
var g = m[f];
|
|
if (g instanceof h && g._adapter._index === i && g._adapter
|
|
.getDirection() === r) {
|
|
if (g === e._line) break;
|
|
var b = g._adapter._height();
|
|
s = n ? s + b : s - b
|
|
}
|
|
}
|
|
return {
|
|
x: t.indexToCoordinate(i),
|
|
y: s
|
|
}
|
|
}
|
|
}
|
|
l.prototype._cachedByBarIndexOrderedExecutions = {};
|
|
class c {
|
|
constructor(e) {
|
|
this._line = e
|
|
}
|
|
_height() {
|
|
var e = this.getArrowHeight(),
|
|
t = this.getArrowSpacing();
|
|
this.getText() && r.fontHeight(this.getFont());
|
|
return e + t + 0 + 10
|
|
}
|
|
getIndex() {
|
|
return this._line._model.timeScale().baseIndex() - this._line.points()[0]
|
|
.index
|
|
}
|
|
setIndex(e) {
|
|
var t = this._line._model.timeScale().baseIndex() - Math.abs(e);
|
|
this._line.startMoving({
|
|
logical: this._line.points()[0]
|
|
});
|
|
var i = TradingView.merge({}, this._line.points()[0]);
|
|
return i.index = t, this._line.move({
|
|
logical: i
|
|
}), this._line.endMoving(), this
|
|
}
|
|
getTime() {
|
|
return this._unixtime
|
|
}
|
|
setTime(e) {
|
|
return this._unixtime = e, this._line.restorePoints([{
|
|
offset: 0,
|
|
price: this.getPrice(),
|
|
time_t: this._unixtime
|
|
}], []), this._line.createServerPoints(), this
|
|
}
|
|
getPrice() {
|
|
return this._line.points().length > 0 ? this._line.points()[0].price : this
|
|
._line._timePoint.length > 0 ? this._line._timePoint[0].price : void 0
|
|
}
|
|
setPrice(e) {
|
|
return this._line.points().length > 0 && (this._line.points()[0].price = e),
|
|
this._line._timePoint.length > 0 && (this._line._timePoint[0].price =
|
|
e), this
|
|
}
|
|
getText() {
|
|
return this._line.properties().text.value()
|
|
}
|
|
setText(e) {
|
|
return this._line.properties().text.setValue(e || ""), this._line
|
|
.updateAllViewsAndRedraw(), this
|
|
}
|
|
getArrowHeight() {
|
|
return this._line.properties().arrowHeight.value()
|
|
}
|
|
setArrowHeight(e) {
|
|
return this._line.properties().arrowHeight.setValue(e || 5), this
|
|
}
|
|
getArrowSpacing() {
|
|
return this._line.properties().arrowSpacing.value()
|
|
}
|
|
setArrowSpacing(e) {
|
|
return this._line.properties().arrowSpacing.setValue(e || 1), this
|
|
}
|
|
getDirection() {
|
|
return this._line.properties().direction.value()
|
|
}
|
|
setDirection(e) {
|
|
return this._line.properties().direction.setValue(e || "buy"), this
|
|
}
|
|
getArrowColor() {
|
|
var e = this._line.properties();
|
|
return "buy" === this.getDirection() ? e.arrowBuyColor.value() : e
|
|
.arrowSellColor.value()
|
|
}
|
|
setArrowColor(e) {
|
|
return "buy" === this.getDirection() ? this.setArrowBuyColor(e) : this
|
|
.setArrowSellColor(e), this
|
|
}
|
|
setArrowBuyColor(e) {
|
|
return this._line.properties().arrowBuyColor.setValue(e), this
|
|
}
|
|
setArrowSellColor(e) {
|
|
return this._line.properties().arrowSellColor.setValue(e), this
|
|
}
|
|
getTextColor() {
|
|
return r.getColorFromProperties(this._line.properties().textColor, this
|
|
._line.properties().textTransparency)
|
|
}
|
|
setTextColor(e) {
|
|
return r.setColorToProperties(e, this._line.properties().textColor, this
|
|
._line.properties().textTransparency), this
|
|
}
|
|
getFont() {
|
|
return r.getFontFromProperties(this._line.properties().fontFamily, this
|
|
._line.properties().fontSize, this._line.properties().fontBold, this
|
|
._line.properties().fontItalic)
|
|
}
|
|
setFont(e) {
|
|
return r.setFontToProperties(e, this._line.properties().fontFamily, this
|
|
._line.properties().fontSize, this._line.properties().fontBold, this
|
|
._line.properties().fontItalic), this
|
|
}
|
|
setTooltip(e) {
|
|
return null == e ? e = "" : e += "", this._line.properties().tooltip
|
|
.setValue(e), this
|
|
}
|
|
getTooltip() {
|
|
return this._line.properties().tooltip.value()
|
|
}
|
|
remove() {
|
|
this._line._model.removeSource(this._line), delete this._line
|
|
}
|
|
getPoints() {
|
|
return this._line.points()
|
|
}
|
|
}
|
|
class h extends s {
|
|
constructor(e, t) {
|
|
super(e, t || h.createProperties()), this._adapter = new c(this), this
|
|
.customization.forcePriceAxisLabel = !1, this.customization
|
|
.disableErasing = !0, this.customization.showInObjectTree = !1, this
|
|
.setSelectionEnabled(!1), i.e("lt-pane-views").then(i.t.bind(null,
|
|
"tjxb", 7)).then(({
|
|
ExecutionPaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
zorder() {
|
|
return a
|
|
}
|
|
isSpeciallyZOrderedSource() {
|
|
return !0
|
|
}
|
|
pointsCount() {
|
|
return h.POINTS_COUNT
|
|
}
|
|
name() {
|
|
return "Execution"
|
|
}
|
|
hasContextMenu() {
|
|
return !1
|
|
}
|
|
state() {
|
|
return null
|
|
}
|
|
updateAllViews() {
|
|
return this._isVisible() ? s.prototype.updateAllViews.call(this) : null
|
|
}
|
|
priceAxisViews(e, t) {
|
|
return this._isVisible() ? s.prototype.priceAxisViews.call(this, e, t) :
|
|
null
|
|
}
|
|
_isVisible() {
|
|
return this._model.properties().tradingProperties.showExecutions.value()
|
|
}
|
|
paneViews() {
|
|
return TradingView.printing && !e.enabled("snapshot_trading_drawings") ?
|
|
null : this._model.properties().tradingProperties.showExecutions
|
|
.value() ? s.prototype.paneViews.call(this) : null
|
|
}
|
|
userEditEnabled() {
|
|
return !1
|
|
}
|
|
showInObjectTree() {
|
|
return !1
|
|
}
|
|
cloneable() {
|
|
return !1
|
|
}
|
|
copiable() {
|
|
return !1
|
|
}
|
|
isSynchronizable() {
|
|
return !1
|
|
}
|
|
static createProperties(e) {
|
|
var t = new n("linetoolexecution", e, !1, !1);
|
|
return h._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
s._configureProperties(e)
|
|
}
|
|
}
|
|
h.POINTS_COUNT = 1, t.ExecutionsPositionController = l, t.LineToolExecution = h
|
|
}).call(this, i("Kxc7"))
|
|
},
|
|
"7ADh": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineToolFibWedgeBase", (function() {
|
|
return o
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("aO4+"),
|
|
n = i("Ss5c");
|
|
class o extends n.LineDataSource {
|
|
pointsCount() {
|
|
return 3
|
|
}
|
|
hasEditableCoordinates() {
|
|
return !1
|
|
}
|
|
setPoint(e, t) {
|
|
if (super.setPoint(e, t), !this._recursiveGuard) try {
|
|
if (this._recursiveGuard = !0, 2 === e) {
|
|
const e = this.pointToScreenPoint(this._points[0])[0];
|
|
let t = this.pointToScreenPoint(this._points[1])[0];
|
|
const i = this.pointToScreenPoint(this._points[2])[0].subtract(e)
|
|
.length();
|
|
let s = t.subtract(e);
|
|
s.length() <= 0 && (s = new r.Point(1, 0)), t = e.add(s.normalized()
|
|
.scaled(i));
|
|
const n = this.screenPointToPoint(t),
|
|
o = this._pointsProperty.childs().points[1];
|
|
o.childs().price.setValue(n.price), o.childs().bar.setValue(n.index)
|
|
} else {
|
|
const e = this.pointToScreenPoint(this._points[0])[0],
|
|
t = this.pointToScreenPoint(this._points[1])[0];
|
|
let i = this.pointToScreenPoint(this._points[2])[0];
|
|
const s = t.subtract(e).length();
|
|
let n = i.subtract(e);
|
|
n.length() <= 0 && (n = new r.Point(1, 0)), i = e.add(n.normalized()
|
|
.scaled(s));
|
|
const o = this.screenPointToPoint(i),
|
|
a = this._pointsProperty.childs().points[2];
|
|
a.childs().price.setValue(o.price), a.childs().bar.setValue(o.index)
|
|
}
|
|
} finally {
|
|
this._recursiveGuard = !1
|
|
}
|
|
}
|
|
addPoint(e) {
|
|
if (2 === this._points.length) {
|
|
const t = this.pointToScreenPoint(this._points[0])[0],
|
|
i = this.pointToScreenPoint(this._points[1])[0];
|
|
let r = this.pointToScreenPoint(e)[0];
|
|
const n = i.subtract(t).length(),
|
|
o = r.subtract(t).normalized();
|
|
r = t.add(o.scaled(n));
|
|
const a = Object(s.ensureNotNull)(this.ownerSource()),
|
|
l = Object(s.ensureNotNull)(a.firstValue()),
|
|
c = Object(s.ensureNotNull)(this.priceScale()).coordinateToPrice(r.y,
|
|
l);
|
|
e = {
|
|
index: Math.round(this._model.timeScale().coordinateToIndex(r.x)),
|
|
price: c
|
|
}
|
|
}
|
|
return n.LineDataSource.prototype.addPoint.call(this, e)
|
|
}
|
|
}
|
|
},
|
|
"7ETO": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("ocLq");
|
|
class r {
|
|
main(e) {
|
|
const t = e.new_var(s.Std.open(e)),
|
|
i = e.new_var(s.Std.close(e)),
|
|
r = t.get(1),
|
|
n = i.get(1),
|
|
o = s.Std.ohlc4(e),
|
|
a = s.Std.na(t.get(1)) ? (s.Std.open(e) + s.Std.close(e)) / 2 : (r + n) / 2;
|
|
t.set(a), i.set(o);
|
|
const l = s.Std.max(s.Std.high(e), s.Std.max(a, o)),
|
|
c = s.Std.min(s.Std.low(e), s.Std.min(a, o)),
|
|
h = s.Std.volume(e),
|
|
u = e.symbol;
|
|
return [u.time, a, l, c, o, h, u.updatetime, u.isBarClosed]
|
|
}
|
|
}
|
|
|
|
function n(e) {
|
|
if (0 === e.type.indexOf("BarSetHeikenAshi@tv-basicstudies-")) return new r;
|
|
const t = "unknown builder type: " + e.type;
|
|
throw console.error(t), new Error(t)
|
|
}
|
|
i.d(t, "getChartStyleStudy", (function() {
|
|
return n
|
|
}))
|
|
},
|
|
"7Fue": function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return r
|
|
})), i.d(t, "b", (function() {
|
|
return n
|
|
}));
|
|
const s = ["horizlines", "vertlines", "lines", "hlines", "textmarks", "shapemarks",
|
|
"backgrounds", "polygons", "trendchannels", "hhists", "dwglabels", "dwglines",
|
|
"dwgboxes", "dwgtables", "dwgtablecells"
|
|
];
|
|
|
|
function r(e) {
|
|
return !s.some(t => e[t]().size > 0)
|
|
}
|
|
|
|
function n(e) {
|
|
const t = new Map;
|
|
return e.forEach((e, i) => {
|
|
e.forEach(e => {
|
|
const s = {
|
|
...e,
|
|
styleId: i
|
|
},
|
|
r = e.firstBarTime;
|
|
let n = t.get(r);
|
|
void 0 === n && (n = new Set, t.set(r, n)), n.add(s)
|
|
})
|
|
}), t
|
|
}
|
|
},
|
|
"7KDR": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "Action", (function() {
|
|
return l
|
|
})), i.d(t, "ActionAsync", (function() {
|
|
return c
|
|
})), i.d(t, "Separator", (function() {
|
|
return h
|
|
})), i.d(t, "Loader", (function() {
|
|
return u
|
|
}));
|
|
var s = i("zRdu"),
|
|
r = i("aIyQ"),
|
|
n = i.n(r),
|
|
o = i("/3z9"),
|
|
a = i("e3/o");
|
|
class l {
|
|
constructor(e, t = a.guid()) {
|
|
this.type = s.a.Action, this._destroyed = !1, this._binding = null, this.id = t,
|
|
this._onUpdate = new n.a, this._options = e, this.update(e)
|
|
}
|
|
execute() {
|
|
this._options.checkable && this.update({
|
|
checked: !this._options.checked
|
|
}), this._options.onExecute && this._options.onExecute(this)
|
|
}
|
|
getLabel() {
|
|
return this._options.label || ""
|
|
}
|
|
getSubItems() {
|
|
return this._options.subItems || []
|
|
}
|
|
isDisabled() {
|
|
return !0 === this._options.disabled
|
|
}
|
|
isActive() {
|
|
return !0 === this._options.active
|
|
}
|
|
isCheckable() {
|
|
return !0 === this._options.checkable
|
|
}
|
|
isChecked() {
|
|
return !0 === this._options.checked
|
|
}
|
|
getPayload() {
|
|
return this._options.payload
|
|
}
|
|
update(e) {
|
|
this._destroyed || (this._unbindShortcut(), e.hotkeyHash && (this._options
|
|
.shortcutHint = Object(o.humanReadableHash)(e.hotkeyHash)), this
|
|
._options = Object.assign(this._options, e), this._bindShortcut(), this
|
|
._onUpdate.fire(this))
|
|
}
|
|
onUpdate() {
|
|
return this._onUpdate
|
|
}
|
|
getState() {
|
|
return {
|
|
label: this.getLabel(),
|
|
disabled: this.isDisabled(),
|
|
active: this.isActive(),
|
|
subItems: this.getSubItems(),
|
|
checkable: this.isCheckable(),
|
|
checked: this.isChecked(),
|
|
doNotCloseOnClick: this._options.doNotCloseOnClick || !1,
|
|
shortcutHint: this._options.shortcutHint,
|
|
hint: this._options.hint,
|
|
icon: this._options.icon,
|
|
iconChecked: this._options.iconChecked,
|
|
toolbox: this._options.toolbox,
|
|
showToolboxOnHover: this._options.showToolboxOnHover || !1,
|
|
statName: this._options.statName,
|
|
name: this._options.name,
|
|
fullWidthLabel: this._options.fullWidthLabel,
|
|
invisibleHotkey: this._options.invisibleHotkey
|
|
}
|
|
}
|
|
getBinding() {
|
|
return this._binding
|
|
}
|
|
setBinding(e) {
|
|
this._binding = e
|
|
}
|
|
destroy() {
|
|
this._destroyed = !0, this._onUpdate.destroy(), null !== this._binding && this
|
|
._binding.destroy(), this._unbindShortcut()
|
|
}
|
|
options() {
|
|
return this._options
|
|
}
|
|
_bindShortcut() {
|
|
if (!this._options.hotkeyGroup || !this._options.hotkeyHash) return;
|
|
const e = "string" == typeof this._options.label ? this._options.label : this
|
|
._options.name;
|
|
this._hotkeyAction = this._options.hotkeyGroup.add({
|
|
hotkey: this._options.hotkeyHash,
|
|
desc: e,
|
|
handler: () => this.execute(),
|
|
isDisabled: () => this.isDisabled()
|
|
})
|
|
}
|
|
_unbindShortcut() {
|
|
this._hotkeyAction && (this._hotkeyAction.destroy(), delete this._hotkeyAction)
|
|
}
|
|
}
|
|
class c extends l {
|
|
constructor(e, t) {
|
|
super({}, t), this.type = s.a.ActionAsync, this._loader = e, this._loaded = !1
|
|
}
|
|
loadOptions() {
|
|
return this._loadingPromise || (this._loadingPromise = this._loader().then(e => {
|
|
this.update(e), this._loaded = !0
|
|
})),
|
|
this._loadingPromise
|
|
}
|
|
isLoaded() {
|
|
return this._loaded
|
|
}
|
|
}
|
|
class h {
|
|
constructor(e, t = a.guid()) {
|
|
this.type = s.a.Separator, this.id = t, this._hint = e
|
|
}
|
|
getHint() {
|
|
return this._hint
|
|
}
|
|
}
|
|
class u {
|
|
constructor(e = a.guid()) {
|
|
this.type = s.a.Loader, this.id = e
|
|
}
|
|
}
|
|
},
|
|
"7MWe": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "PriceScaleChangeUndoCommand", (function() {
|
|
return a
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("txPx"),
|
|
n = i("RDU5");
|
|
const o = Object(r.getLogger)("Chart.ChartUndoModel");
|
|
class a extends n.UndoCommand {
|
|
constructor(e, t, i, s, r) {
|
|
super("Scale price", !1), this._newPriceScaleState = null, this._model = e, this
|
|
._paneIndex = e.panes().indexOf(t), this._priceScaleId = i.id(), this
|
|
._state = s, this._timestamp = r ? performance.now() : null
|
|
}
|
|
undo() {
|
|
if (null !== this._newPriceScaleState) return void o.logDebug(
|
|
"PriceScaleChangeUndoCommand.undo: Command is already undone");
|
|
const [e, t] = this._paneAndScale();
|
|
this._newPriceScaleState = t.state(), this._model.restorePriceScaleState(e, t,
|
|
this._state)
|
|
}
|
|
redo() {
|
|
if (null === this._newPriceScaleState) return void o.logDebug(
|
|
"PriceScaleChangeUndoCommand.redo: Command is not undone");
|
|
const [e, t] = this._paneAndScale();
|
|
this._model.restorePriceScaleState(e, t, this._newPriceScaleState), this
|
|
._newPriceScaleState = null
|
|
}
|
|
canMerge(e) {
|
|
return e instanceof a && null !== this._timestamp && null !== e._timestamp &&
|
|
null === this._newPriceScaleState && e._model === this._model && e
|
|
._paneIndex === this._paneIndex && e._priceScaleId === this._priceScaleId &&
|
|
Math.abs(e._timestamp - this._timestamp) < 1e3
|
|
}
|
|
merge(e) {
|
|
this._timestamp = e._timestamp
|
|
}
|
|
_paneAndScale() {
|
|
const e = this._model.panes()[this._paneIndex],
|
|
t = Object(s.ensureNotNull)(e.getPriceScaleById(this._priceScaleId));
|
|
return [e, t]
|
|
}
|
|
}
|
|
},
|
|
"7RN7": function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "b", (function() {
|
|
return s
|
|
})), i.d(t, "a", (function() {
|
|
return r
|
|
}));
|
|
const s = 52,
|
|
r = 5
|
|
},
|
|
"7dm8": function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return r
|
|
})), i.d(t, "b", (function() {
|
|
return n
|
|
})), i.d(t, "c", (function() {
|
|
return o
|
|
})), i.d(t, "d", (function() {
|
|
return a
|
|
})), i.d(t, "e", (function() {
|
|
return l
|
|
}));
|
|
var s = i("ocLq");
|
|
class r {
|
|
init(e, t) {
|
|
e.new_sym(t(1), s.Std.period(e)), this._source = t(0), this._scaleFactor1 = 1, this
|
|
._scaleFactor2 = 1
|
|
}
|
|
main(e, t) {
|
|
const i = e.symbol.time,
|
|
r = s.Std[this._source](e);
|
|
e.select_sym(1);
|
|
const n = s.Std[this._source](e),
|
|
o = e.new_unlimited_var(n),
|
|
a = e.new_unlimited_var(e.symbol.time);
|
|
if (e.select_sym(0), isNaN(i)) return null;
|
|
let l = a.indexOf(i); - 1 !== l && a.get(l) !== i && (l = -1);
|
|
const c = l < 0 ? NaN : o.get(l);
|
|
return [this._doCalculation(this._scaleFactor1, r, this._scaleFactor2, c)]
|
|
}
|
|
}
|
|
const n = {
|
|
styles: {
|
|
plot1: {
|
|
linestyle: 0,
|
|
linewidth: 2,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 35,
|
|
visible: !0,
|
|
color: "#800080"
|
|
}
|
|
},
|
|
precision: 2,
|
|
inputs: {
|
|
source: "close",
|
|
symbol2: ""
|
|
}
|
|
},
|
|
o = [{
|
|
defval: "close",
|
|
id: "source",
|
|
name: "Source",
|
|
options: ["open", "high", "low", "close", "hl2", "hlc3", "ohlc4"],
|
|
type: "text"
|
|
}, {
|
|
id: "symbol2",
|
|
name: "Symbol",
|
|
type: "symbol",
|
|
confirm: !0
|
|
}],
|
|
a = [{
|
|
id: "plot1",
|
|
type: "line"
|
|
}],
|
|
l = {
|
|
plot1: {
|
|
title: "Plot",
|
|
histogramBase: 0
|
|
}
|
|
}
|
|
},
|
|
"7ktv": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "PriceDataSource", (function() {
|
|
return a
|
|
}));
|
|
var s = i("fgLi"),
|
|
r = i("aIyQ"),
|
|
n = i.n(r),
|
|
o = i("/tGj");
|
|
class a extends s.DataSource {
|
|
constructor(e) {
|
|
super(), this._formatterChanged = new n.a, this._priceStepChanged = new n.a,
|
|
this._currencyChanged = new n.a, this._unitChanged = new n.a, this
|
|
._priceRangeReadyChanged = new n.a, this._metaInfo = null, this._priceStep =
|
|
null, this._priceRangeReady = !0, this._model = e
|
|
}
|
|
barColorer() {
|
|
return null
|
|
}
|
|
base() {
|
|
return 0
|
|
}
|
|
model() {
|
|
return this._model
|
|
}
|
|
currencyChanged() {
|
|
return this._currencyChanged
|
|
}
|
|
isCurrencySource() {
|
|
return !0
|
|
}
|
|
unitChanged() {
|
|
return this._unitChanged
|
|
}
|
|
isUnitSource() {
|
|
return !0
|
|
}
|
|
priceRange(e, t) {
|
|
return null
|
|
}
|
|
isDraggable() {
|
|
return !this._metaInfo || !this._metaInfo.linkedToSeries
|
|
}
|
|
priceLineColor(e) {
|
|
return e
|
|
}
|
|
formatterChanged() {
|
|
return this._formatterChanged
|
|
}
|
|
priceStep(e) {
|
|
return this._priceStep
|
|
}
|
|
priceStepChanged() {
|
|
return this._priceStepChanged
|
|
}
|
|
hasStateForAlert() {
|
|
return !1
|
|
}
|
|
isIncludedInAutoScale() {
|
|
return !0
|
|
}
|
|
correctScaleMargins(e) {
|
|
return e
|
|
}
|
|
priceRangeReady() {
|
|
return this._priceRangeReady
|
|
}
|
|
priceRangeReadyChanged() {
|
|
return this._priceRangeReadyChanged
|
|
}
|
|
disablePriceRangeReady() {
|
|
const e = this.priceScale();
|
|
null === e || e.isAutoScale() || e.mainSource() !== this || (this
|
|
._priceRangeReady = !1, e.recalculatePriceRangeOnce()), this
|
|
._priceRangeReadyChanged.fire(!1)
|
|
}
|
|
_enablePriceRangeReady() {
|
|
this._priceRangeReady = !0, this._priceRangeReadyChanged.fire(!0)
|
|
}
|
|
_onSourceCurrencyChanged() {
|
|
Object(o.isSymbolSource)(this) || this._currencyChanged.fire()
|
|
}
|
|
_onSourceUnitChanged() {
|
|
Object(o.isSymbolSource)(this) || this._unitChanged.fire()
|
|
}
|
|
_onSourcePriceRangeReadyChanged(e) {
|
|
Object(o.isSymbolSource)(this) || e || this.disablePriceRangeReady()
|
|
}
|
|
}
|
|
},
|
|
"7nsU": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "showConfirmInputsDialog", (function() {
|
|
return r
|
|
}));
|
|
var s = i("YFKU");
|
|
async function r(e, t, r, n, o = "default") {
|
|
let a = !1,
|
|
l = !1;
|
|
try {
|
|
const s = await Promise.all([i.e("redux"), i.e("react"), i.e(1), i.e(3), i.e(4), i
|
|
.e(6), i.e(8), i.e(9), i.e(12), i.e(13), i.e(14), i.e(16), i.e(17), i.e(
|
|
19), i.e(21), i.e(23), i.e(26), i.e(33), i.e(34), i.e(35), i.e(36),
|
|
i.e(39), i.e(50), i.e(59), i.e(95), i.e(0), i.e(2), i.e(5), i.e(7), i.e(
|
|
10), i.e(15), i.e(18), i.e(20), i.e(25), i.e(30), i.e(31), i.e(32),
|
|
i.e(37), i.e(46), i.e(55), i.e("new-confirm-inputs-dialog")
|
|
]).then(i.bind(null, "T4SC"));
|
|
a = await s.selectInputValuesOnChart(e, t, o)
|
|
} catch (e) {
|
|
l = !0
|
|
}
|
|
l ? n() : a ? r(t.defaults.inputs || {}) : Promise.all([i.e("redux"), i.e("react"), i.e(
|
|
1), i.e(3), i.e(4), i.e(6), i.e(8), i.e(9), i.e(12), i.e(13), i.e(14), i
|
|
.e(16), i.e(17), i.e(19), i.e(21), i.e(23), i.e(26), i.e(33), i.e(34), i.e(
|
|
35), i.e(36), i.e(39), i.e(50), i.e(59), i.e(95), i.e(0), i.e(2), i.e(
|
|
5), i.e(7), i.e(10), i.e(15), i.e(18), i.e(20), i.e(25), i.e(30), i.e(
|
|
31), i
|
|
.e(32), i.e(37), i.e(46), i.e(55), i.e("new-confirm-inputs-dialog")
|
|
]).then(i.bind(null, "iqv3")).then(i => {
|
|
const a = new i.ConfirmInputsDialogRenderer(function(e) {
|
|
if ("symbol" === e) return Object(s.t)("Add Symbol");
|
|
return Object(s.t)("Confirm Inputs")
|
|
}(o), t, e.model(), o, r, n);
|
|
return a.show(), a
|
|
})
|
|
}
|
|
},
|
|
"7qI1": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineToolRectangle", (function() {
|
|
return c
|
|
}));
|
|
var s = i("aO4+"),
|
|
r = i("Ocx9"),
|
|
n = i("tc+8"),
|
|
o = i.n(n),
|
|
a = i("Ss5c"),
|
|
l = i("j3hX");
|
|
class c extends a.LineDataSource {
|
|
constructor(e, t) {
|
|
const s = t || c.createProperties();
|
|
super(e, s), i.e("lt-pane-views").then(i.bind(null, "GW0y")).then(({
|
|
RectanglePaneView: t
|
|
}) => {
|
|
const i = [new t(this, e)];
|
|
this._setPaneViews(i)
|
|
})
|
|
}
|
|
pointsCount() {
|
|
return 2
|
|
}
|
|
textColorsProperty() {
|
|
return this.properties().childs().showLabel.value() ? super
|
|
.textColorsProperty() : null
|
|
}
|
|
properties() {
|
|
return super.properties()
|
|
}
|
|
name() {
|
|
return "Rectangle"
|
|
}
|
|
setPoint(e, t, i) {
|
|
if (e < 2 && super.setPoint(e, t, i), i && i.shift()) {
|
|
const i = this._getAnchorPointForIndex(e);
|
|
if (e >= 4) return this._correctMiddlePoints(e, t, i), void this
|
|
.normalizePoints();
|
|
this._snapPoint45Degree(t, i)
|
|
}
|
|
switch (e) {
|
|
case 2:
|
|
this._points[1].price = t.price, this._points[0].index = t.index;
|
|
break;
|
|
case 3:
|
|
this._points[0].price = t.price, this._points[1].index = t.index;
|
|
break;
|
|
case 4:
|
|
this._points[0].index = t.index;
|
|
break;
|
|
case 5:
|
|
this._points[1].index = t.index;
|
|
break;
|
|
case 6:
|
|
this._points[0].price = t.price;
|
|
break;
|
|
case 7:
|
|
this._points[1].price = t.price
|
|
}
|
|
this.normalizePoints()
|
|
}
|
|
getPoint(e) {
|
|
return e < 2 ? super.getPoint(e) : this._getAnchorPointForIndex(e)
|
|
}
|
|
template() {
|
|
const e = super.template();
|
|
return e.text = this.properties().childs().text.value(), e
|
|
}
|
|
static createProperties(e) {
|
|
const t = new r.DefaultProperty("linetoolrectangle", e);
|
|
return c._configureProperties(t), t
|
|
}
|
|
_getPropertyDefinitionsViewModelClass() {
|
|
return Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "K4wI")).then(
|
|
e => e.RectangleDefinitionsViewModel)
|
|
}
|
|
_applyTemplateImpl(e) {
|
|
super._applyTemplateImpl(e), this.properties().childs().text.setValue(e.text)
|
|
}
|
|
_snapPoint45Degree(e, t, i) {
|
|
const s = this.m_priceScale,
|
|
r = this.ownerSource();
|
|
if (null === s || null === r) return;
|
|
const n = r.firstValue();
|
|
if (null === n) return;
|
|
const o = this._model.timeScale(),
|
|
a = this.pointToScreenPoint(e)[0],
|
|
l = this.pointToScreenPoint(t)[0],
|
|
c = a.x - l.x,
|
|
h = a.y - l.y,
|
|
u = c < 0 ? -1 : 1,
|
|
d = h < 0 ? -1 : 1,
|
|
p = Math.max(Math.abs(c), Math.abs(h)),
|
|
_ = Math.round(o.coordinateToIndex(l.x + p * u)),
|
|
m = Math.abs(o.indexToCoordinate(_) - l.x),
|
|
f = s.coordinateToPrice(l.y + m * d, n);
|
|
e.index = _, e.price = f
|
|
}
|
|
_correctMiddlePoints(e, t, i) {
|
|
e < 6 ? this._correctRightLeftMiddlePoint(e, t, i) : this
|
|
._correctTopBottomMiddlePoint(e, t, i)
|
|
}
|
|
_correctRightLeftMiddlePoint(e, t, i) {
|
|
const r = this.pointToScreenPoint(t)[0],
|
|
n = this.pointToScreenPoint(i)[0],
|
|
o = this.pointToScreenPoint(this._points[0])[0],
|
|
a = this.pointToScreenPoint(this._points[1])[0];
|
|
let l = r.x - n.x;
|
|
if (0 === l) return;
|
|
const c = o.x < a.x ? 1 : -1,
|
|
h = o.y < a.y ? 1 : -1;
|
|
switch (l *= c, e) {
|
|
case 4: {
|
|
const e = a.y - h * l / 2,
|
|
t = this.screenPointToPoint(new s.Point(a.x, e));
|
|
this._points[1].price = t.price;
|
|
const i = this.screenPointToPoint(new s.Point(o.x + c * l, o.y + h * l /
|
|
2));
|
|
this._points[0].price = i.price, this._points[0].index = i.index;
|
|
break
|
|
}
|
|
case 5: {
|
|
const e = o.y - h * l / 2,
|
|
t = this.screenPointToPoint(new s.Point(o.x, e));
|
|
this._points[0].price = t.price;
|
|
const i = this.screenPointToPoint(new s.Point(a.x + c * l, a.y + h * l /
|
|
2));
|
|
this._points[1].price = i.price, this._points[1].index = i.index;
|
|
break
|
|
}
|
|
}
|
|
}
|
|
_correctTopBottomMiddlePoint(e, t, i) {
|
|
const r = this.m_priceScale,
|
|
n = this.ownerSource();
|
|
if (null === r || null === n) return;
|
|
const o = this._model.timeScale(),
|
|
a = n.firstValue();
|
|
if (null === a) return;
|
|
const l = this.pointToScreenPoint(t)[0],
|
|
c = this.pointToScreenPoint(i)[0],
|
|
h = this.pointToScreenPoint(this._points[0])[0],
|
|
u = this.pointToScreenPoint(this._points[1])[0],
|
|
d = l.y - c.y,
|
|
p = d < 0 ? -1 : 1,
|
|
_ = h.x < u.x ? 1 : -1,
|
|
m = h.y < u.y ? 1 : -1;
|
|
switch (e) {
|
|
case 6: {
|
|
const e = Math.floor(u.x - _ * d / 2),
|
|
t = this.screenPointToPoint(new s.Point(e, u.y)),
|
|
i = Math.abs(this._points[1].index - t.index),
|
|
n = _ * m * p * Math.ceil(i / 2);
|
|
if (0 === n) return;
|
|
this._points[1].index = this._points[1].index - n;
|
|
const l = p * Math.abs(o.indexToCoordinate(this._points[1].index) - u
|
|
.x);
|
|
this._points[0].price = r.coordinateToPrice(h.y + l, a), this._points[0]
|
|
.index = this._points[0].index + n;
|
|
break
|
|
}
|
|
case 7: {
|
|
const e = Math.floor(h.x - _ * d / 2),
|
|
t = this.screenPointToPoint(new s.Point(e, h.y)),
|
|
i = Math.abs(this._points[0].index - t.index),
|
|
n = _ * m * p * Math.ceil(i / 2);
|
|
if (0 === n) return;
|
|
this._points[0].index = this._points[0].index - n;
|
|
const l = p * Math.abs(o.indexToCoordinate(this._points[0].index) - h
|
|
.x);
|
|
this._points[1].price = r.coordinateToPrice(u.y + l, a), this._points[1]
|
|
.index = this._points[1].index + n;
|
|
break
|
|
}
|
|
}
|
|
}
|
|
_snapTo45DegreesAvailable() {
|
|
return !0
|
|
}
|
|
static _configureProperties(e) {
|
|
a.LineDataSource._configureProperties(e), e.hasChild("text") || e.addChild(
|
|
"text", new o.a("")), e.addExclusion("text"), e.addChild("linesColors",
|
|
new l.LineToolColorsProperty([e.childs().color])), e.addChild(
|
|
"textsColors", new l.LineToolColorsProperty([e.childs().textColor], e
|
|
.childs().showLabel))
|
|
}
|
|
_getAnchorPointForIndex(e) {
|
|
const t = this.points(),
|
|
i = t[0],
|
|
s = t[1];
|
|
let r = 0,
|
|
n = 0;
|
|
switch (e) {
|
|
case 0:
|
|
r = i.price, n = i.index;
|
|
break;
|
|
case 1:
|
|
r = s.price, n = s.index;
|
|
break;
|
|
case 2:
|
|
r = s.price, n = i.index;
|
|
break;
|
|
case 3:
|
|
r = i.price, n = s.index;
|
|
break;
|
|
case 4:
|
|
r = (s.price + i.price) / 2, n = i.index;
|
|
break;
|
|
case 5:
|
|
r = (s.price + i.price) / 2, n = s.index;
|
|
break;
|
|
case 6:
|
|
r = i.price, n = (s.index + i.index) / 2;
|
|
break;
|
|
case 7:
|
|
r = s.price, n = (s.index + i.index) / 2
|
|
}
|
|
return {
|
|
index: n,
|
|
price: r
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"7qT/": function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e, t) {
|
|
return 100 * (t - e) / Math.abs(e)
|
|
}
|
|
i.d(t, "a", (function() {
|
|
return s
|
|
}))
|
|
},
|
|
"8LSp": function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return s
|
|
}));
|
|
class s {
|
|
constructor() {
|
|
this._stable = [], this._variable = null, this._owner = null
|
|
}
|
|
addStable(e) {
|
|
e.setOwner(this), this._stable.push(e)
|
|
}
|
|
setVariable(e) {
|
|
this._variable = e, null !== this._variable && this._variable.setOwner(this)
|
|
}
|
|
primitivesData(e) {
|
|
const t = [];
|
|
return this._forEach(i => t.push(...i.primitivesData(e))), t
|
|
}
|
|
deleteErasedItems() {
|
|
this._forEach(e => e.deleteErasedItems())
|
|
}
|
|
markPostedItems() {
|
|
this._forEach(e => e.markPostedItems())
|
|
}
|
|
isNaN() {
|
|
return this._all(e => e.isNaN())
|
|
}
|
|
dirty() {
|
|
null !== this._owner && this._owner.dirty()
|
|
}
|
|
setOwner(e) {
|
|
this._owner = e
|
|
}
|
|
_forEach(e) {
|
|
for (const t of this._stable) e(t);
|
|
null !== this._variable && e(this._variable)
|
|
}
|
|
_all(e) {
|
|
for (const t of this._stable)
|
|
if (!e(t)) return !1;
|
|
return null === this._variable || e(this._variable)
|
|
}
|
|
}
|
|
},
|
|
"8OdW": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "MINUTE_SPAN", (function() {
|
|
return s
|
|
})), i.d(t, "HOUR_SPAN", (function() {
|
|
return r
|
|
})), i.d(t, "DAY_SPAN", (function() {
|
|
return n
|
|
})), i.d(t, "WEEK_SPAN", (function() {
|
|
return o
|
|
})), i.d(t, "MONTH_SPAN", (function() {
|
|
return a
|
|
})), i.d(t, "YEAR_SPAN", (function() {
|
|
return l
|
|
})), i.d(t, "DEFAULT_BAR_SPACING", (function() {
|
|
return c
|
|
}));
|
|
const s = 20,
|
|
r = 30,
|
|
n = 40,
|
|
o = 50,
|
|
a = 60,
|
|
l = 70,
|
|
c = 6
|
|
},
|
|
"8Uy/": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LINESTYLE_SOLID", (function() {
|
|
return s
|
|
})), i.d(t, "LINESTYLE_DOTTED", (function() {
|
|
return r
|
|
})), i.d(t, "LINESTYLE_DASHED", (function() {
|
|
return n
|
|
})), i.d(t, "LINESTYLE_LARGE_DASHED", (function() {
|
|
return o
|
|
})),
|
|
i.d(t, "LINESTYLE_SPARSE_DOTTED", (function() {
|
|
return a
|
|
})), i.d(t, "LINESTYLE_SMALL_DASHED", (function() {
|
|
return l
|
|
}));
|
|
const s = 0,
|
|
r = 1,
|
|
n = 2,
|
|
o = 3,
|
|
a = 4,
|
|
l = 5
|
|
},
|
|
"8gnj": function(e, t, i) {
|
|
"use strict";
|
|
var s = i("LxhU").Interval,
|
|
r = i("OLhd").isAlignmentEnabled,
|
|
n = i("7ETO").getChartStyleStudy,
|
|
o = i("5fI3").decodeExtendedSymbol,
|
|
a = i("53h+").findSuitableResolutionToBuildFrom,
|
|
l = function() {
|
|
var e = i("ocLq"),
|
|
t = e.StudyEngine,
|
|
l = e.BarBuilder,
|
|
c = e.BarSet;
|
|
|
|
function h(e) {
|
|
this.host = e, this.cache = {}
|
|
}
|
|
|
|
function u(e) {
|
|
throw console.error(e), e
|
|
}
|
|
h.prototype.getCache = function(e) {
|
|
return this.cache[e]
|
|
}, h.prototype.putCache = function(e, t) {
|
|
this.cache[e] = t
|
|
}, h.prototype.subscribe = function(e, t, i, s, r, n, o, a, l, c) {
|
|
var h = l(o),
|
|
u = function(e, t, i, s, r, n, o, a) {
|
|
var l = r.has_empty_bars ? "_" : "";
|
|
return n + e + s + (t || "") + (i || "") + l + "_" + o.countBack + "_" +
|
|
o.to + "_" + Boolean(a)
|
|
}(e, t, i, s, o, a, h, c),
|
|
d = this.getCache(u);
|
|
return d || (d = this.createItem(e, t, i, s, o, h, a, c), this.putCache(u, d)),
|
|
d.listeners.addListener(r, n), {
|
|
key: u,
|
|
listener: r
|
|
}
|
|
}, h.prototype.unsubscribe = function(e) {
|
|
var t = this.getCache(e.key);
|
|
t && t.listeners.removeListener(e.listener)
|
|
}, h.prototype.removeUnused = function() {
|
|
var e = [];
|
|
for (var t in this.cache) {
|
|
if (this.cache[t]) 0 === this.cache[t].listeners.listenersCount() && e.push(
|
|
t)
|
|
}
|
|
if (0 !== e.length) {
|
|
for (var i = 0; i < e.length; i++) {
|
|
var s = e[i],
|
|
r = this.cache[s];
|
|
this.cache[s] = null, r.stop()
|
|
}
|
|
this.removeUnused()
|
|
}
|
|
}, h.prototype.rebuildFrom = function(e, t) {
|
|
return a(e, t)
|
|
};
|
|
var d = s.parse("1M").inMilliseconds(0);
|
|
h.prototype.createItem = function(e, t, i, a, c, h, f, g) {
|
|
var b = new m,
|
|
v = o(e),
|
|
S = "string" != typeof v.symbol ? v.symbol : v;
|
|
t = S["currency-id"] || t, i = S["unit-id"] || i;
|
|
var y = S.symbol,
|
|
w = S.session && "extended" !== S.session;
|
|
if ("type" in v) {
|
|
var P = Object.assign({}, c);
|
|
return c.has_empty_bars && (P.has_empty_bars = !1), new _(b, y, t, i, a, n(
|
|
v), P, h, f)
|
|
}
|
|
g && !r() && u("Internal error: rebuilding is requested but it is disabled."), !
|
|
g && c.has_empty_bars && u(
|
|
'Misconfiguration error: attempt to request data for symbol with "has_empty_bars" flag, but "disable_resolution_rebuild" featureset is enabled'
|
|
);
|
|
var C, x, T = this.rebuildFrom(a, c);
|
|
if (!s.isTicks(a) && (!s.isEqual(a, T) || g)) {
|
|
r() || u(
|
|
'Misconfiguration error: remove "disable_resolution_rebuild" featureset or provide ' +
|
|
a + " data by yourself");
|
|
var I = c.has_empty_bars;
|
|
P = Object.assign({}, c);
|
|
c.has_empty_bars && (P.has_empty_bars = !1);
|
|
var M = Math.ceil((C = s.parse(a), x = s.parse(T), C.kind() === x.kind() ? C
|
|
.multiplier() / x.multiplier() : (C.isMonths() ? C
|
|
.multiplier() * d : C.inMilliseconds()) / (x.isMonths() ? x
|
|
.multiplier() * d : x.inMilliseconds())));
|
|
return h = Object.assign({}, h, {
|
|
countBack: h.countBack * M
|
|
}), new _(b, y, t, i, T, new l(a, I), P, h, f)
|
|
}
|
|
return new p(b, y, {
|
|
currency: t,
|
|
unit: i
|
|
}, a, w, this.host, c, h)
|
|
};
|
|
var p = function(e, t, i, s, r, n, o, a) {
|
|
this.listeners = e, this.host = n;
|
|
var l = this;
|
|
this.host.resolve(t, i, (function(e) {
|
|
r && e.regular_session && (e.session = e.regular_session), l
|
|
.subs = l.host.subscribe(e, s, a, (function(e) {
|
|
l.listeners.fire(e)
|
|
}), (function(e) {
|
|
l.listeners.onError(e)
|
|
}))
|
|
}), (function(e) {
|
|
l.listeners.onError(e)
|
|
}))
|
|
};
|
|
p.prototype.stop = function() {
|
|
this.subs && this.host.unsubscribe(this.subs)
|
|
};
|
|
var _ = function(e, i, s, r, n, o, a, l, c) {
|
|
this.listeners = e, this.isRecalculated = !1, this.symbolInfo = a;
|
|
var h = this;
|
|
this.engine = new t({
|
|
tickerid: i,
|
|
currencyCode: s,
|
|
unitId: r,
|
|
period: n,
|
|
body: o,
|
|
sessionId: c,
|
|
symbolInfo: a,
|
|
dataRange: l,
|
|
forceAlignBars: !1,
|
|
recalc: function(e, t) {
|
|
h._recalc(t)
|
|
},
|
|
out: function(e, t) {
|
|
h._out(e, t)
|
|
},
|
|
nonseriesOut: function(e, t) {
|
|
h._nonseriesOut(e, t)
|
|
},
|
|
setNoMoreData: function() {
|
|
h.barset && (h.barset.endOfData = !0)
|
|
},
|
|
onErrorCallback: function(e) {
|
|
h.listeners.onError(e)
|
|
}
|
|
})
|
|
};
|
|
_.prototype.stop = function() {
|
|
this.engine ? this.engine.stop() : console.error("Internal library error 0x1")
|
|
}, _.prototype._recalc = function(e) {
|
|
this.isRecalculated && console.error("recalc called twice!"), this.barset || (
|
|
this.barset = new c(this.symbolInfo)), e && (this.barset
|
|
.firstLoadedTimeMs = e.firstLoadedTimeMs, this.barset.endOfData = e
|
|
.endOfData), this.listeners.fire(this.barset), this.isRecalculated = !0
|
|
}, _.prototype._nonseriesOut = function(e, t) {
|
|
var i = Object.assign({}, t);
|
|
i.nonseries = !0, i.data = t.bars, delete i.bars, i.barsetSize = this.barset ?
|
|
this.barset.count() : 0, i.lastBar = this.barset ? this.barset.bar(this
|
|
.barset.count() - 1) : null, this.listeners.fire(i, !0)
|
|
}, _.prototype._out = function(e, t) {
|
|
var i = t[0];
|
|
if (!isNaN(i)) {
|
|
var s = {
|
|
time: i,
|
|
open: t[1],
|
|
high: t[2],
|
|
low: t[3],
|
|
close: t[4],
|
|
volume: t[5],
|
|
updatetime: t[6]
|
|
},
|
|
r = t[7];
|
|
this.barset || (this.barset = new c(e.info));
|
|
var n = t[8];
|
|
if (n instanceof Array)
|
|
for (var o = 0; o < n.length; o++) {
|
|
var a = t[9],
|
|
l = n[o],
|
|
h = {
|
|
time: l,
|
|
open: a,
|
|
high: a,
|
|
low: a,
|
|
close: a,
|
|
volume: 0,
|
|
updatetime: l
|
|
};
|
|
this.barset.add(h, !0), this.isRecalculated && this.listeners.fire(
|
|
this.barset)
|
|
}
|
|
this.barset.add(s, r), this.barset.isBarClosed = r, this.isRecalculated &&
|
|
this.listeners.fire(this.barset)
|
|
}
|
|
};
|
|
var m = function() {
|
|
this.listeners = []
|
|
};
|
|
return m.prototype.listenersCount = function() {
|
|
return this.listeners.reduce((function(e, t) {
|
|
return e + (t ? 1 : 0)
|
|
}), 0)
|
|
}, m.prototype.addListener = function(e, t) {
|
|
this.listeners.push({
|
|
dataListener: e,
|
|
onErrorCallback: t
|
|
}), this.barset && e(this.barset), this.errorMsg && t(this.errorMsg)
|
|
}, m.prototype.removeListener = function(e) {
|
|
var t = this.listeners.filter((function(t) {
|
|
return t.dataListener === e
|
|
}));
|
|
if (0 !== t.length) {
|
|
var i = this.listeners.indexOf(t[0]);
|
|
delete this.listeners[i]
|
|
}
|
|
}, m.prototype.onError = function(e) {
|
|
this.errorMsg = e || "unspecified error";
|
|
for (var t = this.listeners, i = t.length, s = 0; s < i; s++) {
|
|
var r = t[s];
|
|
r && r.onErrorCallback && r.onErrorCallback(e)
|
|
}
|
|
}, m.prototype.fire = function(e, t) {
|
|
t || (this.barset = e);
|
|
for (var i = this.listeners, s = i.length, r = 0; r < s; r++) {
|
|
var n = i[r];
|
|
n && n.dataListener(e)
|
|
}
|
|
}, {
|
|
setupFeed: function(t) {
|
|
h.instance = new h(t), e.setupFeed(h.instance)
|
|
},
|
|
unsubscribeUnused: function() {
|
|
h.instance.removeUnused()
|
|
}
|
|
}
|
|
}();
|
|
e.exports = l
|
|
},
|
|
"8pII": function(e) {
|
|
e.exports = JSON.parse(
|
|
'{"content":{"chartProperties":{"scalesProperties":{"textColor":"#B2B5BE","lineColor":"rgba(240, 243, 250, 0.12)","backgroundColor":"#ffffff"},"paneProperties":{"vertGridProperties":{"color":"rgba(240, 243, 250, 0.06)"},"horzGridProperties":{"color":"rgba(240, 243, 250, 0.06)"},"crossHairProperties":{"color":"#9598A1"},"background":"#131722","backgroundGradientStartColor":"#181C27","backgroundGradientEndColor":"#131722","backgroundType":"gradient"}},"sessions":{"graphics":{"backgrounds":{"outOfSession":{"color":"#2962FF","transparency":92},"preMarket":{"color":"#FF9800","transparency":92},"postMarket":{"color":"#2962FF","transparency":92}},"vertlines":{"sessBreaks":{"color":"#4985e7","style":2,"width":1}}}},"mainSourceProperties":{"baseLineColor":"#5d606b","candleStyle":{"borderColor":"#378658","upColor":"#26a69a","wickColor":"#B5B5B8","wickUpColor":"#26a69a","wickDownColor":"#ef5350","downColor":"#ef5350","borderUpColor":"#26a69a","borderDownColor":"#ef5350"},"haStyle":{"borderColor":"#378658","upColor":"#26a69a","wickColor":"#B5B5B8","wickUpColor":"#26a69a","wickDownColor":"#ef5350","downColor":"#ef5350","borderUpColor":"#26a69a","borderDownColor":"#ef5350"},"barStyle":{"downColor":"#ef5350","upColor":"#26a69a"},"pnfStyle":{"downColor":"#ef5350","upColor":"#26a69a","upColorProjection":"#336854","downColorProjection":"#7f323f"},"baselineStyle":{"baselineColor":"rgba( 117, 134, 150, 1)","topFillColor1":"rgba( 38, 166, 154, 0.28)","topFillColor2":"rgba( 38, 166, 154, 0.05)","bottomFillColor1":"rgba( 239, 83, 80, 0.05)","bottomFillColor2":"rgba( 239, 83, 80, 0.28)","topLineColor":"rgba( 38, 166, 154, 1)","bottomLineColor":"rgba( 239, 83, 80, 1)"},"areaStyle":{"transparency":100,"color1":"rgba(41, 98, 255, 0.28)","color2":"#2962FF","linecolor":"#2962FF","linewidth":2,"linestyle":0},"renkoStyle":{"upColor":"#26a69a","downColor":"#ef5350","borderUpColor":"#26a69a","borderDownColor":"#ef5350","upColorProjection":"#336854","downColorProjection":"#7f323f","borderUpColorProjection":"#336854","borderDownColorProjection":"#7f323f","wickUpColor":"#26a69a","wickDownColor":"#ef5350"},"lineStyle":{"color":"#2962FF","linewidth":2,"linestyle":0},"kagiStyle":{"downColor":"#ef5350","upColor":"#26a69a","upColorProjection":"#336854","downColorProjection":"#7f323f"},"pbStyle":{"upColor":"#26a69a","downColor":"#ef5350","borderUpColor":"#26a69a","borderDownColor":"#ef5350","upColorProjection":"#336854","downColorProjection":"#7f323f","borderUpColorProjection":"#336854","borderDownColorProjection":"#7f323f"},"rangeStyle":{"upColor":"#26a69a","downColor":"#ef5350","upColorProjection":"#336854","downColorProjection":"#7f323f"}}}}'
|
|
)
|
|
},
|
|
"8sOK": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("2kV1"),
|
|
r = i("7ktv"),
|
|
n = i("kcTO"),
|
|
o = i("aIyQ"),
|
|
a = i.n(o),
|
|
l = i("tc+8"),
|
|
c = i.n(l),
|
|
h = i("ww0J");
|
|
class u extends h.a {
|
|
text() {
|
|
return this._source.isActualInterval() ?
|
|
`${this._source.title()} ${this.sourceStatusText()}` : this._source.title()
|
|
}
|
|
}
|
|
var d = i("bmVy");
|
|
i.d(t, "StudyStub", (function() {
|
|
return m
|
|
}));
|
|
class p {
|
|
getItems() {
|
|
return []
|
|
}
|
|
getValues(e) {
|
|
return []
|
|
}
|
|
}
|
|
const _ = new a.a;
|
|
class m extends r.PriceDataSource {
|
|
constructor(e, t, i) {
|
|
super(e), this._priceStep = .01, this._status = {
|
|
type: d.StudyStatusType.Undefined
|
|
}, this._statusChanged = new a.a, this._formatter = new n.PriceFormatter(
|
|
100), this._origState = t, this._title = i;
|
|
this._properties = new c.a({
|
|
visible: !0
|
|
}), this._statusView = new s.StudyStatusView(this)
|
|
}
|
|
properties() {
|
|
return this._properties
|
|
}
|
|
statusView() {
|
|
return this._statusView
|
|
}
|
|
legendView() {
|
|
return null
|
|
}
|
|
state(e) {
|
|
return this._origState
|
|
}
|
|
setStatus(e) {
|
|
this._status = e, this._statusChanged.fire()
|
|
}
|
|
formatter() {
|
|
return this._formatter
|
|
}
|
|
title() {
|
|
return this._title
|
|
}
|
|
titleInParts() {
|
|
return [this._title]
|
|
}
|
|
isFailed() {
|
|
return this._status.type === d.StudyStatusType.Error
|
|
}
|
|
isLoading() {
|
|
return this._status.type === d.StudyStatusType.Loading
|
|
}
|
|
setFailed(e) {
|
|
this.setStatus({
|
|
type: d.StudyStatusType.Error,
|
|
errorDescription: {
|
|
error: e
|
|
}
|
|
}), this._model.updateSource(this)
|
|
}
|
|
isSymbolInvalid() {
|
|
return !1
|
|
}
|
|
isActualInterval() {
|
|
return !0
|
|
}
|
|
onIsActualIntervalChange() {
|
|
return _
|
|
}
|
|
start() {}
|
|
status() {
|
|
return this._status
|
|
}
|
|
onStatusChanged() {
|
|
return this._statusChanged
|
|
}
|
|
firstValue() {
|
|
return null
|
|
}
|
|
currency() {
|
|
return null
|
|
}
|
|
sessionId() {
|
|
return this._model.mainSeries().sessionId()
|
|
}
|
|
sessionIdChanged() {
|
|
return this._model.mainSeries().sessionIdChanged()
|
|
}
|
|
unit() {
|
|
return null
|
|
}
|
|
symbolSource() {
|
|
return this._model.mainSeries()
|
|
}
|
|
valuesProvider() {
|
|
return new p
|
|
}
|
|
statusProvider(e) {
|
|
return new u(this, this._model.properties().scalesProperties.textColor)
|
|
}
|
|
}
|
|
},
|
|
"8woN": function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Kxc7"),
|
|
r = [{
|
|
d: "E-Mini S&P 500",
|
|
t: "ES"
|
|
}, {
|
|
d: "E-Mini Nasdaq 100",
|
|
t: "NQ"
|
|
}, {
|
|
d: "Gold",
|
|
t: "GC"
|
|
}, {
|
|
d: "Silver",
|
|
t: "SI"
|
|
}, {
|
|
d: "Crude Oil WTI",
|
|
t: "CL"
|
|
}, {
|
|
d: "Natural Gas",
|
|
t: "NG"
|
|
}, {
|
|
d: "Australian Dollar",
|
|
t: "6A"
|
|
}, {
|
|
d: "Australian Dollar (Floor)",
|
|
t: "AD"
|
|
}, {
|
|
d: "Euro FX",
|
|
t: "6E"
|
|
}, {
|
|
d: "Euro FX (Floor)",
|
|
t: "EC"
|
|
}, {
|
|
d: "Corn",
|
|
t: "ZC"
|
|
}, {
|
|
d: "Corn (Floor)",
|
|
t: "C"
|
|
}, {
|
|
d: "Eurodollar",
|
|
t: "GE"
|
|
}, {
|
|
d: "Eurodollar (Floor)",
|
|
t: "ED"
|
|
}],
|
|
n = function() {
|
|
var e = [{
|
|
pattern: "(",
|
|
ctor: o
|
|
}, {
|
|
pattern: ")",
|
|
ctor: a
|
|
}, {
|
|
pattern: "+",
|
|
ctor: c
|
|
}, {
|
|
pattern: "-",
|
|
ctor: h
|
|
}, {
|
|
pattern: "*",
|
|
ctor: u
|
|
}, {
|
|
pattern: "/",
|
|
ctor: d
|
|
}, {
|
|
pattern: "^",
|
|
ctor: p
|
|
}, {
|
|
pattern: /\d+(?:\.\d*|(?![a-zA-Z0-9_!:.&]))|\.\d+/,
|
|
ctor: g
|
|
}, {
|
|
pattern: /\./,
|
|
ctor: S
|
|
}, {
|
|
pattern: s.enabled("charting_library_base") ?
|
|
/[a-zA-Z0-9_\u0370-\u1FFF_\u2E80-\uFFFF^][a-zA-Z0-9_\u0020\u0370-\u1FFF_\u2E80-\uFFFF_!:.&]*|'.+?'/ :
|
|
/[a-zA-Z0-9_\u0370-\u1FFF_\u2E80-\uFFFF][a-zA-Z0-9_\u0020\u0370-\u1FFF_\u2E80-\uFFFF_!|:.&]*|'.+?'/,
|
|
ctor: f
|
|
}, {
|
|
pattern: /'[^']*/,
|
|
ctor: v
|
|
}, {
|
|
pattern: /[\0-\x20\s]+/,
|
|
ctor: n
|
|
}];
|
|
|
|
function t(e, t) {
|
|
var i = function() {};
|
|
return i.prototype = t.prototype, e.prototype = new i, e
|
|
}
|
|
|
|
function i() {}
|
|
|
|
function n(e) {
|
|
this.value = e
|
|
}
|
|
|
|
function o() {}
|
|
|
|
function a() {}
|
|
|
|
function l() {}
|
|
|
|
function c() {}
|
|
|
|
function h() {}
|
|
|
|
function u() {}
|
|
|
|
function d() {}
|
|
|
|
function p() {}
|
|
i.prototype.toString = function() {
|
|
return this.value
|
|
}, t(n, i), t(o, i), o.prototype.value = "(", t(a, i), a.prototype.value = ")", t(l,
|
|
i), t(c, l), c.prototype.value = "+", c.prototype.precedence = 0, c.prototype
|
|
.commutative = !0, t(h, l), h.prototype.value = "-", h.prototype.precedence = 0, h
|
|
.prototype.commutative = !1, t(u, l), u.prototype.value = "*", u.prototype
|
|
.precedence = 1, u.prototype.commutative = !0, t(d, l), d.prototype.value = "/", d
|
|
.prototype.precedence = 1, d.prototype.commutative = !1, t(p, l),
|
|
p.prototype.value = "^", p.prototype.precedence = 2, p.prototype.commutative = !1;
|
|
var _ = /^'?(?:([A-Z0-9_]+):)?(.*?)'?$/i,
|
|
m = /[+\-/*]/;
|
|
|
|
function f(e) {
|
|
this.value = e
|
|
}
|
|
|
|
function g(e) {
|
|
this.value = e
|
|
}
|
|
|
|
function b(e) {
|
|
this.value = e
|
|
}
|
|
|
|
function v() {
|
|
f.apply(this, arguments)
|
|
}
|
|
|
|
function S() {
|
|
g.apply(this, arguments)
|
|
}
|
|
t(f, i), f.prototype.toString = function() {
|
|
if (this.hasOwnProperty("_ticker")) {
|
|
var e = m.test(this._ticker) ? "'" : "";
|
|
return e + (this._exchange ? this._exchange + ":" : "") + this._ticker + e
|
|
}
|
|
return this.value
|
|
}, f.prototype.parse = function() {
|
|
var e = _.exec(this.value);
|
|
e[1] && (this._exchange = e[1]), this._ticker = e[2]
|
|
}, f.prototype.parseAsFutures = function() {
|
|
this.hasOwnProperty("_ticker") || this.parse();
|
|
for (var e = function(e) {
|
|
return r.some((function(t) {
|
|
return t.t === e
|
|
}))
|
|
}, t = 2; t >= 1; --t) {
|
|
var i = this._ticker.slice(0, t);
|
|
if (e(i)) {
|
|
this._root = i, this._contract = this._ticker.slice(t);
|
|
break
|
|
}
|
|
}
|
|
}, f.prototype.exchange = function(e) {
|
|
if (this.hasOwnProperty("_ticker") || this.parse(), !(arguments.length > 0))
|
|
return this._exchange;
|
|
null == e ? delete this._exchange : this._exchange = e + ""
|
|
}, f.prototype.ticker = function(e) {
|
|
if (this.hasOwnProperty("_ticker") || this.parse(), !(arguments.length > 0))
|
|
return this._ticker;
|
|
null == e ? delete this._ticker : this._ticker = e + "", delete this._root,
|
|
delete this._contract
|
|
}, f.prototype.root = function(e) {
|
|
if (this.hasOwnProperty("_root") || this.parseAsFutures(), !(arguments.length >
|
|
0)) return this._root;
|
|
null == e ? delete this._root : (this._root = e + "", this._root && (this
|
|
._ticker = this._root + (this._contract || "")))
|
|
}, f.prototype.contract = function(e) {
|
|
if (this.hasOwnProperty("_contract") || this.parseAsFutures(), !(arguments
|
|
.length > 0)) return this._root;
|
|
null == e ? delete this._contract : (this._contract = e + "", this._root && (
|
|
this._ticker = this._root + this._contract))
|
|
}, t(g, i), g.prototype.toString = function() {
|
|
return this.hasOwnProperty("_normalizedValue") ? this._normalizedValue : this
|
|
.value
|
|
}, g.prototype.parse = function() {
|
|
this._normalizedValue = this.value.replace(/^0+|\.0*$/g, "").replace(
|
|
/(\.\d*?)0+$/, "$1").replace(/^(\.|$)/, "0$1")
|
|
}, b.prototype.toString = function() {
|
|
return this.value
|
|
}, t(v, f), v.prototype.isIncomplete = !0, v.prototype.incompleteSuggest =
|
|
function() {
|
|
if ("'" !== this.value) return String("'")
|
|
}, t(S, g), S.prototype.isIncomplete = !0;
|
|
var y = new RegExp(e.map((function(e) {
|
|
return "(" + ("string" == typeof e.pattern ? e.pattern.replace(
|
|
/[\^$()[\]{}*+?|\\]/g, "\\$&") : e.pattern.source) + ")"
|
|
})).concat(".").join("|"), "g");
|
|
|
|
function w(t, i) {
|
|
var s, r = [];
|
|
e: for (; s = y.exec(t);) {
|
|
for (var o = e.length; o--;)
|
|
if (s[o + 1]) {
|
|
if (e[o].ctor) {
|
|
var a = new e[o].ctor(s[o + 1]);
|
|
a._offset = s.index, r.push(a)
|
|
}
|
|
continue e
|
|
} var l = new b(s[0]);
|
|
l._offset = s.index, r.push(l)
|
|
}
|
|
if (i && i.recover) {
|
|
var c;
|
|
for (o = r.length; o--;) {
|
|
var h = r[o];
|
|
if (h instanceof g || h instanceof f) {
|
|
if (void 0 !== c) {
|
|
var u = new f(""),
|
|
d = r.splice(o, c - o + 1, u);
|
|
u.value = d.map((function(e) {
|
|
return e.value
|
|
})).join("")
|
|
}
|
|
c = o
|
|
} else h instanceof n || (c = void 0)
|
|
}
|
|
}
|
|
return r
|
|
}
|
|
|
|
function P(e) {
|
|
for (var t = [], i = 0; i < e.length; i++) e[i] instanceof n || t.push(e[i]);
|
|
return t
|
|
}
|
|
|
|
function C(e) {
|
|
e = P(e);
|
|
for (var t, i = [], s = [], r = 0; r < e.length; r++) {
|
|
var n = e[r];
|
|
if (n instanceof l) s.length && s[s.length - 1].minPrecedence > n.precedence &&
|
|
(s[s.length - 1].minPrecedence = n.precedence);
|
|
else if (n instanceof o) s.push(t = {
|
|
minPrecedence: 1 / 0,
|
|
openBraceIndex: r
|
|
});
|
|
else if (n instanceof a) {
|
|
var c = e[(t = s.pop()).openBraceIndex - 1],
|
|
h = e[r + 1];
|
|
h instanceof l && !(h.precedence <= t.minPrecedence) || !(!(
|
|
c instanceof l) || c.precedence < t.minPrecedence || c
|
|
.precedence === t.minPrecedence && c.commutative) || (i.unshift(t
|
|
.openBraceIndex), i.push(r), s.length && s[s.length - 1]
|
|
.minPrecedence > t.minPrecedence && (s[s.length - 1].minPrecedence =
|
|
t.minPrecedence))
|
|
}
|
|
}
|
|
for (r = i.length; r--;) e.splice(i[r], 1);
|
|
return e
|
|
}
|
|
|
|
function x(e) {
|
|
if ("string" != typeof e) throw new TypeError("expression must be a string");
|
|
return (e = w(e)).filter((function(e) {
|
|
return e instanceof f
|
|
})).map((function(e) {
|
|
return e.exchange()
|
|
})).filter((function(e) {
|
|
return e
|
|
}))
|
|
}
|
|
|
|
function T(e) {
|
|
return 1 !== (e = x(e)).length ? null : e[0]
|
|
}
|
|
|
|
function I(e, t) {
|
|
return (e = x(e)).some((function(e) {
|
|
return t.includes((e || "").toUpperCase())
|
|
}))
|
|
}
|
|
|
|
function M(e) {
|
|
return e.join("")
|
|
}
|
|
return {
|
|
tokenize: w,
|
|
validate: function(e) {
|
|
if (s.enabled("charting_library_base")) return {
|
|
currentState: "var"
|
|
};
|
|
for (var t = "init", i = {
|
|
warnings: [],
|
|
errors: [],
|
|
isEmpty: !0
|
|
}, r = [], c = 0; c < e.length; c++) {
|
|
if (!((u = e[c]) instanceof n)) {
|
|
if (delete i.isEmpty, u.isIncomplete) {
|
|
var h = {
|
|
status: "incomplete",
|
|
reason: "incomplete_token",
|
|
offset: u._offset,
|
|
token: u
|
|
};
|
|
if (u.incompleteSuggest && (h.recover = {
|
|
append: u.incompleteSuggest()
|
|
}), i.warnings.push(h), c !== e.length - 1) {
|
|
h.status = "error";
|
|
continue
|
|
}
|
|
}
|
|
if (u instanceof f || u instanceof g) {
|
|
if ("var" === t) {
|
|
i.errors.push({
|
|
status: "error",
|
|
reason: "unexpected_token",
|
|
offset: u._offset,
|
|
token: u
|
|
});
|
|
continue
|
|
}
|
|
t = "var"
|
|
} else if (u instanceof l) {
|
|
if ("var" !== t) {
|
|
i.errors.push({
|
|
status: "error",
|
|
reason: "unexpected_token",
|
|
offset: u._offset,
|
|
token: u
|
|
});
|
|
continue
|
|
}
|
|
t = "operator"
|
|
} else if (u instanceof o) {
|
|
if ("var" === t) {
|
|
i.errors.push({
|
|
status: "error",
|
|
reason: "unexpected_token",
|
|
offset: u._offset,
|
|
token: u
|
|
});
|
|
continue
|
|
}
|
|
r.push(u), t = "init"
|
|
} else if (u instanceof a) {
|
|
if ("var" !== t) {
|
|
i.errors.push({
|
|
status: "error",
|
|
reason: "unexpected_token",
|
|
offset: u._offset,
|
|
token: u
|
|
});
|
|
continue
|
|
}
|
|
r.pop() || i.errors.push({
|
|
status: "error",
|
|
reason: "unbalanced_brace",
|
|
offset: u._offset,
|
|
token: u,
|
|
recover: {
|
|
prepend: new o
|
|
}
|
|
}), t = "var"
|
|
} else u instanceof b && i.errors.push({
|
|
status: "error",
|
|
reason: "unparsed_entity",
|
|
offset: u._offset,
|
|
token: u
|
|
})
|
|
}
|
|
}
|
|
for (i.braceBalance = r.length, "var" !== t && i.warnings.push({
|
|
status: "incomplete"
|
|
}); r.length;) {
|
|
var u;
|
|
h = {
|
|
status: "incomplete",
|
|
reason: "unbalanced_brace",
|
|
offset: (u = r.pop())._offset,
|
|
token: u
|
|
};
|
|
"var" === t && (h.recover = {
|
|
append: new a
|
|
}), i.warnings.push(h)
|
|
}
|
|
return i.currentState = t, 0 === i.warnings.length && delete i.warnings,
|
|
0 === i.errors.length && delete i.errors, i
|
|
},
|
|
factorOutBraces: C,
|
|
normalizeTokens: function(e) {
|
|
for (var t = 0; t < e.length; t++) e[t].parse && e[t].parse();
|
|
return e
|
|
},
|
|
flip: function(e) {
|
|
var t = function(e) {
|
|
for (var t, i = 0, s = 0, r = 0; r < e.length; r++) {
|
|
var c = e[r];
|
|
if (!(c instanceof n)) switch (i) {
|
|
case 0:
|
|
if (!(c instanceof g && 1 == +c.value)) return !1;
|
|
i = 1;
|
|
break;
|
|
case 1:
|
|
if (!(1 === i && c instanceof d)) return !1;
|
|
i = 2, t = r + 1;
|
|
break;
|
|
case 2:
|
|
if (c instanceof o) i = 3, s = 1;
|
|
else if (c instanceof l) return !1;
|
|
break;
|
|
case 3:
|
|
c instanceof o ? s++ : c instanceof a && --s <= 0 &&
|
|
(i = 2)
|
|
}
|
|
}
|
|
return e.slice(t)
|
|
}(e);
|
|
return C(t || [new g("1"), new d, new o].concat(e).concat(new a))
|
|
},
|
|
hasBatsSymbols: function(e) {
|
|
return I(e, ["BATS"])
|
|
},
|
|
hasEodSymbols: function(e) {
|
|
return (e = T(e)) && -1 !== e.toUpperCase().indexOf("_EOD")
|
|
},
|
|
hasChxjpySymbols: function(e) {
|
|
return I(e, ["CHXJPY"])
|
|
},
|
|
hasFreeDelaySymbols: function(e) {
|
|
return I(e, pro.getProductsByType(pro.PRODUCT_TYPES.exchange).map((function(
|
|
e) {
|
|
return e.exchange.toUpperCase() + "_DLY"
|
|
})))
|
|
},
|
|
getExchange: T,
|
|
getExchanges: x,
|
|
isExchange: function(e, t) {
|
|
return !!(e = T(e)) && e.substr(0, t.length) === t
|
|
},
|
|
SymbolToken: f,
|
|
IncompleteSymbolToken: v,
|
|
NumberToken: g,
|
|
BinaryOperatorToken: l,
|
|
OpenBraceToken: o,
|
|
CloseBraceToken: a,
|
|
ticker: function(e) {
|
|
return new f(e).ticker()
|
|
},
|
|
shortName: function(e) {
|
|
if ("string" != typeof e) throw new TypeError(
|
|
"expression must be a string");
|
|
var t = C(P(w(e)));
|
|
return t.forEach((function(e) {
|
|
e instanceof f && e.exchange(null)
|
|
})), M(t)
|
|
},
|
|
normalize: function(e) {
|
|
if ("string" != typeof e) throw new TypeError(
|
|
"expression must be a string");
|
|
return M(C(P(w(e))))
|
|
}
|
|
}
|
|
}();
|
|
e.exports = n
|
|
},
|
|
"96Yh": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "lineToolEntityInfo", (function() {
|
|
return o
|
|
})), i.d(t, "studyEntityInfo", (function() {
|
|
return a
|
|
})), i.d(t, "seriesEntityInfo", (function() {
|
|
return l
|
|
})), i.d(t, "entityForDataSource", (function() {
|
|
return c
|
|
}));
|
|
var s = i("3ClC"),
|
|
r = i("2jXJ"),
|
|
n = i("CW80");
|
|
|
|
function o(e) {
|
|
return {
|
|
id: e.id(),
|
|
name: (t = e.toolname, Object.keys(r.supportedLineTools).find(e => r.supportedLineTools[
|
|
e].name === t) || null)
|
|
};
|
|
var t
|
|
}
|
|
|
|
function a(e) {
|
|
return {
|
|
id: e.id(),
|
|
name: e.metaInfo().description
|
|
}
|
|
}
|
|
|
|
function l(e) {
|
|
return {
|
|
id: e.id(),
|
|
name: "Main Series"
|
|
}
|
|
}
|
|
|
|
function c(e, t) {
|
|
return t === e.mainSeries() ? l(e.mainSeries()) : Object(s.isStudy)(t) ? a(t) : Object(n
|
|
.isLineTool)(t) ? o(t) : null
|
|
}
|
|
},
|
|
"972a": function(e, t, i) {
|
|
"use strict";
|
|
var s, r, n, o;
|
|
i.d(t, "c", (function() {
|
|
return s
|
|
})), i.d(t, "a", (function() {
|
|
return r
|
|
})), i.d(t, "b", (function() {
|
|
return o
|
|
})),
|
|
function(e) {
|
|
e.AboveBar = "AboveBar", e.BelowBar = "BelowBar", e.Top = "Top", e.Bottom = "Bottom", e
|
|
.Right = "Right", e.Left = "Left", e.Absolute = "Absolute", e.AbsoluteUp =
|
|
"AbsoluteUp", e.AbsoluteDown = "AbsoluteDown"
|
|
}(s || (s = {})),
|
|
function(e) {
|
|
e.Left = "left", e.Center = "center", e.Right = "right"
|
|
}(r || (r = {})),
|
|
function(e) {
|
|
e.Top = "top", e.Middle = "middle", e.Bottom = "bottom"
|
|
}(n || (n = {})),
|
|
function(e) {
|
|
e[e.Solid = 0] = "Solid", e[e.Dotted = 1] = "Dotted", e[e.Dashed = 2] = "Dashed"
|
|
}(o || (o = {}))
|
|
},
|
|
"99ZO": function(e, t, i) {
|
|
"use strict";
|
|
var s, r;
|
|
i.r(t), i.d(t, "WeekDays", (function() {
|
|
return s
|
|
})), i.d(t, "Months", (function() {
|
|
return r
|
|
})),
|
|
function(e) {
|
|
e[e.SUNDAY = 1] = "SUNDAY", e[e.MONDAY = 2] = "MONDAY", e[e.TUESDAY = 3] = "TUESDAY", e[
|
|
e.WEDNESDAY = 4] = "WEDNESDAY", e[e.THURSDAY = 5] = "THURSDAY", e[e.FRIDAY =
|
|
6] = "FRIDAY", e[e.SATURDAY = 7] = "SATURDAY"
|
|
}(s || (s = {})),
|
|
function(e) {
|
|
e[e.JANUARY = 0] = "JANUARY", e[e.FEBRUARY = 1] = "FEBRUARY", e[e.MARCH = 2] = "MARCH",
|
|
e[e.APRIL = 3] = "APRIL", e[e.MAY = 4] = "MAY", e[e.JUNE = 5] = "JUNE", e[e.JULY =
|
|
6] = "JULY", e[e.AUGUST = 7] = "AUGUST", e[e.SEPTEMBER = 8] = "SEPTEMBER", e[e
|
|
.OCTOBER = 9] = "OCTOBER", e[e.NOVEMBER = 10] = "NOVEMBER", e[e.DECEMBER = 11] =
|
|
"DECEMBER"
|
|
}(r || (r = {}))
|
|
},
|
|
"9Jkk": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("Eyy1"),
|
|
r = i("XlJ7"),
|
|
n = i("x0JF"),
|
|
o = i("Y7w9"),
|
|
a = i("Zp/P"),
|
|
l = i("VdBB"),
|
|
c = i("cPgM");
|
|
class h extends c.ScaledPaneRenderer {
|
|
constructor() {
|
|
super(...arguments),
|
|
this._data = null, this._barWidth = null
|
|
}
|
|
setData(e) {
|
|
this._data = e, this._barWidth = Math.max(1, Math.round(Object(a
|
|
.optimalHiLoWidth)(e.barSpacing)))
|
|
}
|
|
hitTest(e) {
|
|
if (null === this._data || null === this._barWidth) return null;
|
|
const t = this._data.bars,
|
|
i = .5 * this._data.barSpacing;
|
|
if (0 === t.length) return null;
|
|
if (e.x < t[0].time - i) return null;
|
|
if (e.x > t[t.length - 1].time + i) return null;
|
|
const s = t[Object(o.lowerbound)(t, e.x - i, (e, t) => e.time < t)];
|
|
if (e.x < s.time - i || e.x > s.time + i) return null;
|
|
const r = Object(a.interactionTolerance)().series + this._barWidth / 2,
|
|
n = Math.min(s.high, s.low),
|
|
c = Math.max(s.high, s.low),
|
|
h = this._data.fontSize;
|
|
return n - r - h <= e.y && e.y <= n + r || c - r <= e.y && e.y <= c + r + h ?
|
|
new l.HitTestResult(l.HitTestResult.REGULAR) : null
|
|
}
|
|
_drawImpl(e) {
|
|
if (null === this._data || null === this._barWidth) return;
|
|
e.save(), e.translate(.5, .5), e.textAlign = "center", e.fillStyle = this._data
|
|
.labelColor, e.font = Object(r.makeFont)(this._data.fontSize, this._data
|
|
.font);
|
|
const t = this._data.bars,
|
|
i = this._data.inverted;
|
|
for (let s = 0; s < t.length; ++s) {
|
|
const r = t[s],
|
|
n = Math.min(r.high, r.low),
|
|
o = Math.max(r.high, r.low);
|
|
e.fillText(i ? r.lowLabel : r.highLabel, r.time, n - this._data
|
|
.labelsPadding), e.fillText(i ? r.highLabel : r.lowLabel, r.time,
|
|
o + this._data.labelsPadding + this._data.fontSize)
|
|
}
|
|
e.restore()
|
|
}
|
|
}
|
|
var u = i("/hKg"),
|
|
d = i("Zy3/"),
|
|
p = i("vq8G"),
|
|
_ = i("u+0B"),
|
|
m = i("zDbI");
|
|
|
|
function f(e) {
|
|
return null != e
|
|
}
|
|
i.d(t, "SeriesHiLoPaneView", (function() {
|
|
return g
|
|
}));
|
|
class g extends n.SeriesBarCandlesPaneView {
|
|
constructor(e, t) {
|
|
super(e, t), this._widthsCache = new _.TextWidthCache, this._labelsRenderer =
|
|
new h, this._candlesRenderer = new u.PaneRendererCandles, this._canvas =
|
|
document.createElement("canvas"), this._context = Object(s.ensureNotNull)(
|
|
this._canvas.getContext("2d"));
|
|
const i = e.properties();
|
|
this._context.font = Object(r.makeFont)(i.hiloStyle.fontSize.value(), m
|
|
.CHART_FONT_FAMILY)
|
|
}
|
|
renderer(e, t, i) {
|
|
if (this._invalidated) {
|
|
const e = this._series().formatter(),
|
|
t = this._needLabels();
|
|
this._updateImpl(this._barUpdater.bind(this, e, t)), this._invalidated = !1
|
|
}
|
|
const s = this._series().properties().hiloStyle,
|
|
r = this._model().timeScale().barSpacing(),
|
|
n = this._needLabels() && this._bars().every(e => e.highLabelWidth <= r && e
|
|
.lowLabelWidth <= r),
|
|
o = {
|
|
bars: this._bars(),
|
|
wickVisible: !1,
|
|
bodyVisible: s.drawBody.value(),
|
|
barSpacing: r,
|
|
borderVisible: s.showBorders.value(),
|
|
barWidth: Object(a.optimalHiLoWidth)(r),
|
|
font: m.CHART_FONT_FAMILY,
|
|
fontSize: s.fontSize.value(),
|
|
labelColor: s.labelColor.value(),
|
|
inverted: this._series().priceScale().isInverted(),
|
|
labelsPadding: 3
|
|
},
|
|
l = new d.CompositeRenderer;
|
|
return this._candlesRenderer.setData(o), l.append(this._candlesRenderer), n && (
|
|
this._labelsRenderer.setData(o), l.append(this._labelsRenderer)), this
|
|
._model().selection().isSelected(this._series()) && this
|
|
._isMarkersEnabled && l.append(new p.SelectionRenderer(this
|
|
._selectionData)), l
|
|
}
|
|
topPixelMargin() {
|
|
return this._margin()
|
|
}
|
|
bottomPixelMargin() {
|
|
return this._margin()
|
|
}
|
|
_margin() {
|
|
const e = this._series().properties().hiloStyle;
|
|
return e.showLabels.value() ? e.fontSize.value() + 6 : 0
|
|
}
|
|
_barUpdater(e, t, i, s) {
|
|
const r = i[2],
|
|
n = i[3];
|
|
return !(!f(r) || !f(n)) && (s.high = s.open = r, s.low = s.close = n, t && (s
|
|
.highLabel = e.format(r),
|
|
s.highLabelWidth = this._getLabelWidth(s.highLabel), s.lowLabel = e
|
|
.format(n), s.lowLabelWidth = this._getLabelWidth(s.lowLabel)), !0)
|
|
}
|
|
_needLabels() {
|
|
const e = this._model().timeScale().barSpacing();
|
|
return this._series().properties().hiloStyle.showLabels.value() && e > 5
|
|
}
|
|
_getLabelWidth(e) {
|
|
return this._widthsCache.measureText(this._context, e)
|
|
}
|
|
}
|
|
},
|
|
"9QkW": function(e, t, i) {
|
|
"use strict";
|
|
var s = i("7ADh").LineToolFibWedgeBase,
|
|
r = i("5rJj"),
|
|
n = i("j3hX"),
|
|
o = n.LineToolWidthsProperty,
|
|
a = n.LineToolColorsProperty;
|
|
class l extends s {
|
|
constructor(e, t) {
|
|
super(e, t || l.createProperties()), i.e("lt-pane-views").then(i.t.bind(null,
|
|
"1SUO", 7)).then(({
|
|
FibWedgePaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
isSynchronizable() {
|
|
return !1
|
|
}
|
|
levelsCount() {
|
|
return l.LevelsCount
|
|
}
|
|
name() {
|
|
return "Fib Wedge"
|
|
}
|
|
processErase(e, t) {
|
|
var i = "level" + t,
|
|
s = this.properties()[i].visible;
|
|
e.setProperty(s, !1, "Erase level line")
|
|
}
|
|
static createProperties(e) {
|
|
var t = new r("linetoolfibwedge", e, !1, {
|
|
range: [1, 11]
|
|
});
|
|
return l._configureProperties(t), t
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "6mGk")))
|
|
.FibWedgeDefinitionsViewModel
|
|
}
|
|
static _configureProperties(e) {
|
|
s._configureProperties(e);
|
|
for (var t = [e.child("trendline").child("linewidth")], i = [e.child("trendline")
|
|
.child("color")
|
|
], r = 1; r <= l.LevelsCount; r++) t.push(e.child("level" + r).child(
|
|
"linewidth")), i.push(e.child("level" + r).child("color"));
|
|
e.addChild("linesColors", new a(i)), e.addChild("linesWidths", new o(t))
|
|
}
|
|
}
|
|
l.LevelsCount = 11, t.LineToolFibWedge = l
|
|
},
|
|
"9dnG": function(e, t) {
|
|
e.exports =
|
|
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 28 28" width="28" height="28"><path fill="currentColor" d="M13.39 3.84a1 1 0 0 1 1.22 0l8.19 6.37a1 1 0 0 1 0 1.58l-8.19 6.37a1 1 0 0 1-1.22 0L5.2 11.79a1 1 0 0 1 0-1.58l8.19-6.37zm.61.8L5.81 11 14 17.37 22.19 11 14 4.63zM5.3 13.6l8.7 6.76 8.7-6.76.6.78-8.69 6.77a1 1 0 0 1-1.22 0l-8.7-6.77.62-.78zm8.09 10.55l-8.7-6.77.62-.78L14 23.37l8.7-6.76.6.78-8.69 6.77a1 1 0 0 1-1.22 0z"/></svg>'
|
|
},
|
|
"9iCb": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "applyOverridesToStudy", (function() {
|
|
return h
|
|
})), i.d(t, "applyOverridesToStudyDefaults", (function() {
|
|
return u
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("23IT"),
|
|
n = i("txPx");
|
|
const o = Object(n.getLogger)("Chart.Model.StudyPropertiesOverrider");
|
|
var a, l;
|
|
|
|
function c(e, t, i, s) {
|
|
const r = i.split(".");
|
|
if (0 === r.length || 0 === r[0].length) return;
|
|
const n = function(e) {
|
|
const t = e.split(":");
|
|
return {
|
|
name: t[0],
|
|
type: 2 === t.length ? t[1] : null
|
|
}
|
|
}(r[0]),
|
|
c = n.name,
|
|
h = n.type,
|
|
u = null !== h,
|
|
d = !u || "band" === h,
|
|
p = !u || "area" === h,
|
|
_ = !u || "input" === h,
|
|
m = !u || "plot" === h ? l.getPlotIdByTitle(e, c) : null,
|
|
f = d ? l.getBandIndexByName(e, c) : null,
|
|
g = p ? l.getFilledAreaIdByTitle(e, c) : null,
|
|
b = _ ? l.getInputByName(e, c) : null,
|
|
v = t.hasOwnProperty(c);
|
|
if ((null !== m ? 1 : 0) + (null !== f ? 1 : 0) + (null !== g ? 1 : 0) + (null !== b ? 1 :
|
|
0) + (v ? 1 : 0) > 1) return void o.logWarn(
|
|
`Study '${e.description}' has ambiguous identifier '${c}'`);
|
|
const S = r[1];
|
|
if (null !== m) {
|
|
if (1 === r.length) return void o.logWarn(
|
|
`Path of sub-property of '${c}' plot for study '${e.description}' must be not empty`
|
|
);
|
|
const i = r.slice(1);
|
|
a.applyPlotProperty(e, t, m, i, s)
|
|
} else if (null !== b) a.applyInputValue(t, b, s);
|
|
else if (null !== f) {
|
|
if (void 0 === S) return void o.logWarn(
|
|
`Property name of '${c}' band for study '${e.description}' must be set`);
|
|
a.applyBandProperty(t, f, S, s)
|
|
} else if (null !== g) {
|
|
if (void 0 === S) return void o.logWarn(
|
|
`Property name of '${c}' area for study '${e.description}' must be set`);
|
|
a.applyFilledAreaProperty(t, g, S, s)
|
|
} else v ? a.setRootProperty(t, r, s) : o.logWarn(
|
|
`Study '${e.description}' has no plot or input '${c}'`)
|
|
}
|
|
|
|
function h(e, t) {
|
|
const i = e.properties(),
|
|
s = i.state();
|
|
for (const i in t) t.hasOwnProperty(i) && c(e.metaInfo(), s, i, t[i]);
|
|
i.mergeAndFire(s)
|
|
}
|
|
|
|
function u(e, t, i) {
|
|
for (const s in e) {
|
|
if (!e.hasOwnProperty(s)) continue;
|
|
const r = s.indexOf(".");
|
|
if (-1 === r) continue;
|
|
const n = s.substr(0, r),
|
|
a = l.getMetaInfoByDescription(t, n);
|
|
if (null === a) {
|
|
o.logWarn("There is no such study " + n);
|
|
continue
|
|
}
|
|
const h = i(a);
|
|
null !== h ? c(a, h, s.substr(r + 1), e[s]) : o.logWarn(
|
|
"Cannot apply overrides for study " + n)
|
|
}
|
|
}! function(e) {
|
|
const t = {
|
|
line: r.LineStudyPlotStyle.Line,
|
|
histogram: r.LineStudyPlotStyle.Histogram,
|
|
cross: r.LineStudyPlotStyle.Cross,
|
|
area: r.LineStudyPlotStyle.Area,
|
|
columns: r.LineStudyPlotStyle.Columns,
|
|
circles: r.LineStudyPlotStyle.Circles,
|
|
line_with_breaks: r.LineStudyPlotStyle.LineWithBreaks,
|
|
area_with_breaks: r.LineStudyPlotStyle.AreaWithBreaks
|
|
};
|
|
e.applyPlotProperty = function(e, i, n, a, l) {
|
|
if (void 0 === i.styles) return void o.logWarn("Study does not have styles");
|
|
const c = a[0];
|
|
if ("color" === c) {
|
|
return void
|
|
|
|
function(e, t, i, r, n) {
|
|
if (void 0 !== e.styles)
|
|
if (null === t && !isNaN(r) && r > 0) o.logWarn(
|
|
"Study plot does not have color #" + r);
|
|
else {
|
|
if (0 === r || isNaN(r)) {
|
|
Object(s.ensureDefined)(e.styles[i]).color = String(n), r = 0
|
|
}
|
|
null !== t && (Object(s.ensureDefined)(t.colors[r]).color = String(
|
|
n))
|
|
}
|
|
else o.logWarn("Study does not have styles")
|
|
}(i, function(e, t, i) {
|
|
if (void 0 === e.plots) return null;
|
|
for (const s of e.plots) {
|
|
if (!Object(r.isColorerPlot)(s) || void 0 === t.palettes) continue;
|
|
const e = t.palettes[s.palette];
|
|
if (s.target === i && void 0 !== e) return e
|
|
}
|
|
return null
|
|
}(e, i, n), n, a.length > 1 ? parseInt(a[1]) : NaN, l)
|
|
}
|
|
const h = i.styles[n];
|
|
if (void 0 !== h && h.hasOwnProperty(c)) {
|
|
if ("plottype" === c) {
|
|
const e = t[String(l)];
|
|
if (void 0 === e) return void o.logWarn("Unsupported plot type for plot: " +
|
|
l);
|
|
l = e
|
|
}
|
|
h[c] = l
|
|
} else o.logWarn(`Study plot does not have property '${c}'`)
|
|
}, e.applyBandProperty = function(e, i, s, r) {
|
|
if (void 0 === e.bands) return void o.logWarn("Study does not have bands");
|
|
const n = e.bands[i];
|
|
if (void 0 !== n && n.hasOwnProperty(s)) {
|
|
if ("plottype" === s) {
|
|
const e = t[String(r)];
|
|
if (void 0 === e) return void o.logWarn("Unsupported plot type for band: " +
|
|
r);
|
|
r = e
|
|
}
|
|
n[s] = r
|
|
} else o.logWarn(`Study band does not have property '${s}'`)
|
|
}, e.applyFilledAreaProperty = function(e, t, i, s) {
|
|
if (void 0 === e.filledAreasStyle) return void o.logWarn(
|
|
"Study does not have areas");
|
|
const r = e.filledAreasStyle[t];
|
|
void 0 !== r && r.hasOwnProperty(i) ? r[i] = s : o.logWarn(
|
|
`Study area does not have property '${i}'`)
|
|
}, e.applyInputValue = function(e, t, i) {
|
|
void 0 !== e.inputs && e.inputs.hasOwnProperty(t) ? e.inputs[t] = i : o.logWarn(
|
|
`Study does not have input '${t}'`)
|
|
}, e.setRootProperty = function(e, t, i) {
|
|
if (0 === t.length) return;
|
|
let s = e;
|
|
for (const e of t.slice(0, -1)) {
|
|
if (null == s || !s.hasOwnProperty(e)) break;
|
|
s = s[e]
|
|
}
|
|
const r = t[t.length - 1];
|
|
null != s && s.hasOwnProperty(r) ? s[r] = i : o.logWarn(
|
|
"Study does not have property " + t.join("."))
|
|
}
|
|
}(a || (a = {})),
|
|
function(e) {
|
|
e.getInputByName = function(e, t) {
|
|
if (void 0 === e.inputs) return null;
|
|
t = t.toLowerCase();
|
|
for (const i of e.inputs)
|
|
if (i.name.toLowerCase() === t) return i.id;
|
|
return null
|
|
}, e.getPlotIdByTitle = function(e, t) {
|
|
if (void 0 === e.styles) return null;
|
|
t = t.toLowerCase();
|
|
for (const i in e.styles) {
|
|
const s = e.styles[i];
|
|
if ((void 0 !== s && void 0 !== s.title ? s.title : i).toLowerCase() === t)
|
|
return i
|
|
}
|
|
return null
|
|
}, e.getFilledAreaIdByTitle = function(e, t) {
|
|
if (void 0 === e.filledAreas) return null;
|
|
t = t.toLowerCase();
|
|
for (const i of e.filledAreas)
|
|
if (i.title.toLowerCase() === t) return i.id;
|
|
return null
|
|
}, e.getBandIndexByName = function(e, t) {
|
|
if (void 0 === e.bands) return null;
|
|
t = t.toLowerCase();
|
|
for (let i = 0; i < e.bands.length; ++i)
|
|
if (e.bands[i].name.toLowerCase() === t) return i;
|
|
return null
|
|
}, e.getMetaInfoByDescription = function(e, t) {
|
|
t = t.toLowerCase();
|
|
for (const i of e)
|
|
if (i.description.toLowerCase() === t || i.shortDescription.toLowerCase() === t)
|
|
return i;
|
|
return null
|
|
}
|
|
}(l || (l = {}))
|
|
},
|
|
"9nLJ": function(e, t, i) {
|
|
"use strict";
|
|
(function(t, s) {
|
|
var r = i("PT1i").linking,
|
|
n = (i("jofe").createDeferredPromise, i("Q19o")),
|
|
o = i("VNzU").layouts,
|
|
a = i("FQhm"),
|
|
l = i("5VQP").ContextMenuManager,
|
|
c = i("mMWL"),
|
|
h = i("pPtI"),
|
|
u = i("zUrt").backend,
|
|
d = i("txPx"),
|
|
p = i("fZEr").showWarning,
|
|
_ = i("fZEr").showConfirm,
|
|
m = i("2jXJ"),
|
|
f = i("sJA2").ThemesApi,
|
|
g = i("ZjKI").CLOSE_POPUPS_AND_DIALOGS_COMMAND,
|
|
b = i("LxhU").Interval,
|
|
v = i("Ocx9").saveDefaultProperties,
|
|
S = i("htUT").ChartChangesWatcher,
|
|
y = i("xt3Q").TradingViewApiBase,
|
|
w = i("0YCj"),
|
|
P = i("pZDF").getStudyInputsInfo;
|
|
e.exports = class extends y {
|
|
constructor(e) {
|
|
const {
|
|
chartWidgetCollection: i,
|
|
chartApiInstance: s = null,
|
|
saveChartService: r,
|
|
loadChartService: n,
|
|
alertsDispatcher: o,
|
|
supportTicketData: a,
|
|
favoriteServices: l,
|
|
studyMarket: c = null,
|
|
financialsDialog: h = null
|
|
} = e;
|
|
super({
|
|
chartApiInstance: s,
|
|
chartWidgetCollection: i,
|
|
studyMarket: c,
|
|
financialsDialog: h,
|
|
saveChartService: r,
|
|
loadChartService: n
|
|
}), this._chartApiInstance = s, this._loadChartService = n, this
|
|
._alertsDispatcher = o, this._supportTicketData = a, this
|
|
._favoriteServices = l, this._proxyWatchListChangedDelegate = null,
|
|
this._lockDrawingsWatchedValue = null, this
|
|
._hideDrawingsWatchedValue = null, this
|
|
._hideIndicatorsWatchedValue = null, this
|
|
._magnetEnabledWatchedValue = null, this._magnetModeWatchedValue =
|
|
null, this._replayApi = null, this._chartChangesWatcher = null, this
|
|
._hasChartChangesWatchedValue = null, this._getDataSourceHub =
|
|
function() {
|
|
return i.activeChartWidget.value().model().model()
|
|
}, this._chartWidgetCollection.getResizerDetacher = function() {
|
|
return i.activeChartWidget.value().getResizerDetacher()
|
|
}, this._alertService = this._alertsDispatcher ? new(void 0)(this
|
|
._alertsDispatcher, this._getDataSourceHub) : null, this
|
|
._activeChangedChangedDelegate = new t, this._chartWidgetCollection
|
|
.activeChartWidget.subscribe(function() {
|
|
this._activeChangedChangedDelegate.fire()
|
|
}.bind(this)), this._chartWidgets = new WeakMap, this
|
|
._activateChart = function(e) {
|
|
i.activeChartWidget.setValue(e)
|
|
}
|
|
}
|
|
subscribe(e, t) {
|
|
a.subscribe(e, t)
|
|
}
|
|
unsubscribe(e, t) {
|
|
a.unsubscribe(e, t)
|
|
}
|
|
onContextMenu(e) {
|
|
a.subscribe("onContextMenu", (function(t) {
|
|
t.callback(e(t.unixtime, t.price))
|
|
}))
|
|
}
|
|
onGrayedObjectClicked(e) {
|
|
a.subscribe("onGrayedObjectClicked", e)
|
|
}
|
|
activeChart() {
|
|
return this._getChartWidgetApi(this._chartWidgetCollection
|
|
.activeChartWidget.value())
|
|
}
|
|
_getChartWidgetApi(e) {
|
|
var t = this._chartWidgets.get(e);
|
|
return void 0 === t && (t = new n(e, this._activateChart.bind(null, e)),
|
|
this._chartWidgets.set(e, t)), t
|
|
}
|
|
onActiveChartChanged() {
|
|
return this._activeChangedChangedDelegate
|
|
}
|
|
changeSymbol(e, t, i) {
|
|
r.interval.setValue(b.normalize(t)), r.symbol.setValue(e), i && this
|
|
.activeChart().onDataLoaded().subscribe(null, i, !0)
|
|
}
|
|
setLayout(e) {
|
|
this._chartWidgetCollection.setLayout(e)
|
|
}
|
|
layout() {
|
|
return this._chartWidgetCollection.layout.value()
|
|
}
|
|
layoutName() {
|
|
return this._chartWidgetCollection.metaInfo.name.value()
|
|
}
|
|
layoutNameWatchedValue() {
|
|
return this._chartWidgetCollection.metaInfo.name.readonly()
|
|
}
|
|
layoutSettingsDrawer() {
|
|
throw new Error("not implemented")
|
|
}
|
|
chartsCount() {
|
|
return o[this.layout()].count
|
|
}
|
|
viewMode() {
|
|
throw new Error("not implemented")
|
|
}
|
|
viewModeWatchedValue() {
|
|
throw new Error("not implemented")
|
|
}
|
|
setForceFullscreenMode() {
|
|
throw new Error("not implemented")
|
|
}
|
|
setMultichartMode() {
|
|
throw new Error("not implemented")
|
|
}
|
|
setActiveChart(e) {
|
|
throw new Error("not implemented")
|
|
}
|
|
chart(e) {
|
|
if (void 0 === e && (e = 0), e < 0 || e >= this.chartsCount())
|
|
throw Error("Incorrect index: " + e);
|
|
return this._getChartWidgetApi(this._chartWidgetCollection.getAll()[e])
|
|
}
|
|
getSymbolInterval(e) {
|
|
var t = {
|
|
symbol: r.symbol.value(),
|
|
interval: r.interval.value()
|
|
};
|
|
return e && e(t), t
|
|
}
|
|
saveChart(e) {
|
|
if (this._saveChartService) {
|
|
var t = this;
|
|
this._saveChartService.whenReadyToSave((function() {
|
|
var i = t._saveChartService.saveToJSON();
|
|
return e && e(JSON.parse(i.content))
|
|
}))
|
|
}
|
|
}
|
|
loadChart(e) {
|
|
this._chartApiInstance.disconnect(), this._chartWidgetCollection
|
|
.loadContent(e.json), this._chartWidgetCollection
|
|
.purgeUnusedWidgets(), e.extendedData && (this
|
|
._chartWidgetCollection.metaInfo.id.setValue(e.extendedData
|
|
.uid), this._chartWidgetCollection.metaInfo.uid.setValue(e
|
|
.extendedData.uid), this._chartWidgetCollection.metaInfo
|
|
.name.setValue(e.extendedData.name)), this._chartApiInstance
|
|
.connect(), r.symbol.setValue(this.activeChart().symbol()), a.emit(
|
|
"chart_loaded")
|
|
}
|
|
getStudiesList() {
|
|
return this._chartApiInstance.allStudiesMetadata().filter((function(e) {
|
|
return !e.is_hidden_study
|
|
})).map((function(e) {
|
|
return e.description
|
|
}))
|
|
}
|
|
getStudyInputs(e) {
|
|
{
|
|
const t = w.findStudyMetaInfoByDescription(this._chartApiInstance
|
|
.allStudiesMetadata(), e);
|
|
return P(t)
|
|
}
|
|
}
|
|
getSavedCharts(e) {
|
|
u.getCharts().then(e)
|
|
}
|
|
loadChartFromServer(e) {
|
|
u.loadChart(e)
|
|
}
|
|
saveChartToServer(e, t, i) {
|
|
this._saveChartService && this._saveChartService.saveChartSilently(e, t,
|
|
i)
|
|
}
|
|
setAutosave(e) {
|
|
this._saveChartService && this._saveChartService.autoSaveEnabled()
|
|
.setValue(e)
|
|
}
|
|
removeChartFromServer(e, t) {
|
|
u.removeChart(e).then(t)
|
|
}
|
|
getIntervals() {
|
|
var e = [],
|
|
t = h.getCustomResolutions();
|
|
return null !== this._chartApiInstance && (e = this._chartApiInstance
|
|
.defaultResolutions()), h.mergeResolutions(e, t)
|
|
}
|
|
closePopupsAndDialogs() {
|
|
for (var e = document.querySelectorAll("._tv-dialog-title-close"), t =
|
|
0; t < e.length; t++) e[t].click();
|
|
l.hideAll(), a.emit(g)
|
|
}
|
|
selectLineTool(e) {
|
|
m.supportedLineTools[e] && (e = m.supportedLineTools[e].name, c.tool
|
|
.value() !== e && c.tool.setValue(e))
|
|
}
|
|
selectedLineTool() {
|
|
for (var e = Object.keys(m.supportedLineTools), t = c.tool.value(), i =
|
|
0; i < e.length; ++i)
|
|
if (m.supportedLineTools[e[i]].name === t) return e[i];
|
|
return ""
|
|
}
|
|
lockAllDrawingTools() {
|
|
return null === this._lockDrawingsWatchedValue && (this
|
|
._lockDrawingsWatchedValue = new s(c.lockDrawings().value()),
|
|
this._lockDrawingsWatchedValue.subscribe((function(e) {
|
|
c.lockDrawings().setValue(e)
|
|
})), c.lockDrawings().subscribe(this, (function() {
|
|
this._lockDrawingsWatchedValue.setValue(c
|
|
.lockDrawings().value())
|
|
}))), this._lockDrawingsWatchedValue
|
|
}
|
|
hideAllDrawingTools() {
|
|
return null === this._hideDrawingsWatchedValue && (this
|
|
._hideDrawingsWatchedValue = new s(c.hideAllDrawings().value()),
|
|
this._hideDrawingsWatchedValue.subscribe((function(e) {
|
|
c.hideAllDrawings().setValue(e)
|
|
})), c.hideAllDrawings().subscribe(this, (function() {
|
|
this._hideDrawingsWatchedValue.setValue(c
|
|
.hideAllDrawings().value())
|
|
}))), this._hideDrawingsWatchedValue
|
|
}
|
|
hideAllIndicators() {
|
|
return null === this._hideIndicatorsWatchedValue && (this
|
|
._hideIndicatorsWatchedValue = new s(c.hideAllIndicators()
|
|
.value()), this._hideIndicatorsWatchedValue.subscribe((
|
|
function(e) {
|
|
c.hideAllIndicators().setValue(e)
|
|
})), c.hideAllIndicators().subscribe(this, (function() {
|
|
this._hideIndicatorsWatchedValue.setValue(c
|
|
.hideAllIndicators().value())
|
|
}))), this._hideIndicatorsWatchedValue
|
|
}
|
|
magnetEnabled() {
|
|
return null === this._magnetEnabledWatchedValue && (this
|
|
._magnetEnabledWatchedValue = new s(c.properties().magnet
|
|
.value()), this._magnetEnabledWatchedValue.subscribe((
|
|
function(
|
|
e) {
|
|
v(!0), c.properties().magnet.setValue(e), v(!1)
|
|
})), c.properties().magnet.subscribe(this, (function() {
|
|
this._magnetEnabledWatchedValue.setValue(c
|
|
.properties().magnet.value())
|
|
}))), this._magnetEnabledWatchedValue
|
|
}
|
|
magnetMode() {
|
|
return null === this._magnetModeWatchedValue && (this
|
|
._magnetModeWatchedValue = new s(c.properties().magnetMode
|
|
.value()), this._magnetModeWatchedValue.subscribe((function(
|
|
e) {
|
|
v(!0), c.properties().magnetMode.setValue(e), v(!1)
|
|
})), c.properties().magnetMode.subscribe(this, (function() {
|
|
this._magnetModeWatchedValue.setValue(c.properties()
|
|
.magnetMode.value())
|
|
}))), this._magnetModeWatchedValue
|
|
}
|
|
mainSeriesPriceFormatter() {
|
|
return this._chartWidgetCollection.activeChartWidget.value().model()
|
|
.mainSeries().priceScale().formatter()
|
|
}
|
|
showNoticeDialog(e) {
|
|
p({
|
|
title: (e = e || {}).title,
|
|
text: e.body || "",
|
|
onClose: e.callback
|
|
})
|
|
}
|
|
showConfirmDialog(e) {
|
|
if (!(e = e || {}).callback) throw Error("callback must be exist");
|
|
var t = e.callback;
|
|
|
|
function i(e) {
|
|
t && (t(e), t = null)
|
|
}
|
|
_({
|
|
title: e.title,
|
|
text: e.body || "",
|
|
onClose: function() {
|
|
i(!1)
|
|
},
|
|
onConfirm: function(e) {
|
|
i(!0), e.dialogClose()
|
|
}
|
|
})
|
|
}
|
|
logs() {
|
|
return {
|
|
getLogHistory: d.getLogHistory,
|
|
enable: d.loggingOn,
|
|
disable: d.loggingOff
|
|
}
|
|
}
|
|
watchlist() {
|
|
throw new Error("not implemented")
|
|
}
|
|
setWatchlistApiPromise(e) {
|
|
throw new Error("not implemented")
|
|
}
|
|
news() {
|
|
throw new Error("not implemented")
|
|
}
|
|
setNewsApiPromise(e) {
|
|
throw new Error("not implemented")
|
|
}
|
|
showLoadChartDialog() {
|
|
var e = this._loadChartService;
|
|
e && e.showLoadDialog()
|
|
}
|
|
showSaveAsChartDialog() {
|
|
var e = this._saveChartService;
|
|
e && window.runOrSignIn((function() {
|
|
e.saveChartAs()
|
|
}), {
|
|
source: "Save as chart dialogue"
|
|
})
|
|
}
|
|
drawOnAllCharts(e) {
|
|
return c.drawOnAllCharts().setValue(e)
|
|
}
|
|
themes() {
|
|
return new f({
|
|
chartWidgetCollection: this._chartWidgetCollection
|
|
})
|
|
}
|
|
undoRedoState() {
|
|
return this._chartWidgetCollection.undoHistory.state()
|
|
}
|
|
clearUndoHistory() {
|
|
return this._chartWidgetCollection.undoHistory.clearStack()
|
|
}
|
|
undo() {
|
|
return this._chartWidgetCollection.undoHistory.undo()
|
|
}
|
|
redo() {
|
|
return this._chartWidgetCollection.undoHistory.redo()
|
|
}
|
|
trading() {
|
|
throw new Error("Not implemented")
|
|
}
|
|
waitTrading() {
|
|
throw new Error("Not implemented")
|
|
}
|
|
symbolSearch() {
|
|
throw new Error("Not implemented")
|
|
}
|
|
saveChartOrShowTitleDialog(e, t, i) {
|
|
throw new Error("Not implemented")
|
|
}
|
|
showRenameChartDialog() {
|
|
throw new Error("Not implemented")
|
|
}
|
|
setUserInfo(e) {
|
|
throw new Error("Not implemented")
|
|
}
|
|
connect() {
|
|
throw new Error("Not implemented")
|
|
}
|
|
disconnect() {
|
|
throw new Error("Not implemented")
|
|
}
|
|
loginRequired() {
|
|
throw new Error("Not implemented")
|
|
}
|
|
onConnectionStatusChanged(e) {
|
|
throw new Error("Not implemented")
|
|
}
|
|
isConnected() {
|
|
throw new Error("Not implemented")
|
|
}
|
|
showCreateAlertDialog() {
|
|
throw new Error("Not implemented")
|
|
}
|
|
alertService() {
|
|
throw new Error("Not implemented")
|
|
}
|
|
publishChart(e) {
|
|
throw new Error("Not implemented")
|
|
}
|
|
setPublishChartOptions(e) {
|
|
throw new Error("Not implemented")
|
|
}
|
|
showSupportDialog() {
|
|
throw new Error("Not implemented")
|
|
}
|
|
openMobileChartPicker() {
|
|
throw new Error("Not implemented")
|
|
}
|
|
closeMobileChartPicker() {
|
|
throw new Error("Not implemented")
|
|
}
|
|
replayApi() {
|
|
throw new Error("Not implemented")
|
|
}
|
|
takeScreenshot() {
|
|
return this._chartWidgetCollection.takeScreenshot()
|
|
}
|
|
setSymbolSearchUI(e) {
|
|
throw new Error("Not implemented")
|
|
}
|
|
setIntervalLinkingEnabled(e) {
|
|
this._chartWidgetCollection.lock.interval.setValue(e)
|
|
}
|
|
setTimeFrame(e) {
|
|
this._chartWidgetCollection.setTimeFrame(e)
|
|
}
|
|
symbolSync() {
|
|
return this._chartWidgetCollection.lock.symbol
|
|
}
|
|
intervalSync() {
|
|
return this._chartWidgetCollection.lock.interval
|
|
}
|
|
crosshairSync() {
|
|
return this._chartWidgetCollection.lock.crosshair
|
|
}
|
|
timeSync() {
|
|
return this._chartWidgetCollection.lock.trackTime
|
|
}
|
|
startFullscreen() {
|
|
return this._chartWidgetCollection.startFullscreen()
|
|
}
|
|
exitFullscreen() {
|
|
return this._chartWidgetCollection.exitFullscreen()
|
|
}
|
|
takeClientScreenshot(e) {
|
|
return this._chartWidgetCollection.clientSnapshot(e)
|
|
}
|
|
getFavoriteIntervalsService() {
|
|
throw new Error("not implemented")
|
|
}
|
|
getFavoriteChartStylesService() {
|
|
throw new Error("not implemented")
|
|
}
|
|
getLinetoolsFavoritesStore() {
|
|
throw new Error("not implemented")
|
|
}
|
|
supportTicketData() {
|
|
return this._supportTicketData
|
|
}
|
|
hasChartChanges() {
|
|
return null === this._chartChangesWatcher && null === this
|
|
._hasChartChangesWatchedValue && (this._chartChangesWatcher = new S(
|
|
this._chartWidgetCollection.undoHistory, window.saver, a),
|
|
this._hasChartChangesWatchedValue = new s(this
|
|
._chartChangesWatcher.hasChanges()), this
|
|
._chartChangesWatcher.getOnChange().subscribe(this, (
|
|
function() {
|
|
this._hasChartChangesWatchedValue.setValue(this
|
|
._chartChangesWatcher.hasChanges())
|
|
}))), this._hasChartChangesWatchedValue
|
|
}
|
|
}
|
|
}).call(this, i("aIyQ"), i("hY0g"))
|
|
},
|
|
"9uLv": function(e, t, i) {
|
|
"use strict";
|
|
var s = i("K9GE");
|
|
i.d(t, "a", (function() {
|
|
return s.a
|
|
})), i.d(t, "b", (function() {
|
|
return s.b
|
|
})), i.d(t, "c", (function() {
|
|
return s.c
|
|
}))
|
|
},
|
|
"9zVu": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "DrawingToolbarBootloader", (function() {
|
|
return a
|
|
}));
|
|
var s = i("OiSa"),
|
|
r = i("7RN7"),
|
|
n = i("cZRT"),
|
|
o = i("YuHv");
|
|
class a extends n.a {
|
|
constructor(e) {
|
|
super(), this._opts = e, s.isDrawingToolbarVisible.value() && (this._opts
|
|
.resizerBridge.negotiateWidth(r.b), this._opts.resizerBridge.container
|
|
.value().appendChild(Object(o.a)()))
|
|
}
|
|
_startLoading() {
|
|
return Promise.all([i.e("react"), i.e(1), i.e(4), i.e(6), i.e(11), i.e(12), i.e(
|
|
24), i.e(29), i.e(67), i.e(70), i.e(77), i.e(0), i.e(5), i.e(7),
|
|
i.e(10), i.e("line-tools-icons"), i.e(53), i.e(57), i.e(
|
|
"drawing-toolbar")
|
|
]).then(i.bind(null, "5f7t")).then(e => new e.DrawingToolbarRenderer(this
|
|
._opts.resizerBridge.container.value(), {
|
|
...this._opts
|
|
}))
|
|
}
|
|
}
|
|
},
|
|
AE9l: function(e, t, i) {},
|
|
"AWC/": function(e, t, i) {
|
|
e.exports = {
|
|
container: "container-e6Js9pSl",
|
|
inner: "inner-e6Js9pSl",
|
|
"border-left": "border-left-e6Js9pSl",
|
|
"border-right": "border-right-e6Js9pSl",
|
|
"border-top": "border-top-e6Js9pSl",
|
|
"border-bottom": "border-bottom-e6Js9pSl",
|
|
"top-right-radius": "top-right-radius-e6Js9pSl",
|
|
"top-left-radius": "top-left-radius-e6Js9pSl",
|
|
"bottom-right-radius": "bottom-right-radius-e6Js9pSl",
|
|
"bottom-left-radius": "bottom-left-radius-e6Js9pSl"
|
|
}
|
|
},
|
|
"Aba+": function(e, t, i) {},
|
|
ApcL: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("ogJP"),
|
|
r = i("vTIA");
|
|
var n = i("txPx"),
|
|
o = i("oXaB"),
|
|
a = i("wZIs"),
|
|
l = i("sDZI"),
|
|
c = i("FIi8"),
|
|
h = i("4vW/");
|
|
i.d(t, "gridPreferencesDefault", (function() {
|
|
return d
|
|
})), i.d(t, "crossHairPreferencesDefault", (function() {
|
|
return p
|
|
})), i.d(t, "legendPreferencesDefault", (function() {
|
|
return _
|
|
})), i.d(t, "priceScalePreferencesDefault", (function() {
|
|
return m
|
|
})), i.d(t, "panePreferencesDefault", (function() {
|
|
return f
|
|
})), i.d(t, "scalesPreferencesBaseDefault", (function() {
|
|
return g
|
|
})), i.d(t, "scalesPreferencesToApplyDefault", (function() {
|
|
return b
|
|
})), i.d(t, "chartEventsSourceBreaksPreferencesDefault", (function() {
|
|
return v
|
|
})), i.d(t, "chartEventsSourcePreferencesDefault", (function() {
|
|
return S
|
|
})), i.d(t, "timeScalePreferencesDefault", (function() {
|
|
return y
|
|
})), i.d(t, "statusViewPreferencesDefault", (function() {
|
|
return w
|
|
})), i.d(t, "highLowAvgPreferencesDefault", (function() {
|
|
return P
|
|
})), i.d(t, "mainSeriesPreferencesDefault", (function() {
|
|
return C
|
|
})), i.d(t, "chartPreferencesBaseDefault", (function() {
|
|
return x
|
|
})), i.d(t, "chartPreferencesToApplyDefault", (function() {
|
|
return T
|
|
})), i.d(t, "chartPreferencesToRestoreDefault", (function() {
|
|
return I
|
|
})), i.d(t, "createPreferencesObject", (function() {
|
|
return M
|
|
})), i.d(t, "preferencesByWhiteList", (function() {
|
|
return O
|
|
})), i.d(t, "defaultsPreferencesByWhiteList", (function() {
|
|
return L
|
|
}));
|
|
const u = Object(n.getLogger)("Chart.ApplyPreferencesToAllCharts"),
|
|
d = {
|
|
color: "",
|
|
style: 0
|
|
},
|
|
p = {
|
|
color: "",
|
|
style: 0,
|
|
transparency: 0,
|
|
width: 0
|
|
},
|
|
_ = {
|
|
showStudyArguments: !1,
|
|
showStudyTitles: !1,
|
|
showStudyValues: !1,
|
|
showSeriesTitle: !1,
|
|
showSeriesOHLC: !1,
|
|
showLegend: !1,
|
|
showBarChange: !0,
|
|
showBackground: !0,
|
|
backgroundTransparency: 0,
|
|
wrapText: !1
|
|
},
|
|
m = {
|
|
autoScale: !1,
|
|
autoScaleDisabled: !1,
|
|
lockScale: !1,
|
|
percentage: !1,
|
|
percentageDisabled: !1,
|
|
log: !1,
|
|
logDisabled: !1,
|
|
alignLabels: !1,
|
|
isInverted: !1,
|
|
indexedTo100: !1
|
|
},
|
|
f = {
|
|
backgroundType: h.ColorType.Solid,
|
|
background: "",
|
|
backgroundGradientStartColor: "",
|
|
backgroundGradientEndColor: "",
|
|
topMargin: 0,
|
|
bottomMargin: 0,
|
|
rightOffset: 0,
|
|
horzGridProperties: Object(c.deepExtend)({}, d),
|
|
vertGridProperties: Object(c.deepExtend)({}, d),
|
|
crossHairProperties: Object(c.deepExtend)({}, p),
|
|
legendProperties: Object(c.deepExtend)({}, _),
|
|
axisProperties: Object(c.deepExtend)({}, m)
|
|
},
|
|
g = {
|
|
lineColor: "",
|
|
textColor: "",
|
|
fontSize: 0,
|
|
scaleSeriesOnly: !1,
|
|
showSeriesLastValue: !1,
|
|
seriesLastValueMode: o.PriceAxisLastValueMode.LastValueAccordingToScale,
|
|
showSeriesPrevCloseValue: !1,
|
|
showStudyLastValue: !1,
|
|
showSymbolLabels: !1,
|
|
showStudyPlotLabels: !1,
|
|
showBidAskLabels: !1,
|
|
showPrePostMarketPriceLabel: !0,
|
|
showFundamentalLastValue: !1,
|
|
showFundamentalNameLabel: !1,
|
|
showCurrency: !0,
|
|
showUnit: !0
|
|
},
|
|
b = {
|
|
...g
|
|
},
|
|
v = {
|
|
color: "",
|
|
visible: !1,
|
|
style: 0,
|
|
width: 0
|
|
},
|
|
S = {
|
|
visible: !1,
|
|
futureOnly: !1,
|
|
breaks: Object(c.deepExtend)({}, v)
|
|
},
|
|
y = {
|
|
defaultRightOffset: 0
|
|
},
|
|
w = {
|
|
fontSize: 16,
|
|
showExchange: !0,
|
|
showInterval: !0,
|
|
symbolTextSource: "description"
|
|
},
|
|
P = {
|
|
highLowPriceLinesVisible: !1,
|
|
highLowPriceLabelsVisible: !1,
|
|
averageClosePriceLineVisible: !1,
|
|
averageClosePriceLabelVisible: !1
|
|
},
|
|
C = {
|
|
style: 0,
|
|
minTick: 0,
|
|
showPriceLine: !1,
|
|
priceLineWidth: 0,
|
|
priceLineColor: "",
|
|
showPrevClosePriceLine: !1,
|
|
showCountdown: !0,
|
|
prevClosePriceLineWidth: 0,
|
|
sessionId: "regular",
|
|
prevClosePriceLineColor: "",
|
|
esdShowDividends: !1,
|
|
esdShowSplits: !1,
|
|
esdShowEarnings: !1,
|
|
esdShowBreaks: !1,
|
|
dividendsAdjustment: !1,
|
|
statusViewStyle: Object(c.deepExtend)({}, w),
|
|
priceAxisProperties: Object(c.deepExtend)({}, m),
|
|
highLowAvgPrice: Object(c.deepExtend)({}, P),
|
|
candleStyle: Object(c.deepExtend)({}, {
|
|
upColor: "",
|
|
downColor: "",
|
|
drawWick: !1,
|
|
drawBorder: !1,
|
|
drawBody: !0,
|
|
borderColor: "",
|
|
borderUpColor: "",
|
|
borderDownColor: "",
|
|
wickColor: "",
|
|
wickUpColor: "",
|
|
wickDownColor: "",
|
|
barColorsOnPrevClose: !1
|
|
}),
|
|
hollowCandleStyle: Object(c.deepExtend)({}, {
|
|
upColor: "",
|
|
downColor: "",
|
|
drawWick: !1,
|
|
drawBorder: !1,
|
|
drawBody: !0,
|
|
borderColor: "",
|
|
borderUpColor: "",
|
|
borderDownColor: "",
|
|
wickColor: "",
|
|
wickUpColor: "",
|
|
wickDownColor: ""
|
|
}),
|
|
barStyle: Object(c.deepExtend)({}, {
|
|
upColor: "",
|
|
downColor: "",
|
|
barColorsOnPrevClose: !1,
|
|
dontDrawOpen: !1,
|
|
thinBars: !0
|
|
}),
|
|
lineStyle: Object(c.deepExtend)({}, {
|
|
color: "",
|
|
linestyle: 0,
|
|
linewidth: 0,
|
|
styleType: 0
|
|
}),
|
|
areaStyle: Object(c.deepExtend)({}, {
|
|
color1: "",
|
|
color2: "",
|
|
linecolor: "",
|
|
linestyle: 0,
|
|
linewidth: 0,
|
|
transparency: 0
|
|
}),
|
|
baselineStyle: Object(c.deepExtend)({}, {
|
|
topFillColor1: "",
|
|
topFillColor2: "",
|
|
bottomFillColor1: "",
|
|
bottomFillColor2: "",
|
|
topLineColor: "",
|
|
bottomLineColor: "",
|
|
topLineWidth: 0,
|
|
bottomLineWidth: 0,
|
|
transparency: 0,
|
|
baseLevelPercentage: 0
|
|
}),
|
|
hiloStyle: Object(c.deepExtend)({}, {
|
|
color: "",
|
|
showBorders: !1,
|
|
borderColor: "",
|
|
showLabels: !1,
|
|
labelColor: "",
|
|
fontSize: 0,
|
|
drawBody: !0
|
|
}),
|
|
haStyle: Object(c.deepExtend)({}, {
|
|
upColor: "",
|
|
downColor: "",
|
|
drawWick: !1,
|
|
drawBorder: !1,
|
|
drawBody: !0,
|
|
borderColor: "",
|
|
borderUpColor: "",
|
|
borderDownColor: "",
|
|
wickColor: "",
|
|
wickUpColor: "",
|
|
wickDownColor: "",
|
|
showRealLastPrice: !1,
|
|
barColorsOnPrevClose: !1,
|
|
inputs: {}
|
|
}),
|
|
renkoStyle: Object(c.deepExtend)({}, {
|
|
upColor: "",
|
|
downColor: "",
|
|
borderUpColor: "",
|
|
borderDownColor: "",
|
|
upColorProjection: "",
|
|
downColorProjection: "",
|
|
borderUpColorProjection: "",
|
|
borderDownColorProjection: "",
|
|
wickUpColor: "",
|
|
wickDownColor: "",
|
|
inputs: {
|
|
boxSize: 0,
|
|
style: "",
|
|
atrLength: 0,
|
|
wicks: !1,
|
|
sources: "",
|
|
source: ""
|
|
}
|
|
}),
|
|
pbStyle: Object(c.deepExtend)({}, {
|
|
upColor: "",
|
|
downColor: "",
|
|
borderUpColor: "",
|
|
borderDownColor: "",
|
|
upColorProjection: "",
|
|
downColorProjection: "",
|
|
borderUpColorProjection: "",
|
|
borderDownColorProjection: "",
|
|
inputs: {
|
|
source: "",
|
|
lb: 0
|
|
}
|
|
}),
|
|
kagiStyle: Object(c.deepExtend)({}, {
|
|
upColor: "",
|
|
downColor: "",
|
|
upColorProjection: "",
|
|
downColorProjection: "",
|
|
inputs: {
|
|
style: "",
|
|
atrLength: 0,
|
|
reversalAmount: 0
|
|
}
|
|
}),
|
|
pnfStyle: Object(c.deepExtend)({}, {
|
|
upColor: "",
|
|
downColor: "",
|
|
upColorProjection: "",
|
|
downColorProjection: "",
|
|
inputs: {
|
|
reversalAmount: 0,
|
|
boxSize: 0,
|
|
style: "",
|
|
atrLength: 0
|
|
}
|
|
}),
|
|
rangeStyle: Object(c.deepExtend)({}, {
|
|
upColor: "",
|
|
downColor: "",
|
|
upColorProjection: "",
|
|
downColorProjection: "",
|
|
thinBars: !1,
|
|
inputs: {
|
|
range: 0,
|
|
phantomBars: !1
|
|
}
|
|
})
|
|
},
|
|
x = {
|
|
priceScaleSelectionStrategyName: "auto",
|
|
timeScale: Object(c.deepExtend)({}, y),
|
|
mainSeries: Object(c.deepExtend)({}, C),
|
|
sessions: Object(c.deepExtend)({}, l.sessionsPreferencesDefault),
|
|
paneProperties: Object(c.deepExtend)({}, f),
|
|
chartEventsSourceProperties: Object(c.deepExtend)({}, S),
|
|
tradingProperties: Object(c.deepExtend)({}, r.tradingPreferencesDefault)
|
|
},
|
|
T = {
|
|
timezone: "",
|
|
scalesProperties: Object(c.deepExtend)({}, b),
|
|
...x
|
|
},
|
|
I = {
|
|
scalesProperties: Object(c.deepExtend)({}, g),
|
|
...x
|
|
};
|
|
|
|
function M(e, t, i, r, n = !0) {
|
|
if (void 0 === t[e]) return u.logDebug(
|
|
`We haven't had this property ${r}.${e} yet, please, remove it from whiteList`),
|
|
null;
|
|
if (Object(s.isObject)(i[e])) {
|
|
const s = Object.keys(i[e]);
|
|
let o = "";
|
|
return s.map(s => ({
|
|
[s]: M(s, t[e], i[e], `${r}.${e}`, n)
|
|
})).reduce((e, t) => (o = Object.keys(t)[0], e[o] = t[o], e), {})
|
|
}
|
|
return n ? t[e].value() : t[e]
|
|
}
|
|
|
|
function O(e, t, i = T) {
|
|
const s = {
|
|
timezone: "",
|
|
priceScaleSelectionStrategyName: "auto",
|
|
timeScale: {
|
|
defaultRightOffset: e.timeScale().defaultRightOffsetProperty().value()
|
|
},
|
|
mainSeries: {},
|
|
sessions: {},
|
|
paneProperties: {},
|
|
scalesProperties: {},
|
|
chartEventsSourceProperties: {},
|
|
tradingProperties: {}
|
|
},
|
|
r = ["timeScale", "mainSeries", "sessions"],
|
|
n = i.mainSeries,
|
|
o = Object.keys(i),
|
|
a = Object.keys(n),
|
|
l = t.properties(),
|
|
c = e.properties(),
|
|
h = i.sessions,
|
|
u = Object.keys(h),
|
|
d = e.sessions().properties();
|
|
return a.forEach(e => {
|
|
s.mainSeries[e] = M(e, l, n, "mainSeries")
|
|
}), u.forEach(e => {
|
|
s.sessions[e] = M(e, d, h, "sessions")
|
|
}), o.forEach(e => {
|
|
r.includes(e) || (s[e] = M(e, c, i, "preferences"))
|
|
}), s
|
|
}
|
|
|
|
function L(e, t, i = I) {
|
|
const s = {
|
|
timeScale: {
|
|
defaultRightOffset: e.timeScale().rightOffsetDefaultValue()
|
|
},
|
|
mainSeries: {},
|
|
sessions: Object(c.deepExtend)({}, l.sessionsPreferencesDefault),
|
|
paneProperties: {},
|
|
scalesProperties: {},
|
|
chartEventsSourceProperties: {},
|
|
tradingProperties: {},
|
|
priceScaleSelectionStrategyName: "auto"
|
|
},
|
|
r = ["timeScale", "mainSeries", "sessions"],
|
|
n = i.mainSeries,
|
|
o = Object.keys(i),
|
|
h = Object.keys(n),
|
|
u = Object(a.factoryDefaults)("chartproperties.mainSeriesProperties"),
|
|
d = Object(a.factoryDefaults)("chartproperties");
|
|
return h.forEach(e => {
|
|
s.mainSeries[e] = M(e, u, n, "mainSeries", !1)
|
|
}), o.forEach(e => {
|
|
r.includes(e) || (s[e] = M(e, d, i, "preferences", !1))
|
|
}), s
|
|
}
|
|
},
|
|
Az04: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("aO4+").Point,
|
|
r = i("GEp6").distanceToLine,
|
|
n = i("Ss5c").LineDataSource,
|
|
o = i("Ocx9").DefaultProperty,
|
|
a = i("j3hX").LineToolColorsProperty;
|
|
class l extends n {
|
|
constructor(e, t) {
|
|
super(e, t || l.createProperties()), i.e("lt-pane-views").then(i.t.bind(null,
|
|
"lZ9F", 7)).then(({
|
|
RotatedRectanglePaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
startChanging(e, t) {
|
|
if (super.startChanging(e, t), 0 === e || 1 === e) {
|
|
var i = this._getPaneViews()[0],
|
|
s = i._points[0],
|
|
n = i._points[1],
|
|
o = i._points[2];
|
|
this._distance = r(s, n, o).distance
|
|
}
|
|
}
|
|
setPoint(e, t, i) {
|
|
if (super.setPoint(e, t, i), 0 === e || 1 === e) {
|
|
var r = this._getPaneViews()[0];
|
|
r.update();
|
|
var n = r._points[0],
|
|
o = r._points[1].subtract(n),
|
|
a = new s(o.y, -o.x).normalized().scaled(this._distance),
|
|
l = n.add(a),
|
|
c = this.screenPointToPoint(l);
|
|
this._points[2] = c
|
|
}
|
|
}
|
|
endChanging(e, t) {
|
|
delete this._distance, super.endChanging(e, t)
|
|
}
|
|
pointsCount() {
|
|
return 3
|
|
}
|
|
name() {
|
|
return "Rotated Rectangle"
|
|
}
|
|
hasEditableCoordinates() {
|
|
return !1
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "Zd1D")))
|
|
.GeneralFiguresDefinitionsViewModel
|
|
}
|
|
_snapTo45DegreesAvailable() {
|
|
return !0
|
|
}
|
|
static createProperties(e) {
|
|
var t = new o("linetoolrotatedrectangle", e);
|
|
return l._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
n._configureProperties(e), e.addChild("linesColors", new a([e.color]))
|
|
}
|
|
}
|
|
t.LineToolRotatedRectangle = l
|
|
},
|
|
"B4/o": function(e, t, i) {
|
|
"use strict";
|
|
(function(e) {
|
|
var s = i("QIuV").LineToolTrading,
|
|
r = i("4TVt").LineToolPriceAxisView,
|
|
n = i("jkoZ"),
|
|
o = i("Ss5c").LineDataSource,
|
|
a = i("Ocx9").DefaultProperty,
|
|
l = i("s1Gx").sortSourcesPreOrdered.LineToolOrder;
|
|
|
|
function c(e) {
|
|
return null == e ? e = "" : e += "", e
|
|
}
|
|
class h {
|
|
constructor(e) {
|
|
this._line = e, this._data = {
|
|
bodyText: "order",
|
|
quantityText: "0"
|
|
}, this._editable = !0, this._cancellable = !0, this._mode = "", this
|
|
._direction = "buy", this._active = !0
|
|
}
|
|
setMode(e) {
|
|
return this._mode = e, this._line.updateAllViewsAndRedraw(), this
|
|
}
|
|
setDirection(e) {
|
|
return this._direction = e, this._line.updateAllViewsAndRedraw(), this
|
|
}
|
|
setActive(e) {
|
|
return this._active = e, this._line.updateAllViewsAndRedraw(), this
|
|
}
|
|
setEditable(e) {
|
|
return this._editable = e, this._line.updateAllViewsAndRedraw(), this
|
|
}
|
|
getEditable() {
|
|
return this._editable
|
|
}
|
|
setCancellable(e) {
|
|
return this._cancellable = e, this._line.updateAllViewsAndRedraw(), this
|
|
}
|
|
getCancellable() {
|
|
return this._cancellable
|
|
}
|
|
hasMoveCallback() {
|
|
return this.isFunction(this._onMoveCallback)
|
|
}
|
|
hasModifyCallback() {
|
|
return this.isFunction(this._onModifyCallback)
|
|
}
|
|
getPrice() {
|
|
return this._line.points().length > 0 ? this._line.points()[0].price : this
|
|
._line._timePoint.length > 0 ? this._line._timePoint[0].price : void 0
|
|
}
|
|
setPrice(e) {
|
|
if (this._line.points().length > 0) {
|
|
var t = this._line.points()[0];
|
|
t.price = e, this._line._points[0] = t, this._line.normalizePoints(),
|
|
this._line.updateAllViewsAndRedraw()
|
|
}
|
|
return this._line._timePoint.length > 0 && (this._line._timePoint[0].price =
|
|
e), this
|
|
}
|
|
getText() {
|
|
return this._data.bodyText
|
|
}
|
|
setText(e) {
|
|
return this._data.bodyText = e || "", this._line.updateAllViewsAndRedraw(),
|
|
this
|
|
}
|
|
setTooltip(e) {
|
|
return this._line.properties().tooltip.setValue(c(e)), this
|
|
}
|
|
getTooltip() {
|
|
return this._line.properties().tooltip.value()
|
|
}
|
|
setModifyTooltip(e) {
|
|
return this._line.properties().modifyTooltip.setValue(c(e)), this
|
|
}
|
|
getModifyTooltip() {
|
|
return this._line.properties().modifyTooltip.value()
|
|
}
|
|
setCancelTooltip(e) {
|
|
return this._line.properties().cancelTooltip.setValue(c(e)), this
|
|
}
|
|
getCancelTooltip() {
|
|
return this._line.properties().cancelTooltip.value()
|
|
}
|
|
getQuantity() {
|
|
return this._data.quantityText
|
|
}
|
|
setQuantity(e) {
|
|
return this._data.quantityText = e || "", this._line
|
|
.updateAllViewsAndRedraw(), this
|
|
}
|
|
getExtendLeft() {
|
|
var e = this._line.properties().extendLeft.value();
|
|
return "inherit" === e ? this._line._model.properties().tradingProperties
|
|
.extendLeft.value() : e
|
|
}
|
|
setExtendLeft(e) {
|
|
return this._line.properties().extendLeft.setValue(e), this
|
|
}
|
|
getLineLength() {
|
|
var e = this._line.properties().lineLength.value();
|
|
return "inherit" === e ? this._line._model.properties().tradingProperties
|
|
.lineLength.value() : e
|
|
}
|
|
setLineLength(e) {
|
|
return this._line.properties().lineLength.setValue(Math.max(0, Math.min(e,
|
|
100))), this
|
|
}
|
|
getLineColor() {
|
|
var e = this._line.properties();
|
|
return "buy" === this._direction ? this._active ? e.lineActiveBuyColor
|
|
.value() : e.lineInactiveBuyColor.value() : this._active ? e
|
|
.lineActiveSellColor.value() : e.lineInactiveSellColor.value()
|
|
}
|
|
setLineColor(e) {
|
|
return "buy" === this._direction ? this._active ? this
|
|
.setLineActiveBuyColor(e) : this.setLineInactiveBuyColor(e) : this
|
|
._active ? this.setLineActiveSellColor(e) : this
|
|
.setLineInactiveSellColor(e), this
|
|
}
|
|
setLineActiveBuyColor(e) {
|
|
return this._line.properties().lineActiveBuyColor.setValue(e), this
|
|
}
|
|
setLineInactiveBuyColor(e) {
|
|
return this._line.properties().lineInactiveBuyColor.setValue(e), this
|
|
}
|
|
setLineActiveSellColor(e) {
|
|
return this._line.properties().lineActiveSellColor.setValue(e), this
|
|
}
|
|
setLineInactiveSellColor(e) {
|
|
return this._line.properties().lineInactiveSellColor.setValue(e), this
|
|
}
|
|
getLineStyle() {
|
|
var e = this._line.properties().lineStyle.value();
|
|
return "inherit" === e ? this._line._model.properties().tradingProperties
|
|
.lineStyle.value() : e
|
|
}
|
|
setLineStyle(e) {
|
|
return this._line.properties().lineStyle.setValue(e), this
|
|
}
|
|
getLineWidth() {
|
|
var e = this._line.properties().lineWidth.value();
|
|
return "inherit" === e ? this._line._model.properties().tradingProperties
|
|
.lineWidth.value() : e
|
|
}
|
|
setLineWidth(e) {
|
|
return this._line.properties().lineWidth.setValue(e), this
|
|
}
|
|
getBodyBorderColor() {
|
|
var e = this._line.properties();
|
|
return "buy" === this._direction ? this._active ? e.bodyBorderActiveBuyColor
|
|
.value() : e.bodyBorderInactiveBuyColor.value() : this._active ? e
|
|
.bodyBorderActiveSellColor.value() : e.bodyBorderInactiveSellColor
|
|
.value()
|
|
}
|
|
setBodyBorderColor(e) {
|
|
return "buy" === this._direction ? this._active ? this
|
|
.setBodyBorderActiveBuyColor(e) : this.setBodyBorderInactiveBuyColor(
|
|
e) : this._active ? this.setBodyBorderActiveSellColor(e) : this
|
|
.setBodyBorderInactiveSellColor(e), this
|
|
}
|
|
setBodyBorderActiveBuyColor(e) {
|
|
return this._line.properties().bodyBorderActiveBuyColor.setValue(e), this
|
|
}
|
|
setBodyBorderInactiveBuyColor(e) {
|
|
return this._line.properties().bodyBorderInactiveBuyColor.setValue(e), this
|
|
}
|
|
setBodyBorderActiveSellColor(e) {
|
|
return this._line.properties().bodyBorderActiveSellColor.setValue(e), this
|
|
}
|
|
setBodyBorderInactiveSellColor(e) {
|
|
return this._line.properties().bodyBorderInactiveSellColor.setValue(e), this
|
|
}
|
|
getBodyBackgroundColor() {
|
|
return n.getColorFromProperties(this._line.properties().bodyBackgroundColor,
|
|
this._line.properties().bodyBackgroundTransparency)
|
|
}
|
|
setBodyBackgroundColor(e) {
|
|
return n.setColorToProperties(e, this._line.properties()
|
|
.bodyBackgroundColor, this._line.properties()
|
|
.bodyBackgroundTransparency), this
|
|
}
|
|
getBodyTextColor() {
|
|
var e = this._line.properties();
|
|
return "limit" === this._mode ? this._active ? e.bodyTextActiveLimitColor
|
|
.value() : e.bodyTextInactiveLimitColor.value() : "stop" === this
|
|
._mode ? this._active ? e.bodyTextActiveStopColor.value() : e
|
|
.bodyTextInactiveStopColor.value() : "buy" === this._direction ? this
|
|
._active ? e.bodyTextActiveBuyColor.value() : e.bodyTextInactiveBuyColor
|
|
.value() : this._active ? e.bodyTextActiveSellColor.value() : e
|
|
.bodyTextInactiveSellColor.value()
|
|
}
|
|
setBodyTextColor(e) {
|
|
return "limit" === this._mode ? this._active ? this
|
|
.setBodyTextActiveLimitColor(e) : this.setBodyTextInactiveLimitColor(
|
|
e) : "stop" === this._mode ? this._active ? this
|
|
.setBodyTextActiveStopColor(e) : this.setBodyTextInactiveStopColor(e) :
|
|
"buy" === this._direction ? this._active ? this
|
|
.setBodyTextActiveBuyColor(e) : this.setBodyTextInactiveBuyColor(e) :
|
|
this._active ? this.setBodyTextActiveSellColor(e) : this
|
|
.setBodyTextInactiveSellColor(e), this
|
|
}
|
|
setBodyTextInactiveLimitColor(e) {
|
|
return this._line.properties().bodyTextInactiveLimitColor.setValue(e), this
|
|
}
|
|
setBodyTextActiveLimitColor(e) {
|
|
return this._line.properties().bodyTextActiveLimitColor.setValue(e), this
|
|
}
|
|
setBodyTextInactiveStopColor(e) {
|
|
return this._line.properties().bodyTextInactiveStopColor.setValue(e), this
|
|
}
|
|
setBodyTextActiveStopColor(e) {
|
|
return this._line.properties().bodyTextActiveStopColor.setValue(e), this
|
|
}
|
|
setBodyTextInactiveBuyColor(e) {
|
|
return this._line.properties().bodyTextInactiveBuyColor.setValue(e), this
|
|
}
|
|
setBodyTextActiveBuyColor(e) {
|
|
return this._line.properties().bodyTextActiveBuyColor.setValue(e), this
|
|
}
|
|
setBodyTextInactiveSellColor(e) {
|
|
return this._line.properties().bodyTextInactiveSellColor.setValue(e), this
|
|
}
|
|
setBodyTextActiveSellColor(e) {
|
|
return this._line.properties().bodyTextActiveSellColor.setValue(e), this
|
|
}
|
|
getBodyFont() {
|
|
return n.getFontFromProperties(this._line.properties().bodyFontFamily, this
|
|
._line.properties().bodyFontSize, this._line.properties()
|
|
.bodyFontBold, this._line.properties().bodyFontItalic)
|
|
}
|
|
setBodyFont(e) {
|
|
return n.setFontToProperties(e, this._line.properties().bodyFontFamily, this
|
|
._line.properties().bodyFontSize, this._line.properties()
|
|
.bodyFontBold, this._line.properties().bodyFontItalic), this
|
|
}
|
|
getQuantityBorderColor() {
|
|
var e = this._line.properties();
|
|
return "buy" === this._direction ? this._active ? e
|
|
.quantityBorderActiveBuyColor.value() : e.quantityBorderInactiveBuyColor
|
|
.value() : this._active ? e.quantityBorderActiveSellColor.value() : e
|
|
.quantityBorderInactiveSellColor.value()
|
|
}
|
|
setQuantityBorderColor(e) {
|
|
return "buy" === this._direction ? this._active ? this
|
|
.setQuantityBorderActiveBuyColor(e) : this
|
|
.setQuantityBorderInactiveBuyColor(e) : this._active ? this
|
|
.setQuantityBorderActiveSellColor(e) : this
|
|
.setQuantityBorderInactiveSellColor(e), this
|
|
}
|
|
setQuantityBorderActiveBuyColor(e) {
|
|
return this._line.properties().quantityBorderActiveBuyColor.setValue(e),
|
|
this
|
|
}
|
|
setQuantityBorderInactiveBuyColor(e) {
|
|
return this._line.properties().quantityBorderInactiveBuyColor.setValue(e),
|
|
this
|
|
}
|
|
setQuantityBorderActiveSellColor(e) {
|
|
return this._line.properties().quantityBorderActiveSellColor.setValue(e),
|
|
this
|
|
}
|
|
setQuantityBorderInactiveSellColor(e) {
|
|
return this._line.properties().quantityBorderInactiveSellColor.setValue(e),
|
|
this
|
|
}
|
|
getQuantityBackgroundColor() {
|
|
var e = this._line.properties();
|
|
return "buy" === this._direction ? this._active ? e
|
|
.quantityBackgroundActiveBuyColor.value() : e
|
|
.quantityBackgroundInactiveBuyColor.value() : this._active ? e
|
|
.quantityBackgroundActiveSellColor.value() : e
|
|
.quantityBackgroundInactiveSellColor.value()
|
|
}
|
|
setQuantityBackgroundColor(e) {
|
|
return "buy" === this._direction ? this._active ? this
|
|
.setQuantityBackgroundActiveBuyColor(e) : this
|
|
.setQuantityBackgroundInactiveBuyColor(e) : this._active ? this
|
|
.setQuantityBackgroundActiveSellColor(e) : this
|
|
.setQuantityBackgroundInactiveSellColor(e), this
|
|
}
|
|
setQuantityBackgroundActiveBuyColor(e) {
|
|
return this._line.properties().quantityBackgroundActiveBuyColor.setValue(e),
|
|
this
|
|
}
|
|
setQuantityBackgroundInactiveBuyColor(e) {
|
|
return this._line.properties().quantityBackgroundInactiveBuyColor.setValue(
|
|
e), this
|
|
}
|
|
setQuantityBackgroundActiveSellColor(e) {
|
|
return this._line.properties().quantityBackgroundActiveSellColor.setValue(
|
|
e), this
|
|
}
|
|
setQuantityBackgroundInactiveSellColor(e) {
|
|
return this._line.properties().quantityBackgroundInactiveSellColor.setValue(
|
|
e), this
|
|
}
|
|
getQuantityTextColor() {
|
|
return n.getColorFromProperties(this._line.properties().quantityTextColor,
|
|
this._line.properties().quantityTextTransparency)
|
|
}
|
|
setQuantityTextColor(e) {
|
|
return n.setColorToProperties(e, this._line.properties().quantityTextColor,
|
|
this._line.properties().quantityTextTransparency), this
|
|
}
|
|
getQuantityFont() {
|
|
return n.getFontFromProperties(this._line.properties().quantityFontFamily,
|
|
this._line.properties().quantityFontSize, this._line.properties()
|
|
.quantityFontBold, this._line.properties().quantityFontItalic)
|
|
}
|
|
setQuantityFont(e) {
|
|
return n.setFontToProperties(e, this._line.properties().quantityFontFamily,
|
|
this._line.properties().quantityFontSize, this._line.properties()
|
|
.quantityFontBold, this._line.properties().quantityFontItalic), this
|
|
}
|
|
getCancelButtonBorderColor() {
|
|
var e = this._line.properties();
|
|
return "buy" === this._direction ? this._active ? e
|
|
.cancelButtonBorderActiveBuyColor.value() : e
|
|
.cancelButtonBorderInactiveBuyColor.value() : this._active ? e
|
|
.cancelButtonBorderActiveSellColor.value() : e
|
|
.cancelButtonBorderInactiveSellColor.value()
|
|
}
|
|
setCancelButtonBorderColor(e) {
|
|
return "buy" === this._direction ? this._active ? this
|
|
.setCancelButtonBorderActiveBuyColor(e) : this
|
|
.setCancelButtonBorderInactiveBuyColor(e) : this._active ? this
|
|
.setCancelButtonBorderActiveSellColor(e) : this
|
|
.setCancelButtonBorderInactiveSellColor(e), this
|
|
}
|
|
setCancelButtonBorderActiveBuyColor(e) {
|
|
return this._line.properties().cancelButtonBorderActiveBuyColor.setValue(e),
|
|
this
|
|
}
|
|
setCancelButtonBorderInactiveBuyColor(e) {
|
|
return this._line.properties().cancelButtonBorderInactiveBuyColor.setValue(
|
|
e), this
|
|
}
|
|
setCancelButtonBorderActiveSellColor(e) {
|
|
return this._line.properties().cancelButtonBorderActiveSellColor.setValue(
|
|
e), this
|
|
}
|
|
setCancelButtonBorderInactiveSellColor(e) {
|
|
return this._line.properties().cancelButtonBorderInactiveSellColor.setValue(
|
|
e), this
|
|
}
|
|
getCancelButtonBackgroundColor() {
|
|
return n.getColorFromProperties(this._line.properties()
|
|
.cancelButtonBackgroundColor, this._line.properties()
|
|
.cancelButtonBackgroundTransparency)
|
|
}
|
|
setCancelButtonBackgroundColor(e) {
|
|
return n.setColorToProperties(e, this._line.properties()
|
|
.cancelButtonBackgroundColor, this._line.properties()
|
|
.cancelButtonBackgroundTransparency), this
|
|
}
|
|
getCancelButtonIconColor() {
|
|
var e = this._line.properties();
|
|
return "buy" === this._direction ? this._active ? e
|
|
.cancelButtonIconActiveBuyColor.value() : e
|
|
.cancelButtonIconInactiveBuyColor.value() : this._active ? e
|
|
.cancelButtonIconActiveSellColor.value() : e
|
|
.cancelButtonIconInactiveSellColor.value()
|
|
}
|
|
setCancelButtonIconColor(e) {
|
|
return "buy" === this._direction ? this._active ? this
|
|
.setCancelButtonIconActiveBuyColor(e) : this
|
|
.setCancelButtonIconInactiveBuyColor(e) : this._active ? this
|
|
.setCancelButtonIconActiveSellColor(e) : this
|
|
.setCancelButtonIconInactiveSellColor(e), this
|
|
}
|
|
setCancelButtonIconActiveBuyColor(e) {
|
|
return this._line.properties().cancelButtonIconActiveBuyColor.setValue(e),
|
|
this
|
|
}
|
|
setCancelButtonIconInactiveBuyColor(e) {
|
|
return this._line.properties().cancelButtonIconInactiveBuyColor.setValue(e),
|
|
this
|
|
}
|
|
setCancelButtonIconActiveSellColor(e) {
|
|
return this._line.properties().cancelButtonIconActiveSellColor.setValue(e),
|
|
this
|
|
}
|
|
setCancelButtonIconInactiveSellColor(e) {
|
|
return this._line.properties().cancelButtonIconInactiveSellColor.setValue(
|
|
e), this
|
|
}
|
|
block() {
|
|
this._blocked = !0, this._line.updateAllViewsAndRedraw()
|
|
}
|
|
unblock() {
|
|
this._blocked = !1, this._line.updateAllViewsAndRedraw()
|
|
}
|
|
getBlocked() {
|
|
return this._blocked
|
|
}
|
|
isFunction(e) {
|
|
return "function" == typeof e
|
|
}
|
|
onCancel(e, t) {
|
|
return t ? this.isFunction(t) && (this._onCancelData = e, this
|
|
._onCancelCallback = t) : this.isFunction(e) && (this
|
|
._onCancelCallback = e), this
|
|
}
|
|
callOnCancel() {
|
|
this.isFunction(this._onCancelCallback) && this._onCancelCallback.call(this,
|
|
this._onCancelData)
|
|
}
|
|
isOnCancelCallbackPresent() {
|
|
return this.isFunction(this._onCancelCallback)
|
|
}
|
|
onModify(e, t) {
|
|
return t ? this.isFunction(t) && (this._onModifyData = e, this
|
|
._onModifyCallback = t) : this.isFunction(e) && (this
|
|
._onModifyCallback = e), this
|
|
}
|
|
callOnModify() {
|
|
this.isFunction(this._onModifyCallback) && this._onModifyCallback.call(this,
|
|
this._onModifyData)
|
|
}
|
|
onMove(e, t) {
|
|
return t ? this.isFunction(t) && (this._onMoveData = e, this
|
|
._onMoveCallback = t) : this.isFunction(e) && (this
|
|
._onMoveCallback = e), this
|
|
}
|
|
callOnMove() {
|
|
this.isFunction(this._onMoveCallback) && this._onMoveCallback.call(this,
|
|
this._onMoveData)
|
|
}
|
|
onContextMenu(e, t) {
|
|
return t ? this.isFunction(t) && (this._onContextMenuData = e, this
|
|
._onContextMenuCallback = t) : this.isFunction(e) && (this
|
|
._onContextMenuCallback = e), this
|
|
}
|
|
shouldShowContextMenu() {
|
|
return this.isFunction(this._onContextMenuCallback)
|
|
}
|
|
callOnContextMenu() {
|
|
if (this.isFunction(this._onContextMenuCallback)) return this
|
|
._onContextMenuCallback.call(this, this._onContextMenuData)
|
|
}
|
|
remove() {
|
|
this._line._model.removeSource(this._line), delete this._line
|
|
}
|
|
}
|
|
class u extends s {
|
|
constructor(e, t) {
|
|
super(e, t || u.createProperties()), this._adapter = new h(this), this
|
|
.setSelectionEnabled(!0), i.e("lt-pane-views").then(i.bind(null,
|
|
"LMGK")).then(({
|
|
OrderPaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
zorder() {
|
|
return l
|
|
}
|
|
isSpeciallyZOrderedSource() {
|
|
return !0
|
|
}
|
|
setPoint(e, t, i) {
|
|
this._points[e] = t, this.normalizePoints()
|
|
}
|
|
addPoint(e, t) {
|
|
return this._points.push(e), this._lastPoint = null, this.normalizePoints(),
|
|
this.createServerPoints(), !0
|
|
}
|
|
name() {
|
|
return "Order"
|
|
}
|
|
endMoving(e) {
|
|
var t = this._startMovingPoint && this._currentMovingPoint && this
|
|
._startMovingPoint.logical.price !== this._currentMovingPoint.logical
|
|
.price;
|
|
super.endMoving(), !e && t && this._adapter.callOnMove()
|
|
}
|
|
createPriceAxisView(e) {
|
|
var t = {
|
|
pointIndex: e,
|
|
backgroundPropertyGetter: () => this._adapter.getLineColor()
|
|
};
|
|
return this._priceAxisView = new r(this, t), this._priceAxisView
|
|
}
|
|
paneViews() {
|
|
return TradingView.printing && !e.enabled("snapshot_trading_drawings") ?
|
|
null : this._model.properties().tradingProperties.showOrders.value() ? o
|
|
.prototype.paneViews.call(this) : null
|
|
}
|
|
priceAxisViews(t, i) {
|
|
return TradingView.printing && !e.enabled("snapshot_trading_drawings") ?
|
|
null : this._model.properties().tradingProperties.showOrders.value() ? o
|
|
.prototype.priceAxisViews.call(this, t, i) : null
|
|
}
|
|
adapter() {
|
|
return this._adapter
|
|
}
|
|
hasContextMenu() {
|
|
return this._adapter.shouldShowContextMenu()
|
|
}
|
|
contextMenuItems() {
|
|
return this._adapter.callOnContextMenu()
|
|
}
|
|
movable() {
|
|
return Boolean(this._adapter._onMoveCallback)
|
|
}
|
|
static createProperties(e) {
|
|
var t = new a("linetoolorder", e, !1, !1);
|
|
return u._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
s._configureProperties(e)
|
|
}
|
|
}
|
|
t.LineToolOrder = u
|
|
}).call(this, i("Kxc7"))
|
|
},
|
|
BBCR: function(e, t) {
|
|
e.exports =
|
|
'<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28"><path fill="none" fill-rule="evenodd" stroke="currentColor" stroke-linecap="square" d="M6.145 11.968L14 5.5l7.855 6.468a.3.3 0 0 1-.191.532H6.336a.3.3 0 0 1-.19-.532zm0 4.064L14 22.5l7.855-6.468a.3.3 0 0 0-.191-.532H6.336a.3.3 0 0 0-.19.532z"/></svg>'
|
|
},
|
|
BOPY: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("aO4+").Point,
|
|
r = i("f6yo").pointInCircle,
|
|
n = i("VdBB").HitTestResult,
|
|
o = i("zDbI").CHART_FONT_FAMILY,
|
|
a = i("cPgM").ScaledPaneRenderer;
|
|
class l extends a {
|
|
constructor(e, t) {
|
|
super(), this._barWidth = e.barWidth, this._plates = e.plates, this._tooltip = e
|
|
.tooltip, this._model = t
|
|
}
|
|
_drawImpl(e) {
|
|
e.save();
|
|
for (var t = 0; t < this._plates.length; t++)
|
|
if (this._plates[t].highlightByAuthor) {
|
|
this._highlightByAuthor = !0;
|
|
break
|
|
} this._plates.forEach(this._drawItem.bind(this, e)), this._tooltip.draw(this
|
|
._plates.map(function(e) {
|
|
return this._plateTransform(e)
|
|
}.bind(this)), e), this._tooltip.endDraw(), e.restore()
|
|
}
|
|
_drawItem(e, t) {
|
|
e.save(), this._highlightByAuthor && !t.highlightByAuthor && (e.globalAlpha = .4);
|
|
var i = this._dotTransform(t);
|
|
i.mine ? this._drawTriangle(e, i) : this._drawDot(e, i), e.restore()
|
|
}
|
|
_commonTransform(e) {
|
|
var t = Math.max(1.4 * e.minSize, this._barWidth + 4),
|
|
i = {
|
|
up: -1,
|
|
down: 1
|
|
} [e.direction] * (e.yInverted ? -1 : 1) * (t * (e.order + .6) + .25 * t),
|
|
s = e.y + i,
|
|
r = TradingView.clone(e.overridedTheme || this.themes[e.theme]);
|
|
return r.dotBorderWidth = e.hovered || e.highlightByAuthor ? 4 : 2, {
|
|
id: e.id,
|
|
theme: r,
|
|
themeName: e.theme,
|
|
x: Math.round(e.x + 1),
|
|
y: Math.round(s),
|
|
yInverted: e.yInverted,
|
|
pinned: e.pinned,
|
|
hovered: e.hovered
|
|
}
|
|
}
|
|
_dotTransform(e) {
|
|
var t = this._commonTransform(e);
|
|
return t.radius = Math.max(e.minSize / 2, .4 * this._barWidth), t.label = e.label, t
|
|
.labelFontColor = e.labelFontColor, t.labelFontSize = Math.ceil(Math.max(10,
|
|
Math.min(t.radius, 20))), this._model.updateDotData(e, t)
|
|
}
|
|
_plateTransform(e) {
|
|
var t = this._commonTransform(e);
|
|
return this._model.updatePlateData(e, t)
|
|
}
|
|
_drawTriangle(e, t) {
|
|
e.strokeStyle = t.theme.border, e.fillStyle = t.theme.background, e.lineWidth = t
|
|
.theme.dotBorderWidth;
|
|
var i = t,
|
|
s = t.radius,
|
|
r = Math.cos(Math.PI / 6) * s,
|
|
n = Math.sin(Math.PI / 6) * s;
|
|
e.translate(i.x, i.y), "up" === t.direction !== t.yInverted && e.rotate(Math.PI), t
|
|
.public || (e.lineWidth /= 2), e.beginPath(), e.moveTo(0, -s), e.lineTo(r, n), e
|
|
.lineTo(-r, n), e.lineTo(0, -s), e.closePath(), e.stroke(), t.public && e.fill()
|
|
}
|
|
_drawDot(e, t) {
|
|
e.strokeStyle = t.theme.border, e.fillStyle = t.theme.background, e.lineWidth = t
|
|
.theme.dotBorderWidth, e.beginPath(), e.arc(t.x, t.y, t.radius, 0, 2 * Math.PI,
|
|
!0), e.closePath(), e.stroke(), e.fill(), t.label && t.radius >= 7 && (e
|
|
.textAlign = "center", e.textBaseline = "middle", e.font = "bold " + t
|
|
.labelFontSize + "px " + o, e.fillStyle = t.labelFontColor, e.fillText(t
|
|
.label, t.x, t.y))
|
|
}
|
|
hitTest(e) {
|
|
for (var t, i = this._plates.length - 1; i >= 0; --i)
|
|
if (t = this._hitTestDot(this._plates[i], e)) return t;
|
|
return null
|
|
}
|
|
_hitTestDot(e, t) {
|
|
var i = this._dotTransform(e),
|
|
o = new s(i.x, i.y);
|
|
return r(t, o, Math.max(i.radius, 8)) ? new n(n.REGULAR, e) : null
|
|
}
|
|
}
|
|
l.prototype.themes = {
|
|
green: {
|
|
border: "#78C143",
|
|
background: "#8DDD54"
|
|
},
|
|
red: {
|
|
border: "#CC4545",
|
|
background: "#ED5A5A"
|
|
},
|
|
neutral: {
|
|
border: "#EAC300",
|
|
background: "#FFD400"
|
|
},
|
|
yellow: {
|
|
border: "#EAC300",
|
|
background: "#FFD400"
|
|
},
|
|
blue: {
|
|
border: "#047ACE",
|
|
background: "#0496FF"
|
|
}
|
|
}, t.BarsMarksContainerPaneView = class {
|
|
constructor(e, t) {
|
|
this.source = e, this._rendererFactory = t
|
|
}
|
|
update() {}
|
|
renderer(e, t) {
|
|
return this._rendererFactory(this.source)
|
|
}
|
|
}, t.BarsMarksContainerRenderer = l
|
|
},
|
|
BZtw: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Eyy1"),
|
|
r = i("ogJP"),
|
|
n = i("5fI3"),
|
|
o = i("LxhU"),
|
|
a = i("XPit"),
|
|
l = i("hsV8"),
|
|
c = i("YWnQ"),
|
|
h = i("aIyQ"),
|
|
u = i.n(h);
|
|
class d {
|
|
constructor() {
|
|
this._loading = new u.a, this._completed = new u.a, this._error = new u.a, this
|
|
._symbolError = new u.a, this._symbolResolved = new u.a, this._seriesError =
|
|
new u.a, this._symbolNotPermitted = new u.a, this._symbolGroupNotPermitted =
|
|
new u.a, this._chartTypeNotPermitted = new u.a, this
|
|
._intradaySpreadNotPermitted = new u.a, this._intradayExchangeNotPermitted =
|
|
new u.a, this._customIntervalNotPermitted = new u.a, this
|
|
._secondsIntervalNotPermitted = new u.a, this._tickMarksRangeChanged = new u.a,
|
|
this._barReceived = new u.a, this._seriesTimeFrame = new u.a, this
|
|
._dataUpdated = new u.a
|
|
}
|
|
destroy() {
|
|
this._loading.destroy(), this._completed.destroy(), this._error.destroy(), this
|
|
._symbolError.destroy(), this._symbolResolved.destroy(), this._seriesError
|
|
.destroy(), this._symbolNotPermitted.destroy(), this._symbolGroupNotPermitted
|
|
.destroy(), this._chartTypeNotPermitted.destroy(), this
|
|
._intradaySpreadNotPermitted.destroy(), this._intradayExchangeNotPermitted
|
|
.destroy(), this._customIntervalNotPermitted.destroy(), this
|
|
._secondsIntervalNotPermitted.destroy(), this._tickMarksRangeChanged.destroy(),
|
|
this._barReceived.destroy(), this._seriesTimeFrame.destroy(), this._dataUpdated
|
|
.destroy()
|
|
}
|
|
loading() {
|
|
return this._loading
|
|
}
|
|
completed() {
|
|
return this._completed
|
|
}
|
|
error() {
|
|
return this._error
|
|
}
|
|
symbolError() {
|
|
return this._symbolError
|
|
}
|
|
symbolResolved() {
|
|
return this._symbolResolved
|
|
}
|
|
seriesError() {
|
|
return this._seriesError
|
|
}
|
|
symbolNotPermitted() {
|
|
return this._symbolNotPermitted
|
|
}
|
|
symbolGroupNotPermitted() {
|
|
return this._symbolGroupNotPermitted
|
|
}
|
|
chartTypeNotPermitted() {
|
|
return this._chartTypeNotPermitted
|
|
}
|
|
intradaySpreadNotPermitted() {
|
|
return this._intradaySpreadNotPermitted
|
|
}
|
|
intradayExchangeNotPermitted() {
|
|
return this._intradayExchangeNotPermitted
|
|
}
|
|
customIntervalNotPermitted() {
|
|
return this._customIntervalNotPermitted
|
|
}
|
|
secondsIntervalNotPermitted() {
|
|
return this._secondsIntervalNotPermitted
|
|
}
|
|
tickMarksRangeChanged() {
|
|
return this._tickMarksRangeChanged
|
|
}
|
|
barReceived() {
|
|
return this._barReceived
|
|
}
|
|
seriesTimeFrame() {
|
|
return this._seriesTimeFrame
|
|
}
|
|
dataUpdated() {
|
|
return this._dataUpdated
|
|
}
|
|
fireCompleted(e, t) {
|
|
this._completed.fire(e, t)
|
|
}
|
|
fireLoading(e) {
|
|
this._loading.fire(e)
|
|
}
|
|
fireError() {
|
|
this._error.fire()
|
|
}
|
|
fireSymbolError(e) {
|
|
this._symbolError.fire(e), this.fireError()
|
|
}
|
|
fireSymbolResolved(e) {
|
|
this._symbolResolved.fire(e)
|
|
}
|
|
fireSeriesError(e) {
|
|
this._seriesError.fire(e), this.fireError()
|
|
}
|
|
fireSymbolNotPermitted(e) {
|
|
this._symbolNotPermitted.fire(e), this.fireError()
|
|
}
|
|
fireSymbolGroupNotPermitted(e) {
|
|
this._symbolGroupNotPermitted.fire(e), this.fireError()
|
|
}
|
|
fireChartTypeNotPermitted(e) {
|
|
this._chartTypeNotPermitted.fire(e), this.fireError()
|
|
}
|
|
fireIntradaySpreadNotPermitted() {
|
|
this._intradaySpreadNotPermitted.fire(), this.fireError()
|
|
}
|
|
fireIntradayExchangeNotPermitted() {
|
|
this._intradayExchangeNotPermitted.fire(), this.fireError()
|
|
}
|
|
fireCustomIntervalNotPermitted() {
|
|
this._customIntervalNotPermitted.fire(), this.fireError()
|
|
}
|
|
fireSecondsIntervalNotPermitted() {
|
|
this._secondsIntervalNotPermitted.fire(), this.fireError()
|
|
}
|
|
fireTickMarksRangeChanged(e) {
|
|
this._tickMarksRangeChanged.fire(e)
|
|
}
|
|
fireBarReceived(e) {
|
|
this._barReceived.fire(e)
|
|
}
|
|
fireSeriesTimeFrame(e, t, i, s, r) {
|
|
this._seriesTimeFrame.fire(e, t, i, s, r)
|
|
}
|
|
fireDataUpdated(e, t) {
|
|
this._dataUpdated.fire(e, t)
|
|
}
|
|
}
|
|
var p = i("txPx");
|
|
i.d(t, "a", (function() {
|
|
return b
|
|
}));
|
|
const _ = Object(p.getLogger)("Chart.SeriesDataSource");
|
|
var m;
|
|
! function(e) {
|
|
e[e.Idle = 0] = "Idle", e[e.AwaitingConnection = 1] = "AwaitingConnection", e[e
|
|
.AwaitingFirstDataUpdate = 2] = "AwaitingFirstDataUpdate", e[e.Active = 3] =
|
|
"Active"
|
|
}(m || (m = {}));
|
|
let f = 1;
|
|
let g = 1;
|
|
class b {
|
|
constructor(e, t, i) {
|
|
var r;
|
|
this._instanceId = null, this._symbolInstanceId = null, this._symbol = null, this
|
|
._resolution = null, this._timeFrame = null, this._data = new a.SeriesData, this
|
|
._dataEvents = new d, this._status = m.Idle, this._turnaroundCounter = 1, this
|
|
._boundOnGatewayIsConnectedChanged = this._onGatewayIsConnectedChanged.bind(
|
|
this), this._ongoingDataUpdate = Promise.resolve(), this._gateway = e, this
|
|
._turnaroundPrefix = t, this._createSeriesParams = (r = null != i ? i : {
|
|
count: 300
|
|
}).startDate ? r.endDate || r.count ? r.endDate ? ["from_to", r.startDate, r
|
|
.endDate
|
|
] : ["bar_count", r.startDate, Object(s.ensure)(r.count)] : ["from_to", r
|
|
.startDate
|
|
] : r.count || 300, this._gateway.isConnected().subscribe(this
|
|
._boundOnGatewayIsConnectedChanged)
|
|
}
|
|
destroy() {
|
|
this.stop(), this._gateway.isConnected().unsubscribe(this
|
|
._boundOnGatewayIsConnectedChanged)
|
|
}
|
|
modifySeries(e, t, i = null, n = !1) {
|
|
n && (_.logNormal(
|
|
"Due to force flag clearing symbol & resolution to force re-requesting data."
|
|
), this._symbol = null, this._resolution = null);
|
|
const a = this._symbol,
|
|
l = this._resolution;
|
|
if (this._symbol = e, this._resolution = t, null === this._instanceId) return void(
|
|
this._timeFrame = i);
|
|
const c = !Object(r.deepEquals)(a, e)[0],
|
|
h = null === l || !o.Interval.isEqual(l, t);
|
|
(c || h || null !== i) && (this._timeFrame = null, (c || h) && this
|
|
._turnaroundCounter++, c && this._resolveSymbol(), this._gateway.modifySeries(
|
|
this._instanceId, this.turnaround(), Object(s.ensureNotNull)(this
|
|
._symbolInstanceId), this._resolution, i, this._onMessage.bind(this)))
|
|
}
|
|
requestMoreData(e) {
|
|
null !== this._instanceId && this._gateway.requestMoreData(this._instanceId, e, this
|
|
._onMessage.bind(this))
|
|
}
|
|
requestMoreTickmarks(e) {
|
|
null !== this._instanceId && this._gateway.requestMoreTickmarks(this._instanceId, e,
|
|
this._onMessage.bind(this))
|
|
}
|
|
isStarted() {
|
|
return this._status !== m.Idle
|
|
}
|
|
isActive() {
|
|
return this._status === m.Active
|
|
}
|
|
start() {
|
|
this.isStarted() ? _.logNormal(
|
|
"start: data source is already started, nothing to do") : (Object(s.assert)(
|
|
null !== this._symbol, "symbol must be set before start"), Object(s
|
|
.assert)(null !== this._resolution,
|
|
"resolution must be set before start"), this._gateway.isConnected()
|
|
.value() ? this._createSeries() : this._changeStatusTo(m.AwaitingConnection)
|
|
)
|
|
}
|
|
stop() {
|
|
this.isStarted() ? (null !== this._instanceId && (this._gateway.removeSeries(this
|
|
._instanceId), this._instanceId = null), this._changeStatusTo(m.Idle)) : _
|
|
.logNormal("stop: data source is already stopped, nothing to do")
|
|
}
|
|
instanceId() {
|
|
return this._instanceId
|
|
}
|
|
data() {
|
|
return this._data
|
|
}
|
|
clearData() {
|
|
this.isStarted() ? this._enqueueUpdate(() => this._clearDataImpl()) : this
|
|
._clearDataImpl()
|
|
}
|
|
dataEvents() {
|
|
return this._dataEvents
|
|
}
|
|
turnaround() {
|
|
return `${this._turnaroundPrefix}${this._turnaroundCounter}`
|
|
}
|
|
symbolInstanceId() {
|
|
return this._symbolInstanceId
|
|
}
|
|
moveData(e) {
|
|
this._enqueueUpdate(() => this._data.moveData(e))
|
|
}
|
|
_clearDataImpl() {
|
|
this._data.clear()
|
|
}
|
|
_resolveSymbol() {
|
|
null !== this._symbol && (this._symbolInstanceId = "sds_sym_" + f++, this._gateway
|
|
.resolveSymbol(this._symbolInstanceId, Object(n
|
|
.encodeExtendedSymbolOrGetSimpleSymbolString)(this._symbol), this
|
|
._onMessage.bind(this)))
|
|
}
|
|
_changeStatusTo(e) {
|
|
Object(s.assert)(this._status !== e,
|
|
"Source and destination status should be distinct"), _.logNormal(
|
|
`Status changed from ${m[this._status]} to ${m[e]}`), this._status = e
|
|
}
|
|
_createSeries() {
|
|
Object(s.assert)(this._status !== m.Active,
|
|
'Status should not be "Active" when creating a study'), this._instanceId =
|
|
"sds_" + g++, this._resolveSymbol(), this._gateway.createSeries(this
|
|
._instanceId, this.turnaround(), Object(s.ensureNotNull)(this
|
|
._symbolInstanceId), Object(s.ensureNotNull)(this._resolution), this
|
|
._createSeriesParams, this._timeFrame, this._onMessage.bind(this)), this
|
|
._timeFrame = null, this._changeStatusTo(m.AwaitingFirstDataUpdate)
|
|
}
|
|
_onGatewayIsConnectedChanged(e) {
|
|
e ? this._onGatewayConnected() : this._onGatewayDisconnected()
|
|
}
|
|
_onGatewayConnected() {
|
|
this._status === m.AwaitingConnection && this._createSeries()
|
|
}
|
|
_onGatewayDisconnected() {
|
|
this._status !== m.Idle && this._status !== m.AwaitingConnection && (this
|
|
._instanceId = null, this._changeStatusTo(m.AwaitingConnection)), this
|
|
._turnaroundCounter = 1
|
|
}
|
|
_onMessage(e) {
|
|
this._enqueueUpdate(() => this._onMessageImpl(e))
|
|
}
|
|
async _onMessageImpl(e) {
|
|
switch (e.method) {
|
|
case "symbol_resolved": {
|
|
const [t, i] = e.params;
|
|
if (t !== this._symbolInstanceId) {
|
|
_.logNormal(
|
|
`Resolve for old symbol, expected: ${this._symbolInstanceId}, actual ${e.params[0]}`
|
|
);
|
|
break
|
|
}
|
|
this._onSymbolResolved(i);
|
|
break
|
|
}
|
|
case "symbol_error":
|
|
if (e.params[0] !== this._symbolInstanceId) {
|
|
_.logNormal(
|
|
`Symbol error for old symbol, expected: ${this._symbolInstanceId}, actual ${e.params[0]}`
|
|
);
|
|
break
|
|
}
|
|
this._onSymbolError(e);
|
|
break;
|
|
case "series_timeframe": {
|
|
const [t, i, s, r, n, o, a] = e.params;
|
|
if (!this._checkTurnaround(t, i)) {
|
|
_.logNormal(
|
|
`Time frame for old data, expected: ${this._symbolInstanceId} (${this.turnaround()}), actual ${t} (${i})`
|
|
);
|
|
break
|
|
}
|
|
this._onSeriesTimeFrame(s, r, n, o, a);
|
|
break
|
|
}
|
|
case "series_error": {
|
|
const [t, i] = e.params;
|
|
if (!this._checkTurnaround(t, i)) {
|
|
_.logNormal(
|
|
`Series error for old data, expected: ${this._symbolInstanceId} (${this.turnaround()}), actual ${t} (${i})`
|
|
);
|
|
break
|
|
}
|
|
this._onSeriesError(e.params[2]);
|
|
break
|
|
}
|
|
case "series_loading": {
|
|
const [t, i] = e.params;
|
|
if (!this._checkTurnaround(t, i)) break;
|
|
this._onSeriesLoading(e.time);
|
|
break
|
|
}
|
|
case "series_completed": {
|
|
const [t, i, s] = e.params;
|
|
if (!this._checkTurnaround(t, s)) {
|
|
_.logNormal(
|
|
`Series completed for old data, expected: ${this._symbolInstanceId} (${this.turnaround()}), actual ${t} (${s})`
|
|
);
|
|
break
|
|
}
|
|
this._onSeriesCompleted(i, e.time);
|
|
break
|
|
}
|
|
case "data_update":
|
|
if (!this._checkTurnaround(e.params.customId, e.params.turnaround)) {
|
|
_.logNormal(
|
|
`Data update for old data, expected: ${this._symbolInstanceId} (${this.turnaround()}), actual ${e.params.customId} (${e.params.turnaround})`
|
|
);
|
|
break
|
|
}
|
|
await this._onDataUpdate(e.params.plots, e.params.nonseries, e.params
|
|
.lastBar);
|
|
break;
|
|
case "clear_data":
|
|
if (e.params.turnaround !== this.turnaround()) {
|
|
_.logNormal(
|
|
`Clear data for old data, expected: ${this.turnaround()}, actual ${e.params.turnaround}`
|
|
);
|
|
break
|
|
}
|
|
this._clearDataImpl(), this._dataEvents.fireDataUpdated(void 0, !1)
|
|
}
|
|
}
|
|
_onSeriesError(e) {
|
|
let t, i;
|
|
if ("string" == typeof e) i = {
|
|
error: e
|
|
}, t = e;
|
|
else if (i = e, e.ctx) {
|
|
const i = {};
|
|
Object.entries(e.ctx).forEach(([e, t]) => {
|
|
i[e] = t.toString()
|
|
}), t = e.error.format(i)
|
|
} else t = e.error;
|
|
if (t.startsWith("study_not_auth:")) {
|
|
const e = t.split(":", 2)[1].split("@", 2)[0];
|
|
["BarSetRenko", "BarSetPriceBreak", "BarSetKagi", "BarSetPnF"].includes(e) ?
|
|
this._dataEvents.fireChartTypeNotPermitted(e) : "BarSetSpread" === e ? this
|
|
._dataEvents.fireIntradaySpreadNotPermitted() : "BarSetRange" === e && this
|
|
._dataEvents.fireCustomIntervalNotPermitted()
|
|
} else "resolution_not_entitled" === t ? this._dataEvents
|
|
.fireIntradayExchangeNotPermitted() : "custom_resolution" === t ? this
|
|
._dataEvents.fireCustomIntervalNotPermitted() : "seconds_not_entitled" === t &&
|
|
this._dataEvents.fireSecondsIntervalNotPermitted();
|
|
this._dataEvents.fireSeriesError(i)
|
|
}
|
|
_onSeriesTimeFrame(e, t, i, s, r) {
|
|
this._dataEvents.fireSeriesTimeFrame(e, t, i, null == s || s, r)
|
|
}
|
|
_onSymbolError(e) {
|
|
if (e.params[1] === c.permissionDenied) switch (e.params[2]) {
|
|
case c.SymbolErrorPermissionDeniedReason.Symbol:
|
|
this._dataEvents.fireSymbolNotPermitted(e.params[3]);
|
|
break;
|
|
case c.SymbolErrorPermissionDeniedReason.GroupPermission:
|
|
this._dataEvents.fireSymbolGroupNotPermitted(e.params[3]);
|
|
break;
|
|
default:
|
|
this._dataEvents.fireSymbolNotPermitted(e.params[2])
|
|
}
|
|
this._dataEvents.fireSymbolError(e.params[1])
|
|
}
|
|
_onSymbolResolved(e) {
|
|
this._dataEvents.fireSymbolResolved(e)
|
|
}
|
|
async _onDataUpdate(e, t, i) {
|
|
this._onDataUnpacked(e, i, await async function(e) {
|
|
if (void 0 === e) return {
|
|
projectionPlots: [],
|
|
boxSize: null
|
|
};
|
|
if ("" === e.d || "nochange" === e.indexes) return null;
|
|
const t = await Object(l.unpackNonSeriesData)(e.d);
|
|
if (null === t || t.indexes_replace) return null;
|
|
const i = e.indexes,
|
|
{
|
|
bars: s,
|
|
price: r,
|
|
boxSize: n,
|
|
reversalAmount: o
|
|
} = t.data,
|
|
a = (s || []).map(e => {
|
|
let t;
|
|
return "factor" in e ? t = e.factor :
|
|
"additionalPrice" in e && (t = e.additionalPrice), {
|
|
index: i[e.time],
|
|
value: [0, e.open, e.high, e.low, e.close, e
|
|
.volume, t
|
|
]
|
|
}
|
|
});
|
|
return {
|
|
lastPrice: r,
|
|
projectionPlots: a,
|
|
reversalAmount: o,
|
|
boxSize: n
|
|
}
|
|
}(t))
|
|
}
|
|
_enqueueUpdate(e) {
|
|
return this._ongoingDataUpdate = this._ongoingDataUpdate.then(e, e), this
|
|
._ongoingDataUpdate
|
|
}
|
|
_onDataUnpacked(e, t, i) {
|
|
if (this._status === m.Idle) return;
|
|
this._status === m.AwaitingFirstDataUpdate && (this._changeStatusTo(m.Active), this
|
|
._clearDataImpl());
|
|
const s = this._data.bars().size(),
|
|
r = this._data.bars().firstIndex(),
|
|
n = this._data.bars().merge(e);
|
|
null !== i && (this._data.nsBars().clear(), this._data.nsBars().merge(i
|
|
.projectionPlots), this._data.lastProjectionPrice = i.lastPrice,
|
|
null !== i.boxSize && (this._data.boxSize = i.boxSize), this._data
|
|
.reversalAmount = i.reversalAmount);
|
|
const o = null === r || null !== n && n.index < r;
|
|
this._dataEvents.fireDataUpdated(t, o), s !== this._data.bars().size() && null !==
|
|
n && this._dataEvents.fireBarReceived(n)
|
|
}
|
|
_onSeriesLoading(e) {
|
|
this._dataEvents.fireLoading(e)
|
|
}
|
|
_onSeriesCompleted(e, t) {
|
|
this._dataEvents.fireCompleted(e, t)
|
|
}
|
|
_checkTurnaround(e, t) {
|
|
return this._instanceId === e && (void 0 === t || t === this.turnaround())
|
|
}
|
|
}
|
|
},
|
|
Bt3k: function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e, t) {
|
|
this.tooltips = {}, this.tooltipFactory = e, this.source = t
|
|
}
|
|
|
|
function r(e, t) {
|
|
this.renderer = e, this._tooltip = t, this.visible = !1
|
|
}
|
|
s.prototype.findOrCreateTooltip = function(e) {
|
|
var t = this.tooltips[e.id];
|
|
return null == t && (e.hovered || e.pinned) && (t = this._createTooltip(), this
|
|
.tooltips[e.id] = t), t
|
|
}, s.prototype.showPlate = function(e, t) {
|
|
var i = this.findOrCreateTooltip(e);
|
|
null != i && (i._drawPlate(e, t), i.plateData = e)
|
|
}, s.prototype.draw = function(e, t) {
|
|
this.hoveredId = null;
|
|
for (var i = 0; i < e.length; i++) e[i].hovered && (this.hoveredId = e[i].id);
|
|
e.forEach(function(e) {
|
|
this.showPlate(e, t)
|
|
}.bind(this))
|
|
}, s.prototype.endDraw = function() {
|
|
for (var e in this.tooltips)
|
|
if (this.tooltips.hasOwnProperty(e)) {
|
|
var t = this.tooltips[e];
|
|
t.toggleVisibility(), this.hoveredId && t.plateData.id !== this.hoveredId && !t
|
|
.plateData.pinned && (t.remove(), delete this.tooltips[e])
|
|
}
|
|
}, s.prototype.removeAll = function() {
|
|
for (var e in this.tooltips) {
|
|
if (this.tooltips.hasOwnProperty(e)) this.tooltips[e].remove()
|
|
}
|
|
this.tooltips = {}
|
|
}, s.prototype.removeTooltip = function(e) {
|
|
delete this.tooltips[e]
|
|
}, s.prototype._createTooltip = function() {
|
|
return new r(this, this.tooltipFactory())
|
|
}, r.prototype._drawPlate = function(e, t) {
|
|
var i = this;
|
|
this.visible = !0, this._tooltip.setSource(this.renderer.source), this._tooltip
|
|
.showPlate(e, t), e.hovered || e.pinned || this._tooltip.hide((function() {
|
|
i.renderer.removeTooltip(e.id)
|
|
}))
|
|
}, r.prototype.remove = function() {
|
|
this._tooltip._removeLayout()
|
|
}, r.prototype.toggleVisibility = function() {
|
|
this._tooltip._toggleLayout(this.visible), this.visible = !1
|
|
}, t.TooltipRenderer = s
|
|
},
|
|
CCPt: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("Eyy1");
|
|
|
|
function r(e, t, i) {
|
|
return new Promise(s => {
|
|
i && e.classList.remove(i), e.classList.add(t);
|
|
const r = i => {
|
|
i.target === e && i.animationName === t && (e.removeEventListener(i
|
|
.type, r), s(i))
|
|
};
|
|
e.addEventListener("animationend", r, !1), e.addEventListener(
|
|
"webkitAnimationEnd", r, !1), e.addEventListener("MSAnimationEnd", r, !
|
|
1)
|
|
})
|
|
}
|
|
|
|
function n(e) {
|
|
return r(e, "tv-transition--fade-in", "tv-transition--fade-out")
|
|
}
|
|
i.d(t, "UserDefinedBarsMarksTooltip", (function() {
|
|
return o
|
|
}));
|
|
class o extends class {
|
|
constructor() {
|
|
this._source = null, this._tooltipHovered = !1, this._layout = null, this
|
|
._container = null, this._context = null, this._plateArrowSize = 14
|
|
}
|
|
showPlate(e, t) {
|
|
if (this._currentId !== e.id || !this._layout || null === this._layout.parentNode) {
|
|
this._currentId = e.id, this._createLayout();
|
|
const i = Object(s.ensureNotNull)(this._layout);
|
|
this._getContainer(t).appendChild(i), i.addEventListener("mouseenter", () => {
|
|
this._tooltipHovered = !0, n(Object(s.ensureNotNull)(this._layout))
|
|
}), i.addEventListener("mouseleave", () => {
|
|
this._tooltipHovered = !1
|
|
})
|
|
}
|
|
const i = Object(s.ensureNotNull)(this._layout);
|
|
let r = Math.round(e.barWidth / 2);
|
|
r > 15 && (r = 15), r < 10 && (r = 10), this._updatePlate(e);
|
|
const o = t.canvas.getBoundingClientRect(),
|
|
a = e.x - i.offsetWidth < this._plateArrowSize;
|
|
let l = o.width - e.x + Math.round(e.barWidth / 2 + r);
|
|
a && (l -= i.offsetWidth + 2 * this._plateArrowSize);
|
|
const c = o.height,
|
|
h = Math.min(Math.max(e.y, 20), c - i.offsetHeight - 10) + "px";
|
|
i.classList.toggle("right", a), i.style.display = "block", i.style.top = h, i.style
|
|
.right = l + "px", i.style.fontSize = r + "px"
|
|
}
|
|
hide(e) {
|
|
const t = Object(s.ensureNotNull)(this._layout);
|
|
var i;
|
|
this._tooltipHovered ? n(t) : (i = t, r(i, "tv-transition--fade-out",
|
|
"tv-transition--fade-in")).then(() => {
|
|
t.remove(), e()
|
|
})
|
|
}
|
|
setSource(e) {
|
|
this._source = e
|
|
}
|
|
_getContainer(e) {
|
|
return this._container && this._context === e || (this._context = e, this
|
|
._container = e.canvas.parentElement), Object(s.ensureNotNull)(this
|
|
._container)
|
|
}
|
|
_removeLayout() {
|
|
var e;
|
|
this._tooltipHovered || null === (e = this._layout) || void 0 === e || e.remove()
|
|
}
|
|
_toggleLayout(e) {
|
|
Object(s.ensureNotNull)(this._layout).style.visibility = e ? "visible" : "hidden"
|
|
}
|
|
} {
|
|
constructor() {
|
|
super(...arguments), this._layoutText = null
|
|
}
|
|
_createLayout() {
|
|
this._layout = document.createElement("div"), this._layout.classList.add(
|
|
"bar-mark-tooltip"), this._layoutText = document.createElement("div"), this
|
|
._layoutText.classList.add("text"), this._layout.appendChild(this._layoutText)
|
|
}
|
|
_updatePlate(e) {
|
|
this._currentId = e.id;
|
|
const t = Object(s.ensureNotNull)(this._layout);
|
|
t.style.borderColor = e.theme.border, t.style.marginTop = e.tooltipMargin + "px";
|
|
const i = Object(s.ensureNotNull)(this._layoutText);
|
|
i.innerHTML = e.text, t.appendChild(i)
|
|
}
|
|
}
|
|
},
|
|
CHw2: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("WPQD").LineToolTrendLine,
|
|
r = i("Ocx9").DefaultProperty;
|
|
class n extends s {
|
|
constructor(e, t) {
|
|
super(e, t || n.createProperties())
|
|
}
|
|
name() {
|
|
return "Extended Line"
|
|
}
|
|
static createProperties(e) {
|
|
var t = new r("linetoolextended", e);
|
|
return n._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
s._configureProperties(e)
|
|
}
|
|
}
|
|
t.LineToolExtended = n
|
|
},
|
|
CJIV: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Ss5c").LineDataSource,
|
|
r = i("p1SQ").LineToolHorzLinePriceAxisView,
|
|
n = i("tc+8"),
|
|
o = i("Ocx9").DefaultProperty;
|
|
class a extends s {
|
|
constructor(e, t) {
|
|
super(e, t || a.createProperties()), this._priceAxisView = new r(this), i.e(
|
|
"lt-pane-views").then(i.t.bind(null, "1oDZ", 7)).then(({
|
|
HorzRayPaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
pointsCount() {
|
|
return 1
|
|
}
|
|
name() {
|
|
return "Horizontal Ray"
|
|
}
|
|
priceAxisViews(e, t) {
|
|
return this.isSourceHidden() ? null : t === this.priceScale() && this.properties()
|
|
.showPrice.value() && this._model.paneForSource(this) === e ? [this
|
|
._priceAxisView
|
|
] : null
|
|
}
|
|
updateAllViews() {
|
|
super.updateAllViews(), this._priceAxisView.update()
|
|
}
|
|
canHasAlert() {
|
|
return !0
|
|
}
|
|
_getAlertPlots() {
|
|
var e = this._points[0],
|
|
t = {
|
|
index: e.index + 1,
|
|
price: e.price
|
|
};
|
|
return [this._linePointsToAlertPlot([e, t], null, !1, !0)]
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "e0H+")))
|
|
.HorizontalRayDefinitionsViewModel
|
|
}
|
|
template() {
|
|
var e = s.prototype.template.call(this);
|
|
return e.text = this.properties().childs().text.value(), e
|
|
}
|
|
_applyTemplateImpl(e) {
|
|
super._applyTemplateImpl(e), this.properties().childs().text.setValue(e.text)
|
|
}
|
|
static createProperties(e) {
|
|
var t = new o("linetoolhorzray", e);
|
|
return a._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
s._configureProperties(e), e.hasChild("text") || e.addChild("text", new n("")), e
|
|
.addExclusion("text")
|
|
}
|
|
}
|
|
t.LineToolHorzRay = a
|
|
},
|
|
CLNU: function(e, t, i) {
|
|
(function(e) {
|
|
TradingView.cleanButAmpersand = function(e, t) {
|
|
var i = t ? ["&"] : ["&"];
|
|
return TradingView.clean(e, t, i)
|
|
}, TradingView.strip_tags = function(e) {
|
|
return e && e.replace ? e.replace(/(<([^>]+)>)/gi, "") : e
|
|
}, TradingView.encodeSpread = function(e) {
|
|
return encodeURIComponent(e)
|
|
}, TradingView.clean = function(e, t, i) {
|
|
var s = [
|
|
["&", "&"],
|
|
["<", "<"],
|
|
[">", ">"],
|
|
['"', """],
|
|
["'", "'"],
|
|
["'", "'"]
|
|
],
|
|
r = e;
|
|
if (!e || !e.replace) return r;
|
|
for (var n = 0; n < s.length; n++) {
|
|
var o = s[n][0],
|
|
a = s[n][1];
|
|
i && i.indexOf && -1 !== i.indexOf(t ? a : o) || (r = t ? r.replace(
|
|
new RegExp(a, "g"), o) : r.replace(new RegExp(o, "g"), a))
|
|
}
|
|
return r
|
|
}, e && e.exports && (e.exports = {
|
|
clean: TradingView.clean,
|
|
cleanButAmpersand: TradingView.cleanButAmpersand,
|
|
stripTags: TradingView.strip_tags
|
|
})
|
|
}).call(this, i("YuTi")(e))
|
|
},
|
|
CPmC: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return r
|
|
})), i.d(t, "b", (function() {
|
|
return n
|
|
}));
|
|
const s = new WeakMap;
|
|
|
|
function r(e, t) {
|
|
const i = s.get(e);
|
|
return i instanceof Function ? i(t) : i && i[t]
|
|
}
|
|
|
|
function n(e, t, i) {
|
|
if (i instanceof Function) return void s.set(e, i);
|
|
const r = s.get(e),
|
|
n = void 0 === r || r instanceof Function ? {} : r;
|
|
n[t] = i, s.set(e, n)
|
|
}
|
|
},
|
|
CW80: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("Eyy1"),
|
|
r = i("aO4+"),
|
|
n = i("MSvv"),
|
|
o = i("Ss5c"),
|
|
a = i("OH2X"),
|
|
l = i("gf4d"),
|
|
c = i("USzt"),
|
|
h = i("cBZt");
|
|
const u = Object(h.studyIdString)("VbPFixed", "tv-basicstudies");
|
|
class d extends c.a {
|
|
constructor(e, t, i, s) {
|
|
const r = i || e.studyMetaInfoRepository().findByIdSync({
|
|
type: "java",
|
|
studyId: u
|
|
});
|
|
super(e, t, r, s)
|
|
}
|
|
calcIsActualSymbol() {
|
|
n.StudyLineDataSource.prototype.calcIsActualSymbol.apply(this)
|
|
}
|
|
boundToSymbol() {
|
|
return !0
|
|
}
|
|
isSynchronizable() {
|
|
return this.priceScale() === this._model.mainSeries().priceScale()
|
|
}
|
|
static studyId() {
|
|
return u
|
|
}
|
|
static createProperties(e) {
|
|
const t = super._createPropertiesFromStudyIdAndState(u, e);
|
|
return c.a._configureProperties(t), t
|
|
}
|
|
}
|
|
var p = i("e92V"),
|
|
_ = i("QIuV");
|
|
i.d(t, "setNewToolProperties", (function() {
|
|
return g
|
|
})), i.d(t, "unsetNewToolProperties", (function() {
|
|
return b
|
|
})), i.d(t, "getNewToolProperties", (function() {
|
|
return v
|
|
})), i.d(t, "createLineTool", (function() {
|
|
return S
|
|
})), i.d(t, "prepareLineToolPropertiesByOwnerSource", (function() {
|
|
return y
|
|
})), i.d(t, "createLineToolProperties", (function() {
|
|
return w
|
|
})), i.d(t, "createStudyLineToolProperties", (function() {
|
|
return P
|
|
})), i.d(t, "supportsPhantomMode", (function() {
|
|
return C
|
|
})), i.d(t, "isLineTool", (function() {
|
|
return x
|
|
})), i.d(t, "isStudyLineTool", (function() {
|
|
return T
|
|
})), i.d(t, "isTrading", (function() {
|
|
return I
|
|
})), i.d(t, "tryFindStudyLineToolNameByStudyId", (function() {
|
|
return M
|
|
})), i.d(t, "cloneLineTool", (function() {
|
|
return O
|
|
})), i.d(t, "lineToolByLinkKey", (function() {
|
|
return L
|
|
})), i.d(t, "isLineToolName", (function() {
|
|
return p.isLineToolName
|
|
})), i.d(t, "isStudyLineToolName", (function() {
|
|
return p.isStudyLineToolName
|
|
})), i.d(t, "isLineDrawnWithPressedButton", (function() {
|
|
return p.isLineDrawnWithPressedButton
|
|
}));
|
|
|
|
function m(e) {
|
|
for (const t of Object.keys(e)) TradingView[t] = e[t]
|
|
}
|
|
m(a), m({
|
|
LineToolRegressionTrend: l.LineToolRegressionTrend,
|
|
LineToolVbPFixed: c.a,
|
|
LineToolFixedRangeVolumeProfile: d
|
|
});
|
|
let f = null;
|
|
|
|
function g(e, t) {
|
|
return null !== f && f.tool === e && f.toolData === t || (f = {
|
|
properties: w(e),
|
|
tool: e,
|
|
toolData: t
|
|
}), f.properties
|
|
}
|
|
|
|
function b() {
|
|
f = null
|
|
}
|
|
|
|
function v(e) {
|
|
return null !== f && f.tool === e ? f.properties : null
|
|
}
|
|
|
|
function S(e, t, i, r, n) {
|
|
let o;
|
|
if (Object(s.assert)(Object(p.isLineToolName)(e), "Unknown line tool: " + e), n || i || (i =
|
|
v(e) || void 0), "LineToolVbPFixed" === e) o = new c.a(t, i, Object(s.ensureDefined)
|
|
(r), t.mainSeries());
|
|
else if ("LineToolFixedRangeVolumeProfile" === e) o = new d(t, i, Object(s.ensureDefined)(
|
|
r), t.mainSeries());
|
|
else if ("LineToolRegressionTrend" === e) o = new l.LineToolRegressionTrend(t, i, Object(s
|
|
.ensureDefined)(r));
|
|
else {
|
|
o = new(Object(s.ensureDefined)(a[e]))(t, i, n)
|
|
}
|
|
return o.toolname = e, b(), o
|
|
}
|
|
|
|
function y(e, t) {
|
|
const i = Object(s.ensureNotNull)(t.symbolSource());
|
|
e.childs().symbol.setValue(i.symbol()), e.childs().currencyId.setValue(i.currency()), e
|
|
.childs().unitId.setValue(i.unit()), e.childs().symbolStateVersion.setValue(2), e
|
|
.childs().zOrderVersion.setValue(2)
|
|
}
|
|
|
|
function w(e, t) {
|
|
if (Object(s.assert)(Object(p.isLineToolName)(e), e + " should be name of the line tool"),
|
|
"LineToolVbPFixed" === e) return c.a.createProperties(t);
|
|
if ("LineToolFixedRangeVolumeProfile" === e) return d.createProperties(t);
|
|
if ("LineToolRegressionTrend" === e) return l.LineToolRegressionTrend.createProperties(t);
|
|
return Object(s.ensureDefined)(a[e]).createProperties(t)
|
|
}
|
|
|
|
function P(e, t, i, r, n) {
|
|
if (Object(s.assert)(Object(p.isStudyLineToolName)(e), e +
|
|
" should be name of the study line tool"), "LineToolVbPFixed" === e) return c.a
|
|
.createPropertiesFromStudyMetaInfoAndState(t, i, r, n);
|
|
if ("LineToolFixedRangeVolumeProfile" === e) return d
|
|
.createPropertiesFromStudyMetaInfoAndState(t, i, r, n);
|
|
if ("LineToolRegressionTrend" === e) return l.LineToolRegressionTrend
|
|
.createPropertiesFromStudyMetaInfoAndState(t, i, r, n);
|
|
throw new Error("Property creation is not implemented for study line tool " + e)
|
|
}
|
|
|
|
function C(e) {
|
|
Object(s.assert)(Object(p.isLineToolName)(e), e + " should be name of the line tool");
|
|
const t = a[e];
|
|
return void 0 !== t && Boolean(t.supportPhantomMode)
|
|
}
|
|
|
|
function x(e) {
|
|
return e instanceof o.LineDataSource
|
|
}
|
|
|
|
function T(e) {
|
|
return e instanceof n.StudyLineDataSource
|
|
}
|
|
|
|
function I(e) {
|
|
return e instanceof _.LineToolTrading
|
|
}
|
|
|
|
function M(e) {
|
|
let t = null;
|
|
return e === l.LineToolRegressionTrend.studyId() ? t = "LineToolRegressionTrend" : e === c.a
|
|
.studyId() ? t = "LineToolVbPFixed" : e === d.studyId() && (t =
|
|
"LineToolFixedRangeVolumeProfile"), t
|
|
}
|
|
|
|
function O(e, t, i, n) {
|
|
const o = t.toolname,
|
|
a = w(t.toolname, t.properties().state());
|
|
a.childs().visible.setValue(!0);
|
|
const l = Object(s.ensureNotNull)(t.ownerSource()),
|
|
c = S(o, e, a);
|
|
void 0 !== n && c.setId(n), c.setOwnerSource(l), c.toolname = o;
|
|
const h = c.clonePositionOffset(),
|
|
u = t.fixedPoints();
|
|
(i ? u.map(e => e.add(new r.Point(h.xCoordOffset, h.yCoordOffset))) : u).forEach(e => c
|
|
.addFixedPoint(e));
|
|
const d = t.normalizedPoints(),
|
|
p = i ? function(e, t, i) {
|
|
const r = Object(s.ensureNotNull)(t.priceScale()),
|
|
n = Object(s.ensureNotNull)(t.firstValue());
|
|
return e.map(e => {
|
|
const t = e.price,
|
|
s = r.priceToCoordinate(t, n) + i.yCoordOffset,
|
|
o = r.coordinateToPrice(s, n);
|
|
return {
|
|
time_t: e.time_t,
|
|
price: o,
|
|
offset: e.offset + i.barOffset
|
|
}
|
|
})
|
|
}(d, l, h) : d,
|
|
_ = t.points();
|
|
return c.restorePoints(p, _), c.cloneData && c.cloneData(t), c.checkAlert && c.checkAlert(),
|
|
c
|
|
}
|
|
|
|
function L(e, t) {
|
|
return e.dataSources().find(e => x(e) && e.linkKey().value() === t) || null
|
|
}
|
|
},
|
|
Cf1E: function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e) {
|
|
if (void 0 === e) return "";
|
|
if (e instanceof Error) {
|
|
let t = e.message;
|
|
return e.stack && (t += " " + e.stack), t
|
|
}
|
|
return "string" == typeof e ? e.toString() : JSON.stringify(e)
|
|
}
|
|
i.d(t, "a", (function() {
|
|
return s
|
|
}))
|
|
},
|
|
CsKN: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "SetScaleRatioPropertiesCommand", (function() {
|
|
return n
|
|
}));
|
|
var s = i("RDU5"),
|
|
r = i("Ocx9");
|
|
class n extends s.UndoCommand {
|
|
constructor(e, t, i, s) {
|
|
super(i), this._property = e, this._newValue = t, this._model = s, this
|
|
._priceScale = this._model.mainSeries().priceScale(), this._oldValue = this
|
|
._property.value(), this._oldMode = this._priceScale.mode()
|
|
}
|
|
redo() {
|
|
this._oldValue = this._property.value(), this._oldMode = this._priceScale
|
|
.mode(), Object(r.saveDefaultProperties)(!0), this._priceScale.setMode({
|
|
autoScale: !1,
|
|
percentage: !1,
|
|
log: !1
|
|
}), this._property.setValue(this._newValue), Object(r.saveDefaultProperties)
|
|
(!1), this._model.recalculateAllPanes(), this._model.lightUpdate()
|
|
}
|
|
undo() {
|
|
Object(r.saveDefaultProperties)(!0), this._property.setValue(this._oldValue),
|
|
this._priceScale.setMode(this._oldMode), Object(r.saveDefaultProperties)(!
|
|
1), this._model.recalculateAllPanes(), this._model.lightUpdate()
|
|
}
|
|
}
|
|
},
|
|
CwKc: function(e, t) {
|
|
e.exports =
|
|
'<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28"><g fill="none" fill-rule="evenodd" stroke="currentColor"><path stroke-linecap="square" d="M11.5 21.5v-7m3 7v-5m3 5v-3m-9 3v-5"/><path d="M5.5 22v-3"/><path stroke-linecap="square" d="M5.5 13.5l4.297-4.297a2.406 2.406 0 0 1 3.406 0l2.594 2.594c.94.94 2.463.943 3.406 0L23.5 7.5M22.5 12.5v6m-3-3h6"/></g></svg>'
|
|
},
|
|
CxTi: function(e, t, i) {
|
|
e.exports = {
|
|
css_value_currency_label_top: "6",
|
|
css_value_currency_label_radius: "4",
|
|
css_value_currency_label_text_horizontal_padding: "4",
|
|
css_value_border_color_light: "#D1D4DC",
|
|
css_value_border_color_dark: "#363A45",
|
|
"price-axis-currency-label-wrapper": "price-axis-currency-label-wrapper-25tFaE37",
|
|
"price-axis-currency-label": "price-axis-currency-label-25tFaE37",
|
|
readonly: "readonly-25tFaE37",
|
|
multiline: "multiline-25tFaE37",
|
|
"price-axis-currency-label-dropdown": "price-axis-currency-label-dropdown-25tFaE37",
|
|
"price-axis-currency-label-text": "price-axis-currency-label-text-25tFaE37",
|
|
"price-axis-currency-label-arrow-down": "price-axis-currency-label-arrow-down-25tFaE37"
|
|
}
|
|
},
|
|
DVnF: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return r
|
|
}));
|
|
var s = i("Ss5c");
|
|
class r extends s.LineDataSource {
|
|
constructor() {
|
|
super(...arguments), this._finished = !1
|
|
}
|
|
pointsCount() {
|
|
return -1
|
|
}
|
|
finished() {
|
|
return this._finished
|
|
}
|
|
finish() {
|
|
this._finished = !0, this._lastPoint = null, this.normalizePoints(), this
|
|
.createServerPoints()
|
|
}
|
|
hasEditableCoordinates() {
|
|
return !1
|
|
}
|
|
addPoint(e, t, i) {
|
|
if (this._finished) return !0;
|
|
if (this._lastPoint = null, this._points.length > 0) {
|
|
const t = this._points[this._points.length - 1],
|
|
i = this.pointToScreenPoint(t)[1];
|
|
if (this.pointToScreenPoint(e)[1].subtract(i).length() < 2) return this
|
|
._finished
|
|
}
|
|
return super.addPoint(e), this._finished
|
|
}
|
|
restorePoints(e, t, i) {
|
|
super.restorePoints(e, t, i), this._finished = !0
|
|
}
|
|
}
|
|
},
|
|
Daqx: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return o
|
|
}));
|
|
const s = ["Z", "Y", "X", "W", "V", "U", "T", "S"],
|
|
r = ["A", "B", "C", "D", "E", "F", "G", "H"];
|
|
class n {
|
|
constructor(e) {
|
|
this.label = e
|
|
}
|
|
equals(e) {
|
|
return null !== e && this.label === e.label
|
|
}
|
|
}
|
|
|
|
function o(e, t) {
|
|
const i = "left" === e ? s : r;
|
|
return new n(t < i.length ? i[t] : "")
|
|
}
|
|
},
|
|
Dq3s: function(e) {
|
|
e.exports = JSON.parse(
|
|
'{"4":["v",["h",0,2],["h",1,3]],"6":["v",["h",0,2,4],["h",1,3,5]],"8":["v",["h",0,2,4,6],["h",1,3,5,7]],"2h":["h",0,1],"2v":["v",0,1],"2-1":["v",["h",0,2],1],"3s":["h",0,["v",1,2]],"3h":["h",0,1,2],"3v":["v",0,1,2],"1-2":["v",0,["h",1,2]],"3r":["h",["v",0,1],2],"4h":["h",0,1,2,3],"4v":["v",0,1,2,3],"4s":["h",0,["v",1,2,3]],"1-3":["v",0,["h",1,2,3]],"2-2":["v",["h",0,1],["v",2,3]],"1-4":["v",0,["h",1,2,3,4]],"5s":["h",0,["v",1,2,3,4]],"6c":["v",["h",0,1],["h",2,3],["h",4,5]],"8c":["v",["h",0,1],["h",2,3],["h",4,5],["h",6,7]],"s":0}'
|
|
)
|
|
},
|
|
E3Wt: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("Eyy1"),
|
|
r = i("YFKU"),
|
|
n = i("RDU5");
|
|
class o extends n.UndoCommand {
|
|
constructor(e, t) {
|
|
super(""), this._chartModel = e, this._targetIndex = t
|
|
}
|
|
redo() {
|
|
const e = this._chartModel.createPane(this._targetIndex, void 0, this._paneId);
|
|
this._paneId = e.id()
|
|
}
|
|
undo() {
|
|
const e = Object(s.ensureDefined)(this._paneId),
|
|
t = this._chartModel.panes().find(t => t.id() === e);
|
|
void 0 !== t && this._chartModel.removePane(t)
|
|
}
|
|
createdPaneId() {
|
|
return this._paneId
|
|
}
|
|
}
|
|
var a = i("txPx"),
|
|
l = i("25b6"),
|
|
c = i("qHEz");
|
|
const h = Object(a.getLogger)("Clipboard");
|
|
class u {
|
|
constructor(e) {
|
|
this._e = e
|
|
}
|
|
write(e) {
|
|
return Object(c.a)(this._toRaw(e), this._e)
|
|
}
|
|
_toRaw(e) {
|
|
const t = {
|
|
files: []
|
|
};
|
|
t.text = e.text, void 0 !== e.app ? t.html = this._serializeAppData(e.app, e.text) :
|
|
e.html && (t.html = e.html);
|
|
for (const i of e.files || []) t.files.push(i);
|
|
return t
|
|
}
|
|
_serializeAppData(e, t) {
|
|
return `<meta charset="utf-8"><span data-tradingview-clip="${Object(l.b)(e)}">${t ? Object(l.b)(t.slice(0, 256)) : "📈"}</span>`
|
|
}
|
|
}
|
|
class d {
|
|
constructor(e) {
|
|
this._e = e
|
|
}
|
|
async read() {
|
|
this._e && 0 === this._e.eventPhase && (h.logWarn(
|
|
"Cannot use an already dispatched ClipboardEvent for reading"), this
|
|
._e = null);
|
|
const e = this._e ? this._readUsingEvent(this._e) : await this._readUsingApi();
|
|
return this._fromRaw(e)
|
|
}
|
|
_readUsingEvent(e) {
|
|
const t = Object(s.ensure)(e.clipboardData);
|
|
e.preventDefault();
|
|
const i = {
|
|
files: []
|
|
};
|
|
for (let e = 0; e < t.files.length; e++) i.files.push(t.files[e]);
|
|
for (let e = 0; e < t.items.length; e++) {
|
|
const s = t.items[e];
|
|
"string" === s.kind && ("text/plain" === s.type ? i.text = t.getData(s.type) :
|
|
"text/html" === s.type ? i.html = t.getData(s.type) : i.files.push(
|
|
new Blob([t.getData(s.type)], {
|
|
type: s.type
|
|
})))
|
|
}
|
|
return i
|
|
}
|
|
async _readUsingApi() {
|
|
if (!navigator.clipboard || !navigator.clipboard.read) throw new DOMException(
|
|
"ClipboardApi is not supported", "NotSupportedError");
|
|
let e, t;
|
|
const i = [],
|
|
s = await navigator.clipboard.read();
|
|
for (const r of s)
|
|
for (const s of r.types) "text/html" === s ? e = r.getType(s).then(this
|
|
._readBlobAsText) : "text/plain" === s ? t = r.getType(s).then(this
|
|
._readBlobAsText) : i.push(r.getType(s));
|
|
return {
|
|
text: await t,
|
|
html: await e,
|
|
files: await Promise.all(i)
|
|
}
|
|
}
|
|
_fromRaw(e) {
|
|
const t = {};
|
|
if (void 0 !== e.text && (t.text = e.text), void 0 !== e.html) {
|
|
const i = this._parseAppData(e.html);
|
|
i ? t.app = i : t.html = e.html
|
|
}
|
|
return e.files.length > 0 && (t.files = e.files), t
|
|
}
|
|
_parseAppData(e) {
|
|
if (-1 === e.slice(0, 1024).indexOf("data-tradingview-clip")) return;
|
|
const t = (new DOMParser).parseFromString(e, "text/html").querySelector(
|
|
"[data-tradingview-clip]");
|
|
return t ? t.getAttribute("data-tradingview-clip") || "" : void 0
|
|
}
|
|
_readBlobAsText(e) {
|
|
return new Promise((t, i) => {
|
|
const s = new FileReader;
|
|
s.onloadend = () => {
|
|
t(s.result)
|
|
}, s.onerror = () => {
|
|
i(s.error)
|
|
}, s.readAsText(e)
|
|
})
|
|
}
|
|
}
|
|
var p = i("d700");
|
|
|
|
function _(e) {
|
|
const t = e.target;
|
|
return null !== t && 1 === t.nodeType && Object(p.b)(t)
|
|
}
|
|
|
|
function m(e) {
|
|
const t = e.target;
|
|
if (null === t) return !1;
|
|
const i = (t.ownerDocument || t).getSelection();
|
|
return null !== i && !i.isCollapsed
|
|
}
|
|
class f extends class {
|
|
constructor(e) {
|
|
this._callbacks = Object.assign({}, e), this._boundOnCopy = this._onCopyEv.bind(
|
|
this), this._boundOnCut = this._onCutEv.bind(this), this._boundOnPaste =
|
|
this._onPasteEv.bind(this)
|
|
}
|
|
listen() {
|
|
document.addEventListener("copy", this._boundOnCopy), document.addEventListener(
|
|
"cut", this._boundOnCut), document.addEventListener("paste", this
|
|
._boundOnPaste)
|
|
}
|
|
async peek() {
|
|
if ("granted" !== (await navigator.permissions.query({
|
|
name: "clipboard-read"
|
|
})).state) throw new Error("clipboard-read is not granted");
|
|
return new d(null).read()
|
|
}
|
|
uiRequestCopy(e) {
|
|
this._callbacks.copyRequested && this._callbacks.copyRequested(new u(null), e)
|
|
}
|
|
uiRequestCut(e) {
|
|
this._callbacks.cutRequested && this._callbacks.cutRequested(new u(null), e)
|
|
}
|
|
uiRequestPaste(e) {
|
|
this._callbacks.pasteRequested && this._callbacks.pasteRequested(new d(null), e)
|
|
}
|
|
destroy() {
|
|
document.removeEventListener("copy", this._boundOnCopy), document
|
|
.removeEventListener("cut", this._boundOnCut), document.removeEventListener(
|
|
"paste", this._boundOnPaste)
|
|
}
|
|
_onCopyEv(e) {
|
|
e.defaultPrevented || this._callbacks.copyRequested && this._callbacks
|
|
.copyRequested(new u(e))
|
|
}
|
|
_onCutEv(e) {
|
|
e.defaultPrevented || this._callbacks.cutRequested && this._callbacks.cutRequested(
|
|
new u(e))
|
|
}
|
|
_onPasteEv(e) {
|
|
e.defaultPrevented || this._callbacks.pasteRequested && this._callbacks
|
|
.pasteRequested(new d(e))
|
|
}
|
|
} {
|
|
_onCopyEv(e) {
|
|
if (!_(e) && !m(e)) return super._onCopyEv(e)
|
|
}
|
|
_onCutEv(e) {
|
|
if (!_(e) && !m(e)) return super._onCutEv(e)
|
|
}
|
|
_onPasteEv(e) {
|
|
if (!_(e)) return super._onPasteEv(e)
|
|
}
|
|
}
|
|
i.d(t, "applyIndicatorsToAllChartsImpl", (function() {
|
|
return g
|
|
})), i.d(t, "applyIndicatorToAllChartsImpl", (function() {
|
|
return b
|
|
})), i.d(t, "lineToolsAndGroupsDTOsImpl", (function() {
|
|
return S
|
|
})), i.d(t, "getStateForChartImpl", (function() {
|
|
return y
|
|
})), i.d(t, "getAsyncStateForChartImpl", (function() {
|
|
return w
|
|
})), i.d(t, "resetLineToolsInvalidatedImpl", (function() {
|
|
return P
|
|
})), i.d(t, "applyLineToolUpdateNotificationImpl", (function() {
|
|
return C
|
|
})), i.d(t, "createClipboardHandler", (function() {
|
|
return x
|
|
})), i.d(t, "setBrokerImpl", (function() {
|
|
return T
|
|
})), i.d(t, "chartsSymbolsImpl", (function() {
|
|
return I
|
|
}));
|
|
Object(r.t)(
|
|
"Please give us a clipboard writing permission in your browser or press {keystroke}");
|
|
|
|
function g(e, t) {
|
|
const i = t.model().model().studyTemplate();
|
|
e.undoHistory.beginUndoMacro("Apply Indicators to Entire Layout");
|
|
for (let s = 0; s < e.chartWidgetsDefs.length; s++) {
|
|
const r = e.chartWidgetsDefs[s].chartWidget;
|
|
r !== t && (r.hasModel() && r.model().applyStudyTemplate(i, ""))
|
|
}
|
|
e.undoHistory.endUndoMacro()
|
|
}
|
|
|
|
function b(e, t, i, r, n) {
|
|
e.undoHistory.beginUndoMacro(n);
|
|
for (let a = 0; a < e.chartWidgetsDefs.length; a++) {
|
|
const l = e.chartWidgetsDefs[a].chartWidget;
|
|
if (l !== t && l.hasModel()) {
|
|
const t = l.model();
|
|
let a;
|
|
if (r.isOnMainPane) a = Object(s.ensureNotNull)(t.model().paneForSource(l.model()
|
|
.model().mainSeries()));
|
|
else {
|
|
const i = new o(t.model(), r.paneIndex);
|
|
e.undoHistory.pushUndoCommand(i);
|
|
const n = Object(s.ensureDefined)(i.createdPaneId());
|
|
a = Object(s.ensureDefined)(t.model().panes().find(e => e.id() === n))
|
|
}
|
|
const c = t.pasteSourceFromClip(a, i, !0);
|
|
if (c && 1 === c.length) {
|
|
const e = c[0];
|
|
if (r.asCompare) {
|
|
const i = Object(s.ensureNotNull)(t.mainSeries().priceScale());
|
|
t.moveToScale(e, Object(s.ensureDefined)(a), i, n), t.setPriceScaleMode({
|
|
percentage: !0
|
|
}, i, "")
|
|
}
|
|
}
|
|
t.model().lightUpdate()
|
|
}
|
|
}
|
|
e.undoHistory.endUndoMacro()
|
|
}
|
|
|
|
function v(e) {
|
|
let t = 1;
|
|
for (; e.has("" + t);) t++;
|
|
return "" + t
|
|
}
|
|
|
|
function S(e) {
|
|
const t = new Map,
|
|
i = e.chartsCountToSave(),
|
|
s = new Set;
|
|
for (let r = 0; r < i; r++)
|
|
if (r < e.chartWidgetsDefs.length) {
|
|
const i = e.chartWidgetsDefs[r].chartWidget,
|
|
n = i.id(),
|
|
o = i.lineToolsAndGroupsDTO();
|
|
t.set(n, o), s.add(n)
|
|
} else {
|
|
const i = e.savedChartWidgetOptions[r - e.chartWidgetsDefs.length].content;
|
|
i.chartId || (i.chartId = v(s)),
|
|
t.set(i.chartId, extractLineToolsDTOFromChartState(i)), s.add(i.chartId)
|
|
} return t
|
|
}
|
|
|
|
function y(e, t, i, s, r, n) {
|
|
if (t < e.chartWidgetsDefs.length) {
|
|
const o = e.chartWidgetsDefs[t].chartWidget;
|
|
return t < e.actualLayoutCount() || o.shouldBeSavedEvenIfHidden() ? o.state(i, s, r,
|
|
n) : null
|
|
}
|
|
const o = e.savedChartWidgetOptions[t - e.chartWidgetsDefs.length].content;
|
|
return o
|
|
}
|
|
|
|
function w(e, t) {
|
|
return t < e.chartWidgetsDefs.length ? e.chartWidgetsDefs[t].chartWidget.asyncState() :
|
|
Promise.resolve({})
|
|
}
|
|
|
|
function P(e, t, i) {
|
|
const s = e.chartsCountToSave();
|
|
for (let r = 0; r < s; r++)
|
|
if (r < e.chartWidgetsDefs.length) {
|
|
const s = e.chartWidgetsDefs[r].chartWidget,
|
|
n = s.id(),
|
|
o = i.get(n);
|
|
s.resetLineToolsInvalidated(t, o)
|
|
} else 0
|
|
}
|
|
|
|
function C(e, t, i) {
|
|
var s;
|
|
null === (s = e.map(e => e.chartWidget).find(e => e.id() === t)) || void 0 === s || s
|
|
.applyLineToolUpdateNotification(i)
|
|
}
|
|
|
|
function x(e) {
|
|
return new f({
|
|
copyRequested: (t, i) => {
|
|
e.activeChartWidget.value().model().clipboardCopy(t, i)
|
|
},
|
|
cutRequested: (t, i) => {
|
|
e.activeChartWidget.value().model().clipboardCut(t, i)
|
|
},
|
|
pasteRequested: (t, i) => {
|
|
(i ? i.model().undoModel() : e.activeChartWidget.value().model())
|
|
.clipboardPaste(t, i)
|
|
}
|
|
})
|
|
}
|
|
|
|
function T(e, t) {
|
|
0
|
|
}
|
|
|
|
function I(e) {
|
|
const t = {};
|
|
return e.chartWidgetsDefs.map(e => e.chartWidget).forEach(e => t[e.id()] = function(e) {
|
|
var t, i;
|
|
const s = {},
|
|
r = e.model().mainSeries(),
|
|
n = r.properties(),
|
|
o = r.symbolInfo();
|
|
s.resolution = r.properties().interval.value(), s.symbol_type = null !== o && o
|
|
.type || "", s.exchange = null !== o && o.exchange || "", s
|
|
.listed_exchange = null !== o && o.listed_exchange || "";
|
|
const a = null !== (t = null == o ? void 0 : o.legs) && void 0 !== t ? t : [];
|
|
if (null !== o && r.isSpread()) {
|
|
const e = a[0];
|
|
let t = o.base_name[0];
|
|
t = t.split(":")[1], s.symbol = e, s.short_name = t, s.expression = o
|
|
.full_name
|
|
} else s.symbol = null !== o && o.ticker || n.symbol.value(), s.short_name = n
|
|
.shortName.value();
|
|
const l = null !== (i = null == o ? void 0 : o.base_name) && void 0 !== i ? i :
|
|
[];
|
|
return s.legs = a.map((e, t) => ({
|
|
symbol: e,
|
|
pro_symbol: l[t]
|
|
})), s
|
|
}(e)), t
|
|
}
|
|
},
|
|
E6p6: function(e, t, i) {
|
|
"use strict";
|
|
var s;
|
|
i.r(t), i.d(t, "SessionStage", (function() {
|
|
return s
|
|
})),
|
|
function(e) {
|
|
e[e.PRE_SESSION = -1] = "PRE_SESSION", e[e.POST_SESSION = -2] = "POST_SESSION", e[e
|
|
.LASTBAR_SESSION = -3] = "LASTBAR_SESSION"
|
|
}(s || (s = {}))
|
|
},
|
|
EJcV: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("rQHv"),
|
|
r = i("ocLq"),
|
|
n = i("8gnj"),
|
|
o = i("XRI5").SymbolExtrapolator,
|
|
a = i("ViuT").SessionTimeScale,
|
|
l = i("gzUS").PointsetsManager,
|
|
c = i("IiTo"),
|
|
h = i("OLhd").createDwmAligner,
|
|
u = i("LxhU").Interval,
|
|
d = i("FQhm"),
|
|
p = i("TlGQ").visitObject,
|
|
_ = i("ogJP").isObject;
|
|
i("2cgs"), i("MrEN");
|
|
var m = i("WIS0").DatafeedRequestsCachedProcessor,
|
|
f = i("+6ja").timezoneIsAvailable,
|
|
g = i("OLhd").isAlignmentEnabled,
|
|
b = i("5fI3"),
|
|
v = b.isEncodedExtendedSymbol,
|
|
S = b.decodeExtendedSymbol,
|
|
y = i("n5al").extractSymbolNameFromSymbolInfo,
|
|
w = i("dUJ+").replaceGraphicsTimesWithTimePointIndexIndex,
|
|
P = i("Kxc7");
|
|
|
|
function C(e) {
|
|
var t = e.findIndex((function(e) {
|
|
return -5e6 !== e.index
|
|
}));
|
|
return -1 === t ? [] : 0 === t ? e : e.slice(t)
|
|
}
|
|
|
|
function x(e, t) {
|
|
return e + "_" + t
|
|
}
|
|
var T = function(e) {
|
|
var t = this;
|
|
this._studiesCache = {}, this._objectsDataCache = {}, this._studiesNonSeriesTimes = {},
|
|
this._metainfoCache = [], this._barsCoefficientsCache = {}, this._externalDatafeed =
|
|
e,
|
|
e.getVolumeProfileResolutionForPeriod && r
|
|
.overwriteVolumeProfileResolutionForPeriodGetter((function(t, i, s, r) {
|
|
return e.getVolumeProfileResolutionForPeriod(t, i, s, r)
|
|
})), this._datafeedConfiguration = null, this._marketStatusWatchers = {}, this
|
|
._resolveRequests = {}, this._resolvePromisesBySymbolId = new Map, this
|
|
._symbolIdToSymbolRequestString = new Map, this._callbacks = {}, this
|
|
._serverTimeOffset = 0, t._logMessage("Datafeed settings received: {0}".format(JSON
|
|
.stringify(window.configurationData))), t._datafeedConfiguration = t
|
|
._adoptConfigurationData(window.configurationData), t._fireEvent(
|
|
"configuration_received"), t._externalDatafeed.getServerTime && t
|
|
._externalDatafeed.getServerTime((function(e) {
|
|
t._serverTimeOffset = e - (new Date).valueOf() / 1e3
|
|
})), this._invalidatedPointsetSessions = new Set, this._refreshPointsetsTimerId =
|
|
null, this._pointsetsManagers = {}, this._quotesInfo = [], this._depthInfo = [],
|
|
this._endOfData = {}, this._computeStudyCounter = 0, this._symbolExtrapolators = {},
|
|
this._timeScales = {}, this._cachedDatafeed = new m(e, this.serverTimeOffset.bind(
|
|
this), this._datafeedConfiguration.reset_cache_timeout), n.setupFeed({
|
|
resolve: function(e, i, s, r) {
|
|
t._resolveSymbolByName(e, i, s, r)
|
|
},
|
|
subscribe: function(e, i, s, r, n) {
|
|
return t._cachedDatafeed.subscribe(e, i, s, function(e, i, s) {
|
|
var r = new c.SessionInfo(e.timezone, e.session, e
|
|
.session_holidays, e.corrections),
|
|
n = c.newBarBuilder(i, r, r);
|
|
return function(e) {
|
|
if (e && e.count()) {
|
|
var i = 1e3 * t.getCurrentUTCTime();
|
|
n.moveTo(i), n.indexOfBar(i) >= 0 && e
|
|
.setLastBarClosed(!1)
|
|
}
|
|
s(e)
|
|
}
|
|
}(e, i, r), n)
|
|
},
|
|
unsubscribe: function(e) {
|
|
return t._cachedDatafeed.unsubscribe(e)
|
|
}
|
|
})
|
|
};
|
|
|
|
function I(e, t) {
|
|
return e + "_" + t
|
|
}
|
|
|
|
function M(e, t, i) {
|
|
return e + (t ? "_#_" + t : "") + (i ? "_#_" + i : "")
|
|
}
|
|
T.prototype._getSymbolExtrapolator = function(e, t, i) {
|
|
var s = u.normalize(i),
|
|
r = function(e, t, i) {
|
|
return e + "," + t.full_name + "," + i
|
|
}(e, t, s),
|
|
n = this._symbolExtrapolators[r];
|
|
return void 0 === n && (n = new o(t, s), this._symbolExtrapolators[r] = n), n
|
|
}, T.prototype._barsCoefficients = function(e, t) {
|
|
if (void 0 === S(e).type) return {};
|
|
var i = e + t;
|
|
return this._barsCoefficientsCache[i] || (this._barsCoefficientsCache[i] = {}), this
|
|
._barsCoefficientsCache[i]
|
|
}, T.prototype.destroy = function() {
|
|
this._cachedDatafeed.destroy(), this._externalDatafeed = null, Object.keys(this
|
|
._pointsetsManagers).forEach((function(e) {
|
|
this._pointsetsManagers[e].destroy()
|
|
}), this), this._pointsetsManagers = {}
|
|
}, T.prototype.purgeCache = function() {
|
|
this._endOfData = {}, this._resolveRequests = {}, this._objectsDataCache = {}, this
|
|
._studiesNonSeriesTimes = {}, this._studiesCache = {}, this
|
|
._resolvePromisesBySymbolId.clear(), this._symbolIdToSymbolRequestString.clear(),
|
|
Object.keys(this._pointsetsManagers).forEach((function(e) {
|
|
this._pointsetsManagers[e].destroy()
|
|
}), this), this._pointsetsManagers = {}, Object.keys(this._timeScales).forEach((
|
|
function(e) {
|
|
this._timeScales[e].destroy()
|
|
}), this), this._timeScales = {}, Object.keys(this._symbolExtrapolators)
|
|
.forEach((function(e) {
|
|
this._symbolExtrapolators[e].destroy()
|
|
}), this), this._symbolExtrapolators = {}
|
|
}, T.prototype.purgeDataCache = function() {
|
|
this._cachedDatafeed.purgeCache()
|
|
}, T.prototype._logMessage = function(e) {
|
|
P.enabled("charting_library_debug_mode") && console.log(e)
|
|
},
|
|
T.prototype.on = function(e, t) {
|
|
return this._callbacks.hasOwnProperty(e) || (this._callbacks[e] = []), this._callbacks[
|
|
e].push(t), this
|
|
}, T.prototype._fireEvent = function(e, t, i) {
|
|
if (this._callbacks.hasOwnProperty(e)) {
|
|
for (var s = this._callbacks[e], r = 0; r < s.length; ++r) s[r](t);
|
|
i || (this._callbacks[e] = [])
|
|
}
|
|
}, T.prototype._adoptConfigurationData = function(e) {
|
|
var t = TradingView.merge({}, e),
|
|
i = t.supported_resolutions;
|
|
if (!i || 0 === i.length) return t.supported_resolutions = void 0, t;
|
|
for (var s = [], r = 0; r < i.length; r++) {
|
|
var n = i[r];
|
|
if (-1 !== s.indexOf(n)) throw new Error("Duplicating resolution `" + n + "`");
|
|
s.push(n)
|
|
}
|
|
return t.supported_resolutions = s, t
|
|
}, T.prototype.supportedResolutions = function() {
|
|
return this._datafeedConfiguration.supported_resolutions
|
|
}, T.prototype.supportedCurrencies = function() {
|
|
return this._datafeedConfiguration.currency_codes || []
|
|
}, T.prototype.supportedUnits = function() {
|
|
return this._datafeedConfiguration.units || []
|
|
}, T.prototype.supportedSymbolsTypes = function() {
|
|
return this._datafeedConfiguration.symbols_types || []
|
|
}, T.prototype.supportedExchangesList = function() {
|
|
return this._datafeedConfiguration.exchanges || []
|
|
}, T.prototype.symbolsGrouping = function() {
|
|
return this._datafeedConfiguration.symbols_grouping || {
|
|
futures: /$a/
|
|
}
|
|
}, T.prototype._findStudyObject = function(e) {
|
|
e.endsWith("!") && (e = e.slice(0, -1));
|
|
var t = e.split("@")[0],
|
|
i = JSServer.studyLibrary.filter((function(i) {
|
|
return i.metainfo.id === e || i.metainfo.shortDescription === t
|
|
}));
|
|
return 0 === i.length ? null : i[0]
|
|
}, T.prototype.getMarks = function(e, t, i, s, r) {
|
|
var n = {
|
|
red: 6,
|
|
green: 5,
|
|
blue: 4,
|
|
yellow: 3
|
|
};
|
|
if (this._externalDatafeed.getMarks && this._datafeedConfiguration.supports_marks) {
|
|
this._logMessage(
|
|
"Requesting bars marks: symbol {0}, resolution {1}, range [{2} ... {3}]"
|
|
.format(e.full_name, r, new Date(1e3 * t).toUTCString(), new Date(1e3 * i)
|
|
.toUTCString()));
|
|
var o = this;
|
|
this._externalDatafeed.getMarks(e, t, i, (function(t) {
|
|
var i = t.map((function(e) {
|
|
return e.time = parseInt(e.time), e
|
|
}));
|
|
o._logMessage(
|
|
"Received bars marks: symbol {0}, resolution {1}, marks {2}"
|
|
.format(e.full_name, r, JSON.stringify(i)));
|
|
var a = h(r, e),
|
|
l = P.enabled("two_character_bar_marks_labels"),
|
|
c = i.map((function(e) {
|
|
return e.tickmark = null !== a ? a
|
|
.timeToSessionStart(1e3 * e.time) / 1e3 : e
|
|
.time, e.direction = n[e.color], e.onClicked =
|
|
function() {
|
|
d.emit("onMarkClick", e.id)
|
|
}, e.label = !!e.label && (l ? e.label.slice(0,
|
|
2) : e.label[0]), e
|
|
}));
|
|
s(c)
|
|
}), r)
|
|
}
|
|
}, T.prototype.getTimescaleMarks = function(e, t, i, s, r) {
|
|
if (this._externalDatafeed.getTimescaleMarks && this._datafeedConfiguration
|
|
.supports_timescale_marks) {
|
|
this._logMessage(
|
|
"Requesting timescale marks: symbol {0}, resolution {1}, range [{2} ... {3}]"
|
|
.format(e.full_name, r, new Date(1e3 * t).toUTCString(), new Date(1e3 * i)
|
|
.toUTCString()));
|
|
var n = this;
|
|
this._externalDatafeed.getTimescaleMarks(e, t, i, (function(t) {
|
|
n._logMessage(
|
|
"Received timescale marks: symbol {0}, resolution {1}, marks {2}"
|
|
.format(e.full_name, r, JSON.stringify(t)));
|
|
var i = h(r, e),
|
|
o = t.map((function(e) {
|
|
return e.tickmark = null !== i ? i
|
|
.timeToSessionStart(1e3 * e.time) / 1e3 : e
|
|
.time, e
|
|
}));
|
|
s(o)
|
|
}), r)
|
|
}
|
|
}, T.prototype.getSeriesLastBarTime = function(e, t) {
|
|
var i = this._getSeriesData(e, t);
|
|
return null === i || 0 === i.length ? null : i[i.length - 1].timeMs
|
|
}, T.prototype.getSeriesInterval = function(e, t) {
|
|
var i = this._studiesCache[e][t];
|
|
return i ? i.resolution : null
|
|
}, T.prototype.getSeriesSymbolInfo = function(e, t) {
|
|
var i = this._studiesCache[e][t];
|
|
return i ? i.symbolInfo : null
|
|
}, T.prototype.getSeriesInterval = function(e, t) {
|
|
var i = this._studiesCache[e][t];
|
|
return i ? i.resolution : null
|
|
}, T.prototype.getSeriesSymbolInfo = function(e, t) {
|
|
var i = this._studiesCache[e][t];
|
|
return i ? i.symbolInfo : null
|
|
}, T.prototype._getSeriesData = function(e, t) {
|
|
return this._objectsDataCache[I(e, t)] || null
|
|
}, T.prototype._computeStudy = async function(e, t, i, s, n, o, a, l, c, d) {
|
|
var p = !0,
|
|
_ = [];
|
|
null !== l && (this._objectsDataCache[l] = null);
|
|
var m = this._computeStudyCounter++;
|
|
|
|
function f(e, t) {
|
|
if (e < c()) return -5e6;
|
|
if (0 === t) return 0;
|
|
var i = _[t - 1].index;
|
|
return -5e6 === i ? 0 : i + 1
|
|
}
|
|
var b = new Map;
|
|
var v = !1,
|
|
S = this,
|
|
y = function() {
|
|
return S._studiesCache[e] && S._studiesCache[e][n] && S._studiesCache[e][n]
|
|
.activeResolve === m
|
|
};
|
|
S._studiesCache[e][n].activeResolve = m;
|
|
var w, C, T = this._resolvePromisesBySymbolId.get(x(e, i));
|
|
if (void 0 === T) throw new Error("This should never happen");
|
|
try {
|
|
var I = await T;
|
|
w = I.symbolInfo, C = I.requestedSymbol
|
|
} catch (e) {
|
|
return void(y() && d.onSymbolErrorCallback(e))
|
|
}
|
|
y() && function(i, c) {
|
|
if (!u.parse(s).isIntraday() || i.has_intraday) {
|
|
if (u.isDWM(s) && void 0 !== a.to) {
|
|
var m = h(s, i);
|
|
null !== m && (a.to = m.timeToExchangeTradingDay(a.to))
|
|
}
|
|
try {
|
|
var y = new r.StudyEngine({
|
|
tickerid: c,
|
|
symbolInfo: i,
|
|
period: s,
|
|
body: t,
|
|
sessionId: e,
|
|
onErrorCallback: d.onErrorCallback,
|
|
dataRange: a,
|
|
forceAlignBars: !P.enabled(
|
|
"disable_sameinterval_aligning") && g(),
|
|
input: function(e) {
|
|
return o[e]
|
|
},
|
|
out: function(e, t) {
|
|
! function(e, t, i) {
|
|
for (var s = e.time, r = "number" ==
|
|
typeof t ? [t] : t, n = 0; n < r
|
|
.length; ++n) {
|
|
var o = r[n];
|
|
o && "object" == typeof o && (b.set(n, o
|
|
.offset), o = o.value),
|
|
"number" == typeof o && isNaN(o) &&
|
|
(o = void 0), r[n] = o
|
|
}
|
|
var a = _.length - 1,
|
|
l = a < 0 || s > _[a].timeMs;
|
|
l ? _.push({
|
|
index: f(s, _.length),
|
|
value: [s / 1e3].concat(r),
|
|
timeMs: s
|
|
}) : (_[a].index = f(s, a), _[a]
|
|
.value = [s / 1e3].concat(r), _[a]
|
|
.timeMs = s), p || d
|
|
.onRealtimeCallback([_[_.length - 1]],
|
|
l, _.length, b, i)
|
|
}(e, t, i)
|
|
},
|
|
nonseriesOut: function(e, t) {
|
|
d.onNonSeriesDataUpdate(t, i)
|
|
},
|
|
setNoMoreData: function() {
|
|
v = !0
|
|
},
|
|
recalc: function(e, s) {
|
|
p = !1, _.endOfData = v, t.error && null !== t
|
|
.error() || (null !== l && (S
|
|
._objectsDataCache[l] = _), d
|
|
.onDataReadyCallback(_, b, i, s))
|
|
}
|
|
});
|
|
if (!S._studiesCache[e] || !S._studiesCache[e][n]) throw Error(
|
|
"This should never happen");
|
|
S._studiesCache[e][n].engine = y
|
|
} catch (e) {
|
|
if (!e.studyError) throw e;
|
|
d.onErrorCallback(e.message)
|
|
}
|
|
} else d.onErrorCallback(
|
|
"Unsupported resolution. Did you forget to set has_intraday to true?"
|
|
)
|
|
}(w, C)
|
|
}, T.prototype._createStudy = function(e, t, i, s, r, n, o, a) {
|
|
var l = this;
|
|
|
|
function c(e, t, i) {
|
|
e = C(e), l._timeScales[s].fillIndexesInRows(e), TradingView
|
|
.ChartapiMessagerInstances[s].onDataUpdate(r, n, e, t), TradingView
|
|
.ChartapiMessagerInstances[s].onStudyCompleted(r, n)
|
|
}
|
|
|
|
function h(e) {
|
|
var t = {};
|
|
if (0 !== e.size) {
|
|
var i = {},
|
|
n = l._studiesCache[s][r].metainfo;
|
|
e.forEach((function(e, t) {
|
|
i[n.plots[t].id] = e
|
|
})), t.data = {
|
|
offsets: i
|
|
}
|
|
}
|
|
return t
|
|
}
|
|
a = function(e) {
|
|
if (Array.isArray(e)) return e;
|
|
for (var t = [], i = l._studiesCache[s][r].metainfo.inputs, n = 0; n < i
|
|
.length; n++) t[n] = e[i[n].id];
|
|
return t
|
|
}(a), TradingView.ChartapiMessagerInstances[s].onStudyLoading(r, n);
|
|
var u = null,
|
|
d = !1;
|
|
l._computeStudy(s, i, e, t, r, a, this._seriesDataRange(s, o), null, (function() {
|
|
if (null === u) {
|
|
var e = l._getSeriesData(s, o)[0];
|
|
if (void 0 === e) return 1 / 0;
|
|
u = e.timeMs
|
|
}
|
|
return u
|
|
}), {
|
|
onDataReadyCallback: function(e, t, i) {
|
|
d && 0 === e.length || c(e, h(t))
|
|
},
|
|
onRealtimeCallback: function(e, t, i, o, a) {
|
|
e = C(e), l._timeScales[s].fillIndexesInRows(e), TradingView
|
|
.ChartapiMessagerInstances[s].onDataUpdate(r, n, e, h(o))
|
|
},
|
|
onSymbolErrorCallback: function() {
|
|
TradingView.ChartapiMessagerInstances[s].onStudyError(r, n,
|
|
"error in series")
|
|
},
|
|
onErrorCallback: function(e) {
|
|
TradingView.ChartapiMessagerInstances[s].onStudyError(r, n, e)
|
|
},
|
|
onNonSeriesDataUpdate: function(e, t) {
|
|
switch (d = !0, e.type) {
|
|
case "projection":
|
|
break;
|
|
case "study_graphics":
|
|
var i = {
|
|
data: e.data,
|
|
indexes: []
|
|
},
|
|
n = w(i);
|
|
l._studiesNonSeriesTimes[s][r] = n, i.indexes = l
|
|
._timeScales[s].convertTimesToIndexes(n), c([], i);
|
|
break;
|
|
case "non_series_data":
|
|
n = function(e) {
|
|
var t = {};
|
|
p(e, (function(e) {
|
|
_(e) && Object.keys(e).forEach((
|
|
function(i) {
|
|
i.endsWith(
|
|
"__t"
|
|
) &&
|
|
(t[e[i]] = !
|
|
0)
|
|
}))
|
|
}), {
|
|
visitInstances: !0
|
|
});
|
|
var i = Object.keys(t).map(Number).sort((
|
|
function(e, t) {
|
|
return e - t
|
|
}));
|
|
return i.forEach((function(e, i) {
|
|
t[e] = i
|
|
})), Object.assign(e, p(e, (function(e) {
|
|
return _(e) && Object.keys(
|
|
e).forEach((
|
|
function(i) {
|
|
i.endsWith(
|
|
"__t"
|
|
) &&
|
|
(e[i.slice(0,
|
|
-
|
|
3
|
|
)] =
|
|
t[e[
|
|
i
|
|
]]
|
|
)
|
|
})), e
|
|
}), {
|
|
visitInstances: !0
|
|
})), i
|
|
}(i = {
|
|
data: e.data,
|
|
indexes: []
|
|
});
|
|
l._studiesNonSeriesTimes[s][r] = n, i.indexes = l
|
|
._timeScales[s].convertTimesToIndexes(n), c([], i);
|
|
break;
|
|
default:
|
|
console.warn(
|
|
"unsupported non-series data type for study " +
|
|
e.type)
|
|
}
|
|
}
|
|
})
|
|
}, T.prototype.onSessionSeriesError = function(e) {
|
|
this.stopSources(e);
|
|
var t = this._mainSeriesRecord(e);
|
|
null !== t && (t.error = !0), this._applyTimeScaleUpdate(e, this._timeScales[e]
|
|
.clearTimeScale())
|
|
}, T.prototype.modifySeries = function(e, t, i, s, r) {
|
|
var n = this._mainSeriesRecord(e);
|
|
if (null === n || n.guid !== t) {
|
|
if (null !== n && n.error) return this._studiesCache[e][t].symbolId = i, this
|
|
._studiesCache[e][t].resolution = s, void(this._studiesCache[e][t]
|
|
.turnaround = r);
|
|
for (var o in this._stopSourcesTree(e, t), this.createSeries(e, t, r, i, s, {
|
|
countBack: 0
|
|
}, !0), this._studiesCache[e]) {
|
|
var a = this._studiesCache[e][o];
|
|
if (a && "study" === a.type && a.parentId === t) {
|
|
this._studiesNonSeriesTimes[e][o] = null;
|
|
var l = this._studiesCache[e][a.parentId];
|
|
this._createStudy(l.symbolId, l.resolution, a.studyObject, e, o, a
|
|
.turnaround, a.parentId, a.inputs)
|
|
}
|
|
}
|
|
} else this._modifyMainSeries(e, i, s, r)
|
|
}, T.prototype._modifyMainSeries = function(e, t, i, s) {
|
|
this.stopSources(e);
|
|
var r = this._mainSeriesRecord(e);
|
|
for (var n in this._studiesCache[e]) {
|
|
(o = this._studiesCache[e][n]) && "series" === o.type && (o.guid === r.guid ?
|
|
this.createSeries(e, r.guid, s, t, i, {
|
|
countBack: 0
|
|
}, !0) : this.createSeries(e, o.guid, o.turnaround, o.symbolId, i, {
|
|
countBack: 0
|
|
}, !0))
|
|
}
|
|
for (var n in this._studiesCache[e]) {
|
|
var o;
|
|
if ((o = this._studiesCache[e][n]) && "study" === o.type) {
|
|
this._studiesNonSeriesTimes[e][n] = null;
|
|
var a = this._studiesCache[e][o.parentId];
|
|
this._createStudy(a.symbolId, a.resolution, o.studyObject, e, n, o
|
|
.turnaround, o.parentId, o.inputs)
|
|
}
|
|
}
|
|
this._applyTimeScaleUpdate(e, this._timeScales[e].clearTimeScale())
|
|
}, T.prototype.stopSources = function(e) {
|
|
for (var t in this._studiesCache[e]) {
|
|
var i = this._studiesCache[e][t];
|
|
i && "series" === i.type && this._stopSourcesTree(e, t)
|
|
}
|
|
}, T.prototype._stopSourcesTree = function(e, t) {
|
|
for (var i in this._studiesCache[e]) {
|
|
var s = this._studiesCache[e][i];
|
|
s && (("series" === s.type && i === t || "study" === s.type && s.parentId ===
|
|
t) && (s.engine && s.engine.isStarted() && s.engine.stop(), s
|
|
.activeResolve = -1))
|
|
}
|
|
n.unsubscribeUnused()
|
|
}, T.prototype._recreateSourcesForDataRange = function(e, t) {
|
|
var i = [];
|
|
for (var s in this._studiesCache[e]) {
|
|
(r = this._studiesCache[e][s]) && "series" === r.type && !this._isEndOfData(e,
|
|
s, r.turnaround) && (this._stopSourcesTree(e, s), i.push(s))
|
|
}
|
|
for (var s in i.forEach((function(i) {
|
|
this._startSourcesTree(e, i, Object.assign({}, t))
|
|
}), this), this._studiesCache[e]) {
|
|
var r;
|
|
"series" === (r = this._studiesCache[e][s]).type && this._isEndOfData(e, s, r
|
|
.turnaround) && TradingView.ChartapiMessagerInstances[e]
|
|
.onSeriesCompleted(s, r.turnaround, r.engine.runner.host.symbolInfo
|
|
.data_status)
|
|
}
|
|
this._updateTimeScaleState(e)
|
|
}, T.prototype._startSourcesTree = function(e, t, i) {
|
|
var s = this._studiesCache[e][t];
|
|
for (var r in this.createSeries(e, t, s.turnaround, s.symbolId, s.resolution, i, !
|
|
0), this._studiesCache[e]) {
|
|
var n = this._studiesCache[e][r];
|
|
n && "study" === n.type && n.parentId === t && this._createStudy(s.symbolId, s
|
|
.resolution, n.studyObject, e, r, n.turnaround, n.parentId, n.inputs)
|
|
}
|
|
}, T.prototype.removeStudy = function(e, t) {
|
|
this._studiesCache[e] && this._studiesCache[e][t] && this._studiesCache[e][t]
|
|
.engine && (this._studiesCache[e][t].engine.stop(), n.unsubscribeUnused()),
|
|
delete this._studiesCache[e][t], delete this._studiesNonSeriesTimes[e][t]
|
|
}, T.prototype.removeSeries = function(e, t) {
|
|
this._stopSourcesTree(e, t), delete this._studiesCache[e][t], this
|
|
._updateMainTsBuilder(e), this._timeScales[e].isCompleted() && this._timeScales[
|
|
e].setCompleted(!1);
|
|
var i = this._timeScales[e].setSeriesBarsTimes(t, []);
|
|
this._applyTimeScaleUpdate(e, i), this._updateTimeScaleState(e)
|
|
}, T.prototype.modifyStudy = function(e, t, i, s) {
|
|
var r = this._studiesCache[e][t];
|
|
if (!r) throw Error("This should never happen");
|
|
var o = this._studiesCache[e][r.parentId];
|
|
r.inputs = s, r.turnaround = i, r.engine && (r.engine.stop(), n
|
|
.unsubscribeUnused()), this._studiesNonSeriesTimes[e][t] = null, this
|
|
._createStudy(o
|
|
.symbolId, o.resolution, r.studyObject, e, t, i, r.parentId, s)
|
|
}, T.prototype.createStudy = function(e, t, i, s, r, n) {
|
|
var o = this._studiesCache[e][i],
|
|
a = this._findStudyObject(r);
|
|
if (null === a) return console.warn("Study does not exist: " + r), void TradingView
|
|
.ChartapiMessagerInstances[e].onStudyError(t, s, "unknown study name");
|
|
var l = new a.constructor;
|
|
this._studiesCache[e] = this._studiesCache[e] || {}, this._studiesCache[e][t] = {
|
|
studyObject: l,
|
|
guid: t,
|
|
type: "study",
|
|
inputs: n,
|
|
metainfo: a.metainfo,
|
|
turnaround: s,
|
|
parentId: i
|
|
}, this._studiesNonSeriesTimes[e][t] = null, this._createStudy(o.symbolId, o
|
|
.resolution, l, e, t, s, i, n)
|
|
}, T.prototype.sessionTimeScale = function(e) {
|
|
return this._timeScales[e] || null
|
|
}, T.prototype.isTimeScaleExtendedTo = function(e, t) {
|
|
var i = this._mainSeriesRecord(e);
|
|
if (u.isDWM(i.resolution) && null != i.symbolInfo) {
|
|
var s = h(i.resolution, i.symbolInfo);
|
|
null !== s && (t = s.timeToSessionStart(t))
|
|
}
|
|
var r = this._timeScales[e].indexOfTime(t);
|
|
return null !== r && r.index >= 0
|
|
}, T.prototype.ensureExtendedTo = function(e, t, i) {
|
|
if (!this._studiesCache[t][e]) throw Error("This should never happen");
|
|
var s = this;
|
|
setTimeout((function() {
|
|
s._recreateSourcesForDataRange(t, {
|
|
to: i
|
|
})
|
|
}), 0)
|
|
}, T.prototype.extendSeriesRange = function(e, t) {
|
|
var i = this._timeScales[e].firstSeriesBarTime();
|
|
if (null !== i) {
|
|
var s = this._mainSeriesRecord(e);
|
|
if (u.isDWM(s.resolution) && null != s.symbolInfo) {
|
|
var r = h(s.resolution, s.symbolInfo);
|
|
null !== r && (i = r.timeToExchangeTradingDay(i))
|
|
}
|
|
var n = this._symbolIdToSymbolRequestString.get(x(e, s.symbolId)),
|
|
o = this._barsCoefficients(n, s.resolution),
|
|
a = o.barsCoefficient || 1;
|
|
if (!o.barsCoefficient) {
|
|
var l = this._getSeriesData(e, s.guid);
|
|
null !== l && (o.expectedBarsCount = l.length + t)
|
|
}
|
|
var c = this;
|
|
setTimeout((function() {
|
|
c._recreateSourcesForDataRange(e, {
|
|
to: i,
|
|
countBack: (t + 2) * a
|
|
})
|
|
}), 0)
|
|
} else this._logMessage("Nothing to extend - there is no points on time scale")
|
|
}, T.prototype.seriesTurnaround = function(e, t) {
|
|
return this._studiesCache[e] && this._studiesCache[e][t] && this._studiesCache[e][t]
|
|
.turnaround
|
|
}, T.prototype._seriesDataRange = function(e, t) {
|
|
var i = this._studiesCache[e][t];
|
|
return null !== i.firstLoadedTimeMs ? {
|
|
to: i.firstLoadedTimeMs,
|
|
countBack: 0
|
|
} : i.dataRange
|
|
}, T.prototype._applyTimeScaleUpdate = function(e, t) {
|
|
if (null !== t) {
|
|
var i = [];
|
|
for (var s in this._studiesCache[e]) {
|
|
var r = this._studiesCache[e][s];
|
|
if (r && "study" === r.type) {
|
|
var n = this._studiesNonSeriesTimes[e][s];
|
|
if (n) {
|
|
var o = {
|
|
indexes: this._timeScales[e].convertTimesToIndexes(n),
|
|
data: {
|
|
indexes_replace: !0
|
|
}
|
|
};
|
|
i.push({
|
|
objId: s,
|
|
turnaround: r.turnaround,
|
|
data: [],
|
|
nonSeriesData: o
|
|
})
|
|
}
|
|
}
|
|
}
|
|
TradingView.ChartapiMessagerInstances[e].onTimescaleUpdate(t, i), Promise
|
|
.resolve().then(function() {
|
|
var t = this._mainSeriesRecord(e);
|
|
if (null !== t && null != t.symbolInfo) {
|
|
var i = this._getSymbolExtrapolator(e, t.symbolInfo, t
|
|
.resolution);
|
|
this._pointsetsManagers[e].getUpdatesForSymbol(t.symbolInfo
|
|
.full_name, t.resolution, i, this._timeScales[e])
|
|
.forEach((function(t, i) {
|
|
TradingView.ChartapiMessagerInstances[e]
|
|
.onPointsetDataUpdate(i, null, t)
|
|
}))
|
|
}
|
|
}.bind(this))
|
|
}
|
|
}, T.prototype._updateMainTsBuilder = function(e) {
|
|
var t = this._mainSeriesRecord(e);
|
|
if (null !== t && null != t.symbolInfo) {
|
|
var i = this._getSymbolExtrapolator(e, t.symbolInfo, t.resolution);
|
|
this._timeScales[e].setMainSymbolExtrapolator(i)
|
|
}
|
|
}, T.prototype._updateTimeScaleState = function(e) {
|
|
var t = !0,
|
|
i = !0;
|
|
for (var s in this._studiesCache[e]) {
|
|
var r = this._studiesCache[e][s];
|
|
"series" === r.type && (i = i && this._isEndOfData(e, s, r.turnaround), t = t &&
|
|
r.completed)
|
|
}
|
|
this._timeScales[e].isCompleted() !== t && (this._timeScales[e].setCompleted(t),
|
|
t && TradingView.ChartapiMessagerInstances[e].onTimescaleCompleted(i))
|
|
}, T.prototype._mainSeriesRecord = function(e) {
|
|
var t = null,
|
|
i = null;
|
|
for (var s in this._studiesCache[e]) {
|
|
var r = this._studiesCache[e][s];
|
|
if ("series" === r.type && (null === t && (t = r), r.isMain)) {
|
|
i = r;
|
|
break
|
|
}
|
|
}
|
|
return null === i && (i = t), null !== i && (i.isMain = !0), i
|
|
}, T.prototype._seriesCount = function(e) {
|
|
var t = 0;
|
|
for (var i in this._studiesCache[e]) {
|
|
"series" === this._studiesCache[e][i].type && (t += 1)
|
|
}
|
|
return t
|
|
}, T.prototype._prepareSeriesNonSeriesData = function(e, t, i) {
|
|
var s = i.data[i.data.length - 1],
|
|
r = this._getSeriesData(e, t),
|
|
n = null === r ? [] : i.data;
|
|
return {
|
|
data: {
|
|
data: {
|
|
reversalAmount: i.reversalAmount,
|
|
boxSize: i.boxSize,
|
|
price: s ? s[4] : i.price,
|
|
bars: n.map((function(e, t) {
|
|
return {
|
|
time: t,
|
|
open: e[1],
|
|
high: e[2],
|
|
low: e[3],
|
|
close: e[4],
|
|
volume: e[5],
|
|
factor: e[6],
|
|
additionalPrice: e[6]
|
|
}
|
|
}))
|
|
}
|
|
},
|
|
indexes: this._timeScales[e].convertTimesToIndexes(n.map((function(e) {
|
|
var t = e[0] || 0;
|
|
return t < 0 ? r[r.length + t].timeMs : i.projectionTime + t
|
|
})))
|
|
}
|
|
}, T.prototype.createSeries = function(e, t, i, s, n, o, a) {
|
|
this._setEndOfData(e, t, i, !1);
|
|
var l = new r.OHLCV;
|
|
this._studiesCache[e] = this._studiesCache[e] || {};
|
|
var c = this._getSeriesData(e, t),
|
|
h = this._studiesCache[e][t],
|
|
d = this._seriesCount(e),
|
|
p = this._mainSeriesRecord(e);
|
|
if (!h || u.isEqual(h.resolution, n) && h.symbolId === s) void 0 !== o.countBack &&
|
|
null !== c && 0 !== c.length && (o.to = c[0].timeMs), h && null != h
|
|
.firstLoadedTimeMs ? o.to = void 0 !== o.to ? Math.min(h.firstLoadedTimeMs, o
|
|
.to) : h.firstLoadedTimeMs : h || 0 === d || null !== p && (null != p
|
|
.firstLoadedTimeMs ? (o.to = p.firstLoadedTimeMs, o.countBack = 0) : o =
|
|
Object.assign({}, p.dataRange));
|
|
else if (1 === d) void 0 !== o.countBack && null !== c && (o.countBack += c.length);
|
|
else {
|
|
var _ = this._timeScales[e].firstSeriesBarTime();
|
|
(void 0 === o.to || null !== _ && _ < o.to) && (o.to = _, o.countBack = 0)
|
|
}
|
|
if (void 0 === o.countBack && (o.countBack = 0), void 0 === o.to && 0 === o
|
|
.countBack && (o.countBack = 100), this._studiesCache[e][t] = {
|
|
symbolId: s,
|
|
resolution: n,
|
|
studyObject: l,
|
|
guid: t,
|
|
type: "series",
|
|
turnaround: i,
|
|
dataRange: o,
|
|
firstLoadedTimeMs: null,
|
|
symbolInfo: null,
|
|
isMain: h && h.isMain || 0 === d,
|
|
completed: !1
|
|
}, null === p || p.guid === t || !p.error) {
|
|
this._updateMainTsBuilder(e), this._updateTimeScaleState(e), TradingView
|
|
.ChartapiMessagerInstances[e].onSeriesLoading(t, i);
|
|
var m = this;
|
|
this._computeStudy(e, l, s, n, t, [], o, I(e, t), (function() {
|
|
return -1 / 0
|
|
}), {
|
|
onDataReadyCallback: function(r, o, l, c) {
|
|
var h = m._studiesCache[e][t];
|
|
if (!h) throw Error("This should never happen");
|
|
if (h.symbolInfo = l, h.firstLoadedTimeMs = c
|
|
.firstLoadedTimeMs, h.completed = !0, m
|
|
._updateMainTsBuilder(e), a && m._pointsetsManagers[e]
|
|
.invalidatePointsetsForSymbol(l.full_name, n), 0 !== r
|
|
.length) {
|
|
var u = m._symbolIdToSymbolRequestString.get(x(e, s)),
|
|
d = m._barsCoefficients(u, n);
|
|
d.expectedBarsCount && d.barsCount && (d
|
|
.barsCoefficient = Math.min(Math.max(d
|
|
.barsCoefficient || 1, parseInt(d
|
|
.expectedBarsCount / (r.length - d
|
|
.barsCount) + .5)), 100)), d
|
|
.barsCount = r.length, m._clearSeriesData(e, t)
|
|
} else !c.endOfData && h.isMain && setTimeout((function() {
|
|
m._studiesCache[e] && m
|
|
._recreateSourcesForDataRange(e, {
|
|
countBack: 10
|
|
})
|
|
}), 0);
|
|
f(l), c.endOfData && (m._logMessage(
|
|
"Series has no more data on server: {0}".format(
|
|
l.full_name)), m._setEndOfData(e, t, i)), 0 ===
|
|
r.length && m._clearSeriesData(e, t), TradingView
|
|
.ChartapiMessagerInstances[e].onSeriesCompleted(t, i, l
|
|
.data_status), m._updateTimeScaleState(e)
|
|
},
|
|
onRealtimeCallback: function(s, r, n, o, a) {
|
|
f(a, s), m._timeScales[e].fillIndexesInRows(s);
|
|
var l = s[s.length - 1];
|
|
if (r) {
|
|
if (!m._studiesCache[e][t]) throw Error(
|
|
"This should never happen");
|
|
m._logMessage("New bar arrived: symbol {0}, bar {1}"
|
|
.format(a.full_name, JSON.stringify(l)))
|
|
} else m._logMessage("Last bar update: symbol {0}, bar {1}"
|
|
.format(a.full_name, JSON.stringify(l))),
|
|
TradingView.ChartapiMessagerInstances[e].onDataUpdate(t,
|
|
i, s, null);
|
|
m._fireEvent("realtime_tick", s[s.length - 1], !0)
|
|
},
|
|
onSymbolErrorCallback: function(t) {
|
|
m._logMessage("Series symbol resolve error"), TradingView
|
|
.ChartapiMessagerInstances[e].onSymbolError(s, t ||
|
|
"resolve error"), g(t || "resolve error")
|
|
},
|
|
onErrorCallback: function(e) {
|
|
m._logMessage("Series error: " + e), g(e)
|
|
},
|
|
onNonSeriesDataUpdate: function(s, r) {
|
|
if ("projection" !== s.type) throw new Error(
|
|
"unexpected non-series data type for series " +
|
|
s.type);
|
|
var n = m._getSeriesData(e, t);
|
|
if (null !== n) f(r, 0 === n.length ? void 0 : [n[n.length -
|
|
1]], s);
|
|
else {
|
|
s = m._prepareSeriesNonSeriesData(e, t, s);
|
|
TradingView.ChartapiMessagerInstances[e].onDataUpdate(t,
|
|
i, [], s)
|
|
}
|
|
}
|
|
})
|
|
}
|
|
|
|
function f(s, r, o) {
|
|
var a = [];
|
|
if (void 0 !== o) {
|
|
var l = (o.data || []).reduce((function(e, t) {
|
|
return Math.max(e, t[0] || 0)
|
|
}), -1);
|
|
if (null != o.projectionTime)
|
|
for (var c = 0; c <= l; ++c) a.push(o.projectionTime + c)
|
|
}
|
|
var h = null,
|
|
u = null,
|
|
d = s ? m._getSymbolExtrapolator(e, s, n) : null;
|
|
if (void 0 !== r) {
|
|
var p = r.map((function(e) {
|
|
return e.timeMs
|
|
})).concat(a);
|
|
null !== d && d.replaceBarsTimesTail(p, r.length), u = m._timeScales[e]
|
|
.replaceSeriesBarsTimesTail(t, p), h = r
|
|
} else {
|
|
var _ = m._getSeriesData(e, t) || [],
|
|
f = _.map((function(e) {
|
|
return e.timeMs
|
|
})).concat(a);
|
|
null !== d && d.setBarsTimes(f, _.length), u = m._timeScales[e]
|
|
.setSeriesBarsTimes(t, f), h = _
|
|
}
|
|
if (m._applyTimeScaleUpdate(e, u), 0 !== h.length || void 0 !== o) {
|
|
m._timeScales[e].fillIndexesInRows(h);
|
|
var g = void 0 !== o ? m._prepareSeriesNonSeriesData(e, t, o) : null;
|
|
TradingView.ChartapiMessagerInstances[e].onDataUpdate(t, i, h, g)
|
|
}
|
|
}
|
|
|
|
function g(s) {
|
|
var r = m._studiesCache[e][t];
|
|
r.completed = !0, TradingView.ChartapiMessagerInstances[e].onSeriesError(t, i,
|
|
s), P.enabled("clear_bars_on_series_error") && (r.isMain ? m
|
|
.onSessionSeriesError(e) : m._clearSeriesData(e, t))
|
|
}
|
|
}, T.prototype._clearSeriesData = function(e, t) {
|
|
var i = {};
|
|
for (var s in i[t] = {
|
|
turnaround: this._studiesCache[e][t].turnaround
|
|
}, this._studiesCache[e]) {
|
|
var r = this._studiesCache[e][s];
|
|
"study" === r.type && r.parentId === t && (i[s] = {
|
|
turnaround: r.turnaround
|
|
})
|
|
}
|
|
TradingView.ChartapiMessagerInstances[e].onClearData(i)
|
|
}, T.prototype.requestMoreTickmarks = function(e, t) {
|
|
var i = this._timeScales[e];
|
|
i.setMinFutureBarsCount(i.minFutureBarsCount() + t);
|
|
var s = i.firstFutureBarIndex(),
|
|
r = i.tickMarks(s);
|
|
TradingView.ChartapiMessagerInstances[e].onTickmarksUpdated(s, r)
|
|
}, T.prototype.chartCreateSession = function(e) {
|
|
this._pointsetsManagers[e] = new l, this._timeScales[e] = new a, this
|
|
._studiesNonSeriesTimes[e] = {}
|
|
}, T.prototype.chartDeleteSession = function(e) {
|
|
this._pointsetsManagers[e].destroy(), delete this._pointsetsManagers[e], this
|
|
._timeScales[e].destroy(), delete this._timeScales[e], delete this
|
|
._studiesNonSeriesTimes[e]
|
|
}, T.prototype.removePointset = function(e, t) {
|
|
this._pointsetsManagers[e].removePointset(t)
|
|
}, T.prototype.createPointset = async function(e, t, i, s, r) {
|
|
var n, o = this._resolvePromisesBySymbolId.get(x(e, i));
|
|
try {
|
|
n = (await o).symbolInfo
|
|
} catch (e) {
|
|
return
|
|
}
|
|
var a = this._getSymbolExtrapolator(e, n, s);
|
|
if (this._pointsetsManagers[e].createPointset(t, n.full_name, s, r, a), null ===
|
|
this._refreshPointsetsTimerId) {
|
|
var l = this;
|
|
this._refreshPointsetsTimerId = setTimeout((function() {
|
|
l._refreshPointsetsTimerId = null, l._refreshPointsets(l
|
|
._invalidatedPointsetSessions), l
|
|
._invalidatedPointsetSessions.clear()
|
|
}), 0)
|
|
}
|
|
this._invalidatedPointsetSessions.add(e)
|
|
}, T.prototype._refreshPointsets = function(e) {
|
|
var t = this;
|
|
e.forEach((function(e) {
|
|
var i = t._studiesCache[e];
|
|
if (null != i) {
|
|
var s = null;
|
|
for (var r in i) {
|
|
var n = i[r];
|
|
if ("series" === n.type) {
|
|
s = n;
|
|
break
|
|
}
|
|
}
|
|
if (null !== s && null != s.symbolInfo) {
|
|
var o = t._getSymbolExtrapolator(e, s.symbolInfo, s
|
|
.resolution);
|
|
t._pointsetsManagers[e].getUpdatesForSymbol(s.symbolInfo
|
|
.full_name, s.resolution, o, t._timeScales[e])
|
|
.forEach((function(t, i) {
|
|
TradingView.ChartapiMessagerInstances[e]
|
|
.onPointsetDataUpdate(i, null, t)
|
|
}))
|
|
}
|
|
}
|
|
}))
|
|
}, T.prototype.studiesMetadata = function() {
|
|
return 0 === this._metainfoCache.length && (this._metainfoCache = JSServer
|
|
.studyLibrary.map((function(e) {
|
|
return e.metainfo
|
|
})), this._metainfoCache.push({
|
|
palettes: {},
|
|
inputs: [],
|
|
plots: [{
|
|
id: "open",
|
|
type: "line"
|
|
}, {
|
|
id: "high",
|
|
type: "line"
|
|
}, {
|
|
id: "low",
|
|
type: "line"
|
|
}, {
|
|
id: "close",
|
|
type: "line"
|
|
}, {
|
|
id: "volume",
|
|
type: "line"
|
|
}],
|
|
graphics: {},
|
|
_metainfoVersion: 48,
|
|
description: "Unnamed Study",
|
|
format: {
|
|
type: "inherit"
|
|
},
|
|
is_hidden_study: !0,
|
|
is_price_study: !1,
|
|
shortDescription: "Unnamed Study",
|
|
description_localized: "Unnamed Study",
|
|
id: "BarSetHeikenAshi@tv-prostudies",
|
|
shortId: "BarSetHeikenAshi",
|
|
packageId: "tv-basicstudies",
|
|
version: "13",
|
|
fullId: "BarSetHeikenAshi@tv-basicstudies-13",
|
|
productId: "tv-basicstudies",
|
|
name: "BarSetHeikenAshi@tv-basicstudies"
|
|
})), this._metainfoCache
|
|
}, T.prototype.searchSymbols = function(e, t, i, s) {
|
|
this._logMessage(
|
|
"Symbol search requested: search string `{0}`, exchange: `{1}`, type `{2}`"
|
|
.format(e, t, i));
|
|
var r = this;
|
|
this._externalDatafeed.searchSymbols(e, t, i, (function(e) {
|
|
r._logMessage("Symbol search response: {0}".format(JSON
|
|
.stringify(e))), s(e)
|
|
}))
|
|
}, T.prototype.resolveSymbol = function(e, t, i) {
|
|
var s = this;
|
|
this._symbolIdToSymbolRequestString.set(x(e, t), i), this
|
|
._resolvePromisesBySymbolId.set(x(e, t), new Promise((function(r, n) {
|
|
s._resolveSymbolImpl(i, (function(s) {
|
|
TradingView.ChartapiMessagerInstances[e]
|
|
.onSymbolResolved(t, s), r({
|
|
symbolInfo: s,
|
|
requestedSymbol: i
|
|
})
|
|
}), (function(i) {
|
|
TradingView.ChartapiMessagerInstances[e]
|
|
.onSymbolError(t, i), n(i)
|
|
}))
|
|
})))
|
|
}, T.prototype._resolveSymbolImpl = function(e, t, i) {
|
|
v(e) || console.error(
|
|
"Expect to get symbol encoded string, but got the following instead: " +
|
|
e);
|
|
var s = S(e),
|
|
r = "string" == typeof s.symbol ? s : s.symbol,
|
|
n = r.symbol,
|
|
o = r["currency-id"],
|
|
a = r["unit-id"];
|
|
this._resolveSymbolByName(n, {
|
|
currency: o,
|
|
unit: a
|
|
}, t, i)
|
|
}, T.prototype._resolveSymbolByName = function(e, t, i, s) {
|
|
var r, n = t && t.currency,
|
|
o = t && t.unit,
|
|
a = M(e, n, o);
|
|
if (this._resolveRequests[a]) r = this._resolveRequests[a];
|
|
else {
|
|
r = this._resolveSymbolInternal(e, n || void 0, o || void 0), this
|
|
._resolveRequests[a] = r;
|
|
var l = this;
|
|
r.then((function(t) {
|
|
l._resolveRequests[M(e, t.currency_id, t.unit_id)] = r, l
|
|
._resolveRequests[M(y(t, null), t.currency_id, t
|
|
.unit_id)] = r, l._resolveRequests[M(y(t, null), n,
|
|
o)] = r
|
|
})).catch((function() {}))
|
|
}
|
|
r.then(i).catch(s)
|
|
}, T.prototype._resolveSymbolInternal = function(e, t, i) {
|
|
var s = this;
|
|
return new Promise(function(r, n) {
|
|
this._logMessage("Symbol resolve requested: `{0}` ".format(e));
|
|
var o = !0;
|
|
this._externalDatafeed.resolveSymbol(e, (function(t) {
|
|
o && console.warn(
|
|
"`resolveSymbol` should return result asynchronously. Use `setTimeout` with 0 interval to execute the callback function."
|
|
), s._logMessage(
|
|
"Symbol resolved: `{0}`, SymbolInfo in server response {1}"
|
|
.format(e, JSON.stringify(t))),
|
|
function(e) {
|
|
if (e.base_name || (e.base_name = [e.name]),
|
|
e.legs || (e.legs = [e.name]), e
|
|
.exchange || (e.exchange = e[
|
|
"exchange-listed"]), e.full_name ||
|
|
(e.full_name = e.symbol || (e.exchange ?
|
|
e.exchange + ":" + e.name : e
|
|
.name)), e.pro_name || (e.pro_name =
|
|
e.full_name), e.data_status || (e
|
|
.data_status = "streaming"), e
|
|
.ticker || (e.ticker = e.symbol || e
|
|
.name), !e.session && e[
|
|
"session-regular"] && (e.session =
|
|
e["session-regular"]), !e.minmov &&
|
|
e.minmovement && (e.minmov = e
|
|
.minmovement), e.currency_code && (e
|
|
.currency_id = e.currency_code), e
|
|
.original_currency_code && (e
|
|
.original_currency_id = e
|
|
.original_currency_code), e
|
|
.holidays && (e.session_holidays = e
|
|
.holidays), e.supported_resolutions)
|
|
for (var t = 0; t < e
|
|
.supported_resolutions.length; t++
|
|
) {
|
|
var i = u.parse(e
|
|
.supported_resolutions[t]);
|
|
i.isValid() && (e
|
|
.supported_resolutions[t] =
|
|
i.value())
|
|
}
|
|
}(t),
|
|
function(e) {
|
|
function t(e) {
|
|
console.warn("SymbolInfo validation: " +
|
|
e)
|
|
}
|
|
if (e.has_empty_bars && !g() && t(
|
|
'both has_empty_bars field and featureset "disable_resolution_rebuild" are enabled and may cause data issues (see #3329)'
|
|
), (void 0 === e.minmov || e
|
|
.minmov <= 0) && t(
|
|
"minmov must be positive"), (
|
|
void 0 === e.pricescale || e
|
|
.pricescale <= 0) && t(
|
|
"pricescale must be positive"),
|
|
void 0 !== e.name && 0 !== e.name
|
|
.length || t(
|
|
"name must be non-empty string"),
|
|
void 0 !== e.session && 0 !== e.session
|
|
.length || t(
|
|
"session must be non-empty string"),
|
|
void 0 !== e.holidays && t(
|
|
"field holidays is deprecated, use session_holidays instead"
|
|
), void 0 === e.timezone || 0 === e
|
|
.timezone.length ? t(
|
|
"timezone must be non-empty string"
|
|
) : "exchange" !== e.timezone && f(e
|
|
.timezone) || "UTC" !== e
|
|
.timezone && t(
|
|
'unsupported timezone "{0}"'.format(
|
|
e.timezone)), void 0 !== e
|
|
.intraday_multipliers) {
|
|
var i = e.intraday_multipliers;
|
|
if (Array.isArray(i))
|
|
for (var s = 0; s < i.length; ++s)
|
|
"string" != typeof i[s] && t(
|
|
'intraday_multipliers[{0}] = "{1}" must be string (now: {2})'
|
|
.format(s + 1, i[s],
|
|
typeof i[s]));
|
|
else t(
|
|
"intraday_multipliers must be array"
|
|
)
|
|
}(e.supported_resolutions || []).filter((
|
|
function(e) {
|
|
return !u.isValid(e)
|
|
})).forEach((function(e) {
|
|
t("supported_resolutions field contains invalid value: " +
|
|
e)
|
|
}))
|
|
}(t), s._logMessage(
|
|
"Symbol info after post-processing: `{0}`, SymbolInfo {1}"
|
|
.format(e, JSON.stringify(t))), r(t)
|
|
}), (function(t) {
|
|
s._logMessage(
|
|
"Symbol resolve failed: `{0}`, reason: `{1}`"
|
|
.format(e, t)), n(t)
|
|
}), {
|
|
currencyCode: t,
|
|
unitId: i
|
|
}), o = !1
|
|
}.bind(this))
|
|
}, T.prototype._createMarketStatusWatchers = function(e, t) {
|
|
void 0 === this._marketStatusWatchers[e] && (this._marketStatusWatchers[
|
|
e] = {});
|
|
var i = this;
|
|
t.forEach((function(t) {
|
|
void 0 === i._marketStatusWatchers[e][t] && (i
|
|
._marketStatusWatchers[e][t] = new s(i
|
|
._resolveSymbolByName.bind(i), e, t))
|
|
}))
|
|
}, T.prototype._removeMarketStatusWatchers = function(e) {
|
|
var t = this;
|
|
Object.keys(this._marketStatusWatchers[e] || {}).forEach((function(i) {
|
|
t._marketStatusWatchers[e][i].stop()
|
|
})), this._marketStatusWatchers[e] = {}
|
|
},
|
|
T.prototype._stopQuotesSubscription = function(e) {
|
|
this._quotesInfo[e].listenerGUID && (this._externalDatafeed.unsubscribeQuotes(
|
|
this._quotesInfo[e].listenerGUID), this._quotesInfo[e]
|
|
.listenerGUID = void 0), this._removeMarketStatusWatchers(e)
|
|
}, T.prototype._startQuotesSubscription = function(e) {
|
|
var t = {},
|
|
i = this;
|
|
|
|
function s(t, s) {
|
|
var r = i._marketStatusWatchers[e][t.n];
|
|
t.symbolname = t.n, t.status = t.s, t.values = t.v, t.values.change = t.v
|
|
.ch, t.values.last_price = t.v.lp, t.values.change_percent = t.v.chp, t
|
|
.values.current_session = t.v.cs || r && r.marketStatus(), t.values
|
|
.pricescale = s.pricescale, t.values.minmov = s.minmov, t.values
|
|
.minmove2 = s.minmove2 || 0, t.values.fractional = s.fractional || !1,
|
|
r && t.v.cs && r.stop(), TradingView.ChartapiMessagerInstances[e]
|
|
.onQuotesData([e].concat([t]))
|
|
}
|
|
|
|
function r(e) {
|
|
e.forEach((function(e) {
|
|
void 0 !== t[e.n] ? null !== t[e.n] && s(e, t[e.n]) : i
|
|
._resolveSymbolByName(e.n, null, (function(i) {
|
|
t[e.n] = i, s(e, i)
|
|
}), (function() {
|
|
t[e.n] = null
|
|
}))
|
|
}))
|
|
}
|
|
var n = this._quotesInfo[e].symbols;
|
|
0 !== n.length && (this._externalDatafeed.getQuotes && !P.enabled(
|
|
"charting_library") ? this._externalDatafeed.getQuotes(n, (function(
|
|
t) {
|
|
i._quotesInfo[e] && (r(t), i._quotesInfo[e].listenerGUID =
|
|
e, i._externalDatafeed.subscribeQuotes(n, i
|
|
._quotesInfo[e].fastSymbols, r, i._quotesInfo[e]
|
|
.listenerGUID))
|
|
}), (function(e) {})) : !this._externalDatafeed.getQuotes && P.enabled(
|
|
"trading_terminal") && setTimeout((function() {
|
|
r(n.map((function(e) {
|
|
return {
|
|
n: e,
|
|
s: "ok",
|
|
v: {}
|
|
}
|
|
})))
|
|
})), this._createMarketStatusWatchers(e, n))
|
|
}, T.prototype._restartQuotesSubscription = function(e) {
|
|
this._stopQuotesSubscription(e), this._startQuotesSubscription(e)
|
|
}, T.prototype.quoteCreateSession = function(e) {
|
|
this._quotesInfo[e] = {
|
|
symbols: [],
|
|
fastSymbols: [],
|
|
listenerGUID: void 0
|
|
}
|
|
}, T.prototype.quoteDeleteSession = function(e) {
|
|
this._stopQuotesSubscription(e), this._quotesInfo[e] = null
|
|
}, T.prototype.quoteSetFields = function(e, t) {}, T.prototype.quoteAddSymbols =
|
|
function(e, t) {
|
|
this._quotesInfo[e].symbols = this._filteredSymbols(this._quotesInfo[e].symbols
|
|
.concat(t)), this._restartQuotesSubscription(e)
|
|
}, T.prototype.quoteRemoveSymbols = function(e, t) {
|
|
this._quotesInfo[e].symbols = this._quotesInfo[e].symbols.filter((function(e) {
|
|
return t.indexOf(e) < 0
|
|
})), this._restartQuotesSubscription(e)
|
|
}, T.prototype.quoteFastSymbols = function(e, t) {
|
|
this._quotesInfo[e].fastSymbols = this._filteredSymbols(t), this
|
|
._restartQuotesSubscription(e)
|
|
}, T.prototype.quoteHibernateAll = function(e) {}, T.prototype
|
|
._stopDepthSubscription = function(e) {
|
|
this._depthInfo[e].listenerGUID && (this._externalDatafeed.unsubscribeDepth(this
|
|
._depthInfo[e].listenerGUID), this._depthInfo[e].listenerGUID =
|
|
void 0)
|
|
}, T.prototype._startDepthSubscription = function(e) {
|
|
var t = this,
|
|
i = this._depthInfo[e].symbol;
|
|
|
|
function s(e) {
|
|
return e.map((function(e) {
|
|
return {
|
|
p: e.price,
|
|
v: e.volume
|
|
}
|
|
}))
|
|
}
|
|
|
|
function r(e) {
|
|
var t = {};
|
|
return t.s = i, t.bids = s(e.bids), t.asks = s(e.asks), t
|
|
}
|
|
i && this._externalDatafeed.subscribeDepth && (t._depthInfo[e].listenerGUID =
|
|
this._externalDatafeed.subscribeDepth(i, (function(i) {
|
|
var s;
|
|
t._depthInfo[e] && ((s = i).snapshot ? TradingView
|
|
.ChartapiMessagerInstances[e].onDepthData([e]
|
|
.concat([r(s)])) : TradingView
|
|
.ChartapiMessagerInstances[e].onDepthUpdate([e]
|
|
.concat([r(s)])))
|
|
})))
|
|
}, T.prototype._restartDepthSubscription = function(e) {
|
|
this._stopDepthSubscription(e), this._startDepthSubscription(e)
|
|
}, T.prototype.depthCreateSession = function(e) {
|
|
this._depthInfo[e] = {
|
|
symbol: null,
|
|
listenerGUID: void 0
|
|
}
|
|
}, T.prototype.depthDeleteSession = function(e) {
|
|
this._depthInfo[e].symbol = null, this._stopDepthSubscription(e), delete this
|
|
._depthInfo[e]
|
|
}, T.prototype.depthSetSymbol = function(e, t) {
|
|
this._depthInfo[e].symbol = t, this._restartDepthSubscription(e)
|
|
}, T.prototype._filteredSymbols = function(e) {
|
|
var t = [];
|
|
return e.forEach((function(e) {
|
|
e instanceof Object || t.indexOf(e) < 0 && t.push(e)
|
|
})), t
|
|
}, T.prototype._isEndOfData = function(e, t, i) {
|
|
var s = e + "!" + t + "@" + i;
|
|
return !!this._endOfData[s]
|
|
}, T.prototype._setEndOfData = function(e, t, i, s) {
|
|
var r = e + "!" + t + "@" + i;
|
|
this._endOfData[r] = !1 !== s
|
|
}, T.prototype.serverTimeOffset = function() {
|
|
return this._serverTimeOffset
|
|
}, T.prototype.serverTime = function() {
|
|
return 1e3 * this.getCurrentUTCTime()
|
|
}, T.prototype.getCurrentUTCTime = function() {
|
|
return (new Date).valueOf() / 1e3 + this._serverTimeOffset
|
|
}, T.prototype.switchTimezone = function(e, t) {
|
|
this._timeScales[e].setTimezone(t);
|
|
var i = this._timeScales[e].tickMarks();
|
|
null !== i && TradingView.ChartapiMessagerInstances[e].onTickmarksUpdated(0, i)
|
|
}, e.exports = T
|
|
},
|
|
EX27: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Eyy1").ensureNotNull,
|
|
r = i("IiTo"),
|
|
n = i("LxhU").Interval,
|
|
o = i("EJcV"),
|
|
a = i("MrEN"),
|
|
l = i("XzZr"),
|
|
c = l.ChartApiInterface,
|
|
h = l.HandlerInfo,
|
|
u = i("ogJP").requireFullInterfaceImplementation,
|
|
d = i("txPx").getLogger("Chart.ChartApiLocal"),
|
|
p = i("uDHo").TIMEFRAMETYPE,
|
|
_ = i("OLhd").createDwmAligner;
|
|
TradingView.STUDY_COUNT_LIMIT = 210, JSServer.ChartApi = function(e) {
|
|
this._notificationHandlers = {}, this._sessions = {}, this.studyCounter = 0, this
|
|
._connected = !1, this._enabled = !1, this._studyEngine = new o(e), this
|
|
._callbacks = {}, this._serverTimeOffset = 0;
|
|
var t = this;
|
|
this._studyEngine.on("configuration_received", (function() {
|
|
t._fireEvent("configuration_received")
|
|
})), this._studyEngine.on("realtime_tick", (function(e) {
|
|
var i = {
|
|
time: e.value[0] / 1e3,
|
|
open: e.value[1],
|
|
high: e.value[2],
|
|
low: e.value[3],
|
|
close: e.value[4],
|
|
volume: e.value[5]
|
|
};
|
|
t._fireEvent("realtime_tick", i, !0)
|
|
})), this._setVisibleRangeTimeout = {}
|
|
}, JSServer.ChartApi.prototype.destroy = function() {
|
|
this._studyEngine.destroy(), this._studyEngine = null
|
|
}, JSServer.ChartApi.prototype.purgeCache = function(e) {
|
|
this._studyEngine.purgeCache(), this._studyEngine.purgeDataCache()
|
|
}, JSServer.ChartApi.prototype.defaultWatchlistSymbols = function() {
|
|
return this._watchlistSettings.default_symbols
|
|
}, JSServer.ChartApi.prototype.defaultResolutions = function() {
|
|
return this._studyEngine.supportedResolutions() || ["1", "3", "5", "15", "30", "45",
|
|
"60", "120", "180", "240", "1D", "1W", "1M"
|
|
]
|
|
}, JSServer.ChartApi.prototype.availableCurrencies = function() {
|
|
var e = this._studyEngine.supportedCurrencies().map((function(e) {
|
|
return {
|
|
id: e,
|
|
code: e,
|
|
convertible: !0
|
|
}
|
|
}));
|
|
return Promise.resolve(e)
|
|
}, JSServer.ChartApi.prototype.availableUnits = function() {
|
|
return Promise.resolve(this._studyEngine.supportedUnits())
|
|
}, JSServer.ChartApi.prototype.supportedSymbolsTypes = function() {
|
|
return this._studyEngine.supportedSymbolsTypes()
|
|
}, JSServer.ChartApi.prototype.supportedExchangesList = function() {
|
|
return this._studyEngine.supportedExchangesList()
|
|
}, JSServer.ChartApi.prototype.symbolsGrouping = function() {
|
|
return this._studyEngine.symbolsGrouping()
|
|
}, JSServer.ChartApi.prototype.start = function() {
|
|
this._enabled = !0, this._fireEvent("start_enabled")
|
|
}, JSServer.ChartApi.prototype.unsubscribe = function(e, t) {
|
|
var i = this._callbacks[e];
|
|
i && i.splice(i.indexOf(t), 1)
|
|
}, JSServer.ChartApi.prototype.on = function(e, t) {
|
|
return this._callbacks.hasOwnProperty(e) || (this._callbacks[e] = []), this._callbacks[
|
|
e].push(t), this
|
|
}, JSServer.ChartApi.prototype._fireEvent = function(e, t, i) {
|
|
if (this._callbacks.hasOwnProperty(e)) {
|
|
var s = this._callbacks[e].slice(0);
|
|
i || (this._callbacks[e] = []);
|
|
for (var r = 0; r < s.length; ++r) s[r](t)
|
|
}
|
|
}, JSServer.ChartApi.prototype.chartCreateSession = function(e, t) {
|
|
this._studyEngine.chartCreateSession(e)
|
|
}, JSServer.ChartApi.prototype.chartDeleteSession = function(e) {
|
|
this._studyEngine.chartDeleteSession(e)
|
|
}, JSServer.ChartApi.prototype.createSession = function(e, t) {
|
|
TradingView.ChartapiMessagerInstances[e] = new a(this, e), this._sessions[e] = t, this
|
|
._notificationHandlers[e] = {}, this.connected() && t.onMessage({
|
|
method: "connected",
|
|
params: []
|
|
})
|
|
}, JSServer.ChartApi.prototype.removeSession = function(e) {
|
|
delete this._sessions[e], delete this._notificationHandlers[e], this._studyEngine
|
|
.stopSources(e)
|
|
}, JSServer.ChartApi.prototype.connected = function() {
|
|
return this._connected
|
|
}, JSServer.ChartApi.prototype.connect = function() {
|
|
if (this._enabled) this.connected() || (this._connected = !0, this.sessionid =
|
|
"dummy session id", this._notifySessions({
|
|
method: "connected",
|
|
params: []
|
|
}));
|
|
else {
|
|
var e = this;
|
|
this.on("start_enabled", (function() {
|
|
e.connect()
|
|
}))
|
|
}
|
|
}, JSServer.ChartApi.prototype.disconnect = function() {
|
|
this._connected = !1, this._notifySessions({
|
|
method: "disconnected",
|
|
params: []
|
|
}), this.purgeCache(), this.studyCounter = 0
|
|
}, JSServer.ChartApi.prototype.switchTimezone = function(e, t) {
|
|
this._studyEngine.switchTimezone(e, t)
|
|
}, JSServer.ChartApi.prototype.receiveLocalResponse = function(e) {
|
|
this._dispathNotification(e), this._fireEvent("message_" + e.method, void 0, !0)
|
|
}, JSServer.ChartApi.prototype.getMarks = function(e, t, i, s, r) {
|
|
this._studyEngine.getMarks(e, t, i, s, r)
|
|
}, JSServer.ChartApi.prototype.getTimescaleMarks = function(e, t, i, s, r) {
|
|
this._studyEngine.getTimescaleMarks(e, t, i, s, r)
|
|
}, JSServer.ChartApi.prototype.resolveSymbol = function(e, t, i, s, r) {
|
|
this._notificationHandlers[e][t] = new h(s, t), this._studyEngine.resolveSymbol(e, t, i)
|
|
}, JSServer.ChartApi.prototype._doWhenSeriesDataReceived = function(e, t) {
|
|
TradingView.ChartapiMessagerInstances[e].seriesCompleted.subscribe(null, t, !0)
|
|
}, JSServer.ChartApi.prototype.createSeries = function(e, t, i, s, r, n, o, a) {
|
|
var l = this;
|
|
this._notificationHandlers[e][t] = new h((function(r) {
|
|
"series_completed" === r.method && null !== o && (l._applyTimeFrame(e,
|
|
s, t, i, o), o = null), a(r)
|
|
}), t), this._studyEngine.createSeries(e, t, i, s, r, {
|
|
countBack: n || 300
|
|
})
|
|
}, JSServer.ChartApi.prototype.removeSeries = function(e, t) {
|
|
delete this._notificationHandlers[e][t], this._studyEngine.removeSeries(e, t)
|
|
}, JSServer.ChartApi.prototype.setVisibleTimeRange = function(e, t, i, r, n, o, a, l) {
|
|
var c = r,
|
|
h = !0 !== (a = a || {}).applyDefaultRightMargin && void 0 === a
|
|
.percentRightMargin && void 0 !== n ? n : null,
|
|
u = _(this._studyEngine.getSeriesInterval(e, t), this._studyEngine
|
|
.getSeriesSymbolInfo(e, t));
|
|
null !== u && (c = u.timeToSessionStart(1e3 * c) / 1e3, null !== h && (h = u
|
|
.timeToSessionStart(1e3 * h) / 1e3));
|
|
var d = this;
|
|
|
|
function p() {
|
|
var r = d._studyEngine.sessionTimeScale(e);
|
|
if (null !== r) {
|
|
var n, u = r.indexOfTime(1e3 * c);
|
|
if (null === h) n = r.lastSessionBarIndex();
|
|
else {
|
|
var p = r.indexOfTime(1e3 * h);
|
|
n = p && p.index
|
|
}
|
|
if (null !== u && null !== n) {
|
|
var _ = u.index;
|
|
if (u.timeMs < 1e3 * c && (_ += 1), !1 === o) {
|
|
const e = s(r.firstSessionBarIndex());
|
|
_ < e && (_ = e)
|
|
}
|
|
_ > n || (TradingView.ChartapiMessagerInstances[e].onSeriesTimeframeUpdate(
|
|
t, i, _, n, a), l && setTimeout(l, 0))
|
|
}
|
|
}
|
|
}
|
|
if (this._studyEngine.isTimeScaleExtendedTo(e, 1e3 * r)) p();
|
|
else {
|
|
var m = TradingView.ChartapiMessagerInstances[e].seriesCompleted,
|
|
f = TradingView.ChartapiMessagerInstances[e].seriesError;
|
|
void 0 !== this._setVisibleRangeTimeout[e] && clearTimeout(this
|
|
._setVisibleRangeTimeout[e]), this._setVisibleRangeTimeout[e] = setTimeout(
|
|
function() {
|
|
delete this._setVisibleRangeTimeout[e], m.subscribe(null, g, !0), f
|
|
.subscribe(null, b, !0), this._studyEngine.ensureExtendedTo(t, e,
|
|
1e3 * r)
|
|
}.bind(this), 0)
|
|
}
|
|
|
|
function g(e, s) {
|
|
e === t && s === i && (m.unsubscribe(null, g), f.unsubscribe(null, b), p())
|
|
}
|
|
|
|
function b(e, s) {
|
|
e === t && s === i && m.unsubscribe(null, g)
|
|
}
|
|
}, JSServer.ChartApi.prototype._applyTimeFrame = function(e, t, i, s, o) {
|
|
var a, l, c = {},
|
|
h = !0;
|
|
if (o.type === p.PeriodBack) {
|
|
var u = this._studyEngine.getSeriesLastBarTime(e, i);
|
|
if (null === u) return;
|
|
l = u / 1e3;
|
|
var d = n.parse(o.value),
|
|
m = this._studyEngine.getSeriesSymbolInfo(e, i);
|
|
a = r.alignPeriodsBackForVisibleRange(m.session, m.session_holidays, m.corrections,
|
|
d.letter(), d.multiplier(), 1, u) / 1e3;
|
|
var f = _(this._studyEngine.getSeriesInterval(e, i), m);
|
|
null !== f && (l = f.timeToExchangeTradingDay(1e3 * l) / 1e3, a = f
|
|
.timeToExchangeTradingDay(1e3 * a) / 1e3), c = {
|
|
applyDefaultRightMargin: !0
|
|
}, h = !1
|
|
} else a = o.from, l = o.to;
|
|
this.setVisibleTimeRange(e, i, s, a, l, h, c)
|
|
}, JSServer.ChartApi.prototype.modifySeries = function(e, t, i, s, r, n, o) {
|
|
var a = this;
|
|
this._notificationHandlers[e][t] = new h((function(r) {
|
|
"series_completed" === r.method && null !== n && (a._applyTimeFrame(e,
|
|
s, t, i, n), n = null), o(r)
|
|
}), t), this._studyEngine.modifySeries(e, t, s, r, i)
|
|
}, JSServer.ChartApi.prototype.requestMoreData = function(e, t) {
|
|
this._studyEngine.extendSeriesRange(e, t)
|
|
}, JSServer.ChartApi.prototype.setStudiesAccessController = function(e) {
|
|
this.studiesAccessController = e
|
|
}, JSServer.ChartApi.prototype.setWatchlistSettings = function(e) {
|
|
this._watchlistSettings = e
|
|
}, JSServer.ChartApi.prototype.allStudiesMetadata = function() {
|
|
return this._studyEngine.studiesMetadata()
|
|
}, JSServer.ChartApi.prototype.requestMetadata = function(e, t, i) {
|
|
this._notificationHandlers[e][t] = new h(i, t);
|
|
var s = this.studiesAccessController.getEnabledTools();
|
|
TradingView.ChartapiMessagerInstances[e].onRequestMetadata(t, s)
|
|
}, JSServer.ChartApi.prototype.isCanCreateStudy = function() {
|
|
return this.studyCounter < TradingView.STUDY_COUNT_LIMIT
|
|
},
|
|
JSServer.ChartApi.prototype.createStudy = function(e, t, i, s, r, n, o) {
|
|
if (!this.isCanCreateStudy()) throw new Error("Exceeded the limit of studies");
|
|
this._notificationHandlers[e][t] = new h(o, t), this._studyEngine.createStudy(e, t, s,
|
|
i, r, n), this.studyCounter++
|
|
}, JSServer.ChartApi.prototype.rebindStudy = function(e, t, i, s, r, n, o, a) {
|
|
throw new Error("Not implemented")
|
|
}, JSServer.ChartApi.prototype.removeStudy = function(e, t, i) {
|
|
delete this._notificationHandlers[e][t], this._studyEngine.removeStudy(e, t), this
|
|
.studyCounter--
|
|
}, JSServer.ChartApi.prototype.modifyStudy = function(e, t, i, s, r) {
|
|
this._notificationHandlers[e][t] = new h(r, t), this._studyEngine.modifyStudy(e, t, i,
|
|
s)
|
|
}, JSServer.ChartApi.prototype.createPointset = function(e, t, i, s, r, n, o) {
|
|
this._notificationHandlers[e][t] = new h(o, t), this._studyEngine.createPointset(e, t,
|
|
s, r, n)
|
|
}, JSServer.ChartApi.prototype.modifyPointset = function(e, t, i, s, r) {
|
|
throw Error("This call is not implemented")
|
|
}, JSServer.ChartApi.prototype.removePointset = function(e, t, i) {
|
|
this._notificationHandlers[e][t] = null, this._studyEngine.removePointset(e, t)
|
|
}, JSServer.ChartApi.prototype.requestMoreTickmarks = function(e, t) {
|
|
this._studyEngine.requestMoreTickmarks(e, t)
|
|
}, JSServer.ChartApi.prototype.requestFirstBarTime = function(e, t, i, s) {
|
|
this._notificationHandlers[e][t] = new h(s, t)
|
|
}, JSServer.ChartApi.prototype._invokeHandler = function(e, t) {
|
|
e && e(t)
|
|
}, JSServer.ChartApi.prototype._sendRequest = function(e, t) {
|
|
throw Error("This method is not implemented")
|
|
}, JSServer.ChartApi.prototype._onMessage = function(e) {
|
|
throw Error("This method is not implemented")
|
|
}, JSServer.ChartApi.prototype._dispathNotification = function(e) {
|
|
var t = e.params.shift();
|
|
if (this._notificationHandlers[t]) switch (e.method) {
|
|
case "timescale_update":
|
|
var i = e.params[0],
|
|
s = e.params[1];
|
|
for (var r in s.clear = 0 === s.changes.length && 0 === s.marks.length, this
|
|
._sessions[t].onMessage({
|
|
method: "timescale_update",
|
|
params: s
|
|
}), i) {
|
|
var n = {
|
|
method: "data_update",
|
|
params: {
|
|
customId: r,
|
|
plots: i[r].series,
|
|
nonseries: i[r].nonseries,
|
|
turnaround: i[r].turnaround
|
|
}
|
|
};
|
|
this._invokeNotificationHandler(t, r, n)
|
|
}
|
|
break;
|
|
case "tickmark_update":
|
|
this._sessions[t].onMessage({
|
|
method: "timescale_update",
|
|
params: e.params[0]
|
|
});
|
|
break;
|
|
case "data_update":
|
|
for (var r in e.params[0]) {
|
|
var o = e.params[0][r];
|
|
n = {
|
|
method: "data_update",
|
|
params: {
|
|
customId: r,
|
|
plots: o.series ? o.series : o.plots,
|
|
nonseries: o.nonseries,
|
|
turnaround: o.turnaround
|
|
}
|
|
};
|
|
this._invokeNotificationHandler(t, r, n)
|
|
}
|
|
break;
|
|
case "index_update":
|
|
for (var r in e.params[0]) {
|
|
n = {
|
|
method: "index_update",
|
|
params: e.params[0][r]
|
|
};
|
|
this._invokeNotificationHandler(t, r, n)
|
|
}
|
|
break;
|
|
case "critical_error":
|
|
d.logNormal(new Date + " critical_error session:" + this.sessionid +
|
|
" reason:" + e.params[0]), this._sessions[t].onMessage({
|
|
method: "critical_error",
|
|
params: e.params
|
|
});
|
|
break;
|
|
case "timescale_completed":
|
|
case "quote_symbol_data":
|
|
case "quote_list_fields":
|
|
case "depth_symbol_error":
|
|
case "depth_symbol_success":
|
|
case "dd":
|
|
case "dpu":
|
|
case "depth_bar_last_value":
|
|
this._sessions[t].onMessage({
|
|
method: e.method,
|
|
params: e.params
|
|
});
|
|
break;
|
|
case "clear_data":
|
|
for (var a in e.params[0]) this._invokeNotificationHandler(t, a, {
|
|
method: "clear_data",
|
|
params: e.params[0][a]
|
|
});
|
|
break;
|
|
default:
|
|
var l = e.params[0];
|
|
this._invokeNotificationHandler(t, l, e)
|
|
}
|
|
}, JSServer.ChartApi.prototype._invokeNotificationHandler = function(e, t, i) {
|
|
if (void 0 !== t) {
|
|
var s = this._notificationHandlers[e][t];
|
|
void 0 !== s && s && this._invokeHandler(s.handler, i)
|
|
}
|
|
}, JSServer.ChartApi.prototype.searchSymbols = function(e, t, i, s, r, n, o, a, l, c) {
|
|
this._studyEngine.searchSymbols(e, t, i, c)
|
|
}, JSServer.ChartApi.prototype._notifySessions = function(e) {
|
|
for (var t in this._sessions) {
|
|
if (!this._sessions.hasOwnProperty(t)) return;
|
|
var i = this._sessions[t];
|
|
"function" == typeof i.onMessage && i.onMessage(e)
|
|
}
|
|
}, JSServer.ChartApi.prototype.unpack = function(e) {
|
|
throw Error("This method is not implemented")
|
|
}, JSServer.ChartApi.prototype.quoteCreateSession = function(e) {
|
|
return this._studyEngine.quoteCreateSession(e)
|
|
}, JSServer.ChartApi.prototype.quoteDeleteSession = function(e) {
|
|
return this._studyEngine.quoteDeleteSession(e)
|
|
}, JSServer.ChartApi.prototype.quoteSetFields = function(e, t) {
|
|
return this._studyEngine.quoteSetFields(e, t)
|
|
}, JSServer.ChartApi.prototype.quoteAddSymbols = function(e, t) {
|
|
return -1 !== t.indexOf(void 0) && (console.warn("Got undefined in quoteAddSymbols"),
|
|
t = t.filter((function(e) {
|
|
return !!e
|
|
}))), this._studyEngine.quoteAddSymbols(e, t)
|
|
}, JSServer.ChartApi.prototype.quoteRemoveSymbols = function(e, t) {
|
|
return this._studyEngine.quoteRemoveSymbols(e, t)
|
|
}, JSServer.ChartApi.prototype.quoteFastSymbols = function(e, t) {
|
|
return this._studyEngine.quoteFastSymbols(e, t)
|
|
}, JSServer.ChartApi.prototype.quoteHibernateAll = function(e) {
|
|
return this._studyEngine.quoteHibernateAll(e)
|
|
}, JSServer.ChartApi.prototype.depthCreateSession = function(e) {
|
|
return this._studyEngine.depthCreateSession(e)
|
|
}, JSServer.ChartApi.prototype.depthDeleteSession = function(e) {
|
|
return this._studyEngine.depthDeleteSession(e)
|
|
}, JSServer.ChartApi.prototype.depthSetSymbol = function(e, t) {
|
|
return this._studyEngine.depthSetSymbol(e, t)
|
|
}, JSServer.ChartApi.prototype.depthClearSymbol = function(e) {}, JSServer.ChartApi
|
|
.prototype.depthSetScale = function(e, t) {}, JSServer.ChartApi.prototype
|
|
.createStudiesAccessController = function(e, t, i) {
|
|
return new this.StudiesAccessController(this._studyEngine, e && JSON.parse(e) || {
|
|
type: "black",
|
|
tools: []
|
|
})
|
|
}, JSServer.ChartApi.prototype.StudiesAccessController = function(e, t) {
|
|
this._studyEngine = e, this._studiesAccess = t
|
|
}, JSServer.ChartApi.prototype.StudiesAccessController.prototype._findTool = function(e) {
|
|
for (var t = null, i = 0; i < this._studiesAccess.tools.length; ++i) {
|
|
var s = this._studiesAccess.tools[i];
|
|
if (s.name === e || s === e) {
|
|
t = s;
|
|
break
|
|
}
|
|
}
|
|
return t
|
|
}, JSServer.ChartApi.prototype.StudiesAccessController.prototype.getEnabledTools =
|
|
function() {
|
|
return this._studyEngine.studiesMetadata().filter((function(e) {
|
|
return this.isToolEnabled(e.description) || e.is_hidden_study
|
|
}), this)
|
|
}, JSServer.ChartApi.prototype.StudiesAccessController.prototype.isToolEnabled = function(
|
|
e) {
|
|
var t = this._findTool(e);
|
|
return "black" === this._studiesAccess.type ? !t || t.grayed : !!t
|
|
}, JSServer.ChartApi.prototype.StudiesAccessController.prototype.isToolGrayed = function(
|
|
e) {
|
|
var t = this._findTool(e);
|
|
return t && t.grayed
|
|
}, JSServer.ChartApi.prototype.serverTimeOffset = function() {
|
|
return this._studyEngine.serverTimeOffset()
|
|
},
|
|
JSServer.ChartApi.prototype.serverTime = function() {
|
|
return this._studyEngine.serverTime()
|
|
}, JSServer.ChartApi.prototype.disconnectCount = function() {
|
|
return 0
|
|
}, u(JSServer.ChartApi, "JSServer.ChartApi", c, "ChartApiInterface"), e.exports = JSServer
|
|
.ChartApi
|
|
},
|
|
EYFt: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return S
|
|
}));
|
|
var s = i("ivNn"),
|
|
r = i("YFKU"),
|
|
n = i("qFKp"),
|
|
o = i("Tmoa"),
|
|
a = i("Kxc7"),
|
|
l = i("k9/m"),
|
|
c = i("CW80"),
|
|
h = i("mMWL"),
|
|
u = i("23IT"),
|
|
d = i("i6cO"),
|
|
p = i("UAFa"),
|
|
_ = i("xCUR"),
|
|
m = i("Eyy1"),
|
|
f = i("nEwK");
|
|
const g = n.CheckMobile.any(),
|
|
b = Object(r.t)("n/a"),
|
|
v = a.enabled("hide_last_na_study_output");
|
|
class S {
|
|
constructor(e, t) {
|
|
this._emptyValues = [], this._colorProviders = new Map, this._study = e, this
|
|
._model = t;
|
|
const i = e.metaInfo().plots;
|
|
i && i.forEach((t, i) => {
|
|
if (Object(u.isPlotWithTechnicalValues)(t)) return;
|
|
const s = t.id;
|
|
this._emptyValues.push({
|
|
id: s,
|
|
index: i,
|
|
title: this._study.guiPlotName(s),
|
|
value: "",
|
|
visible: !1
|
|
});
|
|
const r = Object(u.isOhlcPlot)(t) ? t.target : t.id;
|
|
this._colorProviders.set(r, Object(p.createStudyPlotColorProvider)(e
|
|
.metaInfo(), e.properties(), r))
|
|
})
|
|
}
|
|
getItems() {
|
|
return this._emptyValues
|
|
}
|
|
getValues(e) {
|
|
const t = this._emptyValues.map(e => ({
|
|
...e
|
|
}));
|
|
let i = null;
|
|
const r = this._study.data().lastIndex();
|
|
if (null !== r)
|
|
for (const e of t) {
|
|
if (!this._study.properties().styles[e.id].visible.value()) continue;
|
|
const t = this._study.nearestIndex(r, l.PlotRowSearchMode.NearestLeft, e
|
|
.index + 1);
|
|
if (void 0 === t) continue;
|
|
const s = t + this._study.offset(e.id);
|
|
i = null !== i ? Math.max(s, i) : s
|
|
}(null === e || null !== i && e > i) && (e = i);
|
|
const n = this._hideValues(),
|
|
a = this._study.isVisible() && !n ? b : "";
|
|
for (const e of t) e.value = a;
|
|
if (n) return t;
|
|
if (v && t.length && (t[t.length - 1].value = ""), this._study.metaInfo().graphics
|
|
.hhists) return this._getValuesForHHist(t, e);
|
|
const c = this._study.priceScale();
|
|
if (!this._study.isVisible() || null === e || null === c || c.isEmpty() || this
|
|
._model.timeScale().isEmpty()) return t;
|
|
const h = this._study.metaInfo().plots,
|
|
p = Object(_.a)(this._study),
|
|
m = {};
|
|
for (const i of t) {
|
|
let t = i.id;
|
|
const n = this._study.properties().styles[t].visible.value();
|
|
if (i.visible = n, !n) continue;
|
|
const a = i.index,
|
|
c = e - this._study.offset(t),
|
|
_ = null !== r && c > r ? l.PlotRowSearchMode.NearestLeft : l
|
|
.PlotRowSearchMode.Exact,
|
|
f = this._study.nearestIndex(c, _);
|
|
if (void 0 === f) continue;
|
|
let g = m[t];
|
|
if (void 0 === g && (g = this._study.getMinFirstBarIndexForPlot(t), Number
|
|
.isFinite(g) && (m[t] = g)), g > f) continue;
|
|
const b = this._study.data().last(),
|
|
v = this._study.data().valueAt(f) || (null !== b ? b.value : null);
|
|
if (null === v) continue;
|
|
const S = v[a + 1];
|
|
if (!Object(s.isNumber)(S)) continue;
|
|
const y = S > 0;
|
|
i.value = p(S);
|
|
const w = this._study.properties().styles[t];
|
|
let P = w.color.value();
|
|
const C = h[a];
|
|
Object(u.isOhlcPlot)(C) ? (t = C.target || t, P = this._study.properties()
|
|
.ohlcPlots[t].color.value()) : Object(u.isArrowsPlot)(C) && (P = y ? w
|
|
.colorup.value() : w.colordown.value());
|
|
let x = P;
|
|
const T = this._colorProviders.get(t),
|
|
I = T && T.getPlotPointStyle(v);
|
|
I && (Object(u.isArrowsPlot)(C) ? (y && void 0 !== I.colors[d.ColorerType.Up] &&
|
|
(x = I.colors[d.ColorerType.Up]), y || void 0 === I.colors[d
|
|
.ColorerType.Down] || (x = I.colors[d.ColorerType.Down])) :
|
|
void 0 !== I.colors[d.ColorerType.Main] && (x = I.colors[d.ColorerType
|
|
.Main])), "transparent" === x && (x = P),
|
|
x = Object(o.resetTransparency)(x), i.color = x
|
|
}
|
|
return t
|
|
}
|
|
_hideValues() {
|
|
return g && (null === this._model.crossHairSource().pane || Object(c.isLineToolName)
|
|
(h.tool.value()) || null !== this._model.lineBeingEdited())
|
|
}
|
|
_getValuesForHHist(e, t) {
|
|
e.forEach(e => {
|
|
e.visible = this._study.isVisible(), e.value = b
|
|
});
|
|
const i = this._study.priceScale(),
|
|
r = this._model.timeScale();
|
|
if (null === i || i.isEmpty() || r.isEmpty() || this._hideValues()) return e;
|
|
if (null === t || !isFinite(t)) {
|
|
const i = this._study.data().last();
|
|
if (null === i) return e;
|
|
t = i.index
|
|
}
|
|
const n = this._model.crossHairSource(),
|
|
o = n.price;
|
|
if (!isFinite(n.y) && null === (t = function(e, t) {
|
|
var i;
|
|
const s = null === (i = e.visibleBarsStrictRange()) || void 0 === i ?
|
|
void 0 : i.lastBar();
|
|
if (!s) return null;
|
|
const r = t.data().search(s, l.PlotRowSearchMode.NearestLeft);
|
|
return r ? r.index : null
|
|
}(this._model.timeScale(), this._model.mainSeries()))) return e;
|
|
const a = function(e, t, i, s) {
|
|
if (0 === e.size) return null;
|
|
if (!i) {
|
|
const e = Object(m.ensureNotNull)(s.data().valueAt(t));
|
|
i = s.barFunction()(e)
|
|
}
|
|
const r = function(e, t) {
|
|
let i = null;
|
|
return e.forEach((e, s) => {
|
|
s <= t && (null === i || s > i) && (i = s)
|
|
}), i
|
|
}(e, t);
|
|
if (null === r) return null;
|
|
const n = e.get(r);
|
|
if (!n || 0 === n.size) return null;
|
|
return function(e, t) {
|
|
let i = null;
|
|
return e.forEach(e => {
|
|
e.priceLow <= t && t < e.priceHigh && (i = e)
|
|
}), i
|
|
}(n, i)
|
|
}(this._study.graphics().hhistsByTimePointIndex(), t, o, this._model
|
|
.mainSeries());
|
|
if (null === a) return e;
|
|
const c = this._study.metaInfo().graphics.hhists;
|
|
if (void 0 === c) return e;
|
|
const h = c[a.styleId];
|
|
if (void 0 === h) return e;
|
|
const u = this._study.properties().child("graphics").child("hhists").child(a
|
|
.styleId),
|
|
d = new f.VolumeFormatter;
|
|
return e.forEach((e, t) => {
|
|
if (t < u.colors.childCount())
|
|
if (t < a.rate.length) {
|
|
const i = a.rate[t];
|
|
e.title = h.titles[t], e.value = Object(s.isNumber)(i) ? d
|
|
.format(i) : "", e.color = u.colors[t].value()
|
|
} else e.title = "", e.value = "", e.color = void 0;
|
|
else {
|
|
if (a.rate.length > 1 && t === u.colors.childCount()) {
|
|
const t = a.rate.reduce((e, t) => e + t, 0);
|
|
return e.value = d.format(t), void(e.color = u.valuesColor
|
|
.value())
|
|
}
|
|
e.value = ""
|
|
}
|
|
}), e
|
|
}
|
|
}
|
|
},
|
|
Ecpn: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return r
|
|
}));
|
|
const s = {
|
|
VbPFixed: !0,
|
|
PivotPointsStandard: !0,
|
|
VbPVisible: !0
|
|
};
|
|
|
|
function r(e) {
|
|
return e in s
|
|
}
|
|
},
|
|
EqoR: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("5rJj"),
|
|
r = i("aDyP").LineToolPitchfork;
|
|
class n extends r {
|
|
constructor(e, t) {
|
|
super(e, t || n.createProperties())
|
|
}
|
|
name() {
|
|
return "Inside Pitchfork"
|
|
}
|
|
static createProperties(e) {
|
|
var t = new s("linetoolinsidepitchfork", e, !1, {
|
|
range: [0, 8]
|
|
});
|
|
return n._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
r._configureProperties(e)
|
|
}
|
|
}
|
|
t.LineToolInsidePitchfork = n
|
|
},
|
|
Ery9: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "setCustomAdapter", (function() {
|
|
return _
|
|
})), i.d(t, "initialize", (function() {
|
|
return m
|
|
})), i.d(t, "updateUser", (function() {
|
|
return f
|
|
})), i.d(t, "getChartsCount", (function() {
|
|
return g
|
|
})), i.d(t, "getCharts", (function() {
|
|
return b
|
|
})), i.d(t, "removeChart", (function() {
|
|
return v
|
|
})), i.d(t, "saveChart", (function() {
|
|
return S
|
|
})), i.d(t, "getChartContent", (function() {
|
|
return y
|
|
})), i.d(t, "loadChart", (function() {
|
|
return w
|
|
})), i.d(t, "removeStudyTemplate", (function() {
|
|
return P
|
|
})), i.d(t, "getStudyTemplateContent", (function() {
|
|
return C
|
|
})),
|
|
i.d(t, "saveStudyTemplate", (function() {
|
|
return x
|
|
})), i.d(t, "getStudyTemplatesList", (function() {
|
|
return T
|
|
})), i.d(t, "invalidateStudyTemplatesList", (function() {
|
|
return I
|
|
})), i.d(t, "getStudyTemplateContentById", (function() {
|
|
return M
|
|
})), i.d(t, "getStandardStudyTemplateContentById", (function() {
|
|
return O
|
|
})), i.d(t, "removeStudyTemplateById", (function() {
|
|
return L
|
|
})), i.d(t, "renameStudyTemplate", (function() {
|
|
return A
|
|
})), i.d(t, "replaceStudyTemplate", (function() {
|
|
return E
|
|
})), i.d(t, "getDrawingTemplates", (function() {
|
|
return k
|
|
})), i.d(t, "loadDrawingTemplate", (function() {
|
|
return D
|
|
})), i.d(t, "removeDrawingTemplate", (function() {
|
|
return V
|
|
})), i.d(t, "saveDrawingTemplate", (function() {
|
|
return B
|
|
}));
|
|
var s = i("FQhm"),
|
|
r = i("txPx"),
|
|
n = i("Cf1E");
|
|
const o = Object(r.getLogger)("Chart.SaveloadAdapter.Library");
|
|
let a, l, c, h, u = null,
|
|
d = null;
|
|
|
|
function p(e) {
|
|
return `${c}/${encodeURIComponent(h)}/${e}?client=${encodeURIComponent(a)}&user=${encodeURIComponent(l)}`
|
|
}
|
|
|
|
function _(e) {
|
|
u = e
|
|
}
|
|
|
|
function m(e, t, i, s) {
|
|
a = e, l = t, c = i, h = s
|
|
}
|
|
|
|
function f(e) {
|
|
l = e
|
|
}
|
|
|
|
function g(e, t) {
|
|
throw new Error("Not implemented")
|
|
}
|
|
async function b() {
|
|
const e = e => e.map(e => ({
|
|
id: e.id,
|
|
name: e.name,
|
|
image_url: String(e.id),
|
|
modified_iso: e.timestamp,
|
|
short_symbol: e.symbol,
|
|
interval: e.resolution
|
|
}));
|
|
if (u) return u.getAllCharts().then(e);
|
|
try {
|
|
const t = await fetch("" + p("charts"), {
|
|
credentials: "same-origin"
|
|
});
|
|
if (!t.ok) throw new Error(
|
|
`Getting chart content response was not OK. Status: ${t.status}.`);
|
|
const i = await t.json();
|
|
if ("ok" !== i.status) throw new Error("Get chart content request failed: " + i
|
|
.message);
|
|
return e(i.data)
|
|
} catch (e) {
|
|
throw o.logWarn(Object(n.a)(e)), e
|
|
}
|
|
}
|
|
async function v(e) {
|
|
if (u) u.removeChart(e);
|
|
else try {
|
|
const t = await fetch(`${p("charts")}&chart=${encodeURIComponent(e)}`, {
|
|
method: "DELETE",
|
|
credentials: "same-origin"
|
|
});
|
|
if (!t.ok) throw new Error(
|
|
`Remove chart response was not OK. Status: ${t.status}.`);
|
|
const i = await t.json();
|
|
if ("ok" !== i.status) throw new Error(
|
|
"Remove drawing template request failed: " + i.message)
|
|
} catch (e) {
|
|
throw o.logWarn(Object(n.a)(e)), e
|
|
}
|
|
}
|
|
async function S(e, t, i, s, r) {
|
|
const a = r.id.value(),
|
|
l = {
|
|
name: e,
|
|
content: JSON.stringify(s),
|
|
symbol: t,
|
|
resolution: i
|
|
};
|
|
if (u) return u.saveChart({
|
|
...l,
|
|
id: a
|
|
});
|
|
try {
|
|
const e = new FormData;
|
|
for (const t in l) e.append(t, l[t]);
|
|
let t = p("charts");
|
|
null != a && (t += "&chart=" + encodeURIComponent(a));
|
|
const i = await fetch(t, {
|
|
credentials: "same-origin",
|
|
method: "POST",
|
|
body: e
|
|
});
|
|
if (!i.ok) throw new Error(
|
|
`Saving chart content response was not OK. Status: ${i.status}.`);
|
|
const s = await i.json();
|
|
if ("ok" !== s.status) throw new Error("Saving chart content request failed: " + s
|
|
.message);
|
|
return s.id
|
|
} catch (e) {
|
|
throw o.logWarn(Object(n.a)(e)), e
|
|
}
|
|
}
|
|
async function y(e) {
|
|
const t = t => {
|
|
const i = JSON.parse(t);
|
|
return i.uid = e.id, i
|
|
};
|
|
if (u) return u.getChartContent(e.id).then(e => t(e));
|
|
try {
|
|
const i = await fetch(`${p("charts")}&chart=${encodeURIComponent(e.id)}`, {
|
|
credentials: "same-origin"
|
|
});
|
|
if (!i.ok) throw new Error(
|
|
`Getting chart content response was not OK. Status: ${i.status}.`);
|
|
const s = await i.json();
|
|
if ("ok" !== s.status) throw new Error("Get chart content request failed: " + s
|
|
.message);
|
|
return t(s.data.content)
|
|
} catch (e) {
|
|
throw o.logWarn(Object(n.a)(e)), e
|
|
}
|
|
}
|
|
|
|
function w(e) {
|
|
y(e).then(e => {
|
|
s.emit("chart_load_requested", e)
|
|
}, () => {
|
|
o.logWarn("Error loading chart")
|
|
})
|
|
}
|
|
async function P(e) {
|
|
try {
|
|
if (u) return u.removeStudyTemplate({
|
|
name: e
|
|
});
|
|
const t = await fetch(`${p("study_templates")}&template=${encodeURIComponent(e)}`, {
|
|
method: "DELETE",
|
|
credentials: "same-origin"
|
|
});
|
|
if (!t.ok) throw new Error(
|
|
`Remove study template response was not OK. Status: ${t.status}.`);
|
|
const i = await t.json();
|
|
if ("ok" !== i.status) throw new Error("Remove study template request failed: " + i
|
|
.message)
|
|
} catch (e) {
|
|
throw o.logWarn(Object(n.a)(e)), e
|
|
}
|
|
}
|
|
async function C(e) {
|
|
try {
|
|
if (u) {
|
|
return {
|
|
content: await u.getStudyTemplateContent({
|
|
name: e
|
|
})
|
|
}
|
|
}
|
|
const t = await fetch(`${p("study_templates")}&template=${encodeURIComponent(e)}`, {
|
|
credentials: "same-origin"
|
|
});
|
|
if (!t.ok) throw new Error(
|
|
`Get study template response was not OK. Status: ${t.status}.`);
|
|
const i = await t.json();
|
|
if ("ok" !== i.status) throw new Error("Get study template request failed: " + i
|
|
.message);
|
|
return i.data
|
|
} catch (e) {
|
|
throw o.logWarn(Object(n.a)(e)), e
|
|
}
|
|
}
|
|
async function x(e) {
|
|
try {
|
|
if (u) return u.saveStudyTemplate(e).then(() => ({
|
|
error: ""
|
|
})).catch(e => ({
|
|
error: null != e ? Object(n.a)(e) : "error"
|
|
}));
|
|
const t = new FormData;
|
|
t.append("name", e.name), t.append("content", e.content);
|
|
const i = await fetch(p("study_templates"), {
|
|
method: "POST",
|
|
body: t,
|
|
credentials: "same-origin"
|
|
});
|
|
if (!i.ok) throw new Error(
|
|
`Save study template response was not OK. Status: ${i.status}.`);
|
|
const s = await i.json();
|
|
return {
|
|
error: "ok" === s.status ? "" : s.status
|
|
}
|
|
} catch (e) {
|
|
throw o.logWarn(Object(n.a)(e)), e
|
|
}
|
|
}
|
|
async function T() {
|
|
try {
|
|
if (d) return d;
|
|
d = [];
|
|
const e = e => (d = e.map(e => ({
|
|
is_default: !1,
|
|
name: e.name
|
|
})), d);
|
|
if (u) return u.getAllStudyTemplates().then(e);
|
|
const t = await fetch(p("study_templates"), {
|
|
method: "GET",
|
|
credentials: "same-origin"
|
|
});
|
|
if (!t.ok) throw new Error(
|
|
`Study templates list response was not OK. Status: ${t.status}.`);
|
|
const i = await t.json();
|
|
if ("ok" !== i.status) throw new Error("Study templates list request failed: " + i
|
|
.message);
|
|
return e(i.data)
|
|
} catch (e) {
|
|
throw o.logWarn(Object(n.a)(e)), e
|
|
}
|
|
}
|
|
|
|
function I() {
|
|
d = null
|
|
}
|
|
|
|
function M(e, t) {
|
|
throw new Error("Not implemented")
|
|
}
|
|
|
|
function O(e, t) {
|
|
throw new Error("Not implemented")
|
|
}
|
|
|
|
function L(e, t) {
|
|
throw new Error("Not implemented")
|
|
}
|
|
|
|
function A(e, t, i) {
|
|
throw new Error("Not implemented")
|
|
}
|
|
|
|
function E(e, t, i) {
|
|
throw new Error("Not implemented")
|
|
}
|
|
async function k(e) {
|
|
throw new Error("Not implemented")
|
|
}
|
|
async function D(e, t) {
|
|
throw new Error("Not implemented")
|
|
}
|
|
async function V(e, t) {
|
|
throw new Error("Not implemented")
|
|
}
|
|
async function B(e, t, i) {
|
|
throw new Error("Not implemented")
|
|
}
|
|
},
|
|
EsvI: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
i("bSeV");
|
|
var s = i("eJTA"),
|
|
r = i("wZIs"),
|
|
n = i("Vdly");
|
|
|
|
function o() {
|
|
return Object(n.getValue)("current_theme.name") || null
|
|
}
|
|
var a = i("wVAQ"),
|
|
l = i("txPx");
|
|
const c = Object(l.getLogger)("Themes.Provider");
|
|
let h = null;
|
|
|
|
function u(e) {
|
|
return Object(a.fetch)("/theme/?themeName=" + encodeURIComponent(e), {
|
|
credentials: "include",
|
|
method: "GET"
|
|
}).then(e => e.json()).then(e => {
|
|
const t = {};
|
|
return e.content && (t.content = JSON.parse(e.content)), t
|
|
})
|
|
}
|
|
var d = i("zM7N"),
|
|
p = i("oiZD");
|
|
var _ = i("YFKU"),
|
|
m = i("IMMp"),
|
|
f = i("HGP3");
|
|
const g = {
|
|
[d.a.Light]: {
|
|
name: d.a.Light,
|
|
label: () => Object(_.t)("Light", {
|
|
context: "colorThemeName"
|
|
}),
|
|
order: 2,
|
|
getThemedColor: e => Object(f.getHexColorByName)(e)
|
|
},
|
|
[d.a.Dark]: {
|
|
name: d.a.Dark,
|
|
label: () => Object(_.t)("Dark", {
|
|
context: "colorThemeName"
|
|
}),
|
|
order: 1,
|
|
getThemedColor: e => {
|
|
const t = m[e] || e;
|
|
return Object(f.getHexColorByName)(t)
|
|
}
|
|
}
|
|
};
|
|
|
|
function b(e) {
|
|
return !e.isPrivate
|
|
}
|
|
|
|
function v() {
|
|
return g[p.watchedTheme.value()] || g.light
|
|
}
|
|
|
|
function S(e) {
|
|
return v().getThemedColor(e)
|
|
}
|
|
async function y(e, t, i, s, n = !0, o = !1, a = !1) {
|
|
const l = await (t ? Promise.resolve(O(e)) : x(e));
|
|
if (void 0 !== l.content) {
|
|
const h = !t;
|
|
a && (void 0 !== (c = l.content).chartProperties && Object(r.applyDefaultsOverrides)
|
|
(c.chartProperties), void 0 !== c.mainSourceProperties && Object(r
|
|
.applyDefaultsOverrides)(c.mainSourceProperties, void 0, !0,
|
|
"mainSeriesProperties")), await s.applyTheme(l.content, h, i, e, t, n,
|
|
o)
|
|
}
|
|
var c;
|
|
return l
|
|
}
|
|
|
|
function w() {
|
|
Object(p.setTheme)(o() || "light")
|
|
}
|
|
|
|
function P() {
|
|
return o()
|
|
}
|
|
|
|
function C() {
|
|
var e;
|
|
e = v().name, Object(n.setValue)("current_theme.name", e, {
|
|
forceFlush: !0
|
|
})
|
|
}
|
|
|
|
function x(e) {
|
|
return u(e)
|
|
}
|
|
|
|
function T() {
|
|
return h || Object(a.fetch)("/themes/", {
|
|
credentials: "include",
|
|
method: "GET"
|
|
}).then(e => (h = e.json(), h))
|
|
}
|
|
|
|
function I() {
|
|
return d.c()
|
|
}
|
|
|
|
function M(e) {
|
|
return I().includes(e)
|
|
}
|
|
|
|
function O(e) {
|
|
return d.b(e) || {
|
|
content: void 0
|
|
}
|
|
}
|
|
|
|
function L(e, t) {
|
|
const i = t || v().name,
|
|
s = d.b(i),
|
|
r = 0 !== e.length && e.split(".");
|
|
return s && s.content && r ? r.reduce((e, t) => e[t], s.content) : null
|
|
}
|
|
|
|
function A(e, t, i) {
|
|
const r = L(e, i);
|
|
return null !== r && Object(s.areEqualRgba)(Object(s.parseRgba)(r), Object(s.parseRgba)(
|
|
String(t)))
|
|
}
|
|
|
|
function E(e, t) {
|
|
return function(e, t) {
|
|
const i = new FormData;
|
|
return i.append("content", JSON.stringify(t)), i.append("name", e), h = null,
|
|
Object(a.fetch)("/save-theme/", {
|
|
credentials: "include",
|
|
method: "POST",
|
|
body: i
|
|
}).then(e => e.json(), e => c.logError(e))
|
|
}(e, t)
|
|
}
|
|
|
|
function k(e) {
|
|
return function(e) {
|
|
const t = new FormData;
|
|
return t.append("name", e), h = null, Object(a.fetch)("/remove-theme/", {
|
|
credentials: "include",
|
|
method: "POST",
|
|
body: t
|
|
}).then(e => e.json(), e => c.logError(e))
|
|
}(e)
|
|
}
|
|
|
|
function D(e) {
|
|
return function(e) {
|
|
return u(e).then(e => Boolean(e.content))
|
|
}(e)
|
|
}
|
|
|
|
function V(e) {
|
|
return d.e(e)
|
|
}
|
|
|
|
function B(e) {
|
|
return d.d(e)
|
|
}
|
|
|
|
function R(e) {
|
|
return {
|
|
content: {
|
|
chartProperties: {
|
|
paneProperties: e.model().properties().paneProperties.state(),
|
|
scalesProperties: e.model().properties().scalesProperties.state()
|
|
},
|
|
sessions: e.model().sessions().properties().state(),
|
|
mainSourceProperties: e.model().mainSeries().properties().state()
|
|
}
|
|
}
|
|
}
|
|
i.d(t, "isPublicTheme", (function() {
|
|
return b
|
|
})), i.d(t, "getCurrentTheme", (function() {
|
|
return v
|
|
})), i.d(t, "getThemedColor", (function() {
|
|
return S
|
|
})), i.d(t, "loadTheme", (function() {
|
|
return y
|
|
})), i.d(t, "restoreTheme", (function() {
|
|
return w
|
|
})), i.d(t, "savedThemeName", (function() {
|
|
return P
|
|
})), i.d(t, "syncTheme", (function() {
|
|
return C
|
|
})), i.d(t, "getTheme", (function() {
|
|
return x
|
|
})), i.d(t, "getThemeNames", (function() {
|
|
return T
|
|
})), i.d(t, "getStdThemeNames", (function() {
|
|
return I
|
|
})), i.d(t, "isStdThemeName", (function() {
|
|
return M
|
|
})), i.d(t, "getStdTheme", (function() {
|
|
return O
|
|
})), i.d(t, "getStdThemedValue", (function() {
|
|
return L
|
|
})), i.d(t, "isStdThemedDefaultValue", (function() {
|
|
return A
|
|
})), i.d(t, "saveTheme", (function() {
|
|
return E
|
|
})), i.d(t, "removeTheme", (function() {
|
|
return k
|
|
})),
|
|
i.d(t, "isThemeExist", (function() {
|
|
return D
|
|
})), i.d(t, "translateStdThemeName", (function() {
|
|
return V
|
|
})), i.d(t, "isStdTheme", (function() {
|
|
return B
|
|
})), i.d(t, "extractThemeFromModel", (function() {
|
|
return R
|
|
})), i.d(t, "DEFAULT_THEME", (function() {
|
|
return "light"
|
|
})), i.d(t, "themes", (function() {
|
|
return g
|
|
}))
|
|
},
|
|
ExCE: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return r
|
|
}));
|
|
var s = i("VdBB");
|
|
class r {
|
|
constructor() {
|
|
this._bars = []
|
|
}
|
|
hitTest(e) {
|
|
const t = this._bars,
|
|
i = this._getBarSpacing(),
|
|
s = i / 2;
|
|
if (0 === t.length) return null;
|
|
const r = this._getTolerance(),
|
|
n = t[0],
|
|
o = t[t.length - 1];
|
|
if (e.x < n.time - s - r) return null;
|
|
if (e.x > o.time + s + r) return null;
|
|
let a = 0,
|
|
l = t.length - 1,
|
|
c = -1;
|
|
for (; a <= l;) {
|
|
const i = Math.floor((a + l) / 2),
|
|
h = t[i];
|
|
let u = s;
|
|
if (h !== n && h !== o || (u += r), Math.abs(h.time - e.x) <= u) {
|
|
c = i;
|
|
break
|
|
}
|
|
e.x - h.time > s ? a = i + 1 : l = i - 1
|
|
}
|
|
if (-1 !== c) {
|
|
const n = Math.ceil(r / i);
|
|
if (0 !== n) {
|
|
const i = Math.max(0, c - n),
|
|
o = Math.min(t.length - 1, c + n);
|
|
for (let n = i; n <= o; n++)
|
|
if (Math.abs(e.x - t[n].time) <= s + r && this._isPointAtBar(t[n], e.y,
|
|
r)) return this._getHitTest()
|
|
} else if (this._isPointAtBar(t[c], e.y, r)) return this._getHitTest()
|
|
}
|
|
return null
|
|
}
|
|
_getHitTest() {
|
|
return new s.HitTestResult(s.HitTestResult.REGULAR)
|
|
}
|
|
_isPointAtBar(e, t, i) {
|
|
const s = Math.min(e.high, e.low),
|
|
r = Math.max(e.high, e.low);
|
|
return s - i <= t && t <= r + i
|
|
}
|
|
}
|
|
},
|
|
EyEd: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("lCO3").Version,
|
|
r = i("txPx").getLogger("Chart.StudyMigration");
|
|
|
|
function n(e) {
|
|
this._studyId = e, this._maxToVers = s.ZERO, this._maxFromVers = s.ZERO, this._migrs = []
|
|
}
|
|
n.prototype.addMigration = function(e, t, i) {
|
|
var r = s.parse(e),
|
|
n = s.parse(t);
|
|
r.isGreater(this._maxFromVers) && (this._maxFromVers = r), n.isGreater(this
|
|
._maxToVers) && (this._maxToVers = n), this._migrs.push({
|
|
fromVers: r,
|
|
toVers: n,
|
|
rules: i
|
|
})
|
|
}, n.prototype.updateInputs = function(e, t, i) {
|
|
if (!i) return i;
|
|
for (var s = TradingView.clone(i), n = e; n.isLess(t);) {
|
|
var o = this._findMigration(n);
|
|
if (null == o) break;
|
|
if (r.logNormal("Migrating study inputs from " + o.fromVers + " to " + o.toVers +
|
|
" version, studyId: " + this._studyId + ", migration: " + JSON.stringify(
|
|
o) + ", inputs: " + JSON.stringify(i)), s = this._applyMigration(s, o),
|
|
!n
|
|
.isLess(o.toVers)) throw new Error(
|
|
"Problems in study migration process... Possible infinite cycle has been detected and stopped."
|
|
);
|
|
n = o.toVers
|
|
}
|
|
return n > e && r.logNormal("Study inputs migration is done, studyId: " + this
|
|
._studyId + ", inputs: " + JSON.stringify(s)), s
|
|
}, n.prototype._findMigration = function(e) {
|
|
for (var t = -1, i = this._maxFromVers, s = 0; s < this._migrs.length; s++) {
|
|
var r = this._migrs[s];
|
|
r.fromVers.isLess(e) || r.fromVers.isLessOrEqual(i) && (i = r.fromVers, t = s)
|
|
}
|
|
return t < 0 ? null : this._migrs[t]
|
|
}, n.prototype._applyMigration = function(e, t) {
|
|
for (var i = e, s = 0; s < t.rules.length; s++) {
|
|
var r = t.rules[s];
|
|
i = this._getApplyRuleFun(r.type)(i, r)
|
|
}
|
|
return i
|
|
}, n.prototype._getApplyRuleFun = function(e) {
|
|
if ("inputRemoved" === e) return n._applyInputRemovedRule;
|
|
if ("inputChangedType" === e) return n._applyInputChangedTypeRule;
|
|
if ("inputChangedMinMax" === e) return n._applyInputChangedMinMaxRule;
|
|
if ("inputChangedOptions" === e) return n._applyInputChangedOptionsRule;
|
|
throw new Error("Unknown migration rule type: " + e)
|
|
}, n._applyInputRemovedRule = function(e, t) {
|
|
if (!(t.inputId in e)) return e;
|
|
if ("removeVal" !== t.action) throw new Error("Unexpected rule.action=" + t.action +
|
|
" in rule.type=" + t.type);
|
|
var i = e[t.inputId];
|
|
return delete e[t.inputId], r.logNormal("Input " + t.inputId + "=" + i + " removed"), e
|
|
}, n._applyInputChangedTypeRule = function(e, t) {
|
|
var i = e[t.inputId];
|
|
if ("resetToDefVal" === t.action) return e[t.inputId] = t.defVal, r.logNormal("Input " +
|
|
t.inputId + "=" + i + " reset to default value " + t.defVal), e;
|
|
if ("convertVal" === t.action) {
|
|
if (null == i) return e;
|
|
if ("float" === t.inputTypeFrom && "integer" === t.inputType) return e[t.inputId] =
|
|
Math.round(e[t.inputId]), r.logNormal("Input " + t.inputId + "=" + i +
|
|
" converted to value " + e[t.inputId]), e;
|
|
if ("integer" === t.inputTypeFrom && "float" === t.inputType) return e;
|
|
if ("text" === t.inputTypeFrom && "source" === t.inputType) return n._isValidSource(
|
|
i, t.options) || (e[t.inputId] = t.defVal), e;
|
|
throw new Error("Cannot convertVal from " + t.inputTypeFrom + " to " + t.inputType)
|
|
}
|
|
throw new Error("Unknown action " + t.action + " for rule with type " + t.type)
|
|
}, n._isValidSource = function(e, t) {
|
|
return e.indexOf("$") >= 0 || t.indexOf(e) >= 0
|
|
}, n._applyInputChangedMinMaxRule = function(e, t) {
|
|
if ("adjustValIfNeeded" !== t.action) throw new Error("Unknown action " + t.action +
|
|
" for rule with type " + t.type);
|
|
var i = e[t.inputId];
|
|
return i < t.minVal ? e[t.inputId] = t.minVal : i > t.maxVal && (e[t.inputId] = t
|
|
.maxVal), r.logNormal("Input " + t.inputId + "=" + i + " adjusted to value " +
|
|
e[t.inputId]), e
|
|
}, n._applyInputChangedOptionsRule = function(e, t) {
|
|
if (!(["text"].indexOf(t.inputType) >= 0 && "resetToDefValIfNeeded" === t.action))
|
|
throw new Error("Unexpected rule.inputType=" + t.inputType + " in rule.action=" + t
|
|
.action);
|
|
var i = e[t.inputId];
|
|
return t.options.indexOf(i) < 0 && (e[t.inputId] = t.defVal, r.logNormal("Input " + t
|
|
.inputId + "=" + i + " reset to default value " + t.defVal)), e
|
|
}, e.exports = n
|
|
},
|
|
Eyy1: function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e) {
|
|
if (void 0 === e) throw new Error("Value is undefined");
|
|
return e
|
|
}
|
|
|
|
function r(e) {
|
|
if (null === e) throw new Error("Value is null");
|
|
return e
|
|
}
|
|
Object.defineProperty(t, "__esModule", {
|
|
value: !0
|
|
}), t.ensureNever = t.ensure = t.ensureNotNull = t.ensureDefined = t.assert = void 0, t
|
|
.assert = function(e, t) {
|
|
if (!e) throw new Error("Assertion failed" + (t ? ": " + t : ""))
|
|
}, t.ensureDefined = s, t.ensureNotNull = r, t.ensure = function(e) {
|
|
return r(s(e))
|
|
}, t.ensureNever = function(e) {}
|
|
},
|
|
F58L: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "StudyTemplates", (function() {
|
|
return _
|
|
}));
|
|
var s = i("YFKU"),
|
|
r = i("zUrt"),
|
|
n = i("JWMC"),
|
|
o = i("aIyQ"),
|
|
a = i.n(o),
|
|
l = i("hY0g"),
|
|
c = i.n(l),
|
|
h = i("fZEr"),
|
|
u = i("txPx");
|
|
const d = Object(u.getLogger)("Platform.StudyTemplates"),
|
|
p = Object(s.t)("Do you really want to delete Study Template '{name}' ?");
|
|
class _ {
|
|
constructor(e) {
|
|
this._chartWidgetCollection = e.chartWidgetCollection, this
|
|
._favoriteStudyTemplatesService = e.favoriteStudyTemplatesService, window
|
|
.loginStateChange.subscribe(null, r.backend.invalidateStudyTemplatesList), this
|
|
._list = new c.a([]), this._onChange = new a.a, this._list.subscribe(() => this
|
|
._onChange.fire())
|
|
}
|
|
findRecordByName(e) {
|
|
return this._list.value().find(t => t.name === e) || null
|
|
}
|
|
showSaveAsDialog() {
|
|
const e = this._chartWidgetCollection.activeChartWidget.value().model();
|
|
Promise.all([i.e("react"), i.e(1), i.e(3), i.e(4), i.e(8), i.e(9), i.e(13), i.e(16),
|
|
i.e(17), i.e(21), i.e(23), i.e(28), i.e(36), i.e(85), i.e(0), i.e(2), i
|
|
.e(15), i.e("study-template-dialog")
|
|
]).then(i.bind(null, "IDfV")).then(t => {
|
|
new t.StudyTemplateSaver({
|
|
controller: e,
|
|
onSave: e => {
|
|
this._list.setValue(e)
|
|
}
|
|
}).show()
|
|
})
|
|
}
|
|
applyTemplate(e) {
|
|
const t = this.findRecordByName(e);
|
|
null !== t ? window.runOrSignIn(() => {
|
|
const e = this._chartWidgetCollection.activeChartWidget.value(),
|
|
i = i => {
|
|
Object(n.trackEvent)("GUI", "Load Study Template"), e.model()
|
|
.applyStudyTemplate(JSON.parse(i.content), t.name)
|
|
};
|
|
void 0 !== t.id ? t.is_default ? r.backend
|
|
.getStandardStudyTemplateContentById(t.id, i) : r.backend
|
|
.getStudyTemplateContentById(t.id, i) : r.backend
|
|
.getStudyTemplateContent(t.name).then(i)
|
|
}, {
|
|
source: "Study templates apply"
|
|
}) : d.logNormal(`Template ${e} not found in cache`)
|
|
}
|
|
deleteStudyTemplate(e) {
|
|
const t = this.findRecordByName(e);
|
|
null !== t ? this._removeTemplate(t) : d.logNormal(
|
|
`Template ${e} not found in cache`)
|
|
}
|
|
list() {
|
|
return this._list.value()
|
|
}
|
|
getOnChange() {
|
|
return this._onChange
|
|
}
|
|
refreshStudyTemplateList(e) {
|
|
r.backend.getStudyTemplatesList().then(t => {
|
|
this._list.setValue(t), void 0 !== e && e()
|
|
})
|
|
}
|
|
invalidate() {
|
|
r.backend.invalidateStudyTemplatesList()
|
|
}
|
|
_removeTemplate(e) {
|
|
window.runOrSignIn(() => {
|
|
Object(h.showConfirm)({
|
|
text: p.format({
|
|
name: e.name
|
|
}),
|
|
onConfirm: ({
|
|
dialogClose: t
|
|
}) => new Promise(i => {
|
|
const s = () => {
|
|
this.refreshStudyTemplateList(() => {
|
|
const s = this.list();
|
|
this._list.setValue(s
|
|
.filter(t => t !==
|
|
e)), this
|
|
._favoriteStudyTemplatesService &&
|
|
this
|
|
._favoriteStudyTemplatesService
|
|
.remove(e.name), i(),
|
|
t()
|
|
})
|
|
};
|
|
r.backend.invalidateStudyTemplatesList(),
|
|
void 0 !== e.id ? r.backend
|
|
.removeStudyTemplateById(e.id, s) : r
|
|
.backend.removeStudyTemplate(e.name).then(s)
|
|
})
|
|
})
|
|
}, {
|
|
source: "Study templates delete"
|
|
})
|
|
}
|
|
}
|
|
},
|
|
FA0h: function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s() {
|
|
return Promise.all([i.e("redux"), i.e("react"), i.e(1), i.e(3), i.e(4), i.e(8), i.e(9), i.e(
|
|
13), i.e(14), i.e(19), i.e(26), i.e(0), i.e(2), i.e(7), i.e(10), i.e(18), i
|
|
.e(20), i.e(25), i.e("symbol-search-dialog")
|
|
]).then(i.bind(null, "GcSm"))
|
|
}
|
|
i.d(t, "a", (function() {
|
|
return s
|
|
}))
|
|
},
|
|
FBsw: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "OverlayPriceAxisView", (function() {
|
|
return l
|
|
}));
|
|
var s = i("Kxc7"),
|
|
r = i("KcY8"),
|
|
n = i("n5al"),
|
|
o = i("oXaB");
|
|
const a = s.enabled("force_exchange_as_title");
|
|
class l extends r.a {
|
|
constructor(e) {
|
|
super(), this._source = e
|
|
}
|
|
_updateRendererData(e, t, i) {
|
|
e.visible = !1, t.visible = !1;
|
|
const s = this._source.lastValueData("close", !1);
|
|
if (s.noData) return;
|
|
const r = this._source.model(),
|
|
n = this._source.priceScale();
|
|
if (null === n) return;
|
|
if (!r.isPriceScaleVisible(n)) return;
|
|
i.background = s.color, i.textColor = this.generateTextColor(s.color), i
|
|
.coordinate = s.coordinate, i.floatCoordinate = s.floatCoordinate;
|
|
const a = this._source.model().properties().scalesProperties,
|
|
l = n.isPercentage();
|
|
a.showSeriesLastValue.value() && (e.text = l ? s.formattedPricePercentage : s
|
|
.formattedPriceAbsolute, a.seriesLastValueMode.value() !== o
|
|
.PriceAxisLastValueMode.LastPriceAndPercentageValue ? e.secondLine =
|
|
"" : e.secondLine = l ? s.formattedPriceAbsolute : s
|
|
.formattedPricePercentage, e.visible = !0), t.text = "", a
|
|
.showSymbolLabels.value() && (t.text = this._paneText(),
|
|
t.visible = t.text.length > 0)
|
|
}
|
|
_paneText() {
|
|
let e = "";
|
|
const t = this._source.symbolInfo();
|
|
return a ? e = Object(n.displayedSymbolExchange)(t) : this._source.model()
|
|
.properties().scalesProperties.showSymbolLabels.value() && (e = Object(n
|
|
.displayedSymbolName)(t)), e
|
|
}
|
|
}
|
|
},
|
|
FBuY: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "TVXWindowEvents", (function() {
|
|
return o
|
|
}));
|
|
i("HbRj");
|
|
var s = i("txPx"),
|
|
r = i("VVxS");
|
|
const n = Object(s.getLogger)("XWindowEvents");
|
|
var o;
|
|
! function(e) {
|
|
const t = "tvxwevents.",
|
|
i = {};
|
|
let s;
|
|
window.BroadcastChannel ? (s = new BroadcastChannel("tvxwevents"), s.addEventListener(
|
|
"message", (function(e) {
|
|
const {
|
|
data: {
|
|
event: t,
|
|
value: s
|
|
}
|
|
} = e;
|
|
i[t] && i[t].forEach(e => {
|
|
e(s)
|
|
})
|
|
})), function() {
|
|
const e = [],
|
|
i = performance.now();
|
|
for (let i = 0; i < r.TVLocalStorage.length; i++) {
|
|
const s = r.TVLocalStorage.key(i);
|
|
s.startsWith(t) && e.push(s)
|
|
}
|
|
const s = r.TVLocalStorage.length;
|
|
for (const t of e) r.TVLocalStorage.removeItem(t);
|
|
const o = performance.now() - i;
|
|
n.logNormal("Total keys amount in local storage on operation start: " + s), n
|
|
.logNormal("Keys amount in local storage to be deleted: " + e.length), n
|
|
.logNormal("Keys to be deleted from local storage: " + JSON.stringify(e)), n
|
|
.logNormal(`Removing keys from local storage took ${o} ms`)
|
|
}()) : window.addEventListener("storage", (function(e) {
|
|
const {
|
|
newValue: s,
|
|
key: n
|
|
} = e;
|
|
if (null === s || !n || !n.startsWith(t)) return;
|
|
const o = n.substr(t.length);
|
|
i[o] && i[o].forEach(t => {
|
|
t(e.newValue)
|
|
});
|
|
r.TVLocalStorage.removeItem(n)
|
|
})), e.on = function(e, t) {
|
|
i[e] || (i[e] = []), i[e].push(t)
|
|
}, e.off = function(e, t) {
|
|
if (!i[e]) return;
|
|
const s = i[e].indexOf(t); - 1 !== s && (1 === i[e].length ? delete i[e] : i[e]
|
|
.splice(s, 1))
|
|
}, e.emit = function(e, i = Date.now()) {
|
|
try {
|
|
s ? s.postMessage({
|
|
event: e,
|
|
value: i
|
|
}) : r.TVLocalStorage.setItem(t + e, i.toString())
|
|
} catch (e) {
|
|
n.logError(e.message)
|
|
}
|
|
}
|
|
}(o || (o = {}))
|
|
},
|
|
FDyI: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("Eyy1"),
|
|
r = i("LxhU"),
|
|
n = i("IiTo"),
|
|
o = i("/bs+");
|
|
class a {
|
|
constructor(e) {
|
|
this._timeScale = e
|
|
}
|
|
coordinateToTime(e) {
|
|
const t = this._timeScale.coordinateToIndex(e);
|
|
return this._timeScale.indexToTimePoint(t)
|
|
}
|
|
barSpacingChanged() {
|
|
return this._timeScale.barSpacingChanged()
|
|
}
|
|
rightOffsetChanged() {
|
|
return this._timeScale.rightOffsetChanged()
|
|
}
|
|
barSpacing() {
|
|
return this._timeScale.barSpacing()
|
|
}
|
|
rightOffset() {
|
|
return this._timeScale.rightOffset()
|
|
}
|
|
width() {
|
|
return this._timeScale.width()
|
|
}
|
|
}
|
|
var l = i("aIyQ"),
|
|
c = i.n(l),
|
|
h = i("96Yh"),
|
|
u = i("pOzK"),
|
|
d = i("CsKN");
|
|
|
|
function p(e, t) {
|
|
const i = () => {
|
|
e.completed().unsubscribe(null, s), t(!1)
|
|
},
|
|
s = () => {
|
|
e.error().unsubscribe(null, i), t(!0)
|
|
};
|
|
e.completed().subscribe(null, i, !0), e.error().subscribe(null, s, !0)
|
|
}
|
|
var _ = i("OLhd");
|
|
i.d(t, "ChartWidgetApiBase", (function() {
|
|
return m
|
|
}));
|
|
class m {
|
|
constructor(e, t) {
|
|
this._visibleBarsChanged = new c.a, this._crosshairMoved = new c.a, this._ranges =
|
|
null, this._alignerResolution = r.Interval.parse(""), this._alignerSymbolInfo =
|
|
null, this._dwmAligner = null, this._chartWidget = e, this._activateChart = t,
|
|
this._chartWidget.model().crossHairSource().moved().subscribe(this, this
|
|
._onCrosshairMoved)
|
|
}
|
|
getPriceToBarRatio() {
|
|
return this._chartWidget.model().model().mainSeriesScaleRatioProperty().value()
|
|
}
|
|
setPriceToBarRatio(e, t) {
|
|
const i = this._chartWidget.model(),
|
|
s = i.model(),
|
|
r = s.mainSeriesScaleRatioProperty();
|
|
(null == t ? void 0 : t.disableUndo) ? new d.SetScaleRatioPropertiesCommand(r, e,
|
|
"", s).redo(): i.setScaleRatioProperty(r, e, "Change Price to Bar Ratio")
|
|
}
|
|
isPriceToBarRatioLocked() {
|
|
return this._chartWidget.model().model().mainSeries().priceScale().isLockScale()
|
|
}
|
|
setPriceToBarRatioLocked(e, t) {
|
|
const i = this._chartWidget.model(),
|
|
s = i.model(),
|
|
r = s.mainSeries().priceScale();
|
|
(null == t ? void 0 : t.disableUndo) ? new u.SetPriceScaleModeCommand({
|
|
lockScale: e
|
|
}, r, "", s).redo(): i.setPriceScaleMode({
|
|
lockScale: e
|
|
}, r, "Toggle Lock Scale")
|
|
}
|
|
onDataLoaded() {
|
|
return this._makeSubscriptionFromDelegate(this._chartWidget.model().mainSeries()
|
|
.dataEvents().completed())
|
|
}
|
|
onSymbolChanged() {
|
|
return this._makeSubscriptionFromDelegate(this._chartWidget.model().mainSeries()
|
|
.dataEvents().symbolResolved())
|
|
}
|
|
onIntervalChanged() {
|
|
return this._makeSubscriptionFromDelegate(this._chartWidget.model().mainSeries()
|
|
.onIntervalChanged())
|
|
}
|
|
onVisibleRangeChanged() {
|
|
return this._makeSubscriptionFromDelegate(this._visibleBarsChanged)
|
|
}
|
|
onChartTypeChanged() {
|
|
return this._makeSubscriptionFromDelegate(this._chartWidget.model().mainSeries()
|
|
.onStyleChanged())
|
|
}
|
|
onSeriesTimeframe() {
|
|
return this._makeSubscriptionFromDelegate(this._chartWidget.model().mainSeries()
|
|
.dataEvents().seriesTimeFrame())
|
|
}
|
|
whenChartReady(e) {
|
|
this._chartWidget.withModel(this, e)
|
|
}
|
|
crossHairMoved() {
|
|
return this._makeSubscriptionFromDelegate(this._crosshairMoved)
|
|
}
|
|
setSymbol(e, t) {
|
|
if (e === this.symbol()) return void(null == t || t());
|
|
const i = e => {
|
|
!e && t && t()
|
|
},
|
|
s = this._chartWidget.model().mainSeries().dataEvents();
|
|
t && p(s, i), this._activateChart(), this._chartWidget.setSymbol(e)
|
|
}
|
|
setResolution(e, t) {
|
|
const i = r.Interval.normalize(e);
|
|
if (null === i || i === this.resolution()) return void(null == t || t());
|
|
const s = e => {
|
|
!e && t && t()
|
|
},
|
|
n = this._chartWidget.model().mainSeries().dataEvents();
|
|
t && p(n, s), this._activateChart(), this._chartWidget.setResolution(i)
|
|
}
|
|
setChartType(e, t) {
|
|
const i = this._chartWidget.model().mainSeries().properties().style;
|
|
if (i.value() === e) return void(null == t || t());
|
|
const s = e => {
|
|
!e && t && t()
|
|
},
|
|
r = this._chartWidget.model().mainSeries().dataEvents();
|
|
t && p(r, s), this._chartWidget.model().setChartStyleProperty(i, e,
|
|
"Change Series Style")
|
|
}
|
|
getAllStudies() {
|
|
return this._chartWidget.model().model().allStudies(!0).map(h.studyEntityInfo)
|
|
}
|
|
getAllPanesHeight() {
|
|
const e = this._chartWidget.model().model().panes();
|
|
if (this._chartWidget.isMaximizedPane()) {
|
|
let t = 0,
|
|
i = 0;
|
|
e.forEach(e => {
|
|
t += e.height(), i += e.stretchFactor()
|
|
});
|
|
const s = i / t;
|
|
return e.map(e => Math.round(e.stretchFactor() / s * 100) / 100)
|
|
}
|
|
return e.map(e => e.height())
|
|
}
|
|
setAllPanesHeight(e) {
|
|
const t = this._chartWidget.model().model(),
|
|
i = t.panes();
|
|
Object(s.assert)(i.length === e.length,
|
|
"There`s a mismatch between the number of heights you provided and the number of panes."
|
|
);
|
|
const r = i.reduce((e, t) => e + t.stretchFactor(), 0) / e.reduce((e, t) => e + t);
|
|
e.forEach((e, t) => {
|
|
const s = e * r;
|
|
i[t].setStretchFactor(s)
|
|
}), t.fullUpdate()
|
|
}
|
|
sessions() {
|
|
return this._chartWidget.model().model().sessions()
|
|
}
|
|
getTimeScaleLogicalRange() {
|
|
return this._chartWidget.model().timeScale().logicalRange()
|
|
}
|
|
exportData(e) {
|
|
const t = {
|
|
...e
|
|
};
|
|
return void 0 !== t.from && (t.from = this._convertTimeFromPublic(t.from)),
|
|
void 0 !== t.to && (t.to = this._convertTimeFromPublic(t.to)), i.e(
|
|
"export-data").then(i.bind(null, "SIoL")).then(e => e.exportData(this
|
|
._chartWidget.model().model(), t))
|
|
}
|
|
barTimeToEndOfPeriod(e) {
|
|
const t = this._prepareEndOfPeriodArgs();
|
|
return Object(o.a)(t.barBuilder, e, t.intervalObj)
|
|
}
|
|
endOfPeriodToBarTime(e) {
|
|
const t = this._prepareEndOfPeriodArgs();
|
|
return Object(o.b)(t.barBuilder, e, t.intervalObj)
|
|
}
|
|
properties() {
|
|
return this._chartWidget.properties()
|
|
}
|
|
setBarSpacing(e) {
|
|
this._chartWidget.model().timeScale().setBarSpacing(e)
|
|
}
|
|
scrollChartByBar(e) {
|
|
this._chartWidget.model().scrollChartByBar(e)
|
|
}
|
|
mergeAllScales(e) {
|
|
this._chartWidget.model().mergeAllScales(e)
|
|
}
|
|
chartPainted() {
|
|
return this._chartWidget.chartPainted()
|
|
}
|
|
axesSizeReady() {
|
|
for (const e of this._chartWidget.paneWidgets()) {
|
|
for (const t of e.leftPriceAxisesContainer().axes())
|
|
if (!t.sizeReady()) return !1;
|
|
for (const t of e.rightPriceAxisesContainer().axes())
|
|
if (!t.sizeReady()) return !1
|
|
}
|
|
return !0
|
|
}
|
|
applyOverrides(e) {
|
|
this._chartWidget.applyOverrides(e)
|
|
}
|
|
addOverlayStudy(e, t, i) {
|
|
return this._chartWidget.addOverlayStudy(e, t, i)
|
|
}
|
|
ranges() {
|
|
throw new Error("not implemented")
|
|
}
|
|
getTimeScale() {
|
|
return new a(this._chartWidget.model().timeScale())
|
|
}
|
|
_destroy() {
|
|
this._chartWidget.hasModel() && this._chartWidget.model().crossHairSource().moved()
|
|
.unsubscribeAll(this)
|
|
}
|
|
_createStudy(e) {
|
|
return Promise.reject("Pine and java studies are not supported")
|
|
}
|
|
_convertTimeToPublic(e) {
|
|
const t = this._getSeriesAligner();
|
|
return null !== t ? t.timeToExchangeTradingDay(1e3 * e) / 1e3 : e
|
|
}
|
|
_convertIndexToPublicTime(e) {
|
|
const t = this._chartWidget.model(),
|
|
i = t.timeScale();
|
|
if (i.isEmpty()) return null;
|
|
const r = i.points(),
|
|
n = Object(s.ensureNotNull)(r.firstIndex()),
|
|
o = Object(s.ensureNotNull)(r.lastIndex());
|
|
let a = null;
|
|
if (n <= e && e <= o) a = r.valueAt(e);
|
|
else if (e > o) {
|
|
const r = t.mainSeries().syncModel();
|
|
if (null !== r) {
|
|
const t = Object(s.ensureNotNull)(i.indexToTimePoint(o));
|
|
a = r.projectTime(t, e - o)
|
|
}
|
|
}
|
|
return null !== a && (a = this._convertTimeToPublic(a)), a
|
|
}
|
|
_convertTimeFromPublic(e) {
|
|
const t = this._getSeriesAligner();
|
|
return null !== t ? t.timeToSessionStart(1e3 * e) / 1e3 : e
|
|
}
|
|
_getSeriesAligner() {
|
|
const e = this._chartWidget.model().mainSeries(),
|
|
t = e.interval(),
|
|
i = r.Interval.parse(t),
|
|
s = e.symbolInfo();
|
|
return this._alignerResolution.isEqualTo(i) && this._alignerSymbolInfo === s || (
|
|
this._dwmAligner = null === s ? null : Object(_.createDwmAligner)(t, s),
|
|
this._alignerResolution = i, this._alignerSymbolInfo = s), this._dwmAligner
|
|
}
|
|
_onCrosshairMoved(e) {
|
|
const t = this._convertIndexToPublicTime(e.index);
|
|
null !== t && this._crosshairMoved.fire({
|
|
price: e.price,
|
|
time: t
|
|
})
|
|
}
|
|
_makeSubscriptionFromDelegate(e) {
|
|
return {
|
|
subscribe: e.subscribe.bind(e),
|
|
unsubscribe: e.unsubscribe.bind(e),
|
|
unsubscribeAll: e.unsubscribeAll.bind(e)
|
|
}
|
|
}
|
|
_prepareEndOfPeriodArgs() {
|
|
const e = this._chartWidget.model().model(),
|
|
t = e.timezone(),
|
|
i = Object(s.ensureNotNull)(e.mainSeries().symbolInfo()),
|
|
o = e.mainSeries().interval(),
|
|
a = new n.SessionInfo(t, i.session, i.session_holidays, i.corrections);
|
|
return {
|
|
barBuilder: Object(n.newBarBuilder)(o, a, a),
|
|
intervalObj: r.Interval.parse(o)
|
|
}
|
|
}
|
|
}
|
|
},
|
|
FIi8: function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e, ...t) {
|
|
return e && "object" == typeof e ? (0 === t.length || t.forEach(t => {
|
|
null != t && "object" == typeof t && Object.keys(t).forEach(i => {
|
|
const n = e[i],
|
|
o = t[i];
|
|
if (o === e) return;
|
|
const a = Array.isArray(o);
|
|
if (o && (r(o) || a)) {
|
|
let t;
|
|
t = a ? n && Array.isArray(n) ? n : [] : n && r(n) ? n : {},
|
|
e[i] = s(t, o)
|
|
} else void 0 !== o && (e[i] = o)
|
|
})
|
|
}), e) : e
|
|
}
|
|
|
|
function r(e) {
|
|
if (!e || "[object Object]" !== Object.prototype.toString.call(e)) return !1;
|
|
const t = Object.getPrototypeOf(e);
|
|
if (!t) return !0;
|
|
const i = Object.hasOwnProperty.toString,
|
|
s = t.hasOwnProperty("constructor") && t.constructor;
|
|
return "function" == typeof s && i.call(s) === i.call(Object)
|
|
}
|
|
i.r(t), i.d(t, "deepExtend", (function() {
|
|
return s
|
|
}))
|
|
},
|
|
FKaq: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "SetPriceScaleSelectionStrategyCommand", (function() {
|
|
return a
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("RDU5"),
|
|
n = i("MWAT");
|
|
class o {
|
|
constructor(e) {
|
|
this._leftScales = e.leftPriceScales().map(e => e.id()), this._rightScales = e
|
|
.rightPriceScales().map(e => e.id())
|
|
}
|
|
restorePane(e) {
|
|
this._leftScales.reverse().map(t => Object(s.ensureNotNull)(e.getPriceScaleById(t)))
|
|
.forEach(t => e.movePriceScale(t, "left")), this._rightScales.reverse().map(t =>
|
|
Object(s.ensureNotNull)(e.getPriceScaleById(t))).forEach(t => e
|
|
.movePriceScale(t, "right"))
|
|
}
|
|
}
|
|
class a extends r.UndoCommand {
|
|
constructor(e, t, i) {
|
|
super(i), this._chartModel = e, this._targetStrategy = Object(n
|
|
.createPriceScaleSelectionStrategy)(t), this._initialState = e.panes()
|
|
.map(e => new o(e))
|
|
}
|
|
redo() {
|
|
this._chartModel.panes().forEach(e => e.setPriceScaleSelectionStrategy(this
|
|
._targetStrategy)), this._chartModel.fullUpdate()
|
|
}
|
|
undo() {
|
|
const e = this._chartModel.panes();
|
|
for (let t = 0; t < e.length; t++) this._initialState[t].restorePane(e[t]);
|
|
this._chartModel.fullUpdate()
|
|
}
|
|
}
|
|
},
|
|
FQhm: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "unsubscribe", (function() {
|
|
return l
|
|
})), i.d(t, "on", (function() {
|
|
return c
|
|
})), i.d(t, "subscribe", (function() {
|
|
return h
|
|
})), i.d(t, "subscribeToAll", (function() {
|
|
return u
|
|
})), i.d(t, "emit", (function() {
|
|
return d
|
|
})), i.d(t, "emitOnce", (function() {
|
|
return p
|
|
}));
|
|
var s = i("aIyQ"),
|
|
r = i.n(s);
|
|
const n = {},
|
|
o = [],
|
|
a = {};
|
|
|
|
function l(e, t, i) {
|
|
n[e].unsubscribe(i, t)
|
|
}
|
|
|
|
function c(e, t, i) {
|
|
h(e, t, i)
|
|
}
|
|
|
|
function h(e, t, i, s) {
|
|
n.hasOwnProperty(e) || (n[e] = new r.a), a[e] ? t.call(i) : n[e].subscribe(i, t, s)
|
|
}
|
|
|
|
function u(e) {
|
|
o.push(e)
|
|
}
|
|
|
|
function d(e, ...t) {
|
|
const i = [e].concat(t);
|
|
o.forEach(e => {
|
|
e.apply(null, i)
|
|
}), n.hasOwnProperty(e) && n[e].fire.apply(n[e], t)
|
|
}
|
|
|
|
function p(e) {
|
|
a[e] && console.warn(
|
|
`Something went wrong: emitOnce called multiple times with same event (${e})`), a[
|
|
e] = !0, d.apply(null, arguments)
|
|
}
|
|
},
|
|
FZIs: function(e, t, i) {
|
|
"use strict";
|
|
var s;
|
|
i.d(t, "a", (function() {
|
|
return s
|
|
})),
|
|
function(e) {
|
|
e.Light = "light", e.Dark = "dark"
|
|
}(s || (s = {}))
|
|
},
|
|
FaJS: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "scaleRatio", (function() {
|
|
return r
|
|
})), i.d(t, "priceRangeByScaleRatio", (function() {
|
|
return n
|
|
})), i.d(t, "barSpacingByScaleRatio", (function() {
|
|
return o
|
|
}));
|
|
var s = i("Qb4w");
|
|
|
|
function r(e, t) {
|
|
if (t.isLog() || e.isEmpty() || t.isEmpty()) return null;
|
|
const i = function(e) {
|
|
if (e.isEmpty()) return null;
|
|
const t = e.priceRange();
|
|
if (null === t) return null;
|
|
const i = t.length();
|
|
return e.internalHeight() / i
|
|
}(t);
|
|
if (null === i) return null;
|
|
return e.getValidBarSpacing() / Math.max(1e-10, i)
|
|
}
|
|
|
|
function n(e, t, i) {
|
|
if (e.isLog() || null === i || e.isEmpty()) return null;
|
|
const r = e.priceRange();
|
|
if (null === r || r.isEmpty()) return null;
|
|
const n = e.internalHeight() / (t / i),
|
|
o = r.length();
|
|
if (n === o) return r;
|
|
const a = (n - o) / 2;
|
|
return new s.PriceRange(r.minValue() - a, r.maxValue() + a)
|
|
}
|
|
|
|
function o(e, t) {
|
|
if (e.isLog() || null === t || e.isEmpty()) return null;
|
|
const i = e.priceRange();
|
|
if (null === i) return null;
|
|
const s = i.length();
|
|
return e.internalHeight() / s * t
|
|
}
|
|
},
|
|
Fdrt: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "PaneRendererStandardPivotLabel", (function() {
|
|
return r
|
|
}));
|
|
var s = i("VdBB");
|
|
class r {
|
|
constructor(e, t, i) {
|
|
this._drawRects = [], this._cacheProvider = e, this._point = t, this._label = i
|
|
}
|
|
draw(e, t) {
|
|
const i = this._cacheProvider(t);
|
|
e.save(), e.setTransform(1, 0, 0, 1, 0, 0);
|
|
const s = t.pixelRatio;
|
|
this._drawRects = [];
|
|
const r = t => {
|
|
const r = i.labelRectByIndex(t),
|
|
n = {
|
|
left: Math.round(this._point.x - r.width + o),
|
|
top: Math.round(this._point.y - r.height / 2),
|
|
width: r.width,
|
|
height: r.height
|
|
};
|
|
return e.drawImage(i.canvas(), Math.round(r.left * s), Math.round(r.top *
|
|
s), r.width * s, r.height * s, Math.round(n.left * s), Math
|
|
.round(n
|
|
.top * s), n.width * s, n.height * s), this._drawRects.push(n),
|
|
r.width
|
|
},
|
|
n = this._label.split("/");
|
|
let o = 0;
|
|
for (let e = 0; e < n.length; e++) {
|
|
const t = ["P", "S1", "R1", "S2", "R2", "S3", "R3", "S4", "R4", "S5", "R5"]
|
|
.indexOf(n[e]);
|
|
e > 0 && (o += r(t + 11) / 2), o += r(t) / 2
|
|
}
|
|
e.restore()
|
|
}
|
|
hitTest(e) {
|
|
for (const t of this._drawRects)
|
|
if (e.x >= t.left && e.x <= t.left + t.width && e.y >= t.top && e.y <= t.top + t
|
|
.height) return new s.HitTestResult(s.HitTestResult.REGULAR);
|
|
return null
|
|
}
|
|
}
|
|
},
|
|
Fixu: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "c", (function() {
|
|
return r
|
|
})), i.d(t, "d", (function() {
|
|
return n
|
|
})), i.d(t, "b", (function() {
|
|
return o
|
|
})), i.d(t, "a", (function() {
|
|
return a
|
|
}));
|
|
i("Eyy1"), i("dfhE");
|
|
|
|
function s(e, t) {
|
|
0
|
|
}
|
|
|
|
function r(e) {
|
|
s()
|
|
}
|
|
|
|
function n(e) {
|
|
s()
|
|
}
|
|
|
|
function o(e) {
|
|
s()
|
|
}
|
|
|
|
function a(e) {
|
|
0
|
|
}
|
|
},
|
|
FsE7: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Ss5c").LineDataSource,
|
|
r = i("5rJj"),
|
|
n = i("j3hX"),
|
|
o = n.LineToolWidthsProperty,
|
|
a = n.LineToolColorsProperty;
|
|
class l extends s {
|
|
constructor(e, t) {
|
|
super(e, t || l.createProperties()), this.version = l.version, i.e("lt-pane-views")
|
|
.then(i.t.bind(null, "wgWl", 7)).then(({
|
|
FibTimeZonePaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
levelsCount() {
|
|
return l.LevelsCount
|
|
}
|
|
migrateVersion(e, t, i) {
|
|
if (1 === e) {
|
|
i.properties.level1.color.setValue(i.properties.baselinecolor.value());
|
|
for (var s = 2; s <= 11; s++) i.properties["level" + s].color.setValue(i
|
|
.properties.linecolor.value());
|
|
for (s = 1; s <= 11; s++) i.properties["level" + s].linewidth.setValue(i
|
|
.properties.linewidth.value()), i.properties["level" + s].linestyle
|
|
.setValue(i.properties.linestyle.value())
|
|
}
|
|
}
|
|
pointsCount() {
|
|
return 2
|
|
}
|
|
name() {
|
|
return "Fib Time Zone"
|
|
}
|
|
processErase(e, t) {
|
|
var i = "level" + t,
|
|
s = this.properties()[i].visible;
|
|
e.setProperty(s, !1, "Erase level line")
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "SMr9")))
|
|
.FibTimezoneDefinitionsViewModel
|
|
}
|
|
static createProperties(e) {
|
|
var t = new r("linetoolfibtimezone", e, !1, {
|
|
range: [1, 11]
|
|
});
|
|
return l._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
s._configureProperties(e);
|
|
for (var t = [], i = [], r = 1; r <= l.LevelsCount; r++) t.push(e.child("level" + r)
|
|
.child("linewidth")), i.push(e.child("level" + r).child("color"));
|
|
for (t = [], i = [], r = 1; r <= l.LevelsCount; r++) t.push(e.child("level" + r)
|
|
.child("linewidth")), i.push(e.child("level" + r).child("color"));
|
|
e.addChild("linesColors", new a(i)), e.addChild("linesWidths", new o(t))
|
|
}
|
|
}
|
|
l.version = 2, l.LevelsCount = 11, t.LineToolFibTimeZone = l
|
|
},
|
|
"GD+X": function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return s
|
|
}));
|
|
class s {
|
|
constructor(e, t) {
|
|
this._chartUndoModel = e, this._chartModel = e.model(), this._priceScale = t
|
|
}
|
|
getMode() {
|
|
const e = this._priceScale.properties().childs();
|
|
return e.percentage.value() ? 2 : e.indexedTo100.value() ? 3 : e.log.value() ? 1 : 0
|
|
}
|
|
setMode(e) {
|
|
this._priceScale.setMode({
|
|
percentage: 2 === e,
|
|
log: 1 === e,
|
|
indexedTo100: 3 === e
|
|
})
|
|
}
|
|
isInverted() {
|
|
return this._priceScale.isInverted()
|
|
}
|
|
setInverted(e) {
|
|
this._priceScale.properties().childs().isInverted.setValue(e)
|
|
}
|
|
getVisiblePriceRange() {
|
|
return this._priceScale.priceRangeInPrice()
|
|
}
|
|
setVisiblePriceRange(e) {
|
|
this._priceScale.setPriceRangeInPrice(e), this._chartModel.lightUpdate()
|
|
}
|
|
hasMainSeries() {
|
|
return this._priceScale.hasMainSeries()
|
|
}
|
|
getStudies() {
|
|
return this._priceScale.getStudies().map(e => e.id())
|
|
}
|
|
currency() {
|
|
const e = this._priceScale.currency(this._chartModel.availableCurrencies());
|
|
return null === e ? null : {
|
|
selectedCurrency: e.selectedCurrency,
|
|
readOnly: e.readOnly
|
|
}
|
|
}
|
|
setCurrency(e) {
|
|
this._chartUndoModel.setPriceScaleCurrency(this._priceScale, e)
|
|
}
|
|
unit() {
|
|
const e = this._priceScale.unit(this._chartModel.availableUnits());
|
|
return null === e ? null : {
|
|
selectedUnit: e.selectedUnit,
|
|
readOnly: 0 === e.availableGroups.size,
|
|
availableGroups: Array.from(e.availableGroups)
|
|
}
|
|
}
|
|
setUnit(e) {
|
|
this._chartUndoModel.setPriceScaleUnit(this._priceScale, e)
|
|
}
|
|
}
|
|
},
|
|
GDWD: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "addPlusButtonProperty", (function() {
|
|
return o
|
|
})), i.d(t, "restoreAddPlusButtonSettingsValue", (function() {
|
|
return a
|
|
}));
|
|
var s = i("Vdly"),
|
|
r = i("m/cY");
|
|
|
|
function n() {
|
|
return s.getBool("add_plus_button", !0)
|
|
}
|
|
const o = Object(r.a)(n());
|
|
|
|
function a() {
|
|
o.setValue(!0), s.remove("add_plus_button")
|
|
}
|
|
s.onSync.subscribe(null, () => o.setValue(n())), o.listeners().subscribe(null, () => s.setValue(
|
|
"add_plus_button", o.value()))
|
|
},
|
|
GEp6: function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e, t, i) {
|
|
var s = t.subtract(e),
|
|
r = i.subtract(e).dotProduct(s) / s.dotProduct(s);
|
|
return {
|
|
coeff: r,
|
|
distance: e.addScaled(s, r).subtract(i).length()
|
|
}
|
|
}
|
|
Object.defineProperty(t, "__esModule", {
|
|
value: !0
|
|
}), t.distanceToSegment = t.distanceToLine = void 0, t.distanceToLine = s, t
|
|
.distanceToSegment = function(e, t, i) {
|
|
var r = s(e, t, i);
|
|
if (0 <= r.coeff && r.coeff <= 1) return r;
|
|
var n = e.subtract(i).length(),
|
|
o = t.subtract(i).length();
|
|
return n < o ? {
|
|
coeff: 0,
|
|
distance: n
|
|
} : {
|
|
coeff: 1,
|
|
distance: o
|
|
}
|
|
}
|
|
},
|
|
GH0z: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "PercentageFormatter", (function() {
|
|
return n
|
|
}));
|
|
var s = i("kcTO"),
|
|
r = i("Ialn");
|
|
class n extends s.PriceFormatter {
|
|
constructor(e = 100) {
|
|
super(e), this.type = "percentage"
|
|
}
|
|
state() {
|
|
const e = s.PriceFormatter.prototype.state.call(this);
|
|
return e.percent = !0, e
|
|
}
|
|
parse(e) {
|
|
return e = e.replace("%", ""), super.parse(e)
|
|
}
|
|
format(e, t, i, s, n = !0) {
|
|
const o = super.format(e, t, i, s, !1) + "%";
|
|
return n ? Object(r.forceLTRStr)(o) : o
|
|
}
|
|
static serialize(e) {
|
|
return e.state()
|
|
}
|
|
static deserialize(e) {
|
|
return new n(e.priceScale)
|
|
}
|
|
}
|
|
},
|
|
GUQs: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return r
|
|
})), i.d(t, "c", (function() {
|
|
return n
|
|
})), i.d(t, "b", (function() {
|
|
return o
|
|
}));
|
|
var s = i("qFKp");
|
|
|
|
function r(e) {
|
|
e.cancelable && e.preventDefault()
|
|
}
|
|
|
|
function n(e) {
|
|
return t => {
|
|
r(t), e()
|
|
}
|
|
}
|
|
|
|
function o(e) {
|
|
s.isChrome && e.addEventListener("mousedown", e => {
|
|
if (1 === e.button) return e.preventDefault(), !1
|
|
})
|
|
}
|
|
},
|
|
GVHu: function(e, t, i) {
|
|
"use strict";
|
|
(function(e, s) {
|
|
var r = i("Eyy1"),
|
|
n = r.assert,
|
|
o = r.ensureNotNull,
|
|
a = i("hsV8").unpackNonSeriesData,
|
|
l = i("n5al").symbolTitle,
|
|
c = i("38az").StudyBarColorer,
|
|
h = i("hezA").StudyPriceAxisView,
|
|
u = i("jenN"),
|
|
d = u.emptyStudyGraphics,
|
|
p = u.loadStudyGraphics,
|
|
_ = u.saveStudyGraphics,
|
|
m = u.LiveStudyGraphics,
|
|
f = u.createGraphicsPriceAxisViews,
|
|
g = i("XzZr").ChartApiInterface,
|
|
b = i("Ocx9").DefaultProperty,
|
|
v = i("kcTO").PriceFormatter,
|
|
S = i("nEwK").VolumeFormatter,
|
|
y = i("GH0z").PercentageFormatter,
|
|
w = i("k9/m"),
|
|
P = w.PlotList,
|
|
C = w.PlotRowSearchMode,
|
|
x = i("0YCj"),
|
|
T = (i("cBZt").extractStudyId, i("FQhm")),
|
|
I = i("23IT"),
|
|
M = I.LineStudyPlotStyle,
|
|
O = i("TmNs").StudyPriceLineAxisView,
|
|
L = i("w4Ji").studyPlotFunctionMap,
|
|
A = i("w4Ji").studyEmptyPlotValuePredicate,
|
|
E = i("jy4L").makeNextStudyId,
|
|
k = i("Kxc7"),
|
|
D = i("IcDj").StudyBase,
|
|
V = i("i6cO").ColorerType,
|
|
B = i("H0vP").InvalidationMask,
|
|
R = i("bmVy"),
|
|
N = R.StudyStatusType,
|
|
j = (R.convertStudyStatusToString, i("Tmoa").colorToInteger),
|
|
F = i("UAFa").createStudyPlotColorProvider,
|
|
W = i("0C7r").intervalsVisibilitiesDefaults,
|
|
H = i("txPx").getLogger("Chart.Study"),
|
|
U = k.enabled("datasource_copypaste"),
|
|
z = k.enabled("study_symbol_ticker_description"),
|
|
G = k.enabled("hide_unresolved_symbols_in_legend");
|
|
|
|
function q(e, t, i) {
|
|
var s = new b(t, i, !0);
|
|
s.addExclusion("visible"), s.addExclusion("precision"), s.addExclusion("minTick"), s
|
|
.addExclusion("intervalsVisibilities");
|
|
for (var r = 0; r < e.inputs.length; ++r) {
|
|
var n = e.inputs[r];
|
|
n.isHidden && (s.addExclusion("inputs." + r.toString()), s.addExclusion(
|
|
"inputs." + n.id))
|
|
}
|
|
return s
|
|
}
|
|
|
|
function Y(e, t) {
|
|
if (t.plots)
|
|
for (var i = 0; i < t.plots.length; i++) {
|
|
var s = t.plots[i],
|
|
r = s.id;
|
|
if (!I.isColorerPlot(s)) {
|
|
var n = {
|
|
visible: !0,
|
|
color: "#0496FF",
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
linewidth: 2,
|
|
plottype: M.Line,
|
|
histogramBase: 0,
|
|
transparency: 50,
|
|
trackPrice: !1,
|
|
joinPoints: !1
|
|
};
|
|
I.isBarColorerPlot(s) && (n.transparency = 0), n.plottype = s.type, n
|
|
.title = r, e.styles && r in e.styles && TradingView.merge(n, e
|
|
.styles[r]), e.styles[r] = n
|
|
}
|
|
}
|
|
}
|
|
|
|
function K(e, t) {
|
|
return e && e[t] && e[t].hasOwnProperty("showLast") ? e[t].showLast.value() : null
|
|
}
|
|
class J extends D {
|
|
constructor(e, t, i, r) {
|
|
super(e, t, i, r), this._resolvedSymbols = {}, this
|
|
._priceAxisViewsBase = [], this._graphicsPriceAxisViews = [], this
|
|
._priceLinesAxisViews = [], this._hlinesPriceAsisViews = [], this
|
|
._horizlinesPriceAsisViews = [], this._chartApi = e._chartApi, this
|
|
._turnaroundCounter = 0, this._turnaround = "st" + this
|
|
._turnaroundCounter, this._plotFields = [];
|
|
var n = this.metaInfo().plots;
|
|
if (n)
|
|
for (var o = 0, a = n.length; o < a; o++) {
|
|
var l = n[o].id;
|
|
this._plotFields.push(l)
|
|
}
|
|
this._invalidateLastNonEmptyPlotRowCache(), this.m_data = new P(L(this
|
|
._metaInfo), A), this._graphics = new m, this._plotOffsets = {},
|
|
this._plotOffsetsMetaInfoOverride = {}, this._studyModified = !1, this
|
|
._tagsChanged = new s, this._labelPaneViews = [], this._createViews();
|
|
var c = this;
|
|
this._handler = function(e) {
|
|
c.onData(e)
|
|
},
|
|
this._handler.isTVScriptStrategy = this._metaInfo.isTVScriptStrategy,
|
|
this._recreatePriceFormattingDependencies(), this._properties.precision
|
|
.listeners().subscribe(this, this._precisionChanged), this
|
|
._showStudyArgumentsProperty.listeners().subscribe(this, this
|
|
.invalidateTitleCache), this._properties.description.listeners()
|
|
.subscribe(this, this.invalidateTitleCache), this._properties.inputs
|
|
.listeners().subscribe(this, this.invalidateTitleCache), this
|
|
._properties.shortDescription && this._properties.shortDescription
|
|
.listeners().subscribe(this, this.invalidateTitleCache), k.enabled(
|
|
"update_study_formatter_on_symbol_resolve") && e.mainSeries()
|
|
.dataEvents().symbolResolved().subscribe(this, this
|
|
._recreatePriceFormattingDependencies), e.mainSeries().dataEvents()
|
|
.symbolResolved().subscribe(this, this.invalidateTitleCache);
|
|
c = this;
|
|
var h = {};
|
|
this._simplePlotsCount = r.plots.filter((function(e, t) {
|
|
if (I.isLinePlot(e)) return !0;
|
|
if (I.isOhlcPlot(e)) {
|
|
var i = c.metaInfo().plots[t].target;
|
|
return !h[i] && (h[i] = i, !0)
|
|
}
|
|
return !1
|
|
})).length, this._properties.showInDataWindow.listeners().subscribe(e, e
|
|
.fullUpdate), this.hasBarColorer() && this._properties.visible
|
|
.listeners().subscribe(e.mainSeries(), e.mainSeries()
|
|
.invalidateBarStylesCache), this._childStudyByRebind = new s, this
|
|
._formatterChanged = new s, this._priceStepChanged = new s, this
|
|
._aboutToBeDestroyed = new s, this._ongoingDataUpdate = Promise
|
|
.resolve(), this._isDestroyed = !1, this._definitionsViewModel = null
|
|
}
|
|
lastValueData(e, t, i) {
|
|
var s = {
|
|
noData: !0
|
|
};
|
|
if (this._model.timeScale().isEmpty() || null == this.priceScale() || this
|
|
.priceScale().isEmpty() || this.data().isEmpty()) return s;
|
|
var r = this._model.timeScale().visibleBarsStrictRange();
|
|
if (null === r) return s;
|
|
if (!this.properties().visible.value()) return s;
|
|
var n, o, a = this.properties().styles,
|
|
l = this.properties().ohlcPlots;
|
|
if (a && a[e] && (n = a[e]), l && l[e] && (n = l[e]), !n || !n.visible
|
|
.value()) return s;
|
|
var c = this.metaInfo().plots;
|
|
for (o = 0; o < c.length && !(c[o].id === e || I.isOhlcClosePlot(o) && c[o]
|
|
.target === e); o++);
|
|
var h = o + 1,
|
|
u = this.offset(e),
|
|
d = this.nearestIndex(r.lastBar() - u, C.NearestLeft, h);
|
|
if (null == d) return s;
|
|
var p = this._lastNonEmptyPlotRow(h),
|
|
_ = null !== p && r.contains(p.index),
|
|
m = null !== p ? p.value : null,
|
|
f = t || _ ? m : this.data().valueAt(d);
|
|
if (!f || !isNumber(f[h])) return s;
|
|
var g = {
|
|
noData: !1
|
|
},
|
|
b = f[h];
|
|
i && (g.price = b);
|
|
var v = this.firstValue(!0);
|
|
if (!isNumber(v)) return s;
|
|
g.text = this.priceScale().formatPrice(b, v), g.formattedPriceAbsolute =
|
|
this.priceScale().formatPriceAbsolute(b), g.formattedPricePercentage =
|
|
this.priceScale().formatPricePercentage(b, v);
|
|
const S = F(this.metaInfo(), this.properties(), e).getPlotPointStyle(f)
|
|
.colors[V.Main];
|
|
return g.color = S || n.color.value(), g.floatCoordinate = this.priceScale()
|
|
.priceToCoordinate(b, v), g.coordinate = g.floatCoordinate, g.item = f,
|
|
g
|
|
}
|
|
isFailed() {
|
|
return this._status.type === N.Error
|
|
}
|
|
isLoading() {
|
|
return this._status.type === N.Loading
|
|
}
|
|
series() {
|
|
return this._series
|
|
}
|
|
model() {
|
|
return this._model
|
|
}
|
|
clearData() {
|
|
this._invalidateLastNonEmptyPlotRowCache(), this.data().clear(), this
|
|
._graphics.clear && this._graphics.clear(), this._plotOffsets = {}
|
|
}
|
|
onTagsChanged() {
|
|
return this._tagsChanged
|
|
}
|
|
properties() {
|
|
return this._properties
|
|
}
|
|
state(e, t) {
|
|
var i = {
|
|
type: TradingView.className(this.constructor),
|
|
id: this.id(),
|
|
state: this.properties().state(),
|
|
zorder: this.zorder(),
|
|
ownFirstValue: this.isVisible() ? null : this._ownFirstValue
|
|
};
|
|
this.metaInfo() instanceof x ? i.metaInfo = TradingView.clone(this
|
|
.metaInfo().state()) : (i.metaInfo = TradingView.clone(this
|
|
.metaInfo()),
|
|
i.metaInfo.id = x.parseIdString(i.metaInfo.id + (i.metaInfo
|
|
.version ? "-" + i.metaInfo.version : "")).fullId), e && (i
|
|
.data = this.data().state(), i.data.symbols = this._resolvedSymbols,
|
|
i.data.graphics = _(this.graphics()), i.data.plotOffsets = this
|
|
._plotOffsets), this.ownerSource() && (i.ownerSource = this
|
|
.ownerSource().id());
|
|
for (var s = 0; s < this._metaInfo.inputs.length; s++)
|
|
if ("bar_time" === this._metaInfo.inputs[s].type) {
|
|
var r = this._metaInfo.inputs[s].id,
|
|
n = i.state.inputs[r];
|
|
if (n < 0) {
|
|
var o = this._rightOffsetToUnixTime(-n);
|
|
i.state.inputs[r] = o && o >= 0 ? o : 0
|
|
}
|
|
} return this._isChildStudy && x.patchChildStudyMetaInfoState(i), i
|
|
}
|
|
_plotsForAlert() {
|
|
var e = this,
|
|
t = this._metaInfo,
|
|
i = [I.isLinePlot, I.isShapesPlot, I.isCharsPlot, I.isArrowsPlot, I
|
|
.isOhlcPlot, I.isAlertConditionPlot
|
|
];
|
|
return t.plots.map((function(e, t) {
|
|
return e.pinePlotIndex = t, e
|
|
})).filter((function(e) {
|
|
return i.some((function(t) {
|
|
return t(e)
|
|
}))
|
|
})).map((function(i) {
|
|
var s = {
|
|
id: i.id,
|
|
type: i.type,
|
|
pinePlotIndex: i.pinePlotIndex,
|
|
offset: e.offset(i.id)
|
|
};
|
|
return t.styles && void 0 !== t.styles[i.id] && (s.title = t
|
|
.styles[i.id].title || "", s.text = t.styles[i.id]
|
|
.text || ""), i.target && t.ohlcPlots && t
|
|
.ohlcPlots[i.target] && (s.ohlcTitle = t.ohlcPlots[i
|
|
.target].title), s
|
|
}))
|
|
}
|
|
_collectDepsForAlert() {
|
|
throw new Error("Not implemented")
|
|
}
|
|
idForAlert() {
|
|
return D.prototype.idForAlert.call(this)
|
|
}
|
|
dependenciesForAlerts() {
|
|
throw new Error("Not implemented")
|
|
}
|
|
_hasAvailableAlertPlots() {
|
|
return !1
|
|
}
|
|
_hasAlertablePlots() {
|
|
return (this.metaInfo().plots || []).some((function(e) {
|
|
return "line" === e.type
|
|
}))
|
|
}
|
|
_hasAlertConditions() {
|
|
if (this.metaInfo().plots.some(I.isAlertConditionPlot)) return !0;
|
|
var e = this.stateForAlert();
|
|
return Boolean(e.alerts && e.alerts.conditions)
|
|
}
|
|
_hasAlertFunction() {
|
|
const e = this.metaInfo();
|
|
return Boolean(e.hasAlertFunction)
|
|
}
|
|
_isAlertFeatureEnabled() {
|
|
return !1
|
|
}
|
|
hasStateForAlert() {
|
|
return this._isAlertFeatureEnabled() && !this.isFailed() && (this.metaInfo()
|
|
.isTVScript ? this._hasAlertConditions() || this
|
|
._hasAvailableAlertPlots() || this._hasAlertFunction() : this
|
|
._hasAlertablePlots())
|
|
}
|
|
stateForAlert() {
|
|
throw new Error("Not implemented")
|
|
}
|
|
isSavedInStudyTemplates() {
|
|
for (var e = 0; e < this._metaInfo.inputs.length; e++)
|
|
if ("bar_time" === this._metaInfo.inputs[e].type) return !1;
|
|
return !0
|
|
}
|
|
restoreData(e) {
|
|
this._invalidateLastNonEmptyPlotRowCache(), this.data().restoreState(e),
|
|
this._resolvedSymbols = e.symbols, this._graphics = e.graphics ? p(e
|
|
.graphics) : d(), this._postProcessGraphics(), this._plotOffsets = e
|
|
.plotOffsets, this._status = {
|
|
type: N.Completed
|
|
}
|
|
}
|
|
restart(e) {
|
|
this._restarting = !0, this.clearData(), (e || k.enabled(
|
|
"stop_study_on_restart")) && this.stop(), setTimeout(this.start
|
|
.bind(this), 0)
|
|
}
|
|
stop(e) {
|
|
if (!0 === e && this._children)
|
|
for (var t = 0; t < this._children.length; ++t) this._children[t].stop(!
|
|
0);
|
|
this._stopStudyOnServer(), this.clearData(), this._unsubscribeToSessionId(),
|
|
this.recalculate()
|
|
}
|
|
_allInputsAreValid() {
|
|
for (var e = 0; e < this._metaInfo.inputs.length; e++)
|
|
if ("bar_time" === this._metaInfo.inputs[e].type) {
|
|
var t = this._metaInfo.inputs[e].id,
|
|
i = this._properties.inputs[t].value();
|
|
if (void 0 === i || null == i) return !1
|
|
} return !0
|
|
}
|
|
sourceId() {
|
|
return this._studyId
|
|
}
|
|
parentSource() {
|
|
return this._source || this._series
|
|
}
|
|
symbolSource() {
|
|
return this.parentSource().symbolSource()
|
|
}
|
|
source() {
|
|
return this.parentSource()
|
|
}
|
|
ownerSource() {
|
|
return this._isChildStudy ? this._source : D.prototype.ownerSource.call(
|
|
this)
|
|
}
|
|
getAllOwnerSources() {
|
|
for (var e = [], t = this.ownerSource(); null != t;) e.push(t), t = t
|
|
.ownerSource();
|
|
return e
|
|
}
|
|
isChildStudy() {
|
|
return !!this._isChildStudy
|
|
}
|
|
setChild(e) {
|
|
e instanceof J && e.source() === this && (this._children || (this
|
|
._children = []), -1 === this._children.indexOf(e) && this
|
|
._children.push(e))
|
|
}
|
|
unsetChild(e) {
|
|
if (e instanceof J && e.source() === this && this._children) {
|
|
var t = this._children.indexOf(e);
|
|
~t && this._children.splice(t, 1)
|
|
}
|
|
}
|
|
hasChildren() {
|
|
return !(!this._children || !this._children.length)
|
|
}
|
|
getAllChildren() {
|
|
if (!Array.isArray(this._children)) return [];
|
|
for (var e = this._children.slice(), t = 0; t < e.length; ++t)
|
|
for (var i = e[t].getAllChildren(), s = 0; s < i.length; ++s) ~e
|
|
.indexOf(i[s]) || e.push(i[s]);
|
|
return e
|
|
}
|
|
_debugId() {
|
|
var e = [];
|
|
return this._studyId && e.push(this._studyId), e.push(this._metaInfo
|
|
.fullId), e.push(this._metaInfo.description), JSON.stringify({
|
|
study: e
|
|
})
|
|
}
|
|
isStarted() {
|
|
return !!this._studyId
|
|
}
|
|
_isStopped() {
|
|
return !this.isStarted()
|
|
}
|
|
isRestarting() {
|
|
return !!this._restarting
|
|
}
|
|
start(e, t) {
|
|
var i = this._model.mainSeries();
|
|
if (!i.isStarted()) return void i.dataEvents().completed().subscribe(this, (
|
|
function() {
|
|
this.start(e, t)
|
|
}), !0);
|
|
this._isChildStudy && this._source.isHibernated() && this._source.start();
|
|
const s = !(!this._isChildStudy && !this.hasChildren() && !this
|
|
.isVisible()) || !0 === t;
|
|
this._chartApi && this._chartApi.connected() && s && this
|
|
._allSymbolsAreResolved().then(function() {
|
|
this._startAfterSymbolsResolved(e, t)
|
|
}.bind(this)).catch(function(e) {
|
|
H.logError("ERROR: " + this._debugId() + " start failed, " + e),
|
|
delete this._restarting
|
|
}.bind(this))
|
|
}
|
|
_getStudyIdWithLatestVersion() {
|
|
var e = x.cutDollarHash(this._metaInfo.id),
|
|
t = e;
|
|
return e.indexOf("@tv-scripting") >= 0 ? t += "-101!" : t += "-" + this
|
|
._metaInfo.version, t
|
|
}
|
|
_startAfterSymbolsResolved(e, t) {
|
|
if (!this.isStarted() || this._restarting) {
|
|
if (this._isChildStudy) {
|
|
if (!this._source.isStarted() || this._source.isRestarting())
|
|
return void this._source.onStart.subscribe(this, this
|
|
._startAfterSymbolsResolved, !0);
|
|
x.setChildStudyMetaInfoPropertiesSourceId(this._metaInfo, this
|
|
._source.sourceId(), this._properties)
|
|
}
|
|
if (delete this._restarting, this._allInputsAreValid() && (this
|
|
._inputs = this.inputs({
|
|
keepOptionalSymbolsEmpty: !0
|
|
}), this._createStudyOnServer(), this._subscribeToSessionId(),
|
|
this.onStart.fire(), !0 === e && this._children))
|
|
for (var i = 0; i < this._children.length; ++i) this._children[i]
|
|
.start(!0, t)
|
|
}
|
|
}
|
|
_createStudyOnServer() {
|
|
var e = this._getStudyIdWithLatestVersion();
|
|
this._studyId = E(), this._incrementTurnaround(), this._studyName = e,
|
|
this._chartApi.createStudy(this._studyId, this._turnaround, this
|
|
._isChildStudy ? this._source.sourceId() : this._series
|
|
.seriesSource().instanceId(), this._studyName, this._inputs, this
|
|
._handler, this._isChildStudy)
|
|
}
|
|
_modifyStudyOnServer(e) {
|
|
this._chartApi.modifyStudy(this._studyId, this._turnaround, e, this
|
|
._handler)
|
|
}
|
|
_stopStudyOnServer() {
|
|
this._chartApi && this._chartApi.connected() && this.isStarted() && this
|
|
._chartApi.removeStudy(this._studyId, this._isChildStudy), this
|
|
._studyId = null
|
|
}
|
|
_rightOffsetToUnixTime(e) {
|
|
var t = null;
|
|
if (this._series.bars().size() >= e) {
|
|
var i = o(this._series.bars().lastIndex()) - e;
|
|
t = o(this._series.bars().valueAt(i))[TradingView.TIME_PLOT]
|
|
}
|
|
return t
|
|
}
|
|
inputsForAlert() {
|
|
var e = this.offset(),
|
|
t = this.inputs();
|
|
return e && t.push(e), t
|
|
}
|
|
inputsForAlertState() {
|
|
return this.inputs()
|
|
}
|
|
_prepareInputValue(e, t) {
|
|
var i = e.id;
|
|
if (t.valuesAsIsFromProperties) return this._properties.inputs[i].value();
|
|
if ("symbol" === e.type) {
|
|
var s = t && t.symbolsForDisplay,
|
|
r = this._properties.inputs[i].value(),
|
|
n = s ? r : this._getSymbolForApi(r),
|
|
o = this._resolvedSymbols && this._resolvedSymbols[this
|
|
._getSymbolForResolve(n)];
|
|
if ("" === n && e.optional) {
|
|
if (t && t.keepOptionalSymbolsEmpty) return n;
|
|
n = this._model.mainSeries().symbol(), o = this._model.mainSeries()
|
|
.symbolInfo()
|
|
}
|
|
if (s)
|
|
if (o)
|
|
if (z) {
|
|
switch (this._model.mainSeries().properties()
|
|
.statusViewStyle.symbolTextSource.value()) {
|
|
case "description":
|
|
n = o.description;
|
|
break;
|
|
case "ticker-and-description":
|
|
n = `${o.name}, ${o.description}`;
|
|
break;
|
|
case "ticker":
|
|
n = o.name
|
|
}
|
|
} else n = l(o, t.noExchanges);
|
|
else G && (n = "");
|
|
else o && (n = o.ticker || o.full_name), !this.isPine() && t && t
|
|
.symbolsForChartApi && (n = this.getSymbolString(n));
|
|
return n
|
|
}
|
|
if ("bar_time" === e.type) {
|
|
var a = this._properties.inputs[i].value();
|
|
if (a < 0) {
|
|
var c = this._rightOffsetToUnixTime(-a);
|
|
a = c && c >= 0 ? c : a
|
|
}
|
|
return a
|
|
}
|
|
if (this._metaInfo.isTVScript || this._metaInfo.pine) {
|
|
if ("text" === i) return this._metaInfo.defaults.inputs.text;
|
|
if ("pineId" === i) return this._metaInfo.scriptIdPart;
|
|
if ("pineVersion" === i) return this._metaInfo.pine ? this._metaInfo
|
|
.pine.version : "-1";
|
|
if ("color" === e.type && this._metaInfo.isRGB) {
|
|
var h = this._properties.inputs[i].value();
|
|
return j(h)
|
|
}
|
|
return this._properties.inputs[i].value()
|
|
}
|
|
return this._properties.inputs[i].value()
|
|
}
|
|
_rebindToSource(e, t) {
|
|
var i = this.parentSource();
|
|
if (this._isChildStudy) {
|
|
var s;
|
|
this._source.unsetChild(this);
|
|
var r = null;
|
|
if (e === this._model.mainSeries()) delete this._source, delete this
|
|
._isChildStudy, delete this._ownerSource, s = this._series
|
|
.seriesSource().instanceId(), r = g
|
|
.REBIND_STUDY_CHILD_TO_STANDALONE;
|
|
else {
|
|
if (!(e instanceof J)) return H.logError(
|
|
"Unable to rebind study to source of this type"), !1;
|
|
this._ownerSource = e, this._source = e, s = this._source
|
|
.sourceId(), this._source.setChild(this), this._source
|
|
.isHibernated() && this._source.start()
|
|
}
|
|
this._incrementTurnaround(), this.disablePriceRangeReady(), this
|
|
._chartApi.rebindStudy(this._studyId, this._turnaround, s, this
|
|
._studyName, t, this._handler, r)
|
|
} else {
|
|
if (!(e instanceof J)) return H.logError(
|
|
"Unable to rebind study to source of this type"), !1;
|
|
var n = e.isHibernated();
|
|
n && e.start();
|
|
var o = !1;
|
|
if (this._canCreateStudyWithRebindType(g
|
|
.REBIND_STUDY_STANDALONE_TO_CHILD) && (this
|
|
._incrementTurnaround(), this.disablePriceRangeReady(), o = this
|
|
._chartApi.rebindStudy(this._studyId, this._turnaround, e
|
|
.sourceId(), this._studyName, t, this._handler, g
|
|
.REBIND_STUDY_STANDALONE_TO_CHILD)), !o) return n && e
|
|
.stop(), !1;
|
|
this._isChildStudy = !0, this._ownerSource = e, this._source = e, this
|
|
._source.setChild(this), this._childStudyByRebind.fire()
|
|
}
|
|
var a = this.m_priceScale,
|
|
l = e.priceScale();
|
|
if (a !== l) {
|
|
var c = this._model.paneForSource(this),
|
|
h = this._model.paneForSource(e);
|
|
c === h && h.move(this, l, !0)
|
|
}
|
|
const u = this.parentSource();
|
|
return i.formatterChanged().unsubscribe(this, this
|
|
._onSourceFormatterChanged), u.formatterChanged().subscribe(this,
|
|
this._onSourceFormatterChanged), i.priceStepChanged().unsubscribe(
|
|
this, this._onSourcePriceStepChanged), u.priceStepChanged()
|
|
.subscribe(this, this._onSourcePriceStepChanged), i.currencyChanged()
|
|
.unsubscribeAll(this), u.currencyChanged().subscribe(this, this
|
|
._onSourceCurrencyChanged), i.unitChanged().unsubscribeAll(this), u
|
|
.unitChanged().subscribe(this, this._onSourceUnitChanged), i
|
|
.priceRangeReadyChanged().unsubscribeAll(this), u
|
|
.priceRangeReadyChanged().subscribe(this, this
|
|
._onSourcePriceRangeReadyChanged), this
|
|
._recreatePriceFormattingDependencies(), !0
|
|
}
|
|
childStudyByRebind() {
|
|
return this._childStudyByRebind
|
|
}
|
|
_changeInputsImpl(e, t) {
|
|
var i = this.source(),
|
|
s = this._properties.inputs && this._properties.inputs.state(),
|
|
r = x.getSourceIdByInputs(this._metaInfo.inputs, s),
|
|
n = !0;
|
|
if (r)
|
|
if ("high" === r || "open" === r || "low" === r || "close" === r ||
|
|
"hl2" === r || "ohl3" === r || "ohlc4" === r) i = this._model
|
|
.mainSeries();
|
|
else
|
|
for (var o = this._model.dataSources().filter((function(e) {
|
|
return e instanceof J && e.canHaveChildren()
|
|
})), a = 0; a < o.length; ++a)
|
|
if (o[a].sourceId() === r) {
|
|
i = o[a];
|
|
break
|
|
} if (i !== this.source()) {
|
|
if (!this._rebindToSource(i, e) && s)
|
|
for (var l in t)
|
|
if (t.hasOwnProperty(l) && t[l] !== e[l] && 0 === e[l].indexOf(
|
|
r)) {
|
|
var c = this._properties.inputs[l],
|
|
h = t[l];
|
|
c.setValue(h), n = !1;
|
|
break
|
|
}
|
|
} else this._incrementTurnaround(), this.disablePriceRangeReady(), this
|
|
._modifyStudyOnServer(e);
|
|
this.invalidateTitleCache(), n && (this._studyModified = n)
|
|
}
|
|
_incrementTurnaround() {
|
|
this._turnaround = "st" + ++this._turnaroundCounter
|
|
}
|
|
_tryChangeInputs() {
|
|
var e = TradingView.clone(this._inputs);
|
|
this.isStarted() && this._chartApi.connected() ? this._allInputsAreValid() ?
|
|
this._allSymbolsAreResolved().then(function() {
|
|
var t = this.inputs({
|
|
keepOptionalSymbolsEmpty: !0
|
|
});
|
|
const i = JSON.stringify(t) !== JSON.stringify(this._inputs);
|
|
this._isStopped() ? i && this.disablePriceRangeReady() : i && (
|
|
this._changeInputsImpl(t, e), this._inputs = t)
|
|
}.bind(this)).catch(function(e) {
|
|
H.logError("ERROR: " + this._debugId() +
|
|
" _tryChangeInputs: cannot modify study, " + e)
|
|
}.bind(this)) : this.stop() : (this.stop(!0), this.start(!0)), this
|
|
._tagsChanged.fire()
|
|
}
|
|
testInputValue(e, t) {
|
|
if (!x.canBeChild(this._metaInfo) || !x.isSourceInput(e)) return !0;
|
|
var i = this._properties.inputs && this._properties.inputs[e.id];
|
|
if (!i) return !0;
|
|
var s = J.getInputRebindType(e, i.value(), t);
|
|
return !!this._canCreateStudyWithRebindType(s)
|
|
}
|
|
_canCreateStudyWithRebindType(e) {
|
|
return e !== g.REBIND_STUDY_STANDALONE_TO_CHILD || this._chartApi
|
|
.isCanCreateStudy(!0)
|
|
}
|
|
changeStyles() {
|
|
var e = void 0 !== this._metaInfo.inputs.find((function(e) {
|
|
return "symbol" === e.type
|
|
}));
|
|
!this.isStarted() && !e || this._restarting || (this._inputs ? this
|
|
._tryChangeInputs() : this._chartApi && this._chartApi
|
|
.connected() && this.restart())
|
|
}
|
|
_recreatePaneViews() {
|
|
this.hasBarColorer() && this._model.mainSeries().invalidateBarStylesCache(),
|
|
this._createViews(), this.recalculate(!0), this.updateAllViews()
|
|
}
|
|
_onPropertiesChanged() {
|
|
this.changeStyles(), this._recreatePaneViews(), T.emit(
|
|
"study_properties_changed", this._id)
|
|
}
|
|
_isModifiedStudyInputs(e) {
|
|
if (void 0 === this._oldStudyInputs) return this._oldStudyInputs = e, !0;
|
|
var t = Object.keys(this._oldStudyInputs);
|
|
return n(t.length === Object.keys(e).length,
|
|
"keys quantity should be equal"), t.forEach((function(t) {
|
|
n(e.hasOwnProperty(t), "key '" + t +
|
|
"' should existing in studyInputs"), this
|
|
._oldStudyInputs[t] !== e[t] && (this._oldStudyInputs =
|
|
e)
|
|
}), this), this._oldStudyInputs === e
|
|
}
|
|
_pinePatchProps() {
|
|
throw new Error("Not implemented")
|
|
}
|
|
priceLabelText(e) {
|
|
var t, i = this._metaInfo.styles,
|
|
s = this._metaInfo.ohlcPlots;
|
|
i && i[e] && (t = i[e]), s && s[e] && (t = s[e]);
|
|
var r = t.title;
|
|
return 1 !== this._simplePlotsCount || I.isPlotTitleDefined(r) ? this
|
|
._metaInfo.is_price_study && r !== this._metaInfo.shortDescription ?
|
|
"" === r ? this._metaInfo.shortDescription : this._metaInfo
|
|
.shortDescription + ":" + r : r : this._metaInfo.shortDescription
|
|
}
|
|
createPriceAxisView(e) {
|
|
return new h(this, {
|
|
plotIndex: e
|
|
})
|
|
}
|
|
createPriceLineAxisView(e) {
|
|
return new O(this, e)
|
|
}
|
|
_concatPriceAxisViews() {
|
|
this._priceAxisViews = [].concat(this._priceAxisViewsBase, this
|
|
._graphicsPriceAxisViews, this._hlinesPriceAsisViews, this
|
|
._horizlinesPriceAsisViews)
|
|
}
|
|
recalculate(e) {
|
|
var t = this._model.paneForSource(this);
|
|
this._model.recalculatePane(t, e), this._model.updateSource(this)
|
|
}
|
|
data() {
|
|
return this.m_data
|
|
}
|
|
metaInfo() {
|
|
return this._metaInfo
|
|
}
|
|
graphicsInfo() {
|
|
return this._metaInfo.graphics
|
|
}
|
|
graphics() {
|
|
return this._graphics
|
|
}
|
|
turnaround(e) {
|
|
var t = this.source();
|
|
return !0 === e ? (t === this._series ? t.seriesSource().turnaround() : t
|
|
.turnaround(!0)) + "_" + this._turnaround : this._turnaround
|
|
}
|
|
_checkTurnaround(e) {
|
|
return e === this._turnaround || e === this._model.mainSeries()
|
|
.seriesSource().turnaround() || e === this.turnaround(!0)
|
|
}
|
|
_handleStudyError(e) {
|
|
this.clearData(), this._setStatus(e), this._statusView.update(), this._model
|
|
.updateSource(this)
|
|
}
|
|
_onStudyLoading() {
|
|
this._setStatus({
|
|
type: N.Loading,
|
|
startTime: Date.now()
|
|
}), this._statusView.update(), this._model.updateSource(this)
|
|
}
|
|
_onStudyError(e) {
|
|
var t = "string" == typeof e ? {
|
|
error: e.split(":", 2)[0]
|
|
} : e;
|
|
this._handleStudyError({
|
|
type: N.Error,
|
|
errorDescription: t
|
|
}), this._enablePriceRangeReady()
|
|
}
|
|
_onStudyCompleted(e) {
|
|
this._studyModified && (this.clearData(), this._studyModified = !1), this
|
|
._setStatus({
|
|
type: N.Completed
|
|
}), this._statusView.update();
|
|
var t = this._model.paneForSource(this);
|
|
this._model.recalculatePane(t), this._updateSources();
|
|
var i = B.full();
|
|
null !== this._model.appliedTimeFrame().value() && i
|
|
.lockVisibleTimeRangeOnResize(), this._model.invalidate(i)
|
|
}
|
|
onData(e) {
|
|
switch (e.method) {
|
|
case "study_loading":
|
|
this._onStudyLoading();
|
|
break;
|
|
case "study_error":
|
|
this._onStudyError(e.params[2]);
|
|
break;
|
|
case "study_completed":
|
|
if (!this._checkTurnaround(e.params[1])) return;
|
|
this._onStudyCompleted(e.params[e.params.length - 1]);
|
|
break;
|
|
case "data_update":
|
|
if (e.params.customId !== this.sourceId() || !this._checkTurnaround(
|
|
e.params.turnaround)) return;
|
|
n(!!e.params.nonseries, "data.params.nonseries is missing"), this
|
|
._onDataUpdate(e.params.plots, e.params.nonseries);
|
|
break;
|
|
case "clear_data":
|
|
this._checkTurnaround(e.params.turnaround) && this.clearData()
|
|
}
|
|
}
|
|
_onDataUpdate(e, t) {
|
|
this._studyModified && (this.clearData(), this._studyModified = !1);
|
|
var i = a(t.d);
|
|
return this._ongoingDataUpdate = this._ongoingDataUpdate.then((function() {
|
|
return i
|
|
}), (function() {
|
|
return i
|
|
})).then(this._onDataUnpacked.bind(this, e, t.indexes)), this
|
|
._ongoingDataUpdate
|
|
}
|
|
_onDataUnpacked(e, t, i) {
|
|
this._isDestroyed || ("nochange" !== t && this._processPlotOffsets(i), this
|
|
.transformData(e), this._mergeData(e), null !== i && (i
|
|
.indexes_replace ? (n("nochange" !== t), this._graphics
|
|
.replaceIndexesTo(t)) : ("nochange" !== t && this._graphics
|
|
.replaceIndexesTo(t), void 0 !== i.graphicsCmds && this
|
|
._graphics.processCommands(i.graphicsCmds, this._metaInfo
|
|
.graphics))), this._onDataUpdated(e, i, t), this
|
|
.priceRangeReady() || this._enablePriceRangeReady())
|
|
}
|
|
_onDataUpdated(e, t, i) {
|
|
if (this.hasBarColorer() && e.length > 0) {
|
|
var s = this.barColorer().firstColoredBar(e[0].index);
|
|
this._model.mainSeries().invalidateBarStylesCache(s)
|
|
}
|
|
null !== t && this._postProcessGraphics();
|
|
var r = this._model.paneForSource(this);
|
|
this._model.recalculatePane(r), this._updateSources()
|
|
}
|
|
transformData(e) {}
|
|
moveData(e) {
|
|
this._ongoingDataUpdate = this._ongoingDataUpdate.then(function() {
|
|
this._invalidateLastNonEmptyPlotRowCache(), this.data().move(e)
|
|
}.bind(this))
|
|
}
|
|
replaceData(e, t, i) {
|
|
this._invalidateLastNonEmptyPlotRowCache(), this.data().remove(e + 1), this
|
|
.data().addTail(i, t)
|
|
}
|
|
_updateSources() {
|
|
this._model.updateSource(this), this.hasBarColorer() && this._model
|
|
.updateSource(this._model.mainSeries())
|
|
}
|
|
static processPlotOffsets(e, t) {
|
|
t && t.indexes_replace || (e._plotOffsets = t && t.offsets || {})
|
|
}
|
|
_processPlotOffsets(e) {
|
|
J.processPlotOffsets(this, e)
|
|
}
|
|
_mergeData(e) {
|
|
this._invalidateLastNonEmptyPlotRowCache(), this.data().merge(e)
|
|
}
|
|
_postProcessGraphics() {
|
|
this._graphicsPriceAxisViews = f(this), this._concatPriceAxisViews()
|
|
}
|
|
static offset(e, t) {
|
|
var i = 0;
|
|
return e._plotOffsets && void 0 !== e._plotOffsets[t] && (i += e
|
|
._plotOffsets[t]), void 0 !== e._plotOffsetsMetaInfoOverride[t] ?
|
|
i += e._plotOffsetsMetaInfoOverride[t] : e.properties().offsets &&
|
|
void 0 !== e.properties().offsets[t] && (i += e.properties().offsets[t]
|
|
.val.value()), e.properties().offset && (i += e.properties().offset
|
|
.val.value()), i
|
|
}
|
|
offset(e) {
|
|
return J.offset(this, e)
|
|
}
|
|
paneViews() {
|
|
return this.isSourceHidden() ? null : this._paneViews
|
|
}
|
|
labelPaneViews() {
|
|
return this.isSourceHidden() ? null : this._labelPaneViews
|
|
}
|
|
dataWindowView() {
|
|
return this._dataWindowView
|
|
}
|
|
legendView() {
|
|
return this._legendView
|
|
}
|
|
statusView() {
|
|
return this._statusView
|
|
}
|
|
priceAxisViews(e, t) {
|
|
return this.properties().oldShowLastValue && !this.properties()
|
|
.oldShowLastValue.value() ? null : e.findTargetPriceAxisViews(this, t,
|
|
this._priceAxisViews, this._priceLinesAxisViews)
|
|
}
|
|
_showLastValueOnPriceScale() {
|
|
return this._model.properties().scalesProperties.showStudyLastValue.value()
|
|
}
|
|
hasBarColorer() {
|
|
for (var e = 0; e < this._metaInfo.plots.length; ++e)
|
|
if (I.isBarColorerPlot(this._metaInfo.plots[e])) return !0;
|
|
return !1
|
|
}
|
|
barColorer() {
|
|
for (var e = null, t = 0; t < this._metaInfo.plots.length; ++t)
|
|
if (I.isBarColorerPlot(this._metaInfo.plots[t])) {
|
|
var i = new c(this, t);
|
|
null == e ? e = i : e.pushBackBarColorer(i)
|
|
} if (null == e) throw new Error(
|
|
"Cannot create BarColorer: study doesn't have a bar_colorer plot!"
|
|
);
|
|
return e
|
|
}
|
|
base() {
|
|
return 0
|
|
}
|
|
_priceScaleByProperties() {
|
|
if ("default" === this.properties().precision.value()) return null;
|
|
var e = parseInt(this.properties().precision.value());
|
|
return isFinite(e) ? Math.pow(10, e) : null
|
|
}
|
|
_formatterByProperties() {
|
|
var e = this._priceScaleByProperties();
|
|
return null !== e ? new v(e) : null
|
|
}
|
|
_priceScaleByMetaInfo() {
|
|
var e = this.metaInfo().format,
|
|
t = isNumber(e.precision) ? Math.pow(10, e.precision) : void 0;
|
|
if ("price" === e.type || "percent" === e.type) return t || 100;
|
|
if ("volume" === e.type) {
|
|
if (void 0 === e.precision) {
|
|
var i = this.series().symbolInfo();
|
|
if (null !== i && isNumber(i.volume_precision)) return Math.pow(10,
|
|
i.volume_precision)
|
|
}
|
|
return 1
|
|
}
|
|
return "inherit" === e.type || H.logWarn("Unsupported format type: " + e
|
|
.type), null
|
|
}
|
|
_formatterByMetaInfo() {
|
|
var e = this.metaInfo().format,
|
|
t = isNumber(e.precision) ? Math.pow(10, e.precision) : void 0;
|
|
switch (e.type) {
|
|
case "price":
|
|
return new v(t);
|
|
case "volume":
|
|
var i = e.precision;
|
|
if (void 0 === i) {
|
|
var s = this.series().symbolInfo();
|
|
i = s && isNumber(s.volume_precision) ? s.volume_precision : 0
|
|
}
|
|
return new S(i);
|
|
case "percent":
|
|
return new y(t);
|
|
case "inherit":
|
|
return null;
|
|
default:
|
|
return H.logWarn("Unsupported format type: " + e.type), null
|
|
}
|
|
}
|
|
_onSourceFormatterChanged() {
|
|
null === this._formatter && (null !== this.priceScale() && this.priceScale()
|
|
.updateFormatter(), this._formatterChanged.fire())
|
|
}
|
|
_onSourcePriceStepChanged() {
|
|
null === this._priceStep && this._priceStepChanged.fire()
|
|
}
|
|
_precisionChanged() {
|
|
this._recreatePriceFormattingDependencies()
|
|
}
|
|
_recreatePriceFormattingDependencies() {
|
|
this._recreateFormatter(), this._recreatePriceStep()
|
|
}
|
|
_recreateFormatter() {
|
|
this._formatter = this._tryCreateFormatter(), this._formatterChanged.fire(),
|
|
null !== this.priceScale() && this.priceScale().updateFormatter(), this
|
|
._model.fullUpdate()
|
|
}
|
|
_recreatePriceStep() {
|
|
var e = null,
|
|
t = this._tryToGetPriceScale();
|
|
null !== t && (e = 1 / t), this._priceStep !== e && (this._priceStep = e,
|
|
this._priceStepChanged.fire())
|
|
}
|
|
_tryToGetPriceScale() {
|
|
var e = this._priceScaleByProperties();
|
|
return null === e && (e = this._priceScaleByMetaInfo()), e
|
|
}
|
|
_tryCreateFormatter() {
|
|
var e = this._formatterByProperties();
|
|
return null === e && (e = this._formatterByMetaInfo()), e
|
|
}
|
|
formatter() {
|
|
return this._formatter || this.parentSource().formatter(!1)
|
|
}
|
|
priceStep() {
|
|
return this._priceStep || this.parentSource().priceStep(!1)
|
|
}
|
|
setOwnerSource(e) {
|
|
super.setOwnerSource(e), this._recreatePriceFormattingDependencies()
|
|
}
|
|
nearestIndex(e, t, i) {
|
|
if (TradingView.isInteger(e)) {
|
|
var s = this.data().search(e, t, i);
|
|
return null !== s ? s.index : void 0
|
|
}
|
|
H.logDebug("nearestIndex: incorrect logicalPoint")
|
|
}
|
|
updateAllViews() {
|
|
for (var e = 0; e < this._paneViews.length; e++) this._paneViews[e]
|
|
.update();
|
|
for (e = 0; e < this._labelPaneViews.length; e++) this._labelPaneViews[e]
|
|
.update();
|
|
this._dataWindowView.update(), null !== this._legendView && this._legendView
|
|
.update(), this._statusView.update();
|
|
for (e = 0; e < this._priceAxisViews.length; e++) this._priceAxisViews[e]
|
|
.update();
|
|
this._priceLinesAxisViews.forEach((function(e) {
|
|
e.update()
|
|
}))
|
|
}
|
|
tags() {
|
|
return !this._metaInfo || !this._metaInfo.description || this._metaInfo
|
|
.isTVScriptStub || this._metaInfo.is_hidden_study || this._metaInfo
|
|
.isTVScript && "tv-scripting" === this._metaInfo.productId ? [] : [this
|
|
._metaInfo.description
|
|
]
|
|
}
|
|
onExtendedHoursChanged() {
|
|
this.restart(!0)
|
|
}
|
|
hasSymbolInputs() {
|
|
for (var e = this._metaInfo.inputs.length; e--;)
|
|
if ("symbol" === this._metaInfo.inputs[e].type) return !0;
|
|
return !1
|
|
}
|
|
canOverrideMinTick() {
|
|
return !1
|
|
}
|
|
_subscribeExtendedHours() {
|
|
!this._isSubscribedToExtendedHours && this.hasSymbolInputs() && (this
|
|
._series.onExtendedHoursChanged().subscribe(this, this
|
|
.onExtendedHoursChanged), this._isSubscribedToExtendedHours = !0
|
|
)
|
|
}
|
|
removeByRemoveAllStudies() {
|
|
return !0
|
|
}
|
|
canHaveChildren() {
|
|
return void 0 === this._canHaveChildren && (this._canHaveChildren = !!x
|
|
.canHaveChildren(this._metaInfo)), this._canHaveChildren
|
|
}
|
|
static getInputRebindType(e, t, i) {
|
|
var s = x.isSourceInput(e);
|
|
return s && !~t.indexOf("$") && ~i.indexOf("$") ? g
|
|
.REBIND_STUDY_STANDALONE_TO_CHILD : s && ~t.indexOf("$") && !~i.indexOf(
|
|
"$") ? g.REBIND_STUDY_CHILD_TO_STANDALONE : 0
|
|
}
|
|
getPlotFields() {
|
|
return this._plotFields
|
|
}
|
|
getMinFirstBarIndexForPlot(e) {
|
|
var t = K(this._properties.styles, e) || K(this._properties.ohlcPlots, e) ||
|
|
K(this._properties.filledAreasStyle, e);
|
|
if (null === t) return -1 / 0;
|
|
var i = this.data().lastIndex();
|
|
return null === i ? -1 / 0 : i - t + 1
|
|
}
|
|
_getPropertyDefinitionsViewModelClass() {
|
|
return Promise.resolve(null)
|
|
}
|
|
getPropertyDefinitionsViewModel() {
|
|
if (null === this._definitionsViewModel) {
|
|
var e = this;
|
|
return e._getPropertyDefinitionsViewModelClass().then((function(t) {
|
|
return null === t || e._isDestroyed ? null : (null === e
|
|
._definitionsViewModel && (e
|
|
._definitionsViewModel = new t(e._model
|
|
.undoModel(), e)), e
|
|
._definitionsViewModel)
|
|
}))
|
|
}
|
|
return Promise.resolve(this._definitionsViewModel)
|
|
}
|
|
isPine() {
|
|
return void 0 !== this._metaInfo.pine
|
|
}
|
|
isStandardPine() {
|
|
return this.isPine() && x.isStandardPine(this._metaInfo.id)
|
|
}
|
|
isLinkedToSeries() {
|
|
return !0 === this._metaInfo.linkedToSeries
|
|
}
|
|
_getTelemetryObjectName() {
|
|
return "study"
|
|
}
|
|
_getTelemetryAdditionalData() {
|
|
var e = "";
|
|
return this._metaInfo.pine && this._metaInfo.pine.version && this._metaInfo
|
|
.shortId.indexOf("USER") >= 0 && (e = "_v" + this._metaInfo.pine
|
|
.version), {
|
|
symbol: this.series().actualSymbol(),
|
|
resolution: this.series().interval(),
|
|
study: this._metaInfo.shortId + e
|
|
}
|
|
}
|
|
_sendTelemetryReport(e, t, i) {
|
|
void 0 === i && (i = this._getTelemetryAdditionalData());
|
|
var s = Object.assign(t, {
|
|
additional: i
|
|
});
|
|
(void 0).sendChartReport(e, s)
|
|
}
|
|
_sendTelemetryCounter(e, t) {
|
|
this._sendTelemetryReport(e, {
|
|
count: 1
|
|
}, t)
|
|
}
|
|
onAboutToBeDestroyed() {
|
|
return this._aboutToBeDestroyed
|
|
}
|
|
destroy() {
|
|
this._aboutToBeDestroyed.fire(), this._isDestroyed = !0, this._legendView &&
|
|
this._legendView.destroy(), null !== this._definitionsViewModel && (this
|
|
._definitionsViewModel.destroy(), this._definitionsViewModel = null
|
|
),
|
|
this._properties.precision.listeners().unsubscribe(this, this
|
|
._precisionChanged), this._showStudyArgumentsProperty.listeners()
|
|
.unsubscribe(this, this.invalidateTitleCache), this._properties
|
|
.description.listeners().unsubscribe(this, this.invalidateTitleCache),
|
|
this._properties.shortDescription && this._properties.shortDescription
|
|
.listeners().unsubscribe(this, this.invalidateTitleCache), this._model
|
|
.mainSeries().dataEvents().symbolResolved().unsubscribeAll(this), this
|
|
._properties.showInDataWindow.listeners().unsubscribe(this._model, this
|
|
._model.fullUpdate), this.hasBarColorer() && this._properties
|
|
.visible.listeners().unsubscribe(this._model.mainSeries(), this._model
|
|
.mainSeries().invalidateBarStylesCache), this._model.mainSeries()
|
|
.dataEvents().symbolResolved().unsubscribe(this, this
|
|
._recreatePriceFormattingDependencies), super.destroy()
|
|
}
|
|
desiredPriceScalePosition() {
|
|
return this.metaInfo().isTVScriptStub ? "overlay" : this.metaInfo()
|
|
.linkedToSeries ? "as-series" : void 0 === this.metaInfo().priceScale ?
|
|
null : ["right", "left", "overlay"][this.metaInfo().priceScale]
|
|
}
|
|
guiPlotName(e) {
|
|
var t = this.properties().styles;
|
|
return t && t[e] && t[e].title ? t[e].title.value() : this.title()
|
|
}
|
|
defaultPlotIdForAlert() {
|
|
return this._metaInfo.plots.length ? this._metaInfo.plots[0].id : null
|
|
}
|
|
formatterChanged() {
|
|
return this._formatterChanged
|
|
}
|
|
copiable() {
|
|
return U && !this.isChildStudy()
|
|
}
|
|
setPriceScale(e) {
|
|
super.setPriceScale(e), T.emit("study_event", this.id(),
|
|
"price_scale_changed")
|
|
}
|
|
disconnect() {
|
|
this._studyId = null
|
|
}
|
|
}
|
|
TradingView.Study = J, t.Study = J, t.prepareStudyProperties = function(t, s, r, o, a) {
|
|
return function(t, s, r, o, a, l) {
|
|
var c = function(t, s, r, o) {
|
|
var a = i("K4L1");
|
|
if (x.versionOf(t) < 1) throw new Error(
|
|
"This function cannot work with metainfo of the old format version. Required format version >= 1"
|
|
);
|
|
var l = TradingView.clone(defaults("study"));
|
|
Y(l, t);
|
|
var c = x.getStudyPropertyRootName(t),
|
|
h = TradingView.clone(defaults(c, o));
|
|
h.intervalsVisibilities = TradingView.clone(W), ("Overlay" === t
|
|
.shortId || "Compare" === t.shortId) && (h.currencyId =
|
|
null, h.unitId = null);
|
|
t.isTVScript && t.TVScriptSourceCode !== h.TVScriptSourceCode &&
|
|
(h = TradingView.clone(TradingView.factoryDefaults(c, o)));
|
|
TradingView.merge(l, h), s && (n(!(s instanceof e),
|
|
"propsState should not be an instance of Property"),
|
|
TradingView.merge(l, s));
|
|
var u = TradingView.clone(t),
|
|
d = {};
|
|
a.mergeInputsObjPart(d, u.defaults.inputs), a
|
|
.mergeInputsObjPart(d, l.inputs), l.inputs = d, delete u
|
|
.inputs, delete u.defaults.inputs;
|
|
var p = {};
|
|
if (TradingView.merge(p, u.defaults), TradingView.merge(p,
|
|
TradingView.factoryDefaults(c)), TradingView.merge(p,
|
|
l), TradingView.merge(p, u), delete p.defaults, l = p,
|
|
null !== r) {
|
|
var _ = r.model().studiesColorRotatorFactory()
|
|
.getColorRotator(t);
|
|
null !== _ && ("Overlay@tv-basicstudies" === t.id ? l
|
|
.lineStyle.color = _.getColor(l.lineStyle.color,
|
|
t) : TradingView.merge(l, function(e, t) {
|
|
for (var i in e.styles) {
|
|
var s = e.styles[i].color;
|
|
s && (e.styles[i].color = t.getColor(s))
|
|
}
|
|
return e
|
|
}(l, _)))
|
|
}
|
|
s && TradingView.merge(l.styles, s.styles);
|
|
return l
|
|
}(t, s, r, o),
|
|
h = x.getSourceInputIds(t);
|
|
if (h.length > 0) {
|
|
var u = h[0];
|
|
l instanceof J ? c.inputs[u] = "{pid}$0" : void 0 !== c.inputs[u] &&
|
|
-1 !== c.inputs[u].indexOf("$") && (c.inputs[u] = "close")
|
|
}
|
|
return q(t, a, c)
|
|
}(t, s, r, o, x.getStudyPropertyRootName(t), a)
|
|
}, t.prepareStudyPropertiesForLoadChart = function(e, t, s, r, n, o) {
|
|
return function(e, t, s, r, n, o, a) {
|
|
var l = function(e, t, s, r, n) {
|
|
var o = i("K4L1");
|
|
e.version && s.version && e.version !== s.version && H.logWarn(
|
|
"Serialized metaInfo version " + e.version +
|
|
" is not equal to the saved state version " + s.version);
|
|
var a = TradingView.clone(defaults("study"));
|
|
a.intervalsVisibilities = TradingView.clone(W), TradingView
|
|
.merge(a, TradingView.factoryDefaults(x
|
|
.getStudyPropertyRootName(e))), Y(a, e), TradingView
|
|
.merge(a, s), a = n.updateStudyState(a, e, t);
|
|
var l = TradingView.clone(t || e);
|
|
if (l && x.versionOf(l) >= 1) {
|
|
var c = {};
|
|
o.mergeInputsObjPart(c, (l.defaults || {}).inputs), o
|
|
.mergeInputsObjPart(c, a.inputs), a.inputs = c, delete l
|
|
.inputs, l.defaults && delete l.defaults.inputs;
|
|
var h = {};
|
|
TradingView.merge(h, l.defaults), TradingView.merge(h,
|
|
TradingView.factoryDefaults(x
|
|
.getStudyPropertyRootName(l))), TradingView
|
|
.merge(h, a), delete l.defaults, TradingView.merge(h,
|
|
l), a = h
|
|
}
|
|
return a
|
|
}(e, t, s, 0, n);
|
|
return q(t || e, o, l)
|
|
}(e, t, s, 0, n, x.getStudyPropertyRootName(e))
|
|
}
|
|
}).call(this, i("tc+8"), i("aIyQ"))
|
|
},
|
|
GVQo: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return o
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("3ClC"),
|
|
n = i("CW80");
|
|
|
|
function o(e, t) {
|
|
if (1 === t.length && Object(r.isStudy)(t[0])) {
|
|
const e = t[0];
|
|
return {
|
|
title: e.title(),
|
|
sources: [{
|
|
source: Object(s.ensureNotNull)(e.state()),
|
|
type: "study"
|
|
}]
|
|
}
|
|
}
|
|
const i = {
|
|
sources: [],
|
|
title: ""
|
|
};
|
|
return i.sources = t.filter(e => e.copiable() && Object(n.isLineTool)(e)).map(t => {
|
|
const i = {
|
|
type: "drawing",
|
|
geometry: t.geometry(),
|
|
source: {
|
|
...t.state(!1),
|
|
points: t.normalizedPoints()
|
|
},
|
|
modelId: e
|
|
};
|
|
return delete i.source.alertId, i
|
|
}), i.sources.length > 0 ? (1 === i.sources.length ? i.title = t[0].title && t[0]
|
|
.title() : i.title = "Drawings", i) : null
|
|
}
|
|
},
|
|
GhVi: function(e, t, i) {
|
|
"use strict";
|
|
(function(t) {
|
|
function i() {
|
|
this._marksByIndex = new Map, this._marksBySpan = [], this.changed = new t, this
|
|
.minIndex = void 0, this.maxIndex = void 0
|
|
}
|
|
i.prototype.reset = function() {
|
|
this._resetImpl(), this.changed.fire()
|
|
}, i.prototype._resetImpl = function() {
|
|
this._marksByIndex = new Map, this._marksBySpan = [], this.minIndex = void 0,
|
|
this.maxIndex = void 0, this._cache = void 0
|
|
}, i.prototype.merge = function(e) {
|
|
if (0 !== e.length) {
|
|
var t = e[0].index,
|
|
i = e[e.length - 1].index;
|
|
t <= this.minIndex && i >= this.maxIndex && this._resetImpl();
|
|
for (var s = this._marksBySpan, r = new Set, n = 0; n < e.length; n++) {
|
|
var o = (c = e[n]).index,
|
|
a = c.span,
|
|
l = this._marksByIndex.get(c.index);
|
|
if (l) {
|
|
if (l.index === c.index && l.span === c.span) {
|
|
l.time = c.time;
|
|
continue
|
|
}
|
|
this._removeTickmark(l)
|
|
}
|
|
}
|
|
for (n = 0; n < e.length; n++) {
|
|
var c;
|
|
o = (c = e[n]).index, a = c.span;
|
|
if (!this._marksByIndex.has(c.index)) {
|
|
this._marksByIndex.set(o, c);
|
|
var h = s[a];
|
|
void 0 === h && (h = [], s[a] = h);
|
|
var u = 0 === h.length || h[h.length - 1].index < c.index;
|
|
s[a].push(c), u || r.add(a)
|
|
}
|
|
}
|
|
this.minIndex = void 0 === this.minIndex ? t : Math.min(this.minIndex, t),
|
|
this.maxIndex = void 0 === this.maxIndex ? i : Math.max(this.maxIndex,
|
|
i);
|
|
for (a = s.length; a--;) s[a] && (s[a].length || delete s[a], r.has(a) && s[
|
|
a].sort(this._sortByIndexAsc));
|
|
this._cache = void 0, this.changed.fire()
|
|
}
|
|
}, i.prototype._removeTickmark = function(e) {
|
|
var t = e.index;
|
|
if (this._marksByIndex.get(t) === e) {
|
|
this._marksByIndex.delete(t),
|
|
t <= this.minIndex && this.minIndex++, t >= this.maxIndex && this
|
|
.maxIndex--, this.maxIndex < this.minIndex && (this.minIndex = void 0,
|
|
this.maxIndex = void 0);
|
|
var i = this._marksBySpan[e.span],
|
|
s = i.indexOf(e); - 1 !== s && i.splice(s, 1)
|
|
}
|
|
}, i.prototype._sortByIndexAsc = function(e, t) {
|
|
return e.index - t.index
|
|
}, i.prototype.removeTail = function(e) {
|
|
var t = new Map;
|
|
this.maxIndex = 0, this._marksByIndex.forEach(function(i, s) {
|
|
i.time < e && (t.set(s, i), this.maxIndex = Math.max(this.maxIndex,
|
|
s))
|
|
}.bind(this)), this._marksByIndex = t
|
|
}, i.prototype.addTail = function(e) {
|
|
for (var t = 0; t < e.length; t++) e[t].index = this.maxIndex + t + 1;
|
|
this.merge(e)
|
|
}, i.prototype.indexToTime = function(e) {
|
|
var t = this._marksByIndex.get(e);
|
|
return t ? new Date(1e3 * t.time) : null
|
|
}, i.prototype.density = function() {
|
|
var e = this.maxIndex - this.minIndex;
|
|
if (0 !== e) return 1e3 * (this._marksByIndex.get(this.maxIndex).time - this
|
|
._marksByIndex.get(this.minIndex).time) / e
|
|
}, i.prototype.estimateLeft = function(e) {
|
|
var t = this.density();
|
|
if (t) return (1e3 * this._marksByIndex.get(this.minIndex).time - e) / t
|
|
}, i.prototype.nearestIndex = function(e) {
|
|
for (var t = this.minIndex, i = this.maxIndex; i - t > 2;) {
|
|
if (1e3 * this._marksByIndex.get(t).time === e) return t;
|
|
if (1e3 * this._marksByIndex.get(i).time === e) return i;
|
|
var s = Math.round((t + i) / 2);
|
|
1e3 * this._marksByIndex.get(s).time > e ? i = s : t = s
|
|
}
|
|
return t
|
|
}, i.prototype.build = function(e, t) {
|
|
var i = Math.ceil(t / e);
|
|
if (this._maxbar === i && this._cache) return this._cache;
|
|
this._maxbar = i;
|
|
for (var s = [], r = this._marksBySpan.length; r--;)
|
|
if (this._marksBySpan[r]) {
|
|
var n = s;
|
|
s = [];
|
|
for (var o = n.length, a = 0, l = this._marksBySpan[r], c = l.length,
|
|
h = 1 / 0, u = -1 / 0, d = 0; d < c; d++) {
|
|
for (var p = l[d], _ = p.index; a < o;) {
|
|
var m = n[a],
|
|
f = m.index;
|
|
if (!(f < _)) {
|
|
h = f;
|
|
break
|
|
}
|
|
a++, s.push(m), u = f, h = 1 / 0
|
|
}
|
|
h - _ >= i && _ - u >= i && (s.push(p), u = _)
|
|
}
|
|
for (; a < o; a++) s.push(n[a])
|
|
} return this._cache = s, this._cache
|
|
}, i.prototype.state = function() {
|
|
for (var e = [], t = this._marksBySpan.length; t--;) this._marksBySpan[t] && (
|
|
e = e.concat(this._marksBySpan[t]));
|
|
return {
|
|
marks: e = e.map((function(e) {
|
|
return [e.span, e.time, e.index]
|
|
})),
|
|
version: 2
|
|
}
|
|
}, i.prototype.restoreState = function(e) {
|
|
if (this._marksByIndex = new Map, this._marksBySpan = [], this.maxIndex =
|
|
void 0, this.minIndex = void 0, e && e.marks && e.marks.length)
|
|
if (2 === e.version) {
|
|
var t = e.marks.map((function(e) {
|
|
return {
|
|
span: e[0],
|
|
time: e[1],
|
|
index: e[2]
|
|
}
|
|
}));
|
|
this.merge(t)
|
|
} else this.merge(e.marks)
|
|
}, e.exports.Tickmarks = i
|
|
}).call(this, i("aIyQ"))
|
|
},
|
|
GmZZ: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return r
|
|
}));
|
|
var s = i("fJhV");
|
|
class r extends s.LineDataSourceTimeAxisView {
|
|
constructor(e) {
|
|
super(e, 0)
|
|
}
|
|
_getBgColor() {
|
|
return this._source.properties().linecolor.value()
|
|
}
|
|
_getAlwaysInViewPort() {
|
|
return !1
|
|
}
|
|
_getIndex() {
|
|
const e = this._source.points();
|
|
return 0 === e.length ? null : e[0].index
|
|
}
|
|
}
|
|
},
|
|
GxN8: function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e) {
|
|
return Boolean(e.showInObjectTree)
|
|
}
|
|
i.d(t, "a", (function() {
|
|
return s
|
|
}))
|
|
},
|
|
H007: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "RiskRewordEntryPriceProperty", (function() {
|
|
return a
|
|
})), i.d(t, "RiskRewordStopPriceProperty", (function() {
|
|
return l
|
|
})), i.d(t, "RiskRewardTargetPriceProperty", (function() {
|
|
return c
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("tc+8"),
|
|
n = i.n(r);
|
|
class o extends n.a {
|
|
constructor(e, t) {
|
|
super(), this._lineSource = e, this._pointIndex = t
|
|
}
|
|
value() {
|
|
const e = this._lineSource.points()[this._pointIndex].price;
|
|
return this._formatAndParsePrice(e)
|
|
}
|
|
state() {
|
|
return this.value()
|
|
}
|
|
merge(e, t) {
|
|
return this.setValue(e), t ? [] : null
|
|
}
|
|
_formatAndParsePrice(e) {
|
|
const t = Object(s.ensureNotNull)(this._lineSource.ownerSource()).formatter();
|
|
if (t.parse) {
|
|
const i = t.format(e),
|
|
s = t.parse(i);
|
|
return s.res ? s.value : e
|
|
}
|
|
return e
|
|
}
|
|
}
|
|
class a extends o {
|
|
constructor(e) {
|
|
super(e, 0)
|
|
}
|
|
setValue(e) {
|
|
const t = this._lineSource.points()[this._pointIndex];
|
|
this._lineSource.startChanging(this._pointIndex, t), t.price = parseFloat("" + e),
|
|
this._lineSource.setPoint(this._pointIndex, t), this._lineSource.recalculate(),
|
|
this._lineSource.model().updateSource(this._lineSource), this._listeners.fire(
|
|
this), this._lineSource.endChanging(!1, !1), this._lineSource
|
|
.syncPriceLevels()
|
|
}
|
|
}
|
|
class l extends o {
|
|
constructor(e) {
|
|
super(e, 1)
|
|
}
|
|
value() {
|
|
const e = this._lineSource.stopPrice();
|
|
return this._formatAndParsePrice(e)
|
|
}
|
|
setValue(e) {
|
|
const t = Math.round(Math.abs(e - this._lineSource.entryPrice()) * this._lineSource
|
|
.model().mainSeries().base());
|
|
this._lineSource.properties().childs().stopLevel.setValue(t), this._lineSource
|
|
.syncPriceLevels()
|
|
}
|
|
}
|
|
class c extends o {
|
|
constructor(e) {
|
|
super(e, 2)
|
|
}
|
|
value() {
|
|
const e = this._lineSource.profitPrice();
|
|
return this._formatAndParsePrice(e)
|
|
}
|
|
setValue(e) {
|
|
const t = Math.round(Math.abs(e - this._lineSource.entryPrice()) * this._lineSource
|
|
.model().mainSeries().base());
|
|
this._lineSource.properties().childs().profitLevel.setValue(t), this._lineSource
|
|
.syncPriceLevels()
|
|
}
|
|
}
|
|
},
|
|
H0vP: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s, r = i("Eyy1");
|
|
class n {
|
|
constructor(e = o) {
|
|
this._paneInvalidationLevel = o, this._leftPriceScalesInvalidationMap = new Map,
|
|
this._rightPriceScalesInvalidationMap = new Map, this._invalidationLevel = e
|
|
}
|
|
fullInvalidation() {
|
|
return this._invalidationLevel
|
|
}
|
|
invalidateAll(e) {
|
|
this._invalidationLevel = Math.max(this._invalidationLevel, e)
|
|
}
|
|
invalidatePane(e) {
|
|
this._paneInvalidationLevel = Math.max(this._invalidationLevel, e)
|
|
}
|
|
invalidatePriceScale(e, t, i) {
|
|
const s = "left" === e ? this._leftPriceScalesInvalidationMap : this
|
|
._rightPriceScalesInvalidationMap,
|
|
r = s.get(t) || o;
|
|
s.set(t, Math.max(r, i))
|
|
}
|
|
invalidationLevelForPane() {
|
|
return Math.max(this._paneInvalidationLevel, this._invalidationLevel)
|
|
}
|
|
getterForPriceScaleInvalidationLevelBySide(e) {
|
|
const t = "left" === e ? this._leftPriceScalesInvalidationMap : this
|
|
._rightPriceScalesInvalidationMap;
|
|
return e => Math.max(t.get(e) || o, this._invalidationLevel)
|
|
}
|
|
priceScaleSideMaxLevel(e) {
|
|
const t = "left" === e ? this._leftPriceScalesInvalidationMap : this
|
|
._rightPriceScalesInvalidationMap;
|
|
let i = this._invalidationLevel;
|
|
return t.size > 0 && t.forEach(e => {
|
|
e > i && (i = e)
|
|
}), i
|
|
}
|
|
merge(e) {
|
|
this._invalidationLevel = Math.max(this._invalidationLevel, e._invalidationLevel),
|
|
this._paneInvalidationLevel = Math.max(this._paneInvalidationLevel, e
|
|
._paneInvalidationLevel), e._leftPriceScalesInvalidationMap.forEach((e,
|
|
t) => {
|
|
const i = this._leftPriceScalesInvalidationMap.get(t) || o;
|
|
this._leftPriceScalesInvalidationMap.set(t, Math.max(i, e))
|
|
}), e._rightPriceScalesInvalidationMap.forEach((e, t) => {
|
|
const i = this._rightPriceScalesInvalidationMap.get(t) || o;
|
|
this._rightPriceScalesInvalidationMap.set(t, Math.max(i, e))
|
|
})
|
|
}
|
|
}
|
|
i.d(t, "InvalidationLevel", (function() {
|
|
return s
|
|
})), i.d(t, "defaultInvalidationLevel", (function() {
|
|
return o
|
|
})), i.d(t, "InvalidationMask", (function() {
|
|
return a
|
|
})),
|
|
function(e) {
|
|
e[e.None = 0] = "None", e[e.Cursor = 1] = "Cursor", e[e.Light = 2] = "Light", e[e.Full =
|
|
3] = "Full"
|
|
}(s || (s = {}));
|
|
const o = s.None;
|
|
class a {
|
|
constructor(e = o) {
|
|
this._panesOrderChanged = !1, this._keepVisibleTimeRangeOnResize = !1, this
|
|
._timeAxisInvalidationLevel = o, this._invalidatedPanes = new Map, this
|
|
._additionalActions = [], this._invalidationLevel = e
|
|
}
|
|
invalidateAll(e) {
|
|
this._invalidationLevel !== e && (this._invalidationLevel = Math.max(this
|
|
._invalidationLevel, e), this._invalidatedPanes.forEach(e => {
|
|
e.invalidateAll(this._invalidationLevel)
|
|
}))
|
|
}
|
|
invalidateAllPane(e, t) {
|
|
this._invalidatedPanes.has(e) || this._invalidatedPanes.set(e, new n(this
|
|
._invalidationLevel)), Object(r.ensureDefined)(this._invalidatedPanes.get(
|
|
e)).invalidateAll(t)
|
|
}
|
|
invalidatePriceScale(e, t, i, s) {
|
|
this._invalidatedPanes.has(e) || this._invalidatedPanes.set(e, new n(this
|
|
._invalidationLevel)), Object(r.ensureDefined)(this._invalidatedPanes.get(
|
|
e)).invalidatePriceScale(t, i, s)
|
|
}
|
|
invalidateTimeScale(e) {
|
|
this._timeAxisInvalidationLevel = Math.max(this._timeAxisInvalidationLevel, e)
|
|
}
|
|
invalidatePanesOrder() {
|
|
this._panesOrderChanged = !0
|
|
}
|
|
lockVisibleTimeRangeOnResize() {
|
|
this._keepVisibleTimeRangeOnResize = !0
|
|
}
|
|
fullInvalidation() {
|
|
return this._invalidationLevel
|
|
}
|
|
maxPaneInvalidation() {
|
|
const e = [];
|
|
return this._invalidatedPanes.forEach(t => {
|
|
e.push(t.fullInvalidation())
|
|
}), Math.max(...e, this._invalidationLevel)
|
|
}
|
|
invalidateForPane(e) {
|
|
return this._invalidatedPanes.get(e) || new n(this._invalidationLevel)
|
|
}
|
|
invalidateForTimeScale() {
|
|
return Math.max(this._timeAxisInvalidationLevel, this._invalidationLevel)
|
|
}
|
|
validationActions() {
|
|
return this._additionalActions
|
|
}
|
|
addValidationAction(e) {
|
|
this._additionalActions.push(e)
|
|
}
|
|
merge(e) {
|
|
this._invalidationLevel = Math.max(this._invalidationLevel, e._invalidationLevel),
|
|
this._panesOrderChanged = this._panesOrderChanged || e._panesOrderChanged, this
|
|
._keepVisibleTimeRangeOnResize = this._keepVisibleTimeRangeOnResize || e
|
|
._keepVisibleTimeRangeOnResize, this._invalidatedPanes.forEach(e => {
|
|
e.invalidateAll(this._invalidationLevel)
|
|
}), e._invalidatedPanes.forEach((e, t) => {
|
|
this._invalidatedPanes.has(t) || this._invalidatedPanes.set(t, new n(
|
|
this._invalidationLevel)), Object(r.ensureDefined)(this
|
|
._invalidatedPanes.get(t)).merge(e)
|
|
}), this._timeAxisInvalidationLevel = Math.max(this._timeAxisInvalidationLevel,
|
|
e._timeAxisInvalidationLevel);
|
|
for (let t = 0; t < e._additionalActions.length; t++) this._additionalActions.push(e
|
|
._additionalActions[t])
|
|
}
|
|
panesOrderInvalidated() {
|
|
return this._panesOrderChanged
|
|
}
|
|
isVisibleTimeRangeLockedOnResize() {
|
|
return this._keepVisibleTimeRangeOnResize
|
|
}
|
|
static cursor() {
|
|
return new a(s.Cursor)
|
|
}
|
|
static light() {
|
|
return new a(s.Light)
|
|
}
|
|
static full() {
|
|
return new a(s.Full)
|
|
}
|
|
static panesOrder() {
|
|
const e = a.full();
|
|
return e.invalidatePanesOrder(), e
|
|
}
|
|
static validateAction(e) {
|
|
const t = new a;
|
|
return t._additionalActions.push(e), t
|
|
}
|
|
}
|
|
},
|
|
HGP3: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("iR50"),
|
|
r = i("RBvv"),
|
|
n = i("Eyy1");
|
|
const o = {
|
|
...s,
|
|
...r
|
|
},
|
|
a = {},
|
|
l = Object.keys(o).length,
|
|
c = /^#[0-9A-F]{6}$/i;
|
|
Object.keys(o).forEach(e => {
|
|
const t = function e(t, i = []) {
|
|
const s = o[t];
|
|
if (!s) return null;
|
|
if (c.test(s)) return s;
|
|
const r = s;
|
|
return i.push(t), -1 !== i.indexOf(r) ? (console.warn(
|
|
"Colors definitions cycled"), s) : i.length > l ? (console.warn(
|
|
"Too many variables-link in HEX-color search: " + i[0]), null) : e(
|
|
r, i)
|
|
}(e);
|
|
a[e] = Object(n.ensureNotNull)(t)
|
|
});
|
|
const h = a;
|
|
|
|
function u(e) {
|
|
const t = h[e];
|
|
if (!t) throw new Error("No such color " + e);
|
|
return t
|
|
}
|
|
i.d(t, "colorsPalette", (function() {
|
|
return h
|
|
})), i.d(t, "getHexColorByName", (function() {
|
|
return u
|
|
}))
|
|
},
|
|
HGup: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return o
|
|
})), i.d(t, "c", (function() {
|
|
return a
|
|
})), i.d(t, "b", (function() {
|
|
return l
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("3u3j");
|
|
class n extends r.a {
|
|
constructor(e, t, i) {
|
|
super(e, t, i)
|
|
}
|
|
redo() {
|
|
const e = Object(s.ensureNotNull)(this._chartModel.dataSourceForId(this
|
|
._sourceId)),
|
|
t = Object(s.ensureNotNull)(this._chartModel.paneForSource(e)),
|
|
i = this._chartModel.children(e, !0);
|
|
t.bulkActionMacro(() => {
|
|
i.forEach(e => this._chartModel.detachSource(e)), this._chartModel
|
|
.detachSource(e)
|
|
});
|
|
const r = this._chartModel.createPane(this.targetPaneIndex()),
|
|
n = r.findSuitableScale(e);
|
|
r.bulkActionMacro(() => {
|
|
r.addDataSource(e, n, !1), i.forEach(e => r.addDataSource(e, n, !1))
|
|
}), Object(s.ensureNotNull)(e.priceScale()).restoreState(this
|
|
._newPriceScaleState(r.isOverlay(e))), this._chartModel.fullUpdate(),
|
|
this._chartModel.setShouldBeSavedEvenIfHidden(!0)
|
|
}
|
|
undo() {
|
|
const e = Object(s.ensureNotNull)(this._chartModel.dataSourceForId(this
|
|
._sourceId)),
|
|
t = Object(s.ensureNotNull)(this._chartModel.paneForSource(e)),
|
|
i = this._chartModel.children(e, !0);
|
|
t.bulkActionMacro(() => {
|
|
i.forEach(e => this._chartModel.detachSource(e));
|
|
const t = this._chartModel.detachSource(e);
|
|
Object(s.assert)(t, "Undo of detaching must remove pane")
|
|
});
|
|
const r = this._chartModel.panes()[this._initialPaneIndex];
|
|
let n = r.getPriceScaleById(this._initialPriceScaleId);
|
|
null === n && (n = r.createPriceScaleAtPosition(this._initialPriceScalePosition,
|
|
this._initialPriceScaleIndex)), r.bulkActionMacro(() => {
|
|
r.addDataSource(e, n, !0), i.forEach(e => r.addDataSource(e, n, !1))
|
|
}), Object(s.ensureNotNull)(e.priceScale()).restoreState(this
|
|
._originalPriceScaleState()), this._chartModel.fullUpdate()
|
|
}
|
|
}
|
|
class o extends n {
|
|
constructor(e, t, i) {
|
|
super(e, t, i)
|
|
}
|
|
targetPaneIndex() {
|
|
return this._initialPaneIndex + 1
|
|
}
|
|
}
|
|
class a extends n {
|
|
constructor(e, t, i) {
|
|
super(e, t, i)
|
|
}
|
|
targetPaneIndex() {
|
|
return this._initialPaneIndex
|
|
}
|
|
}
|
|
class l extends n {
|
|
constructor(e, t, i) {
|
|
super(e, t, i)
|
|
}
|
|
targetPaneIndex() {
|
|
return this._chartModel.panes().length
|
|
}
|
|
}
|
|
},
|
|
HLXm: function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e) {
|
|
"LineToolGannComplex" !== e.type || void 0 !== e.version && 1 !== e.version || (e.type =
|
|
"LineToolGannFixed")
|
|
}
|
|
i.r(t), i.d(t, "migrateState", (function() {
|
|
return s
|
|
}))
|
|
},
|
|
"HV/F": function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e) {
|
|
const t = {};
|
|
return {
|
|
promise: new Promise((i, s) => {
|
|
e.subscribe(t, i, !0)
|
|
}),
|
|
destroy: () => {
|
|
e.unsubscribeAll(t)
|
|
}
|
|
}
|
|
}
|
|
i.r(t), i.d(t, "delegateToPromise", (function() {
|
|
return s
|
|
}))
|
|
},
|
|
HY7u: function(e, t, i) {},
|
|
HZKX: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "defaultContextMenuOptions", (function() {
|
|
return Te
|
|
})), i.d(t, "createActionAddAlert", (function() {
|
|
return Me
|
|
})), i.d(t, "createActionTrade", (function() {
|
|
return Oe
|
|
})), i.d(t, "createActionOrder", (function() {
|
|
return Le
|
|
})), i.d(t, "createMTPredictorActions", (function() {
|
|
return Ae
|
|
})), i.d(t, "createLinesAction", (function() {
|
|
return Ee
|
|
})), i.d(t, "ActionsProvider", (function() {
|
|
return ke
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("txPx"),
|
|
n = (i("nc0P"), i("ogJP")),
|
|
o = i("Kxc7"),
|
|
a = i("7KDR"),
|
|
l = i("YmeR"),
|
|
c = i("Daqx"),
|
|
h = i("3ClC"),
|
|
u = i("QloM"),
|
|
d = i("Qq0B"),
|
|
p = i("z61+"),
|
|
_ = i("/3z9"),
|
|
m = i("L/Ed"),
|
|
f = i("cKqi"),
|
|
g = i("YzC7"),
|
|
b = i("pvsv"),
|
|
v = i("GVQo"),
|
|
S = i("CW80"),
|
|
y = i("/tGj"),
|
|
w = i("2uTr"),
|
|
P = i("YFKU"),
|
|
C = i("//lZ"),
|
|
x = i("9uLv");
|
|
const T = Object(r.getLogger)("Chart.ActionsProvider"),
|
|
I = (Object(P.t)("Add Alert"), Object(P.t)("Add Alert on {series}"), Object(P.t)(
|
|
"Add Alert on {drawing}"), Object(w.appendEllipsis)(Object(P.t)(
|
|
"Edit {title} Alert"))),
|
|
M = Object(P.t)("Extend Alert Lines"),
|
|
O = Object(P.t)("Show alert label lines"),
|
|
L = Object(P.t)("Hide alert label lines"),
|
|
A = (Object(P.t)("Trade"), Object(w.appendEllipsis)(Object(P.t)("Create Limit Order")),
|
|
Object(P.t)("Show")),
|
|
E = Object(P.t)("Hide"),
|
|
k = (Object(P.t)("MTPredictor"), Object(P.t)("Apply Manual Risk/Reward"), Object(P.t)(
|
|
"Apply Manual Decision Point"), Object(P.t)("Analyze Trade Setup"), Object(P.t)(
|
|
"Apply Elliott Wave"), Object(P.t)("Apply Elliott Wave Intermediate"), Object(P.t)(
|
|
"Apply Elliott Wave Major"), Object(P.t)("Apply Elliott Wave Minor"), Object(P.t)(
|
|
"Apply WPT Up Wave"), Object(P.t)("Up Wave 1 or A"), Object(P.t)("Up Wave 2 or B"),
|
|
Object(P.t)("Up Wave C"), Object(P.t)("Up Wave 3"), Object(P.t)("Up Wave 4"), Object(P
|
|
.t)("Up Wave 5"), Object(P.t)("Apply WPT Down Wave"), Object(P.t)(
|
|
"Down Wave 1 or A"), Object(P.t)("Down Wave 2 or B"), Object(P.t)("Down Wave C"),
|
|
Object(P.t)("Down Wave 3"), Object(P.t)("Down Wave 4"), Object(P.t)("Down Wave 5"),
|
|
Object(P.t)("Pinned To Scale {label} (Hidden)")),
|
|
D = Object(P.t)("Pinned To Right Scale (Hidden)"),
|
|
V = Object(P.t)("Pin To Scale {label} (Hidden)"),
|
|
B = Object(P.t)("Pin To Right Scale (Hidden)"),
|
|
R = Object(P.t)("Pinned To Scale {label}"),
|
|
N = Object(P.t)("Pinned To Right Scale"),
|
|
j = Object(P.t)("Pin To Scale {label}"),
|
|
F = Object(P.t)("Pin To Right Scale"),
|
|
W = Object(P.t)("Pinned To Left Scale (Hidden)"),
|
|
H = Object(P.t)("Pin To Left Scale (Hidden)"),
|
|
U = Object(P.t)("Pinned To Left Scale"),
|
|
z = Object(P.t)("Pin To Left Scale"),
|
|
G = Object(P.t)("Pin To New Left Scale"),
|
|
q = Object(P.t)("Pin To New Right Scale"),
|
|
Y = Object(P.t)("Pin To Scale (Now {label})"),
|
|
K = Object(P.t)("Pin To Scale (Now No Scale)"),
|
|
J = Object(P.t)("Pin To Scale (Now Left)"),
|
|
Z = Object(P.t)("Pin To Scale (Now Right)"),
|
|
X = Object(P.t)("No Scale (Fullscreen)"),
|
|
$ = Object(P.t)("Move To"),
|
|
Q = Object(P.t)("Existing Pane Above"),
|
|
ee = Object(P.t)("New Pane Above"),
|
|
te = Object(P.t)("Existing Pane Below"),
|
|
ie = Object(P.t)("New Pane Below"),
|
|
se = Object(P.t)("Bring to Front"),
|
|
re = Object(P.t)("Send to Back"),
|
|
ne = Object(P.t)("Bring Forward"),
|
|
oe = Object(P.t)("Send Backward"),
|
|
ae = Object(P.t)("Visual Order"),
|
|
le = Object(P.t)("Lines"),
|
|
ce = Object(w.appendEllipsis)(Object(P.t)("Add Indicator/Strategy on {studyTitle}")),
|
|
he = (Object(w.appendEllipsis)(Object(P.t)("Add Financial metric for {instrumentName}")),
|
|
Object(w.appendEllipsis)(Object(P.t)("Settings"))),
|
|
ue = Object(P.t)("Apply Default"),
|
|
de = Object(w.appendEllipsis)(Object(P.t)("Save As")),
|
|
pe = Object(P.t)("Copy"),
|
|
_e = Object(P.t)("Clone"),
|
|
me = Object(P.t)("Template"),
|
|
fe = (Object(P.t)("Sync To All Charts"), Object(P.t)("Go to {lineToolName}")),
|
|
ge = Object(P.t)("Unlock"),
|
|
be = Object(P.t)("Lock"),
|
|
ve = (Object(P.t)("Show Earnings"), Object(P.t)("Show Dividends"), Object(P.t)(
|
|
"Show Splits"), Object(P.t)("Show All Ideas")),
|
|
Se = Object(P.t)("Show Ideas of Followed Users"),
|
|
ye = Object(P.t)("Show My Ideas Only"),
|
|
we = Object(w.appendEllipsis)(Object(P.t)("Settings")),
|
|
Pe = Object(P.t)("Hide Events on Chart"),
|
|
Ce = Object(P.t)("Add this Symbol to Entire Layout"),
|
|
xe = Object(P.t)("Add this Indicator to Entire Layout"),
|
|
Te = (Object(P.t)("Add this Strategy to Entire Layout"), Object(P.t)(
|
|
"Add this Financial Metric to Entire Layout"), {
|
|
general: !0,
|
|
mainSeries: !0,
|
|
mainSeriesTrade: !0,
|
|
esdStudies: !0,
|
|
studies: !0,
|
|
fundamentals: !0,
|
|
lineTools: !0,
|
|
publishedCharts: !0,
|
|
ordersAndPositions: !0,
|
|
alerts: !0,
|
|
chartEvents: !0,
|
|
objectTree: !0,
|
|
gotoLineTool: !1
|
|
});
|
|
|
|
function Ie(e) {
|
|
return Object(y.isSymbolSource)(e) ? e.symbolTitle(!0, !0) : e.title(!0)
|
|
}
|
|
|
|
function Me(e, t) {
|
|
return null
|
|
}
|
|
|
|
function Oe(e, t, i) {
|
|
return null
|
|
}
|
|
|
|
function Le(e) {
|
|
throw new Error("not supported")
|
|
}
|
|
|
|
function Ae(e, t, i, s) {
|
|
return null
|
|
}
|
|
|
|
function Ee(e) {
|
|
const t = e.actions(),
|
|
i = [t.showPriceLine];
|
|
return i.push(t.showHighLowPriceLines), i.push(t.showAverageClosePriceLine), new a.Action({
|
|
label: le,
|
|
statName: "Lines",
|
|
subItems: i
|
|
})
|
|
}
|
|
class ke {
|
|
constructor(e, t) {
|
|
this._chartWidget = e, this._options = Object(n.merge)(Object(n.clone)(Te), t || {})
|
|
}
|
|
async contextMenuActionsForSources(e) {
|
|
const t = e[0],
|
|
i = this._options;
|
|
if (t === this._chartWidget.model().mainSeries() && i.mainSeries) return this
|
|
._contextMenuActionsForSeries(t);
|
|
if (Object(h.isStudy)(t) && i.studies) return this._contextMenuActionsForStudy(t);
|
|
if (Object(S.isLineTool)(t) && i.lineTools) {
|
|
const t = e.filter(S.isLineTool);
|
|
return this._contextMenuActionsForLineTool(t)
|
|
}
|
|
return []
|
|
}
|
|
_isReadOnly() {
|
|
return this._chartWidget.readOnly()
|
|
}
|
|
_createActionHide(e) {
|
|
return new a.Action({
|
|
label: E,
|
|
icon: i("dmHa"),
|
|
statName: "HideSelectedObject",
|
|
onExecute: this._chartWidget.hideDataSources.bind(this._chartWidget, [
|
|
e
|
|
])
|
|
})
|
|
}
|
|
_createActionShow(e) {
|
|
const t = new a.Action({
|
|
checkable: !0,
|
|
label: A,
|
|
icon: i("6ctS"),
|
|
statName: "ToggleShow"
|
|
}),
|
|
s = new l.ActionBinder(t, e.properties().visible, this._chartWidget.model(), A);
|
|
return t.setBinding(s), s.setValue(e.properties().visible.value()), t
|
|
}
|
|
_createActionScale(e) {
|
|
const t = Object(s.ensureNotNull)(e.priceScale()),
|
|
r = this._chartWidget.model().model(),
|
|
n = Object(s.ensureNotNull)(r.paneForSource(e)),
|
|
o = n.priceScalePosition(t),
|
|
l = ("left" === o ? n.leftPriceScales() : n.rightPriceScales()).indexOf(t),
|
|
h = r.priceScaleSlotsCount().totallySlots < 2 ? "dontneedname" : "needname",
|
|
u = "overlay" === o ? "" : Object(c.a)(o, l).label,
|
|
d = Y.format({
|
|
label: u
|
|
}),
|
|
p = {
|
|
"left-needname": d,
|
|
"left-dontneedname": J,
|
|
"right-needname": d,
|
|
"right-dontneedname": Z,
|
|
"overlay-needname": K,
|
|
"overlay-dontneedname": K
|
|
} [o + "-" + h];
|
|
return new a.Action({
|
|
label: p,
|
|
icon: i("/kal"),
|
|
subItems: this._createActionScaleItems(e)
|
|
})
|
|
}
|
|
_createActionScaleDetach(e, t, i, r) {
|
|
const n = this._chartWidget.model().model(),
|
|
o = Object(s.ensureNotNull)(n.paneForSource(e));
|
|
if (!o.canCreateNewPriceScale()) return null;
|
|
const l = Object(s.ensureNotNull)(e.priceScale()),
|
|
h = l.canDetachSource(e),
|
|
u = o.priceScalePosition(l),
|
|
d = h || u !== t;
|
|
if (!d) return null;
|
|
const p = n.priceScaleSlotsCount(),
|
|
_ = {
|
|
left: {
|
|
labelled: j,
|
|
sided: G
|
|
},
|
|
right: {
|
|
labelled: j,
|
|
sided: q
|
|
}
|
|
},
|
|
m = "left" === t ? o.leftPriceScales().length : o.rightPriceScales().length,
|
|
f = p[t] > m ? "labelled" : "sided",
|
|
g = Object(c.a)(t, m).label,
|
|
b = _[t][f].format({
|
|
label: g
|
|
});
|
|
return new a.Action({
|
|
checkable: !1,
|
|
disabled: !d,
|
|
label: b,
|
|
statName: r,
|
|
payload: e,
|
|
onExecute: i
|
|
})
|
|
}
|
|
_onDetachLeft(e) {
|
|
const t = e.getPayload(),
|
|
i = this._chartWidget.model().model(),
|
|
r = Object(s.ensureNotNull)(i.paneForSource(t));
|
|
this._chartWidget.model().detachToLeft(t, r)
|
|
}
|
|
_onDetachRight(e) {
|
|
const t = e.getPayload(),
|
|
i = this._chartWidget.model().model(),
|
|
r = Object(s.ensureNotNull)(i.paneForSource(t));
|
|
this._chartWidget.model().detachToRight(t, r)
|
|
}
|
|
_createActionScaleDetachLeft(e) {
|
|
return this._createActionScaleDetach(e, "left", this._onDetachLeft.bind(this),
|
|
"ToggleScaleLeft")
|
|
}
|
|
_createActionScaleDetachRight(e) {
|
|
return this._createActionScaleDetach(e, "right", this._onDetachRight.bind(this),
|
|
"ToggleScaleRight")
|
|
}
|
|
_onMoveToScale(e) {
|
|
const t = e.getPayload();
|
|
if (t.datasource.priceScale() === t.priceScale) return;
|
|
const i = this._chartWidget.model().model(),
|
|
r = Object(s.ensureNotNull)(i.paneForSource(t.datasource));
|
|
this._chartWidget.model().moveToScale(t.datasource, r, t.priceScale, t.undoText)
|
|
}
|
|
_createMoveToScaleAction(e, t, i, s) {
|
|
const r = e.priceScale() === t;
|
|
return new a.Action({
|
|
checkable: !0,
|
|
checked: r,
|
|
label: i,
|
|
statName: "ToggleScale",
|
|
payload: {
|
|
datasource: e,
|
|
priceScale: t,
|
|
undoText: s
|
|
},
|
|
onExecute: this._onMoveToScale.bind(this)
|
|
})
|
|
}
|
|
_onNoScale(e) {
|
|
const t = e.getPayload().datasource,
|
|
i = this._chartWidget.model().model(),
|
|
r = Object(s.ensureNotNull)(i.paneForSource(t));
|
|
r.isOverlay(t) || this._chartWidget.model().detachNoScale(t, r)
|
|
}
|
|
_createActionNoScale(e) {
|
|
const t = this._chartWidget.model().model(),
|
|
i = Object(s.ensureNotNull)(t.paneForSource(e)),
|
|
r = i.actionNoScaleIsEnabled(e);
|
|
return new a.Action({
|
|
checkable: !0,
|
|
checked: i.isOverlay(e),
|
|
label: X,
|
|
disabled: !r,
|
|
statName: "ToggleNoScale",
|
|
payload: {
|
|
datasource: e
|
|
},
|
|
onExecute: this._onNoScale.bind(this)
|
|
})
|
|
}
|
|
_createActionScaleItems(e) {
|
|
const t = [],
|
|
i = this._chartWidget.model().model(),
|
|
r = Object(s.ensureNotNull)(i.paneForSource(e)),
|
|
n = i.priceScaleSlotsCount().totallySlots > 1,
|
|
o = r.rightPriceScales(),
|
|
l = r.leftPriceScales(),
|
|
h = this._createActionScaleDetachRight(e),
|
|
u = this._createActionScaleDetachLeft(e),
|
|
d = o.length + l.length + (null === h ? 0 : 1) + (null === u ? 0 : 1) > 2,
|
|
p = {
|
|
right: {
|
|
hidden: {
|
|
checked: {
|
|
labelled: k,
|
|
sided: D
|
|
},
|
|
unchecked: {
|
|
labelled: V,
|
|
sided: B
|
|
}
|
|
},
|
|
visible: {
|
|
checked: {
|
|
labelled: R,
|
|
sided: N
|
|
},
|
|
unchecked: {
|
|
labelled: j,
|
|
sided: F
|
|
}
|
|
}
|
|
},
|
|
left: {
|
|
hidden: {
|
|
checked: {
|
|
labelled: k,
|
|
sided: W
|
|
},
|
|
unchecked: {
|
|
labelled: V,
|
|
sided: H
|
|
}
|
|
},
|
|
visible: {
|
|
checked: {
|
|
labelled: R,
|
|
sided: U
|
|
},
|
|
unchecked: {
|
|
labelled: j,
|
|
sided: z
|
|
}
|
|
}
|
|
}
|
|
},
|
|
_ = {
|
|
left: r.visibleLeftPriceScales(),
|
|
right: r.visibleRightPriceScales()
|
|
},
|
|
m = (t, i) => {
|
|
const s = ("right" === i ? o : l)[t],
|
|
r = _[i].includes(s) ? "visible" : "hidden",
|
|
a = e.priceScale() === s ? "checked" : "unchecked",
|
|
h = n ? "labelled" : "sided",
|
|
u = p[i],
|
|
d = {
|
|
labelled: u.visible.unchecked.labelled,
|
|
sided: u.visible.unchecked.sided
|
|
},
|
|
m = Object(c.a)(i, t).label;
|
|
return {
|
|
actionText: u[r][a][h].format({
|
|
label: m
|
|
}),
|
|
undoText: d[h].format({
|
|
label: m
|
|
})
|
|
}
|
|
};
|
|
t.push(...o.map((t, i) => {
|
|
const s = m(i, "right");
|
|
return this._createMoveToScaleAction(e, t, s.actionText, s.undoText)
|
|
})), null !== h && t.push(h);
|
|
d && (o.length > 0 || null !== h) && t.push(new a.Separator);
|
|
t.push(...l.map((t, i) => {
|
|
const s = m(i, "left");
|
|
return this._createMoveToScaleAction(e, t, s.actionText, s.undoText)
|
|
})), null !== u && t.push(u);
|
|
d && (l.length > 0 || null !== u) && t.push(new a.Separator);
|
|
return t.push(this._createActionNoScale(e)), t
|
|
}
|
|
_createVisualOrderAction(e) {
|
|
const t = this._chartWidget.model(),
|
|
s = t.availableZOrderOperations(e),
|
|
r = [new a.Action({
|
|
label: se,
|
|
statName: "BringToFront",
|
|
disabled: !s.bringToFrontEnabled,
|
|
onExecute: () => t.bringToFront(e)
|
|
}), new a.Action({
|
|
label: re,
|
|
statName: "SendToBack",
|
|
disabled: !s.sendToBackEnabled,
|
|
onExecute: () => t.sendToBack(e)
|
|
}), new a.Action({
|
|
label: ne,
|
|
statName: "BringForward",
|
|
disabled: !s.bringForwardEnabled,
|
|
onExecute: () => t.bringForward(e)
|
|
}), new a.Action({
|
|
label: oe,
|
|
statName: "SendBackward",
|
|
disabled: !s.sendBackwardEnabled,
|
|
onExecute: () => t.sendBackward(e)
|
|
})];
|
|
return new a.Action({
|
|
label: ae,
|
|
icon: i("9dnG"),
|
|
statName: "VisualOrder",
|
|
subItems: r
|
|
})
|
|
}
|
|
_createActionMergeUp(e) {
|
|
const t = this._chartWidget.model();
|
|
return t.model().isMergeUpAvailableForSource(e) ? new a.Action({
|
|
label: Q,
|
|
statName: "MergeUp",
|
|
onExecute: () => t.mergeSourceUp(e)
|
|
}) : null
|
|
}
|
|
_createActionUnmergeUp(e) {
|
|
const t = this._chartWidget.model();
|
|
return t.model().isUnmergeAvailableForSource(e) ? new a.Action({
|
|
label: ee,
|
|
statName: "UnmergeUp",
|
|
onExecute: () => t.unmergeSourceUp(e)
|
|
}) : null
|
|
}
|
|
_createActionMergeDown(e) {
|
|
const t = this._chartWidget.model();
|
|
return t.model().isMergeDownAvailableForSource(e) ? new a.Action({
|
|
label: te,
|
|
statName: "MergeDown",
|
|
onExecute: () => t.mergeSourceDown(e)
|
|
}) : null
|
|
}
|
|
_createActionUnmergeDown(e) {
|
|
const t = this._chartWidget.model();
|
|
return t.model().isUnmergeAvailableForSource(e) ? new a.Action({
|
|
label: ie,
|
|
statName: "UnmergeDown",
|
|
onExecute: () => t.unmergeSourceDown(e)
|
|
}) : null
|
|
}
|
|
_mergeContentMenuItems(e) {
|
|
return [this._createActionMergeUp(e), this._createActionUnmergeUp(e), this
|
|
._createActionMergeDown(e), this._createActionUnmergeDown(e)
|
|
].filter(n.notNull)
|
|
}
|
|
_createActionMove(e) {
|
|
const t = this._mergeContentMenuItems(e);
|
|
return t.length > 0 ? new a.Action({
|
|
label: $,
|
|
icon: i("BBCR"),
|
|
subItems: t
|
|
}) : null
|
|
}
|
|
_contextMenuActionsForSeries(e) {
|
|
const t = [],
|
|
i = e.properties().visible.value(),
|
|
r = this._chartWidget.model().model(),
|
|
n = (Object(s.ensureNotNull)(r.paneForSource(e)), this._chartWidget.actions());
|
|
if (this._isReadOnly()) t.push(i ? this._createActionHide(e) : this
|
|
._createActionShow(e)), t.push(new a.Separator), t.push(this
|
|
._createActionScale(e));
|
|
else {
|
|
0,
|
|
t.length > 0 && !(t[t.length - 1] instanceof a.Separator) && t.push(new a
|
|
.Separator),
|
|
o.enabled("symbol_info") && t.push(n.showSymbolInfoDialog);r.mainSeries()
|
|
.symbolInfo();0,
|
|
t.length > 0 && !(t[t.length - 1] instanceof a.Separator) && t.push(new a
|
|
.Separator),
|
|
t.push(this._createVisualOrderAction([e]));
|
|
const s = this._createActionMove(e);null !== s && t.push(s),
|
|
t.push(this._createActionScale(e)),
|
|
t.push(i ? this._createActionHide(e) : this._createActionShow(e)),
|
|
t.push(new a.Separator),
|
|
t.push(Ee(this._chartWidget)),
|
|
t.push(new a.Separator);window.widgetbar && (!window.widgetbar._customization ||
|
|
window.widgetbar._customization.watchlist) && n.addToWatchlist && t.push(n
|
|
.addToWatchlist),
|
|
o.enabled("text_notes") && t.push(n.addToTextNotes),
|
|
t[t.length - 1] instanceof a.Separator || t.push(new a.Separator),
|
|
t[t.length - 1] instanceof a.Separator && t.pop()
|
|
}
|
|
return t
|
|
}
|
|
_createActionAddChildStudy(e) {
|
|
const t = this._chartWidget.model().model();
|
|
return new a.Action({
|
|
label: ce.format({
|
|
studyTitle: Ie(e)
|
|
}),
|
|
icon: i("CwKc"),
|
|
statName: "ApplyIndicator",
|
|
onExecute: () => {
|
|
const i = this._chartWidget.showIndicators(Object(h.isStudy)(
|
|
e) ? e : void 0);
|
|
if (i && Object(h.isStudy)(e)) {
|
|
const e = () => {
|
|
trackEvent("SOS", "Apply SOS", "Apply by RC menu")
|
|
},
|
|
s = t.studyInserted();
|
|
s.subscribe(this, e), i.visible().subscribe(t => {
|
|
t || s.unsubscribe(this, e)
|
|
}, {
|
|
once: !0
|
|
})
|
|
}
|
|
}
|
|
})
|
|
}
|
|
_createActionAddFundamentals(e) {
|
|
return null
|
|
}
|
|
_createActionShowSymbolInfoDialog(e, t) {
|
|
return new a.Action({
|
|
label: Object(w.appendEllipsis)(Object(P.t)("Symbol Info")),
|
|
icon: i("1pHB"),
|
|
checkable: !1,
|
|
statName: "SymbolInfo",
|
|
onExecute: () => {
|
|
const i = e.symbol(),
|
|
s = {
|
|
symbolInfo: e.symbolInfo(),
|
|
unitName: e => t.name(e)
|
|
};
|
|
Object(b.showSymbolInfoDialog)(i, s)
|
|
}
|
|
})
|
|
}
|
|
_createActionShowProperties(e) {
|
|
return new a.Action({
|
|
label: he,
|
|
icon: i("MXV9"),
|
|
statName: "EditSelectedObject",
|
|
onExecute: () => this._chartWidget.showSourceProperties(e)
|
|
})
|
|
}
|
|
_contextMenuActionsForStudy(e) {
|
|
const t = this._chartWidget.actions(),
|
|
i = e.properties().visible.value(),
|
|
s = [];
|
|
if (!e.userEditEnabled()) return s;
|
|
if (this._chartWidget.readOnly()) s.push(i ? this._createActionHide(e) : this
|
|
._createActionShow(e)), s.push(new a.Separator), e.constructor instanceof d
|
|
.NonSeriesStudy || s.push(this._createActionScale(e));
|
|
else {
|
|
0,
|
|
o.enabled("study_on_study") && e.canHaveChildren() && s.push(this
|
|
._createActionAddChildStudy(e));
|
|
const r = this._createApplyToEntireLayoutCommand(e);
|
|
if (null !== r && s.push(r), s.length > 0 && !(s[s.length - 1] instanceof a
|
|
.Separator) && s.push(new a.Separator), o.enabled("symbol_info") && (
|
|
e instanceof g.a || e instanceof f.study_Overlay) && null !== e
|
|
.symbolInfo() && (s.push(this._createActionShowSymbolInfoDialog(e, this
|
|
._chartWidget.model().model().availableUnits())), s.push(new a
|
|
.Separator)), s.push(this._createVisualOrderAction([e])), !(e
|
|
.constructor instanceof d.NonSeriesStudy)) {
|
|
const t = this._createActionMove(e);
|
|
null !== t && s.push(t), s.push(this._createActionScale(e))
|
|
}
|
|
s.push(new a.Separator);
|
|
const n = e.metaInfo();
|
|
if (e.copiable()) {
|
|
const t = new a.Action({
|
|
label: pe,
|
|
shortcutHint: Object(_.humanReadableHash)(_.Modifiers.Mod + 67),
|
|
statName: "Copy",
|
|
onExecute: () => {
|
|
this._chartWidget.chartWidgetCollection().clipboard
|
|
.uiRequestCopy([e])
|
|
}
|
|
});
|
|
s.push(t)
|
|
}
|
|
s.push(i ? this._createActionHide(e) : this._createActionShow(e)),
|
|
s.push(t.studyRemove),
|
|
s.push(new a.Separator),
|
|
o.enabled("property_pages") && new p.a(n).hasUserEditableOptions() && s.push(
|
|
this._createActionShowProperties(e)),
|
|
s[s.length - 1] instanceof a.Separator && s.pop()
|
|
}
|
|
return s
|
|
}
|
|
_createEditAlertDrawingAction(e) {
|
|
return new a.Action({
|
|
label: I.format({
|
|
title: e.title()
|
|
}),
|
|
icon: TbbiEditAlertSvg,
|
|
statName: "EditAlert",
|
|
onExecute: () => {
|
|
window.runOrSignIn(() => {
|
|
e.editAlert("pane_context_menu_edit_alert")
|
|
}, {
|
|
source: "Alert edit from pane context menu"
|
|
})
|
|
}
|
|
})
|
|
}
|
|
_createLineToolTemplateAction(e) {
|
|
if (!window.lineToolPropertiesToolbar) return null;
|
|
const t = window.lineToolPropertiesToolbar.templatesList();
|
|
return void 0 === t ? null : new a.ActionAsync(() => {
|
|
const i = [],
|
|
s = new a.Action({
|
|
label: de,
|
|
statName: "SaveAs",
|
|
onExecute: () => {
|
|
t.showSaveDialog(i => {
|
|
const s = JSON.stringify(e.template());
|
|
t.saveTemplate(i, s)
|
|
})
|
|
}
|
|
});
|
|
i.push(s);
|
|
const r = new a.Action({
|
|
label: ue,
|
|
statName: "ApplyDefault",
|
|
onExecute: () => {
|
|
this._chartWidget.model()
|
|
.restorePropertiesForSource(e), window
|
|
.lineToolPropertiesToolbar.onSourceChanged(e)
|
|
}
|
|
});
|
|
return i.push(r), new Promise(e => {
|
|
t.templatesLoaded().then(() => {
|
|
const e = t.getData();
|
|
e.length > 0 && i.push(new a.Separator), e
|
|
.forEach((e, s) => {
|
|
const r = new a.Action({
|
|
label: e,
|
|
statName: "ApplyTemplate",
|
|
onExecute: () => t
|
|
.loadTemplate(e),
|
|
toolbox: {
|
|
type: m.ToolboxType
|
|
.Delete,
|
|
action: () => {
|
|
t.deleteAction(
|
|
e)
|
|
}
|
|
},
|
|
showToolboxOnHover: !0
|
|
});
|
|
i.push(r)
|
|
})
|
|
}, e => {
|
|
T.logWarn(e)
|
|
}).then(() => {
|
|
e({
|
|
label: me,
|
|
statName: "Template",
|
|
subItems: i
|
|
})
|
|
})
|
|
})
|
|
})
|
|
}
|
|
_createActionToggleLockObject(e) {
|
|
const t = e.properties().frozen.value();
|
|
return new a.Action({
|
|
label: t ? ge : be,
|
|
statName: "ToggleLockSelectedObject",
|
|
checkable: !0,
|
|
icon: i(t ? "fs3R" : "qckB"),
|
|
onExecute: () => this._chartWidget.toggleLockSelectedObject()
|
|
})
|
|
}
|
|
async _contextMenuActionsForLineTool(e) {
|
|
const t = [],
|
|
r = this._chartWidget.actions(),
|
|
l = this._chartWidget.model().model(),
|
|
c = () => {
|
|
t.push(this._createVisualOrderAction(e))
|
|
},
|
|
h = () => {
|
|
const s = e.filter(e => e.cloneable());
|
|
if (s.length > 0) {
|
|
const e = new a.Action({
|
|
label: _e,
|
|
icon: i("K8V9"),
|
|
shortcutHint: Object(_.humanReadableModifiers)(_.Modifiers
|
|
.Mod) + "Drag",
|
|
doNotBindShortcut: !0,
|
|
statName: "Clone",
|
|
onExecute: () => this._chartWidget.model().cloneLineTools(s,
|
|
!1)
|
|
}, "Clone");
|
|
t.push(e)
|
|
}
|
|
return !!s.length
|
|
},
|
|
u = () => {
|
|
const i = e.filter(e => e.copiable());
|
|
if (i.length > 0) {
|
|
const e = new a.Action({
|
|
label: pe,
|
|
shortcutHint: Object(_.humanReadableHash)(_.Modifiers.Mod +
|
|
67),
|
|
statName: "Copy",
|
|
onExecute: () => this._chartWidget.chartWidgetCollection()
|
|
.clipboard.uiRequestCopy(i)
|
|
}, "Copy");
|
|
t.push(e)
|
|
}
|
|
return !!i.length
|
|
},
|
|
d = e => {
|
|
const i = new a.Action({
|
|
label: fe.format({
|
|
lineToolName: e.title()
|
|
}),
|
|
statName: "GoToLineTool",
|
|
checkable: !1,
|
|
onExecute: async t => {
|
|
const i = l.timeScale().logicalRange();
|
|
if (null === i) return;
|
|
const r = this._chartWidget.model(),
|
|
o = l.timeScale().barSpacing();
|
|
let a = i.left();
|
|
const c = e.points().map(e => e.index);
|
|
let h = l.timeScale().points().firstIndex();
|
|
const u = l.timeScale().points().lastIndex();
|
|
if (null === h || null === u) return;
|
|
const d = i.length() / 2;
|
|
if (0 === c.length || c.some(e => i.contains(e)))
|
|
return;
|
|
const p = () => {
|
|
const t = e.points().map(e => e.index),
|
|
i = t.filter(e => e <= u).reduce((e, t) =>
|
|
null === e ? t : Math.max(e, t), null);
|
|
return null !== i ? i : t.reduce((e, t) => Math
|
|
.min(e, t))
|
|
};
|
|
let _, m = p();
|
|
if (h - d > m) {
|
|
const t = e.points().map(e => e.time).filter(n
|
|
.notUndefined).map(e => e.valueOf() / 1e3);
|
|
if (0 === t.length) return;
|
|
const i = t.reduce((e, t) => Math.min(e, t), t[0]);
|
|
await l.gotoTime(i), m = p();
|
|
a = Object(s.ensureNotNull)(l.timeScale()
|
|
.logicalRange()).left(), h = Object(s
|
|
.ensureNotNull)(l.timeScale().points()
|
|
.firstIndex())
|
|
}
|
|
h - d > m ? (_ = (a - h + d) * o, l.mainSeries()
|
|
.setGotoDateResult({
|
|
timestamp: Object(s.ensureNotNull)(l
|
|
.timeScale().points().valueAt(h)
|
|
),
|
|
eod: !0
|
|
})) : _ = (a - m + 1 + d) * o, r
|
|
.startScrollTime(0), Object(C.doAnimate)({
|
|
onStep: (e, t) => r.scrollTimeTo(t),
|
|
from: 0,
|
|
to: Math.round(_),
|
|
easing: x.c.easeInOutCubic,
|
|
duration: x.b,
|
|
onComplete: () => r.endScrollTime()
|
|
})
|
|
}
|
|
});
|
|
t.push(i)
|
|
};
|
|
if (1 === e.length) {
|
|
const i = e[0];
|
|
if (this._chartWidget.readOnly()) t.push(r.lineHide);
|
|
else if (i.userEditEnabled()) {
|
|
if (o.enabled("alerts") && !this._chartWidget.onWidget() && i.hasAlert && i
|
|
.hasAlert.value() && (t.push(this._createEditAlertDrawingAction(i)), t
|
|
.push(new a.Separator)), !o.enabled("charting_library_base")) {
|
|
const e = this._createLineToolTemplateAction(i);
|
|
null !== e && t.push(e)
|
|
}
|
|
c(), this._options.objectTree && r.paneObjectTree && t.push(r
|
|
.paneObjectTree), t.push(new a.Separator);
|
|
let e = h();
|
|
e = u() || e, e = e, e && t.push(new a.Separator), t.push(this
|
|
._createActionToggleLockObject(i)), t.push(r.lineHide), t.push(r
|
|
.lineRemove), i.points().length > 0 && this._options.gotoLineTool &&
|
|
(t.push(new a.Separator), d(i));
|
|
const s = await this._chartWidget.propertiesDefinitionsForSource(i);
|
|
if (o.enabled("property_pages") && null !== s && (t.push(new a.Separator), t
|
|
.push(r.format)), i.additionalActions) {
|
|
t.push(new a.Separator);
|
|
const e = i.additionalActions(this._chartWidget.model());
|
|
t.push(...e)
|
|
}
|
|
}
|
|
} else this._options.objectTree && r.paneObjectTree && t.push(r.paneObjectTree),
|
|
c(), t.push(new a.Separator), h(), u(), t.push(new a.Separator), t.push(r
|
|
.lineHide),
|
|
t.push(r.lineRemove);
|
|
return t
|
|
}
|
|
_createEarningsShow() {
|
|
return null
|
|
}
|
|
_createDividendsShow() {
|
|
return null
|
|
}
|
|
_createSplitsShow() {
|
|
return null
|
|
}
|
|
_contextMenuActionsForESD() {
|
|
return []
|
|
}
|
|
_contextMenuActionsForPublishedTimeline(e) {
|
|
const t = this._chartWidget.actions(),
|
|
i = [];
|
|
if (i.push(t.lineHide), window.is_authenticated) {
|
|
const t = e.properties().filter,
|
|
s = new a.Action({
|
|
checked: t.value() === PublishedChartsFilter.None,
|
|
checkable: !0,
|
|
label: ve,
|
|
name: "ToggleAllIdeas",
|
|
statName: "ToggleAllIdeas",
|
|
onExecute: () => this._chartWidget.model().setProperty(t,
|
|
PublishedChartsFilter.None, ve)
|
|
}),
|
|
r = new a.Action({
|
|
checked: t.value() === PublishedChartsFilter.Following,
|
|
checkable: !0,
|
|
label: Se,
|
|
name: "ToggleIdeasOfPeopleAndUser",
|
|
statName: "ToggleIdeasOfPeopleAndUser",
|
|
onExecute: () => this._chartWidget.model().setProperty(t,
|
|
PublishedChartsFilter.Following, Se)
|
|
}),
|
|
n = new a.Action({
|
|
checked: t.value() === PublishedChartsFilter.Private,
|
|
checkable: !0,
|
|
label: ye,
|
|
name: "ToggleUserIdeas",
|
|
statName: "ToggleUserIdeas",
|
|
onExecute: () => this._chartWidget.model().setProperty(t,
|
|
PublishedChartsFilter.Private, ye)
|
|
});
|
|
i.push(new a.Separator, s, r, n)
|
|
}
|
|
return i
|
|
}
|
|
_contextMenuActionsForTradingDrawings(e) {
|
|
return e.contextMenuItems()
|
|
}
|
|
_createAlertToggleHorzLineLabelAction(e) {
|
|
const t = getGlobalAlertSettingsProperty().childs().line.childs().visible,
|
|
i = t.value() ? L : O;
|
|
return new a.Action({
|
|
checkable: !0,
|
|
label: M,
|
|
checked: t.value(),
|
|
statName: "ToggleExtendAlertLine",
|
|
onExecute: () => this._chartWidget.model().setProperty(t, !t.value(), i)
|
|
})
|
|
}
|
|
_contextMenuActionsForAlertLabel(e) {
|
|
const t = e.alert(),
|
|
i = [];
|
|
return t.get("active") ? i.push(AlertActionCreator.stopAlert(t)) : i.push(
|
|
AlertActionCreator.restartAlert(t, "alert_label_context_menu_restart")), i
|
|
.push(AlertActionCreator.editAlert(t, "alert_label_context_menu_edit")), i.push(
|
|
AlertActionCreator.deleteAlert(t)),
|
|
i.push(new a.Separator), i.push(this._createAlertToggleHorzLineLabelAction(e)),
|
|
i
|
|
}
|
|
_contextMenuActionsForChartEvents(e) {
|
|
const t = [];
|
|
if (o.enabled("property_pages")) {
|
|
const e = new a.Action({
|
|
label: we,
|
|
statName: "Format",
|
|
onExecute: () => this._chartWidget.showGeneralChartProperties(u
|
|
.TabNames.eventsAndAlerts)
|
|
});
|
|
t.push(e)
|
|
}
|
|
const i = new a.Action({
|
|
label: Pe,
|
|
name: "HideEvents",
|
|
statName: "HideEvents",
|
|
onExecute: () => this._chartWidget.model().setProperty(e.properties()
|
|
.visible, !1, Pe)
|
|
});
|
|
return t.push(i), t
|
|
}
|
|
_createApplyToEntireLayoutCommand(e) {
|
|
if (!this._chartWidget.chartWidgetCollection()
|
|
.applyIndicatorsToAllChartsAvailable()) return null;
|
|
const t = this._chartWidget.model().model();
|
|
if (e.parentSource() !== t.mainSeries()) return null;
|
|
const i = Object(s.ensureNotNull)(t.paneForSource(e)),
|
|
r = t.paneForSource(t.mainSeries()) === i,
|
|
n = e instanceof g.a && e.priceScale() === t.mainSeries().priceScale() &&
|
|
Object(s.ensureNotNull)(e.priceScale()).isPercentage(),
|
|
o = r ? void 0 : t.panes().indexOf(i);
|
|
let l = xe,
|
|
c = "AddStudyToEntireLayout";
|
|
return Object(y.isSymbolSource)(e) && (l = Ce, c = "AddSymbolToEntireLayout"), new a
|
|
.Action({
|
|
label: l,
|
|
statName: c,
|
|
onExecute: () => {
|
|
const i = Object(s.ensureNotNull)(Object(v.a)(t.id(), [e])),
|
|
a = this._chartWidget.chartWidgetCollection(),
|
|
c = {
|
|
isOnMainPane: r,
|
|
asCompare: n,
|
|
paneIndex: o
|
|
};
|
|
a.applyIndicatorToAllCharts(this._chartWidget, i, c, l)
|
|
}
|
|
}, "applyStudyToEntireLayout")
|
|
}
|
|
}
|
|
},
|
|
Hr11: function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e, t) {
|
|
return e <= t
|
|
}
|
|
|
|
function r(e, t) {
|
|
return e >= t
|
|
}
|
|
|
|
function n(e, t, i) {
|
|
return Math.min(Math.max(e, t), i)
|
|
}
|
|
|
|
function o(e) {
|
|
return e < 0 ? -1 : e > 0 ? 1 : 0
|
|
}
|
|
|
|
function a(e) {
|
|
if (e < 0) return !1;
|
|
for (let t = e; t > 1; t /= 10)
|
|
if (t % 10 != 0) return !1;
|
|
return !0
|
|
}
|
|
|
|
function l(e, t, i) {
|
|
return t - e <= i
|
|
}
|
|
|
|
function c(e, t, i) {
|
|
return Math.abs(e - t) < i
|
|
}
|
|
|
|
function h(e) {
|
|
return e <= 0 ? NaN : Math.log(e) / Math.log(10)
|
|
}
|
|
|
|
function u(e, t) {
|
|
return e < t ? -1 : e > t ? 1 : 0
|
|
}
|
|
|
|
function d(e, t = u) {
|
|
if (e.length < 1) throw Error("array is empty");
|
|
let i = e[0];
|
|
for (let s = 0; s < e.length; ++s) t(e[s], i) < 0 && (i = e[s]);
|
|
return i
|
|
}
|
|
|
|
function p(e, t = u) {
|
|
if (e.length < 1) throw Error("array is empty");
|
|
let i = e[0];
|
|
for (let s = 0; s < e.length; ++s) t(e[s], i) > 0 && (i = e[s]);
|
|
return i
|
|
}
|
|
|
|
function _(e) {
|
|
const t = Math.ceil(e);
|
|
return t % 2 != 0 ? t - 1 : t
|
|
}
|
|
|
|
function m(e) {
|
|
return e > 0 ? Math.floor(e) : Math.ceil(e)
|
|
}
|
|
i.r(t), i.d(t, "lessThan", (function() {
|
|
return s
|
|
})), i.d(t, "greaterThan", (function() {
|
|
return r
|
|
})), i.d(t, "clamp", (function() {
|
|
return n
|
|
})), i.d(t, "sign", (function() {
|
|
return o
|
|
})), i.d(t, "isBaseDecimal", (function() {
|
|
return a
|
|
})), i.d(t, "greaterOrEqual", (function() {
|
|
return l
|
|
})), i.d(t, "equal", (function() {
|
|
return c
|
|
})), i.d(t, "log10", (function() {
|
|
return h
|
|
})), i.d(t, "defComparator", (function() {
|
|
return u
|
|
})), i.d(t, "min", (function() {
|
|
return d
|
|
})), i.d(t, "max", (function() {
|
|
return p
|
|
})), i.d(t, "ceiledEven", (function() {
|
|
return _
|
|
})), i.d(t, "toInt", (function() {
|
|
return m
|
|
}))
|
|
},
|
|
HySD: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "ResizerDetacherState", (function() {
|
|
return o
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("hY0g"),
|
|
n = i.n(r);
|
|
class o {
|
|
constructor(e) {
|
|
this._alive = new n.a, this._container = new n.a, this._width = new n.a, this
|
|
._height = new n.a, this._fullscreen = new n.a, this._detachable = new n.a, this
|
|
._fullscreenable = new n.a, this._visible = new n.a, this._availWidth = new n.a,
|
|
this._availHeight = new n.a,
|
|
this._owner = new n.a, this._ownersStack = [], this.owner = this._owner
|
|
.readonly(), this._bridge = {
|
|
alive: this._alive.readonly(),
|
|
container: this._container.readonly(),
|
|
width: this._width.readonly(),
|
|
height: this._height.readonly(),
|
|
fullscreen: this._fullscreen.readonly(),
|
|
detachable: this._detachable.readonly(),
|
|
fullscreenable: this._fullscreenable.readonly(),
|
|
visible: this._visible.readonly(),
|
|
availWidth: this._availWidth.readonly(),
|
|
availHeight: this._availHeight.readonly(),
|
|
remove: () => {
|
|
const e = this._owner.value();
|
|
e && e.remove && e.remove()
|
|
},
|
|
negotiateWidth: e => {
|
|
const t = this._owner.value();
|
|
t && t.negotiateWidth && t.negotiateWidth(e)
|
|
},
|
|
negotiateHeight: e => {
|
|
const t = this._owner.value();
|
|
t && t.negotiateHeight && t.negotiateHeight(e)
|
|
},
|
|
requestFullscreen: () => {
|
|
const e = this._owner.value();
|
|
e && e.requestFullscreen && e.requestFullscreen()
|
|
},
|
|
exitFullscreen: () => {
|
|
const e = this._owner.value();
|
|
e && e.exitFullscreen && e.exitFullscreen()
|
|
},
|
|
detach: e => {
|
|
const t = this._owner.value();
|
|
t && t.detach && t.detach(e)
|
|
},
|
|
attach: () => {
|
|
const e = this._owner.value();
|
|
e && e.attach && e.attach()
|
|
}
|
|
}, e && this.pushOwner(e)
|
|
}
|
|
bridge() {
|
|
return this._bridge
|
|
}
|
|
pushOwner(e) {
|
|
if (!e.alive.value()) return;
|
|
for (const e of this._ownersStack) this._unsubscribeOwner(e);
|
|
const t = {
|
|
owner: e
|
|
};
|
|
this._ownersStack.push(t), this._subscribeOwner(t)
|
|
}
|
|
_subscribeOwner(e) {
|
|
const t = e.owner;
|
|
if (e.deathWatcher || (this._alive.setValue(!0), e.deathWatcher = t.alive.spawn(), e
|
|
.deathWatcher.subscribe(t => {
|
|
t || this._deadHandler(e)
|
|
})), this._owner.setValue(t), !e.subscriptions) {
|
|
const i = e.subscriptions = [];
|
|
this._visible.setValue(!1);
|
|
const s = (e, t) => {
|
|
if (e) {
|
|
const s = e.spawn();
|
|
i.push(s), s.subscribe(e => {
|
|
t.setValue(e)
|
|
}, {
|
|
callWithLast: !0
|
|
})
|
|
} else t.deleteValue()
|
|
};
|
|
s(t.container, this._container), s(t.width, this._width), s(t.height, this
|
|
._height), s(t.fullscreen, this._fullscreen), s(t.detachable, this
|
|
._detachable), s(t.fullscreenable, this._fullscreenable), s(t
|
|
.availWidth, this._availWidth), s(t.availHeight, this._availHeight), s(t
|
|
.visible, this._visible)
|
|
}
|
|
}
|
|
_unsubscribeOwner(e, t) {
|
|
if (e.subscriptions) {
|
|
for (const t of e.subscriptions) t.unsubscribe();
|
|
e.subscriptions = null
|
|
}
|
|
t && e.deathWatcher && (e.deathWatcher.unsubscribe(), e.deathWatcher = null)
|
|
}
|
|
_deadHandler(e) {
|
|
const t = this._ownersStack.indexOf(e);
|
|
Object(s.assert)(-1 !== t, "sanitized owner should be in stack");
|
|
for (let e = this._ownersStack.length - 1; e >= t; e--) this._unsubscribeOwner(this
|
|
._ownersStack[e], !0);
|
|
this._ownersStack.length = t, t > 0 ? this._subscribeOwner(this._ownersStack[t -
|
|
1]) : (this._alive.setValue(!1), this._owner.deleteValue())
|
|
}
|
|
}
|
|
},
|
|
I4UZ: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "HeaderToolbarBootloader", (function() {
|
|
return o
|
|
}));
|
|
var s = i("yMne"),
|
|
r = i("YuHv"),
|
|
n = i("cZRT");
|
|
class o extends n.a {
|
|
constructor(e, t) {
|
|
super(), this._toolsBootloader = e, this._headerProps = t, this._headerProps
|
|
.resizerBridge.negotiateHeight(s.b), this._headerProps.resizerBridge
|
|
.container.value().appendChild(Object(r.a)())
|
|
}
|
|
_startLoading() {
|
|
return Promise.all([this._toolsBootloader.load(), this._loadHeaderToolbar()])
|
|
.then(([e, t]) => new t(this._headerProps.resizerBridge.container.value(), {
|
|
...this._headerProps,
|
|
tools: e
|
|
}))
|
|
}
|
|
_loadHeaderToolbar() {
|
|
return Promise.all([i.e("react"), i.e(14), i.e(42), i.e(79), i.e(7), i.e(10), i
|
|
.e(40), i.e("header-toolbar")
|
|
]).then(i.bind(null, "KMbc")).then(e => e.HeaderToolbarRenderer)
|
|
}
|
|
}
|
|
},
|
|
IDnv: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "extrapolateBarsFrontToTime", (function() {
|
|
return r
|
|
})), i.d(t, "extrapolateBarsFrontByCount", (function() {
|
|
return n
|
|
})), i.d(t, "extrapolateBarsFrontByCountAllPoints", (function() {
|
|
return o
|
|
})), i.d(t, "extrapolateBars", (function() {
|
|
return a
|
|
}));
|
|
var s = i("E6p6");
|
|
|
|
function r(e, t, i, s, n = !1) {
|
|
if (t > i) {
|
|
const o = r(e, i, t, s, n);
|
|
return o.count = -o.count, o
|
|
}
|
|
return a(e, t, 1, (e, t) => t > i || 0 !== s && e > s, n)
|
|
}
|
|
|
|
function n(e, t, i, s = !1) {
|
|
const r = i < 0 ? -1 : 1;
|
|
return a(e, t, r, (e, t) => e >= i * r, s)
|
|
}
|
|
|
|
function o(e, t, i) {
|
|
const s = i < 0 ? -1 : 1;
|
|
return a(e, t, s, (e, t) => e >= i * s, !0).times
|
|
}
|
|
|
|
function a(e, t, i, r, n) {
|
|
let o = 0,
|
|
a = t;
|
|
e.moveTo(a);
|
|
let l = 0,
|
|
c = Number.MAX_VALUE,
|
|
h = !1,
|
|
u = t;
|
|
const d = [];
|
|
for (; !r(o, a);) {
|
|
if (l > 15) throw new Error("Internal error 0x10 while extrapolating.");
|
|
const r = e.indexOfBar(a);
|
|
if (r === s.SessionStage.PRE_SESSION && 1 === i) a = e.startOfBar(0), e.moveTo(a);
|
|
else if (r === s.SessionStage.PRE_SESSION && -1 === i) a = e.startOfBar(s.SessionStage
|
|
.PRE_SESSION), e.moveTo(a);
|
|
else if (r === s.SessionStage.POST_SESSION && 1 === i) a = e.startOfBar(s.SessionStage
|
|
.POST_SESSION), e.moveTo(a);
|
|
else {
|
|
if (r === s.SessionStage.POST_SESSION && -1 === i) throw new Error(
|
|
"Internal error 0x12 while extrapolating."); {
|
|
const p = e.startOfBar(r);
|
|
if (p > t && i > 0 || t > p && i < 0) {
|
|
if (h && c === p) throw new Error(
|
|
"Internal error 0x11 while extrapolating.");
|
|
h = !0, c = p, l = 0, o++, u = p, n && d.push(u)
|
|
}
|
|
if (0 === r && -1 === i) a = p - 1;
|
|
else {
|
|
a = e.startOfBar(r + i);
|
|
const t = e.startOfBar(s.SessionStage.POST_SESSION);
|
|
a > t && (e.moveTo(t), a = e.startOfBar(0))
|
|
}
|
|
}
|
|
}
|
|
l++
|
|
}
|
|
return {
|
|
time: u,
|
|
times: d,
|
|
count: o
|
|
}
|
|
}
|
|
},
|
|
IMMp: function(e) {
|
|
e.exports = JSON.parse(
|
|
'{"color-bg-primary":"color-cold-gray-850","color-bg-primary-hover":"color-cold-gray-800","color-bg-secondary":"color-cold-gray-900","color-bg-highlight":"color-cold-gray-900","color-bg-scroll-buttons":"color-cold-gray-800","color-legacy-bg-scroll-buttons":"color-cold-gray-550","color-legacy-bg-widget":"color-cold-gray-900","color-text-primary":"color-cold-gray-200","color-text-secondary":"color-cold-gray-500","color-text-tertiary":"color-cold-gray-400","color-text-disabled":"color-cold-gray-650","color-accent-content":"color-white","color-divider":"color-cold-gray-700","color-divider-hover":"color-cold-gray-800","color-box-shadow":"color-cold-gray-900","color-active-hover-text":"color-cold-gray-300","color-alert-text":"color-cold-gray-200","color-border":"color-cold-gray-750","color-border-chat-fields":"color-cold-gray-750","color-border-hover":"color-cold-gray-650","color-border-table":"color-cold-gray-800","color-brand":"color-tv-blue-500","color-brand-hover":"color-tv-blue-600","color-brand-active":"color-tv-blue-700","color-button-hover-bg":"color-cold-gray-850","color-chart-page-bg":"color-cold-gray-800","color-common-tooltip-bg":"color-cold-gray-650","color-danger":"color-ripe-red-600","color-danger-hover":"color-ripe-red-500","color-danger-active":"color-ripe-red-400","color-depthrenderer-fill-style":"color-cold-gray-150","color-depthrenderer-stroke-style":"color-cold-gray-650","color-disabled-border-and-color":"color-cold-gray-800","color-disabled-input":"color-cold-gray-750","color-empty-container-message":"color-cold-gray-500","color-highlight-new":"color-tv-blue-a800","color-icons":"color-cold-gray-500","color-input-bg":"color-cold-gray-800","color-input-textarea-readonly":"color-cold-gray-650","color-input-placeholder-text":"color-cold-gray-700","color-input-publish-bg":"color-cold-gray-900","color-item-active-blue":"color-tv-blue-a800","color-item-hover-active-bg":"color-cold-gray-800","color-item-hover-bg":"color-cold-gray-800","color-item-hover-blue":"color-tv-blue-a800","color-item-selected-blue":"color-tv-blue-a800","color-item-active-text":"color-cold-gray-200","color-item-active-bg":"color-tv-blue-500","color-link":"color-tv-blue-500","color-link-hover":"color-tv-blue-600","color-link-active":"color-tv-blue-700","color-list-item":"color-cold-gray-500","color-list-nth-child-bg":"color-cold-gray-850","color-news-highlight":"color-cold-gray-800","color-pane-bg":"color-cold-gray-900","color-pane-secondary-bg":"color-cold-gray-850","color-placeholder":"color-cold-gray-650","color-popup-menu-item-hover-bg":"color-cold-gray-800","color-popup-menu-separator":"color-cold-gray-700","color-row-hover-active-bg":"color-cold-gray-800","color-sb-scrollbar-body-bg":"color-cold-gray-650","color-screener-description":"color-cold-gray-200","color-section-separator-border":"color-cold-gray-750","color-search-button-hover":"color-cold-gray-700","color-separator-table-chat":"color-cold-gray-750","color-success":"color-minty-green-700","color-success-hover":"color-minty-green-600","color-success-active":"color-minty-green-500","color-tag-active-bg":"color-cold-gray-750","color-tag-hover-bg":"color-cold-gray-800","color-text-regular":"color-cold-gray-200","color-toolbar-button-text":"color-cold-gray-500","color-toolbar-button-text-hover":"color-cold-gray-450","color-toolbar-button-text-active":"color-tv-blue-500","color-toolbar-button-text-active-hover":"color-tv-blue-600","color-toolbar-button-background-hover":"color-cold-gray-800","color-toolbar-button-background-secondary-hover":"color-cold-gray-750","color-toolbar-toggle-button-background-active":"color-tv-blue-500","color-toolbar-toggle-button-background-active-hover":"color-tv-blue-600","color-toolbar-interactive-element-text-normal":"color-cold-gray-300","color-toolbar-interactive-element-text-hover":"color-cold-gray-250","color-toolbar-opened-element-bg":"color-cold-gray-800","color-tooltip-bg":"color-cold-gray-750","color-tv-button-checked":"color-cold-gray-500","color-tv-dialog-caption":"color-cold-gray-50","color-tv-dropdown-item-hover-bg":"color-cold-gray-800","color-underlined-text":"color-cold-gray-300","color-widget-pages-bg":"color-cold-gray-900","color-warning":"color-tan-orange-700","color-forex-icon":"color-white","color-list-item-active-bg":"color-tv-blue-500","color-list-item-hover-bg":"color-cold-gray-800","color-list-item-text":"color-cold-gray-200","color-price-axis-label-back":"color-cold-gray-800","color-price-axis-label-text":"color-cold-gray-500","color-price-axis-gear":"color-cold-gray-500","color-price-axis-gear-hover":"color-cold-gray-400","color-price-axis-highlight":"color-cold-gray-800","color-bid":"color-tv-blue-500","color-scroll-bg":"color-cold-gray-750","color-scroll-border":"color-cold-gray-850","color-widget-border":"color-cold-gray-800","color-scroll-buttons-arrow":"color-white","color-control-intent-default":"color-cold-gray-650","color-control-intent-success":"color-minty-green-600","color-control-intent-primary":"color-tv-blue-500","color-control-intent-warning":"color-tan-orange-500","color-control-intent-danger":"color-ripe-red-700","color-growing":"color-minty-green-600","color-falling":"color-ripe-red-600","color-pre-market":"color-tan-orange-600","color-pre-market-bg":"color-tan-orange-400","color-post-market":"color-tv-blue-500","color-post-market-bg":"color-tv-blue-400","color-market-open":"color-minty-green-500","color-market-open-bg":"color-minty-green-400","color-market-closed":"color-cold-gray-400","color-market-holiday":"color-cold-gray-400","color-invalid-symbol":"color-ripe-red-400","color-invalid-symbol-hover":"color-ripe-red-500","color-replay-mode":"color-tv-blue-500","color-replay-mode-icon":"color-tv-blue-50","color-replay-mode-hover":"color-tv-blue-600","color-notaccurate-mode":"color-berry-pink-700","color-notaccurate-mode-bg":"color-berry-pink-400","color-delay-mode":"color-tan-orange-700","color-delay-mode-bg":"color-tan-orange-400","color-eod-mode":"color-grapes-purple-700","color-eod-mode-bg":"color-grapes-purple-400","color-data-problem":"color-ripe-red-600","color-data-problem-bg":"color-ripe-red-400","color-data-problem-hover":"color-ripe-red-500","color-list-item-bg-highlighted":"color-tv-blue-a900","color-list-item-bg-selected":"color-tv-blue-a800","color-list-item-bg-highlighted-hover":"color-tv-blue-a800","color-list-item-bg-selected-hover":"color-tv-blue-a700","color-screener-header-bg":"color-cold-gray-850","color-screener-header-bg-hover":"color-cold-gray-800","color-overlay":"color-cold-gray-950","color-card-border":"color-cold-gray-700","color-card-border-hover":"color-cold-gray-600"}'
|
|
)
|
|
},
|
|
IWXC: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "getQuoteSessionInstance", (function() {
|
|
return o
|
|
})), i.d(t, "setQuoteSessionInstance", (function() {
|
|
return a
|
|
})), i.d(t, "getQuoteSessionNoEnsure", (function() {
|
|
return l
|
|
})), i.d(t, "destroyQuoteSessions", (function() {
|
|
return c
|
|
}));
|
|
var s = i("hGf4"),
|
|
r = i.n(s);
|
|
const n = {};
|
|
|
|
function o(e = "full") {
|
|
return n[e] || a(e, new r.a(e)), n[e]
|
|
}
|
|
|
|
function a(e = "full", t) {
|
|
n[e] = t
|
|
}
|
|
|
|
function l(e = "full") {
|
|
return n[e]
|
|
}
|
|
|
|
function c() {
|
|
for (const e in n)
|
|
if (n.hasOwnProperty(e)) {
|
|
const t = n[e];
|
|
void 0 !== t && t.destroy(), delete n[e]
|
|
}
|
|
}
|
|
},
|
|
Ialn: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "isRtl", (function() {
|
|
return r
|
|
})), i.d(t, "stripLTRMarks", (function() {
|
|
return o
|
|
})), i.d(t, "startWithLTR", (function() {
|
|
return a
|
|
})), i.d(t, "forceLTRStr", (function() {
|
|
return l
|
|
})), i.d(t, "forceLTRStrSsr", (function() {
|
|
return c
|
|
})), i.d(t, "forceRTLStr", (function() {
|
|
return h
|
|
})), i.d(t, "getLTRScrollLeft", (function() {
|
|
return u
|
|
})), i.d(t, "getLTRScrollLeftOffset", (function() {
|
|
return d
|
|
})), i.d(t, "detectAutoDirection", (function() {
|
|
return m
|
|
}));
|
|
var s = i("oYVD");
|
|
const r = () => "rtl" === window.document.dir,
|
|
n = new RegExp("|||", "g");
|
|
|
|
function o(e) {
|
|
return "" !== e && r() && null != e ? e.replace(n, "") : e
|
|
}
|
|
|
|
function a(e) {
|
|
return "" !== e && r() && null != e ? "" + e : e
|
|
}
|
|
|
|
function l(e) {
|
|
return "" !== e && r() && null != e ? "" + e + "" : e
|
|
}
|
|
|
|
function c(e) {
|
|
return "" + e + ""
|
|
}
|
|
|
|
function h(e) {
|
|
return "" !== e && r() && null != e ? "" + e + "" : e
|
|
}
|
|
|
|
function u(e) {
|
|
return Object(s.getNormalizedScrollLeft)(e, "rtl")
|
|
}
|
|
|
|
function d(e, t) {
|
|
const i = Object(s.detectScrollType)();
|
|
if ("indeterminate" === i) return 0;
|
|
switch (i) {
|
|
case "negative":
|
|
t = e.clientWidth - e.scrollWidth + t;
|
|
break;
|
|
case "reverse":
|
|
t = e.scrollWidth - e.clientWidth - t
|
|
}
|
|
return t
|
|
}
|
|
const p =
|
|
/[^\u0000-\u0040\u005B-\u0060\u007B-\u00BF\u00D7\u00F7\u02B9-\u02FF\u2000-\u200E\u2010-\u2029\u202C\u202F-\u2BFF]/,
|
|
_ = /[\u0590-\u07FF\u200F\u202B\u202E\uFB1D-\uFDFD\uFE70-\uFEFC]/;
|
|
|
|
function m(e) {
|
|
const t = p.exec(e);
|
|
return t ? _.test(t[0]) ? "rtl" : "ltr" : ""
|
|
}
|
|
},
|
|
IcDj: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("Eyy1"),
|
|
r = i("txPx"),
|
|
n = i("aIyQ"),
|
|
o = i.n(n),
|
|
a = i("7ktv"),
|
|
l = i("Qb4w"),
|
|
c = i("k9/m"),
|
|
h = i("0YCj"),
|
|
u = i.n(h),
|
|
d = i("jenN"),
|
|
p = i("972a"),
|
|
_ = i("it7y"),
|
|
m = i("e1Hy");
|
|
class f extends _.StudyDataWindowView {
|
|
constructor(e, t) {
|
|
super(e, t), this._showStudyValues = t.properties().paneProperties
|
|
.legendProperties.showStudyValues, this._showStudyValues.subscribe(this,
|
|
this.update)
|
|
}
|
|
isValuesVisible() {
|
|
return this._showStudyValues.value()
|
|
}
|
|
additional() {
|
|
return null
|
|
}
|
|
destroy() {
|
|
this._showStudyValues.unsubscribeAll(this)
|
|
}
|
|
_createValuesProvider(e, t) {
|
|
return new m.a(e, t)
|
|
}
|
|
}
|
|
var g = i("mMWL"),
|
|
b = i("2kV1"),
|
|
v = i("5fI3"),
|
|
S = i("jy4L"),
|
|
y = i("YWnQ"),
|
|
w = i("W+6j"),
|
|
P = i("ogJP"),
|
|
C = i("zXvd"),
|
|
x = i("23IT"),
|
|
T = i("Kxc7"),
|
|
I = i("aO4+"),
|
|
M = i("Tmoa"),
|
|
O = i("Zy3/");
|
|
class L {
|
|
constructor(e) {
|
|
this._data = e
|
|
}
|
|
draw(e, t) {}
|
|
drawBackground(e, t) {
|
|
e.save();
|
|
const i = this._data,
|
|
s = t.pixelRatio;
|
|
let r = null;
|
|
const n = Math.round(this._data.w * s);
|
|
for (let t = 0; t < i.items.length; ++t) {
|
|
const o = i.items[t];
|
|
if (null == o.color) {
|
|
r = null;
|
|
continue
|
|
}
|
|
e.fillStyle = o.color;
|
|
const a = Math.round(o.x * s);
|
|
let l = a;
|
|
if (t > 0) {
|
|
i.items[t - 1].index === o.index - 1 && null !== r && (l = r + 1)
|
|
}
|
|
const c = a + n,
|
|
h = c - l + 1;
|
|
e.fillRect(l, Math.round(i.y * s), h, Math.round(i.h * s)), r = c
|
|
}
|
|
e.restore()
|
|
}
|
|
hitTest(e) {
|
|
return null
|
|
}
|
|
}
|
|
var A = i("i6cO"),
|
|
E = i("UAFa");
|
|
class k {
|
|
constructor(e, t, i, r) {
|
|
this._items = [], this._invalidated = !0, this._isMarkersEnabled = T.enabled(
|
|
"source_selection_markers"), this._study = e, this._series = t, this
|
|
._model = i, this._plotName = r;
|
|
const n = this._study.metaInfo().plots;
|
|
for (let e = 0; e < n.length; e++) {
|
|
const t = n[e];
|
|
t.id === this._plotName && (this._plotIndex = e, Object(s.assert)(Object(x
|
|
.isBgColorerPlot)(t), "Plot '" + this._plotName +
|
|
"' is not a background colorer!"))
|
|
}
|
|
this._colorProvider = Object(E.createStudyPlotColorProvider)(e.metaInfo(), e
|
|
.properties(), r)
|
|
}
|
|
items() {
|
|
return this._items
|
|
}
|
|
update() {
|
|
this._invalidated = !0
|
|
}
|
|
renderer() {
|
|
if (!this._study.properties().styles[this._plotName].visible) return null;
|
|
if (!this._study.properties().styles[this._plotName].visible.value()) return null;
|
|
if (!this._scalesReady()) return null;
|
|
this._invalidated && (this._updateImpl(), this._invalidated = !1);
|
|
const e = {
|
|
items: this._items,
|
|
y: 0,
|
|
h: Object(s.ensureNotNull)(this._study.priceScale()).height(),
|
|
w: this._model.timeScale().barSpacing()
|
|
},
|
|
t = new O.CompositeRenderer;
|
|
return t.append(new L(e)), t
|
|
}
|
|
_scalesReady() {
|
|
const e = this._model.timeScale(),
|
|
t = this._study.priceScale();
|
|
return e && !e.isEmpty() && null !== t && !t.isEmpty()
|
|
}
|
|
_getTranspValue() {
|
|
const e = this._study.properties().styles[this._plotName];
|
|
let t = 0;
|
|
return e.transparency && (t = e.transparency.value(), t = Object(P.isNumber)(t) ?
|
|
t : 40), t
|
|
}
|
|
_updateImpl() {
|
|
this._items = [], Object(s.assert)(this._scalesReady(), "Scales must be ready!");
|
|
const e = this._model.timeScale().visibleBarsStrictRange();
|
|
if (null === e) return;
|
|
const t = this._getTranspValue();
|
|
let i = Object(s.ensureDefined)(this._series.nearestIndex(e.firstBar(), c
|
|
.PlotRowSearchMode.NearestRight)),
|
|
r = Object(s.ensureDefined)(this._series.nearestIndex(e.lastBar(), c
|
|
.PlotRowSearchMode.NearestLeft));
|
|
const n = this._study.offset(this._plotName);
|
|
n > 0 ? (i -= n, r += n) : (i += n, r -= n);
|
|
const o = this._study.getMinFirstBarIndexForPlot(this._plotName);
|
|
if (o > r) return;
|
|
i = Math.max(o, i);
|
|
const a = this._study.data().rangeIterator(i, r);
|
|
for (; a.hasNext();) {
|
|
const e = a.next();
|
|
let i = e.index;
|
|
const r = e.value;
|
|
i += n;
|
|
const o = new I.Point(Math.floor(i) - .5, NaN);
|
|
let l = Object(P.isNumber)(t) ? t : 50;
|
|
l = Math.min(l, 100), l = Math.max(l, 0);
|
|
const c = this._colorProvider.getPlotPointStyle(r);
|
|
void 0 !== c.colors[A.ColorerType.Background] && (o.color = Object(M
|
|
.generateColor)(Object(s.ensureDefined)(c.colors[A.ColorerType
|
|
.Background]), l)), o.index = i, this._items.push(o)
|
|
}
|
|
this._model.timeScale().timedValuesToCoordinates(this._items)
|
|
}
|
|
}
|
|
var D = i("CLNU"),
|
|
V = i("vq8G"),
|
|
B = i("Nu4p"),
|
|
R = i("Hr11"),
|
|
N = i("VdBB"),
|
|
j = i("o2pV"),
|
|
F = i("XPit"),
|
|
W = i("f6yo");
|
|
|
|
function H(e, t, i) {
|
|
const s = e.get(t);
|
|
return void 0 !== s ? s : (e.set(t, i), i)
|
|
}
|
|
|
|
function U(e, t, i, s) {
|
|
const r = H(e, t, new Map);
|
|
return H(r, i, s)
|
|
}
|
|
class z {
|
|
constructor() {
|
|
this._map = new Map, this._size = 0
|
|
}
|
|
size() {
|
|
return this._size
|
|
}
|
|
clear() {
|
|
this._map.clear(), this._size = 0
|
|
}
|
|
}
|
|
var G, q, Y = i("XlJ7"),
|
|
K = i("c44N"),
|
|
J = i("ikwP");
|
|
! function(e) {
|
|
e.Left = "left", e.Right = "right", e.Center = "center"
|
|
}(G || (G = {})),
|
|
function(e) {
|
|
e.Top = "top", e.Bottom = "bottom", e.Middle = "middle"
|
|
}(q || (q = {}));
|
|
class Z {
|
|
constructor(e, t, i, r, n, o = "center") {
|
|
this._cacheRenderParams = null, this._canvasesMap = {}, this._lines = e.split(
|
|
/[^\S\r\n]*(?:\r\n|\r|\n)/), this._font = function(e, t, i, s) {
|
|
return Object(Y.makeFont)(s, i, `${e ? "bold " : ""}${t ? "italic " : ""}`)
|
|
}(t, i, r, n), this._fontSize = n, this._verticalPadding = ~~(n / 6), this
|
|
._textAlign = o;
|
|
const a = Object(J.createDisconnectedCanvas)(document, new J.Size(0, 0), 1),
|
|
l = Object(s.ensureNotNull)(a.getContext("2d"));
|
|
l.font = this._font;
|
|
let c = 0;
|
|
for (const e of this._lines) {
|
|
const t = l.measureText(e).width;
|
|
c = Math.max(c, t)
|
|
}
|
|
this.textImageWidth = c + 1, this.textImageHeight = this._lines.length * n + this
|
|
._verticalPadding
|
|
}
|
|
paintTo(e, t, i, s, r, n, o) {
|
|
const a = this._getTextImage(i, t);
|
|
if (0 === a.width || 0 === a.height) return;
|
|
const l = function(e, t, i) {
|
|
let s = e;
|
|
switch (t) {
|
|
case "left":
|
|
break;
|
|
case "right":
|
|
s -= i;
|
|
break;
|
|
case "center":
|
|
s -= i / 2
|
|
}
|
|
return Math.round(s)
|
|
}(s, n, this.textImageWidth),
|
|
c = function(e, t, i) {
|
|
let s = e;
|
|
switch (t) {
|
|
case "top":
|
|
break;
|
|
case "bottom":
|
|
s -= i;
|
|
break;
|
|
case "middle":
|
|
s -= i / 2
|
|
}
|
|
return Math.round(s)
|
|
}(r, o, this.textImageHeight);
|
|
Object(J.drawScaled)(e, t.pixelRatio, () => {
|
|
e.drawImage(a, l, c, this.textImageWidth, this.textImageHeight)
|
|
})
|
|
}
|
|
_getTextImage(e, t) {
|
|
if (null !== this._cacheRenderParams && Object(K.areEqualPaneRenderParams)(this
|
|
._cacheRenderParams, t) || (this._canvasesMap = {}, this
|
|
._cacheRenderParams = t), this._canvasesMap[e]) return this._canvasesMap[
|
|
e]; {
|
|
const t = Object(J.createDisconnectedCanvas)(document, new J.Size(this
|
|
.textImageWidth, this.textImageHeight), this._cacheRenderParams
|
|
.pixelRatio),
|
|
i = Object(s.ensureNotNull)(t.getContext("2d"));
|
|
let r;
|
|
switch (i.textBaseline = "top", i.font = this._font, i.fillStyle = e, this
|
|
._textAlign) {
|
|
case "left":
|
|
r = 0, i.textAlign = "left";
|
|
break;
|
|
case "right":
|
|
r = this.textImageWidth - 1, i.textAlign = "right";
|
|
break;
|
|
default:
|
|
r = this.textImageWidth / 2, i.textAlign = "center"
|
|
}
|
|
let n = this._verticalPadding;
|
|
return Object(J.drawScaled)(i, this._cacheRenderParams.pixelRatio, () => {
|
|
for (const e of this._lines) i.fillText(e, r, n), n += this
|
|
._fontSize
|
|
}), this._canvasesMap[e] = t, t
|
|
}
|
|
}
|
|
}
|
|
class X extends z {
|
|
constructor(e) {
|
|
super(), this._maxSize = e, this._keysQueue = []
|
|
}
|
|
get(e) {
|
|
if (!e.text || !e.fontSize || !e.align) return null;
|
|
const t = e.fontSize,
|
|
i = e.text,
|
|
s = e.align,
|
|
r = U(this._map, t, s, new Map);
|
|
let n = r.get(i);
|
|
return void 0 !== n || (this._size >= this._maxSize ? this._deleteFirstKey() : ++
|
|
this._size, this._keysQueue.push([t, i, s]), n = new Z(e.text, e.bold, e
|
|
.italic, e.font, e.fontSize, e.align), r.set(i, n)), n
|
|
}
|
|
_deleteFirstKey() {
|
|
const e = this._keysQueue.shift(),
|
|
t = e[0],
|
|
i = e[1],
|
|
s = this._map.get(t);
|
|
s.delete(i), 0 === s.size && this._map.delete(t)
|
|
}
|
|
}
|
|
var $ = i("zDbI");
|
|
class Q {
|
|
constructor(e, t = {
|
|
skipRenderingOptimizations: !1
|
|
}) {
|
|
this._height = void 0 !== e.height ? e.height : e.width, this._width = void 0 !== e
|
|
.width ? e.width : e.height, this._items = [], this._barSpacing = 0, this
|
|
._textCache = t.textCache || new X(5e3), this._drawOperation = t
|
|
.skipRenderingOptimizations ? this._drawWithoutOptimizations.bind(this) : this
|
|
._drawWithOptimizations.bind(this), this._color = e.color, this._borderColor = e
|
|
.borderColor, this._vertOffset = e.vertOffset || 0, e.text && (this._text = e
|
|
.text, this._fontSize = e.fontSize, this._textColor = e.textColor, this
|
|
._textAlign = e.textAlign || "center"), void 0 !== e.items && void 0 !== e
|
|
.barSpacing && this.setData(e.items, e.barSpacing)
|
|
}
|
|
draw(e, t) {
|
|
this._preDrawInit(), this._drawOperation(e, t)
|
|
}
|
|
hitTest(e) {
|
|
const t = N.HitTestResult.REGULAR;
|
|
let i = null;
|
|
for (const s of this._items) {
|
|
if (!s) continue;
|
|
const r = this._calcBoundingBox(s);
|
|
if (r && Object(W.pointInBox)(e, r)) {
|
|
const e = {
|
|
tooltip: this._getTooltip(s, r)
|
|
};
|
|
i = new N.HitTestResult(t, e)
|
|
}
|
|
}
|
|
return i
|
|
}
|
|
setData(e, t) {
|
|
this._setBaseData(e, t)
|
|
}
|
|
_calcBoundingBox(e) {
|
|
const t = e.vertOffset,
|
|
i = this._getTextCache(e);
|
|
if (!i) return;
|
|
const s = i.textImageWidth,
|
|
r = i.textImageHeight,
|
|
n = s / 2,
|
|
o = e.y + t + e.textVertOffset,
|
|
a = t > 0 ? 0 : -r,
|
|
l = t > 0 ? r : 0,
|
|
c = new I.Point(e.x - n, o + a),
|
|
h = new I.Point(e.x + n, o + l);
|
|
return Object(I.box)(c, h)
|
|
}
|
|
_unionBox(e, t) {
|
|
const i = Math.min(e.min.x, t.min.x),
|
|
s = Math.max(e.max.x, t.max.x),
|
|
r = Math.min(e.min.y, t.min.y),
|
|
n = Math.max(e.max.y, t.max.y),
|
|
o = new I.Point(i, r),
|
|
a = new I.Point(s, n);
|
|
return Object(I.box)(o, a)
|
|
}
|
|
_getTooltip(e, t) {
|
|
if (e.tooltip) return {
|
|
content: {
|
|
type: "text",
|
|
data: e.tooltip
|
|
},
|
|
tooltipDelay: 200,
|
|
extendMargin: !0,
|
|
rect: {
|
|
x: t.min.x,
|
|
y: t.min.y,
|
|
w: Math.abs(t.max.x - t.min.x),
|
|
h: Math.abs(t.max.y - t.min.y)
|
|
}
|
|
}
|
|
}
|
|
_setBaseData(e, t) {
|
|
this._items.length = 0, this._barSpacing = t;
|
|
for (const t of e) {
|
|
const e = void 0 === t.width ? Object(s.ensureDefined)(this._width) : t.width,
|
|
i = void 0 === t.height ? Object(s.ensureDefined)(this._height) : t.height,
|
|
r = void 0 === t.vertOffset ? this._vertOffset : t.vertOffset,
|
|
n = r > 0 ? i : -i;
|
|
this._items.push({
|
|
width: e,
|
|
height: i,
|
|
vertOffset: r,
|
|
textVertOffset: n,
|
|
shapeWidth: 0,
|
|
shapeHeight: 0,
|
|
stepX: 0,
|
|
stepY: 0,
|
|
...t
|
|
})
|
|
}
|
|
}
|
|
_drawItemText(e, t, i) {
|
|
const s = this._getTextCache(i);
|
|
if (null === s) return;
|
|
const r = i.x,
|
|
n = i.vertOffset,
|
|
o = i.y + n + i.textVertOffset;
|
|
let a;
|
|
a = i.style && void 0 !== i.style.textColor ? i.style.textColor : this._textColor, s
|
|
.paintTo(e, t, a, r, o, G.Center, n > 0 ? q.Top : q.Bottom)
|
|
}
|
|
_drawWithOptimizations(e, t) {
|
|
let i, s, r = null,
|
|
n = !1;
|
|
for (const o of this._items) o.style && void 0 !== o.style.color ? (i = o.style
|
|
.color || "rgba(0, 0, 0, 0)", s = o.style.borderColor || "rgba(0, 0, 0, 0)"
|
|
) : (i = this._color, s = this._borderColor), r !== i && (r = i, n && this
|
|
._endPath(e), this._startPath(e, t, i, s)), this._drawItemShape(e, t, o),
|
|
n = !0;
|
|
n && this._endPath(e);
|
|
for (const i of this._items) this._drawItemText(e, t, i)
|
|
}
|
|
_drawWithoutOptimizations(e, t) {
|
|
let i, r;
|
|
for (const n of this._items) {
|
|
const o = Object(s.ensureDefined)(n.style);
|
|
i = o.color || "rgba(0, 0, 0, 0)", r = o.borderColor || "rgba(0, 0, 0, 0)", this
|
|
._startPath(e, t, i, r), this._drawItemShape(e, t, n), this._endPath(e),
|
|
this._drawItemText(e, t, n)
|
|
}
|
|
}
|
|
_drawItemShape(e, t, i) {
|
|
Object(J.drawScaled)(e, t.pixelRatio, () => this._drawItemShapeUsingCSSPixels(e, i))
|
|
}
|
|
_drawItemShapeUsingCSSPixels(e, t) {}
|
|
_preDrawInit() {}
|
|
_startPath(e, t, i, s) {}
|
|
_endPath(e) {}
|
|
_getTextCache(e) {
|
|
const t = e.text || this._text,
|
|
i = e.fontSize || this._fontSize,
|
|
s = e.textAlign || this._textAlign;
|
|
return this._textCache.get({
|
|
text: t,
|
|
bold: !1,
|
|
italic: !1,
|
|
font: $.CHART_FONT_FAMILY,
|
|
fontSize: i,
|
|
align: s
|
|
})
|
|
}
|
|
}
|
|
class ee extends Q {
|
|
_startPath(e, t, i, s) {
|
|
e.beginPath(), e.lineWidth = this._lineWidth(t), e.lineCap = "butt", e.strokeStyle =
|
|
i
|
|
}
|
|
_endPath(e) {
|
|
e.stroke()
|
|
}
|
|
_lineWidth(e) {
|
|
return Math.max(1, Math.floor(2 * e.pixelRatio))
|
|
}
|
|
}
|
|
class te extends Q {
|
|
_startPath(e, t, i, s) {
|
|
e.beginPath(), e.lineWidth = this._lineWidth(t), e.lineCap = "butt", e.fillStyle =
|
|
i, e.strokeStyle = s
|
|
}
|
|
_endPath(e) {
|
|
e.fill(), e.stroke()
|
|
}
|
|
_lineWidth(e) {
|
|
return Math.max(1, Math.floor(e.pixelRatio))
|
|
}
|
|
}
|
|
class ie extends te {
|
|
constructor() {
|
|
super(...arguments), this._sign = 0, this._thinArrow = !1,
|
|
this._thinArrowLineWidth = 0, this._headHeight = 0, this._arrowWidth = 0
|
|
}
|
|
setData(e, t) {
|
|
this._setBaseData(e, t)
|
|
}
|
|
_drawItemShape(e, t, i) {
|
|
const s = t.pixelRatio,
|
|
r = this._lineWidth(t) % 2 ? .5 : 0,
|
|
n = this._sign,
|
|
o = this._arrowWidth,
|
|
a = this._headHeight,
|
|
l = Math.abs(i.height),
|
|
c = Math.round(i.x * s) + r,
|
|
h = i.vertOffset,
|
|
u = Math.round((i.y + h + n * l / 2) * s) + r,
|
|
d = Object(R.ceiledEven)(o * s),
|
|
p = d / 2,
|
|
_ = Math.round(l * s),
|
|
m = Math.round(a * s);
|
|
e.translate(c, u), this._thinArrow ? (e.moveTo(0, 0), e.lineTo(-p, -p * n), e
|
|
.moveTo(0, 0), e.lineTo(p, -p * n), e.moveTo(0, 0), e.lineTo(0, -_ * n), e
|
|
.moveTo(-p, -_ * n), e.lineTo(p, -_ * n)) : (e.moveTo(0, 0), _ < m ? (e
|
|
.lineTo(d, -_ * n), e.lineTo(-d, -_ * n)) : (e.lineTo(d, -m * n), e
|
|
.lineTo(p, -m * n), e.lineTo(p, -_ * n), e.lineTo(-p, -_ * n), e.lineTo(
|
|
-p, -m * n), e.lineTo(-d, -m * n)), e.lineTo(0, 0)), e.translate(-c, -u)
|
|
}
|
|
_preDrawInit() {
|
|
const e = this._calculateWidth();
|
|
this._arrowWidth = e, this._sign = this._isUp() ? -1 : 1, this._thinArrow = e < 4,
|
|
this._thinArrowLineWidth = Math.max(e / 2, 1), this._headHeight = Math.round(e)
|
|
}
|
|
_startPath(e, t, i, s) {
|
|
e.beginPath(), e.fillStyle = i, e.strokeStyle = s, e.lineWidth = this._lineWidth(t)
|
|
}
|
|
_lineWidth(e) {
|
|
return this._thinArrow ? this._thinArrowLineWidth : super._lineWidth(e)
|
|
}
|
|
_calcBoundingBox(e) {
|
|
const t = e.vertOffset,
|
|
i = this._sign,
|
|
s = this._arrowWidth,
|
|
r = this._headHeight,
|
|
n = Math.abs(e.height),
|
|
o = e.x - s,
|
|
a = o + 2 * s,
|
|
l = e.y + t + i * Math.round(n / 2),
|
|
c = l + (-n - r) * i,
|
|
h = new I.Point(o, l),
|
|
u = new I.Point(a, c);
|
|
let d = Object(I.box)(h, u);
|
|
const p = super._calcBoundingBox(e);
|
|
return p && (d = this._unionBox(d, p)), d
|
|
}
|
|
_calculateWidth() {
|
|
return Math.round(this._barSpacing / 4)
|
|
}
|
|
}
|
|
const se = 2 * Math.PI;
|
|
class re extends te {
|
|
setData(e, t) {
|
|
this._setBaseData(e, t);
|
|
for (const e of this._items) {
|
|
const t = e.height;
|
|
e.stepX = Math.round(t / 2 * .65) + .5, e.stepY = e.stepX;
|
|
const i = e.stepX / 2,
|
|
s = this._getTextCache(e);
|
|
if (null === s) {
|
|
e.shapeWidth = 2 * e.stepX, e.shapeHeight = 2.5 * e.stepY, e.vertOffset =
|
|
this._calcVertOffset(e);
|
|
continue
|
|
}
|
|
const r = s.textImageWidth,
|
|
n = s.textImageHeight;
|
|
e.shapeWidth = r + 2 * e.stepX, e.shapeHeight = n + 2 * i + e.stepY, e
|
|
.vertOffset = this._calcVertOffset(e), e.textHorizOffset = this
|
|
._getHorizontalTextOffset(e), e.textVertOffset = this
|
|
._getVerticalTextOffset(e)
|
|
}
|
|
}
|
|
_calcVertOffset(e) {
|
|
return e.vertOffset
|
|
}
|
|
_drawCorner(e, t, i, s, r) {
|
|
const n = Math.max(1, Math.floor(2 * r));
|
|
e.lineTo(t - n * s.prevPointSignX, i - n * s.prevPointSignY), e.arcTo(t, i, t + n *
|
|
s.nextPointSignX, i + n * s.nextPointSignY, n)
|
|
}
|
|
_getArrowSize(e) {
|
|
return e.stepX
|
|
}
|
|
_getHorizontalTextOffset(e) {
|
|
return 0
|
|
}
|
|
_getVerticalTextOffset(e) {
|
|
return 0
|
|
}
|
|
_hasText(e) {
|
|
return Boolean(e.text) || Boolean(this._text)
|
|
}
|
|
_drawItemText(e, t, i) {
|
|
var r;
|
|
const n = this._getTextCache(i);
|
|
if (null === n) return;
|
|
const o = i.textHorizOffset || 0,
|
|
a = i.x + o,
|
|
l = i.vertOffset,
|
|
c = i.y + l + i.textVertOffset,
|
|
h = (null === (r = i.style) || void 0 === r ? void 0 : r.textColor) || this
|
|
._textColor;
|
|
n.paintTo(e, t, Object(s.ensureDefined)(h), a, c, G.Center, q.Middle)
|
|
}
|
|
}
|
|
class ne {
|
|
constructor(e, t, i, s) {
|
|
this.prevPointSignX = e, this.prevPointSignY = t, this.nextPointSignX = i, this
|
|
.nextPointSignY = s
|
|
}
|
|
}
|
|
var oe;
|
|
! function(e) {
|
|
e.rightUp = new ne(1, 0, 0, 1), e.rightDown = new ne(0, 1, -1, 0), e.leftDown = new ne(-1,
|
|
0, 0, -1), e.leftUp = new ne(0, -1, 1, 0)
|
|
}(oe || (oe = {}));
|
|
class ae extends te {
|
|
_calcBoundingBox(e) {
|
|
const t = e.width,
|
|
i = e.height,
|
|
s = t / 2,
|
|
r = Math.round(i / 3),
|
|
n = e.x,
|
|
o = e.vertOffset - 2 * r,
|
|
a = e.y + o,
|
|
l = n - s,
|
|
c = n + s,
|
|
h = a,
|
|
u = a + i,
|
|
d = new I.Point(l, h),
|
|
p = new I.Point(c, u);
|
|
let _ = Object(I.box)(d, p);
|
|
const m = super._calcBoundingBox(e);
|
|
return m && (_ = this._unionBox(_, m)), _
|
|
}
|
|
}
|
|
const le = new Map;
|
|
le.set("PaneRendererArrowUp", class extends ie {
|
|
_isUp() {
|
|
return !0
|
|
}
|
|
}), le.set("PaneRendererArrowDown", class extends ie {
|
|
_isUp() {
|
|
return !1
|
|
}
|
|
}), le.set("PaneRendererCircleShape", class extends te {
|
|
_drawItemShapeUsingCSSPixels(e, t) {
|
|
const i = Math.max(t.width, t.height) / 2,
|
|
s = t.x,
|
|
r = t.vertOffset,
|
|
n = t.y + r;
|
|
e.moveTo(s + i, n), e.arc(s, n, i, 0, se, !1)
|
|
}
|
|
_calcBoundingBox(e) {
|
|
const t = Math.max(e.width, e.height) / 2,
|
|
i = e.x,
|
|
s = e.vertOffset,
|
|
r = e.y + s,
|
|
n = i - t,
|
|
o = i + t,
|
|
a = r - t,
|
|
l = r + t,
|
|
c = new I.Point(n, a),
|
|
h = new I.Point(o, l);
|
|
let u = Object(I.box)(c, h);
|
|
const d = super._calcBoundingBox(e);
|
|
return d && (u = this._unionBox(u, d)), u
|
|
}
|
|
}), le.set("PaneRendererCrossShape", class extends ee {
|
|
_drawItemShape(e, t, i) {
|
|
const s = i.width,
|
|
r = i.height,
|
|
n = i.x - s / 2,
|
|
o = i.vertOffset,
|
|
a = i.y - r / 2 + o,
|
|
l = t.pixelRatio,
|
|
c = this._lineWidth(t),
|
|
h = c % 2 ? .5 : 0,
|
|
u = Math.round(n * l);
|
|
let d = Math.round((n + s) * l);
|
|
(d - u) % 2 != c % 2 && (d += 1);
|
|
const p = Math.floor((u + d) / 2) + h,
|
|
_ = Math.round(a * l);
|
|
let m = Math.round((a + r) * l);
|
|
(m - _) % 2 != c % 2 && (m += 1);
|
|
const f = Math.floor((_ + m) / 2) + h;
|
|
e.moveTo(p, _), e.lineTo(p, m), e.moveTo(u, f), e.lineTo(d, f)
|
|
}
|
|
_calcBoundingBox(e) {
|
|
const t = e.width,
|
|
i = e.height,
|
|
s = e.x - t / 2,
|
|
r = e.vertOffset,
|
|
n = e.y - i / 2 + r,
|
|
o = s,
|
|
a = s + t,
|
|
l = n,
|
|
c = n + i,
|
|
h = new I.Point(o, l),
|
|
u = new I.Point(a, c);
|
|
let d = Object(I.box)(h, u);
|
|
const p = super._calcBoundingBox(e);
|
|
return p && (d = this._unionBox(d, p)), d
|
|
}
|
|
}), le.set("PaneRendererDiamond", class extends te {
|
|
_drawItemShapeUsingCSSPixels(e, t) {
|
|
const i = Math.round(t.height / 2),
|
|
s = t.x,
|
|
r = t.vertOffset,
|
|
n = t.y + r;
|
|
e.moveTo(s, n - i), e.lineTo(s + i, n), e.lineTo(s, n + i), e.lineTo(s - i,
|
|
n), e.lineTo(s, n - i)
|
|
}
|
|
_calcBoundingBox(e) {
|
|
const t = Math.round(e.height / 2),
|
|
i = e.x,
|
|
s = e.vertOffset,
|
|
r = e.y + s,
|
|
n = i - t,
|
|
o = i + t,
|
|
a = r - t,
|
|
l = r + t,
|
|
c = new I.Point(n, a),
|
|
h = new I.Point(o, l);
|
|
let u = Object(I.box)(c, h);
|
|
const d = super._calcBoundingBox(e);
|
|
return d && (u = this._unionBox(u, d)), u
|
|
}
|
|
}), le.set("PaneRendererFlagShape", class extends te {
|
|
_drawItemShapeUsingCSSPixels(e, t) {
|
|
const i = t.width,
|
|
s = t.height,
|
|
r = s / 2,
|
|
n = (i - 3) / 3,
|
|
o = t.x - i / 2,
|
|
a = t.vertOffset,
|
|
l = t.y - r + a;
|
|
e.moveTo(o, l), e.lineTo(o + 3, l), e.bezierCurveTo(o + n, l - n, o + 2 * n,
|
|
l + n, o + i, l), e.lineTo(o + i, l + r), e.bezierCurveTo(o + i - n,
|
|
l + r + n, o + i - 2 * n, l + r - n, o + 3, l + r), e.lineTo(o + 3,
|
|
l + s), e.lineTo(o, l + s), e.lineTo(o, l)
|
|
}
|
|
_calcBoundingBox(e) {
|
|
const t = e.width,
|
|
i = e.height,
|
|
s = i / 2,
|
|
r = e.x - t / 2,
|
|
n = e.vertOffset,
|
|
o = e.y - s + n,
|
|
a = r,
|
|
l = r + t,
|
|
c = o,
|
|
h = o + i,
|
|
u = new I.Point(a, c),
|
|
d = new I.Point(l, h);
|
|
let p = Object(I.box)(u, d);
|
|
const _ = super._calcBoundingBox(e);
|
|
return _ && (p = this._unionBox(p, _)), p
|
|
}
|
|
}), le.set("PaneRendererLabelUp", class extends re {
|
|
_calcBoundingBox(e) {
|
|
const t = e.x - e.shapeWidth / 2,
|
|
i = e.x + e.shapeWidth / 2,
|
|
s = e.y + e.vertOffset,
|
|
r = e.y + e.shapeHeight + e.vertOffset,
|
|
n = new I.Point(t, s),
|
|
o = new I.Point(i, r);
|
|
return Object(I.box)(n, o)
|
|
}
|
|
_drawItemShape(e, t, i) {
|
|
const s = t.pixelRatio,
|
|
r = this._lineWidth(t) % 2 ? .5 : 0,
|
|
n = Math.max(1, Math.floor(s)) % 2 ? .5 : 0,
|
|
o = this._getArrowSize(i);
|
|
let a = Math.round(o * s);
|
|
(n + a) % 1 != r % 1 && (a += .5);
|
|
let l = Math.round(i.shapeWidth / 2 * s);
|
|
(n + l) % 1 != r % 1 && (l += .5);
|
|
const c = Math.round(i.x * s) + n,
|
|
h = Math.round((i.y + i.vertOffset) * s) + r,
|
|
u = c - a,
|
|
d = Math.round((i.y + i.vertOffset + o) * s) + r,
|
|
p = c + a,
|
|
_ = c + l,
|
|
m = Math.round((i.y + i.vertOffset + i.shapeHeight) * s) + r,
|
|
f = c - l;
|
|
e.moveTo(u, d), e.lineTo(c, h), e.lineTo(p, d), i.shapeWidth <= 2 * o ? (e
|
|
.lineTo(_, d), this._drawCorner(e, _, m, oe.rightDown, s), this
|
|
._drawCorner(e, f, m, oe.leftDown, s), e.lineTo(f, d)) : (this
|
|
._drawCorner(e, _, d, oe.rightUp, s), this._drawCorner(e, _, m, oe
|
|
.rightDown, s), this._drawCorner(e, f, m, oe.leftDown, s), this
|
|
._drawCorner(e, f, d, oe.leftUp, s)), e.lineTo(u, d)
|
|
}
|
|
_getVerticalTextOffset(e) {
|
|
return e.shapeHeight / 2 + this._getArrowSize(e) / 2
|
|
}
|
|
_calcVertOffset(e) {
|
|
return Math.sign(e.vertOffset) >= 0 ? e.vertOffset : e.vertOffset - e
|
|
.shapeHeight
|
|
}
|
|
}), le.set("PaneRendererLabelDown", class extends re {
|
|
_calcBoundingBox(e) {
|
|
const t = e.x - e.shapeWidth / 2,
|
|
i = e.x + e.shapeWidth / 2,
|
|
s = e.y - e.shapeHeight + e.vertOffset,
|
|
r = e.y + e.vertOffset,
|
|
n = new I.Point(t, s),
|
|
o = new I.Point(i, r);
|
|
return Object(I.box)(n, o)
|
|
}
|
|
_drawItemShape(e, t, i) {
|
|
const s = t.pixelRatio,
|
|
r = this._lineWidth(t) % 2 ? .5 : 0,
|
|
n = Math.max(1, Math.floor(s)) % 2 ? .5 : 0,
|
|
o = this._getArrowSize(i);
|
|
let a = Math.round(o * s);
|
|
(n + a) % 1 != r % 1 && (a += .5);
|
|
let l = Math.round(i.shapeWidth / 2 * s);
|
|
(n + l) % 1 != r % 1 && (l += .5);
|
|
const c = Math.round(i.x * s) + n,
|
|
h = Math.round((i.y + i.vertOffset) * s) + r,
|
|
u = c + a,
|
|
d = Math.round((i.y + i.vertOffset - o) * s) + r,
|
|
p = c - a,
|
|
_ = c + l,
|
|
m = Math.round((i.y + i.vertOffset - i.shapeHeight) * s) + r,
|
|
f = c - l;
|
|
e.moveTo(u, d), e.lineTo(c, h), e.lineTo(p, d), i.shapeWidth <= 2 * o ? (e
|
|
.lineTo(f, d), this._drawCorner(e, f, m, oe.leftUp, s), this
|
|
._drawCorner(e, _, m, oe.rightUp, s), e.lineTo(_, d)) : (this
|
|
._drawCorner(e, f, d, oe.leftDown, s), this._drawCorner(e, f, m, oe
|
|
.leftUp, s), this._drawCorner(e, _, m, oe.rightUp, s), this
|
|
._drawCorner(e, _, d, oe.rightDown, s)), e.lineTo(u, d)
|
|
}
|
|
_getVerticalTextOffset(e) {
|
|
return -e.shapeHeight / 2 - this._getArrowSize(e) / 2
|
|
}
|
|
_calcVertOffset(e) {
|
|
return Math.sign(e.vertOffset) <= 0 ? e.vertOffset : e.vertOffset + e
|
|
.shapeHeight
|
|
}
|
|
}), le.set("PaneRendererSquare", class extends te {
|
|
_drawItemShape(e, t, i) {
|
|
const s = t.pixelRatio,
|
|
r = Math.max(1, Math.floor(s)) % 2 ? .5 : 0,
|
|
n = this._lineWidth(t) % 2 ? .5 : 0;
|
|
let o = Math.round(i.height / 2 * s);
|
|
(r + o) % 1 != n % 1 && (o += .5);
|
|
const a = Math.round(i.x * s) + r,
|
|
l = Math.round((i.y + i.vertOffset) * s) + r,
|
|
c = a - o,
|
|
h = l - o,
|
|
u = a + o,
|
|
d = l + o;
|
|
e.rect(c, h, u - c, d - h)
|
|
}
|
|
_calcBoundingBox(e) {
|
|
const t = e.height,
|
|
i = Math.round(t / 2),
|
|
s = e.x - i,
|
|
r = e.vertOffset,
|
|
n = e.y + r - i,
|
|
o = s,
|
|
a = s + t,
|
|
l = n,
|
|
c = n + t,
|
|
h = new I.Point(o, l),
|
|
u = new I.Point(a, c);
|
|
let d = Object(I.box)(h, u);
|
|
const p = super._calcBoundingBox(e);
|
|
return p && (d = this._unionBox(d, p)), d
|
|
}
|
|
}), le.set("PaneRendererTriangleApexUp", class extends ae {
|
|
_drawItemShape(e, t, i) {
|
|
const s = i.width,
|
|
r = i.height,
|
|
n = Math.round(r / 3),
|
|
o = i.vertOffset - 2 * n,
|
|
a = t.pixelRatio,
|
|
l = this._lineWidth(t) % 2 ? .5 : 0,
|
|
c = Math.max(1, Math.floor(a)),
|
|
h = c % 2 ? .5 : 0;
|
|
let u = Math.round(s * a);
|
|
u % 2 != c % 2 && (u += 1);
|
|
const d = Math.round(i.x * a) + h,
|
|
p = Math.round((i.y + o) * a),
|
|
_ = d + u / 2,
|
|
m = Math.round((i.y + o + r) * a) + l,
|
|
f = d - u / 2;
|
|
e.moveTo(d, p), e.lineTo(_, m), e.lineTo(f, m), e.lineTo(d, p)
|
|
}
|
|
}), le.set("PaneRendererTriangleApexDown", class extends ae {
|
|
_drawItemShape(e, t, i) {
|
|
const s = i.width,
|
|
r = i.height,
|
|
n = Math.round(r / 3),
|
|
o = i.vertOffset - n,
|
|
a = t.pixelRatio,
|
|
l = this._lineWidth(t) % 2 ? .5 : 0,
|
|
c = Math.max(1, Math.floor(a)),
|
|
h = c % 2 ? .5 : 0;
|
|
let u = Math.round(s * a);
|
|
u % 2 != c % 2 && (u += 1);
|
|
const d = Math.round(i.x * a) + h,
|
|
p = Math.round((i.y + o) * a) + l,
|
|
_ = d + u / 2,
|
|
m = Math.round((i.y + o + r) * a),
|
|
f = d - u / 2;
|
|
e.moveTo(f, p), e.lineTo(_, p), e.lineTo(d, m), e.lineTo(f, p)
|
|
}
|
|
}), le.set("PaneRendererXCross", class extends ee {
|
|
_drawItemShapeUsingCSSPixels(e, t) {
|
|
const i = t.width,
|
|
s = t.height,
|
|
r = t.x - i / 2,
|
|
n = t.vertOffset,
|
|
o = t.y - s / 2 + n;
|
|
e.moveTo(r, o), e.lineTo(r + i, o + s), e.moveTo(r, o + s), e.lineTo(r + i,
|
|
o)
|
|
}
|
|
_calcBoundingBox(e) {
|
|
const t = e.width,
|
|
i = e.height,
|
|
s = e.x - t / 2,
|
|
r = e.vertOffset,
|
|
n = e.y - i / 2 + r,
|
|
o = s,
|
|
a = s + t,
|
|
l = n,
|
|
c = n + i,
|
|
h = new I.Point(o, l),
|
|
u = new I.Point(a, c);
|
|
let d = Object(I.box)(h, u);
|
|
const p = super._calcBoundingBox(e);
|
|
return p && (d = this._unionBox(d, p)), d
|
|
}
|
|
});
|
|
class ce {
|
|
constructor(e, t, i, s) {
|
|
this._items = [], this._invalidated = !1, this._renderer = null, this
|
|
._isMarkersEnabled = T.enabled("source_selection_markers"), this
|
|
._selectionData = null, this._plotIndex = null, this._topCoord = 0, this
|
|
._bottomCoord = 0, this._study = e, this._series = t, this._model = i, this
|
|
._plotName = s;
|
|
const r = e.metaInfo().plots;
|
|
for (let e = 0; e < r.length; e++)
|
|
if (r[e].id === this._plotName) {
|
|
this._plotIndex = e;
|
|
break
|
|
} this._colorProvider = Object(E.createStudyPlotColorProvider)(e.metaInfo(), e
|
|
.properties(), s), this._selectionIndexer = new j.SelectionIndexes(i
|
|
.timeScale())
|
|
}
|
|
items() {
|
|
return this._items
|
|
}
|
|
update() {
|
|
this._invalidated = !0
|
|
}
|
|
renderer() {
|
|
if (!this._study.properties().styles[this._plotName].visible) return null;
|
|
if (!this._study.properties().styles[this._plotName].visible.value()) return null;
|
|
if (!this._scalesReady()) return null;
|
|
if (this._invalidated) {
|
|
const e = this._study.properties().styles[this._plotName];
|
|
this._updateRenderer(e), this._invalidated = !1
|
|
}
|
|
return this._renderer
|
|
}
|
|
_scalesReady() {
|
|
const e = this._model.timeScale(),
|
|
t = this._study.priceScale();
|
|
return e && null !== t && !e.isEmpty() && !t.isEmpty()
|
|
}
|
|
_updateImpl() {
|
|
if (this._items = [], !this._scalesReady()) return;
|
|
const e = this._model.timeScale(),
|
|
t = this._study.priceScale(),
|
|
i = e.visibleBarsStrictRange();
|
|
if (null === i || null === t) return;
|
|
let r = this._series.nearestIndex(i.firstBar(), c.PlotRowSearchMode.NearestRight),
|
|
n = this._series.nearestIndex(i.lastBar(), c.PlotRowSearchMode.NearestLeft);
|
|
if (void 0 === r || void 0 === n) return;
|
|
const o = this._study.offset(this._plotName);
|
|
o > 0 ? (r -= o, n += o) : (r += o, n -= o);
|
|
const a = this._study.getMinFirstBarIndexForPlot(this._plotName);
|
|
if (a > n) return;
|
|
r = Math.max(a, r);
|
|
const l = this._study.data(),
|
|
h = this._study.firstValue();
|
|
if (null === h) return;
|
|
const u = l.rangeIterator(r, n),
|
|
d = this._getTranspValue();
|
|
let p = [];
|
|
const _ = this._model.selection().isSelected(this._study);
|
|
_ ? (p = this._selectionIndexer.indexes(), this._selectionData = {
|
|
points: [],
|
|
hittestResult: N.HitTestResult.REGULAR,
|
|
vertOffset: 0,
|
|
bgColors: [],
|
|
barSpacing: e.barSpacing(),
|
|
visible: !0
|
|
}) : (this._selectionIndexer.clear(), this._selectionData = null);
|
|
const m = this._series.properties().style.value(),
|
|
f = 2 === m ? "lineStyle" : 3 === m ? "areaStyle" : null;
|
|
let g, b;
|
|
f ? (g = this._series.properties()[f].priceSource.value(), b = g) : (g = "high", b =
|
|
"low");
|
|
const v = t.isInverted(),
|
|
S = t.coordinateToPrice(t.height() * t.topMargin(), h),
|
|
y = t.coordinateToPrice(t.height() * (1 - t.bottomMargin()), h);
|
|
this._topCoord = v ? y : S, this._bottomCoord = v ? S : y;
|
|
const w = Object(s.ensureNotNull)(this._model.paneForSource(this._study)).height(),
|
|
P = this._study.properties().styles[this._plotName],
|
|
C = P.color.value(),
|
|
x = P.textColor ? P.textColor.value() : void 0,
|
|
T = C,
|
|
I = C,
|
|
M = void 0 === x ? void 0 : x,
|
|
O = Object(s.ensureNotNull)(this._plotIndex),
|
|
L = Object(A.createEmptyStyle)();
|
|
for (; u.hasNext();) {
|
|
const e = u.next(),
|
|
t = e.index,
|
|
i = e.value,
|
|
s = Math.floor(t + o),
|
|
r = i[O + 1];
|
|
if (null == r) continue;
|
|
const n = this._createItem(s, r, g, b);
|
|
if (null !== n) {
|
|
if (this._colorProvider.isColorDefined()) {
|
|
n.style = {
|
|
color: T,
|
|
borderColor: I,
|
|
textColor: M
|
|
};
|
|
const e = this._colorProvider.getPlotPointStyle(i, L);
|
|
this._fillItemWithPointStyle(n, e, d)
|
|
}
|
|
_ && -1 !== p.indexOf(t) && null !== this._selectionData && (this
|
|
._selectionData.points.push(n), this._selectionData.bgColors.push(
|
|
this._model.backgroundColorAtYPercentFromTop(n.y / w))), this
|
|
._items.push(n)
|
|
}
|
|
}
|
|
this._convertItemsToCoordinates()
|
|
}
|
|
_fillItemWithPointStyle(e, t, i) {
|
|
const r = Object(s.ensureDefined)(e.style);
|
|
if (void 0 !== t.colors[A.ColorerType.Main]) {
|
|
r.color = Object(M.generateColor)(Object(s.ensureDefined)(t.colors[A.ColorerType
|
|
.Main]), i);
|
|
const e = i > 9 ? i - 10 : 0;
|
|
r.borderColor = Object(M.generateColor)(r.color, e)
|
|
}
|
|
void 0 !== t.colors[A.ColorerType.Text] && (r.textColor = Object(M.generateColor)(
|
|
Object(s.ensureDefined)(t.colors[A.ColorerType.Text]), i))
|
|
}
|
|
_updateRenderer(e) {
|
|
this._updateImpl();
|
|
const t = this._model.timeScale(),
|
|
i = {},
|
|
s = this._getTranspValue(),
|
|
r = t.barSpacing(),
|
|
n = this._calculateShapeHeight(r),
|
|
o = this._study.properties().styles[this._plotName].location.value(),
|
|
a = this._calculateVerticalOffset(o, n + n / 2);
|
|
i.barSpacing = r, i.items = this._items, i.color = Object(M.generateColor)(this
|
|
._study.properties().styles[this._plotName].color.value(), s), i.height = n,
|
|
i.vertOffset = a;
|
|
const l = this._study.properties().styles[this._plotName].plottype.value(),
|
|
c = B.a[l],
|
|
h = new O.CompositeRenderer;
|
|
c && h.append(this._createRenderer(c.paneRendererClass, i)), this._model.selection()
|
|
.isSelected(this._study) && this._isMarkersEnabled && null !== this
|
|
._selectionData && (this._selectionData.vertOffset = a, h.append(new V
|
|
.SelectionRenderer(this._selectionData))), this._renderer = h
|
|
}
|
|
_createRenderer(e, t) {
|
|
const i = le.get(e);
|
|
return new(Object(s.ensureDefined)(i))(t)
|
|
}
|
|
_getSeriesVal(e, t) {
|
|
const i = Object(F.barFunction)(e),
|
|
s = this._series.data().valueAt(t);
|
|
return null === s ? null : i(s)
|
|
}
|
|
_getTranspValue() {
|
|
let e = 0;
|
|
this._study.properties().transparency && (e = this._study.properties().transparency
|
|
.value(), e = Object(P.isNumber)(e) ? e : 50);
|
|
const t = this._study.properties().styles[this._plotName];
|
|
return t.transparency && (e = t.transparency.value(), e = Object(P.isNumber)(e) ?
|
|
e : 50), Object(R.clamp)(e, 0, 100)
|
|
}
|
|
_createItem(e, t, i, r) {
|
|
const n = this._study.properties().styles[this._plotName].location.value();
|
|
if ((null === t || 0 === t) && n !== p.c.Absolute) return null;
|
|
let o;
|
|
switch (n) {
|
|
case p.c.AboveBar:
|
|
const a = this._getSeriesVal(i, e);
|
|
if (null === a) return null;
|
|
o = a;
|
|
break;
|
|
case p.c.BelowBar:
|
|
const l = this._getSeriesVal(r, e);
|
|
if (null === l) return null;
|
|
o = l;
|
|
break;
|
|
case p.c.Top:
|
|
o = this._topCoord;
|
|
break;
|
|
case p.c.Bottom:
|
|
o = this._bottomCoord;
|
|
break;
|
|
case p.c.Absolute:
|
|
o = Object(s.ensureNotNull)(t);
|
|
break;
|
|
default:
|
|
throw new Error("Bad value: " + n)
|
|
}
|
|
return new I.Point(e, o)
|
|
}
|
|
_convertItemsToCoordinates() {
|
|
const e = this._model.timeScale(),
|
|
t = this._study.priceScale();
|
|
e.timedValuesToCoordinates(this._items);
|
|
const i = Object(s.ensureNotNull)(this._study.firstValue());
|
|
Object(s.ensureNotNull)(t).pointsArrayToCoordinates(this._items, i)
|
|
}
|
|
_calculateVerticalOffset(e, t) {
|
|
let i = 0;
|
|
switch (e) {
|
|
case p.c.AboveBar:
|
|
case p.c.Bottom:
|
|
i = -t;
|
|
break;
|
|
case p.c.BelowBar:
|
|
case p.c.Top:
|
|
i = t
|
|
}
|
|
return Object(s.ensureNotNull)(this._study.priceScale()).isInverted() && (i *= -1),
|
|
i
|
|
}
|
|
_calculateShapeHeight(e, t) {
|
|
let i = e;
|
|
switch (t) {
|
|
case x.PlotSymbolSize.Tiny:
|
|
i = .3 * e;
|
|
break;
|
|
case x.PlotSymbolSize.Small:
|
|
i = .6 * e;
|
|
break;
|
|
case x.PlotSymbolSize.Normal:
|
|
i = e;
|
|
break;
|
|
case x.PlotSymbolSize.Large:
|
|
i = 1.5 * e;
|
|
break;
|
|
case x.PlotSymbolSize.Huge:
|
|
i = 2 * e
|
|
}
|
|
return i
|
|
}
|
|
}
|
|
class he extends ce {
|
|
renderer() {
|
|
const e = this._study.properties().styles[this._plotName];
|
|
return e.visible && e.visible.value() && this._scalesReady() ? (this._invalidated &&
|
|
(this._updateRenderer(e), this._invalidated = !1), this._renderer) : null
|
|
}
|
|
_updateRenderer(e) {
|
|
this._updateImpl();
|
|
const t = this._model.timeScale(),
|
|
i = {},
|
|
s = this._getTranspValue(),
|
|
r = t.barSpacing();
|
|
let n;
|
|
if (e.size) {
|
|
const t = e.size.value();
|
|
n = this._calculateShapeHeight(25, t)
|
|
} else n = Math.round(r / 2);
|
|
n = Math.max(n, 1);
|
|
const o = e.location.value(),
|
|
a = Object(M.generateColor)(e.color.value(), s),
|
|
l = s > 19 ? s - 10 : 0,
|
|
c = this._calculateVerticalOffset(o, Math.round(1.5 * n));
|
|
i.barSpacing = r, i.items = this.items(), i.color = a, i.borderColor = Object(M
|
|
.generateColor)(e.color.value(), l), i.height = n, i.vertOffset = c;
|
|
const h = e.plottype.value(),
|
|
u = B.a[h],
|
|
d = new O.CompositeRenderer,
|
|
p = e.text ? e.text.value() : void 0;
|
|
if (void 0 !== p && "" !== p.trim()) {
|
|
let t = p.trim().replace(/\\n/gm, "\n");
|
|
t = Object(D.cleanButAmpersand)(t, !0), i.text = t, i.fontSize = 12;
|
|
const r = e.textColor ? e.textColor.value() : void 0;
|
|
i.textColor = r ? Object(M.generateColor)(r, s) : a
|
|
}
|
|
d.append(super._createRenderer(u.paneRendererClass, i)), this._model.selection()
|
|
.isSelected(this._study) && this._isMarkersEnabled && null !== this
|
|
._selectionData && (this._selectionData.vertOffset = c, d.append(new V
|
|
.SelectionRenderer(this._selectionData))), this._renderer = d
|
|
}
|
|
}
|
|
var ue = i("/SnT"),
|
|
de = i.n(ue),
|
|
pe = i("Zp/P");
|
|
class _e extends Q {
|
|
constructor(e, t) {
|
|
super(e, t), this._heightEnsured = Object(s.ensureDefined)(this._height);
|
|
const i = e.char.slice(0, 40);
|
|
this._ch = de()(i)[0] || " ", this._fontFamily = e.fontFamily || $
|
|
.CHART_FONT_FAMILY, this._charCache = new Z(this._ch, !1, !1, this._fontFamily,
|
|
this._heightEnsured)
|
|
}
|
|
hitTest(e) {
|
|
const t = Object(pe.interactionTolerance)().series + this._heightEnsured / 2;
|
|
for (const i of this._items) {
|
|
if (new I.Point(i.x, i.y + i.vertOffset).subtract(e).length() <= t) return new N
|
|
.HitTestResult(N.HitTestResult.REGULAR)
|
|
}
|
|
return null
|
|
}
|
|
_drawItemShape(e, t, i) {
|
|
const s = i.x,
|
|
r = i.vertOffset > 0 ? 1 : -1,
|
|
n = i.y + i.vertOffset - r * Math.round(this._heightEnsured / 2);
|
|
let o;
|
|
o = i.style && void 0 !== i.style.color ? i.style.color : this._color, this
|
|
._charCache.paintTo(e, t, o, s, n, G.Center, i.vertOffset > 0 ? q.Top : q
|
|
.Bottom)
|
|
}
|
|
_startPath(e, t, i, s) {}
|
|
_endPath(e) {}
|
|
}
|
|
class me extends ce {
|
|
renderer() {
|
|
const e = this._study.properties().styles[this._plotName];
|
|
if (!e.visible || !e.visible.value()) return null;
|
|
if (!this._scalesReady()) return null;
|
|
const t = this._model.timeScale();
|
|
this._invalidated && (this._updateImpl(), this._invalidated = !1);
|
|
const i = {},
|
|
s = this._getTranspValue(),
|
|
r = t.barSpacing();
|
|
let n;
|
|
if (e.size) {
|
|
const t = e.size.value();
|
|
n = this._calculateShapeHeight(50, t)
|
|
} else n = Math.round(r);
|
|
const o = e.location.value(),
|
|
a = Object(M.generateColor)(e.color.value(), s),
|
|
l = this._calculateVerticalOffset(o, n);
|
|
i.items = this.items(), i.barSpacing = r, i.char = e.char.value(), i.height = n, i
|
|
.vertOffset = l, i.color = a;
|
|
const c = new O.CompositeRenderer,
|
|
h = e.text ? e.text.value() : void 0;
|
|
if (void 0 !== h && "" !== h.trim()) {
|
|
let t = h.trim().replace(/\\n/gm, "\n");
|
|
t = Object(D.cleanButAmpersand)(t, !0), i.text = t, i.fontSize = 12;
|
|
const r = e.textColor ? e.textColor.value() : void 0;
|
|
i.textColor = r ? Object(M.generateColor)(r, s) : a
|
|
}
|
|
return c.append(new _e(i)), this._model.selection().isSelected(this._study) && this
|
|
._isMarkersEnabled && null !== this._selectionData && (this._selectionData
|
|
.vertOffset = l, c.append(new V.SelectionRenderer(this._selectionData))), c
|
|
}
|
|
}
|
|
var fe = i("eJTA");
|
|
class ge extends I.Point {
|
|
constructor(e, t, i, s) {
|
|
super(e, t), this.height = i, this.isUp = s, this.style = {}
|
|
}
|
|
}
|
|
|
|
function be(e) {
|
|
return Math.round(e / 4)
|
|
}
|
|
|
|
function ve(e) {
|
|
return Math.round(e / 2)
|
|
}
|
|
class Se {
|
|
constructor(e) {
|
|
this._data = e
|
|
}
|
|
draw(e, t) {
|
|
var i;
|
|
const s = t.pixelRatio,
|
|
r = this._data,
|
|
n = ve(r.barSpacing),
|
|
o = be(r.barSpacing),
|
|
a = n < 4,
|
|
l = Math.max(n / 2, 1),
|
|
c = Object(R.ceiledEven)(n * s),
|
|
h = c / 2,
|
|
u = Math.round(n * s);
|
|
e.lineCap = "butt", e.lineWidth = Math.max(1, Math.floor(s));
|
|
const d = e.lineWidth % 2 ? .5 : 0;
|
|
for (const t of r.items) {
|
|
const n = t.isUp ? -1 : 1,
|
|
p = Math.round(Math.abs(t.height) * s),
|
|
_ = Math.round(t.x * s) + d,
|
|
m = Math.round((t.y - n * o) * s) + d;
|
|
e.beginPath(), e.translate(_, m);
|
|
const f = null !== (i = t.style && t.style.color) && void 0 !== i ? i : t.isUp ?
|
|
r.colorup : r.colordown;
|
|
a ? (e.moveTo(0, 0), e.lineTo(-h, -h * n), e.moveTo(0, 0), e.lineTo(h, -h * n),
|
|
e.moveTo(0, 0), e.lineTo(0, -p * n), e.moveTo(-h, -p * n), e.lineTo(h, -
|
|
p * n), e.lineWidth = l, e.strokeStyle = f, e.stroke()) : (e.moveTo(
|
|
0, 0), p < u ? (e.lineTo(c, -p * n), e.lineTo(-c, -p * n)) : (e
|
|
.lineTo(c, -u * n), e.lineTo(h, -u * n), e.lineTo(h, -p * n), e
|
|
.lineTo(-h, -p * n), e.lineTo(-h, -u * n), e.lineTo(-c, -u * n)), e
|
|
.lineTo(0, 0), e.strokeStyle = t.isUp ? r.colorBorderUp : r
|
|
.colorBorderDown, e.stroke(), e.fillStyle = f, e.fill()), e.translate(-
|
|
_, -m)
|
|
}
|
|
}
|
|
hitTest(e) {
|
|
const t = this._data,
|
|
i = ve(t.barSpacing),
|
|
s = Math.round(i / 2),
|
|
r = Math.round(i),
|
|
n = be(t.barSpacing);
|
|
for (const i of t.items) {
|
|
if (!i) continue;
|
|
if (!Number.isFinite(i.x) || !Number.isFinite(i.y)) continue;
|
|
const t = Math.abs(i.height),
|
|
o = i.isUp ? -1 : 1,
|
|
a = t + r,
|
|
l = i.y - o * n,
|
|
c = l - o * a,
|
|
h = i.x - s,
|
|
u = i.x + s;
|
|
if (h < e.x && e.x < u && (i.isUp ? l < e.y && e.y < c : c < e.y && e.y < l))
|
|
return new N.HitTestResult(N.HitTestResult.REGULAR)
|
|
}
|
|
return null
|
|
}
|
|
}
|
|
class ye extends V.SelectionRenderer {
|
|
_drawMarker(e, t, i, r, n) {
|
|
const o = Object(s.ensureNotNull)(this._data),
|
|
a = t.isUp ? 1 : -1;
|
|
const l = i + a * be(o.barSpacing) + a * ve(o.barSpacing);
|
|
let c = Math.round(3.5 * n * 2);
|
|
c % 2 != r % 2 && (c += 1);
|
|
const h = r % 2 / 2,
|
|
u = Math.round(t.x * n) + h,
|
|
d = Math.round((t.y + l) * n) + h;
|
|
e.beginPath(), e.arc(u, d, c / 2, 0, 2 * Math.PI, !0), e.closePath(), e.fill(),
|
|
e.stroke()
|
|
}
|
|
}
|
|
class we extends ce {
|
|
constructor() {
|
|
super(...arguments), this._maxAbsValue = 0
|
|
}
|
|
renderer() {
|
|
if (!this._study.properties().styles[this._plotName].visible) return null;
|
|
if (!this._study.properties().styles[this._plotName].visible.value()) return null;
|
|
if (!this._scalesReady()) return null;
|
|
this._invalidated && (this._updateImpl(), this._invalidated = !1);
|
|
const e = {},
|
|
t = Object(R.clamp)(this._getTranspValue(), 0, 100),
|
|
i = this._model.timeScale().barSpacing();
|
|
e.items = this._items, e.barSpacing = i, e.colorup = Object(M.generateColor)(this
|
|
._study.properties().styles[this._plotName].colorup.value(), t), e
|
|
.colordown = Object(M.generateColor)(this._study.properties().styles[this
|
|
._plotName].colordown.value(), t);
|
|
const s = Object(fe.parseRgba)(e.colorup),
|
|
r = s ? 100 * (1 - s[3]) : 0,
|
|
n = Object(fe.parseRgba)(e.colordown),
|
|
o = n ? 100 * (1 - n[3]) : 0;
|
|
e.colorBorderUp = Object(M.generateColor)("#000000", r), e.colorBorderDown = Object(
|
|
M.generateColor)("#000000", o), e.minHeight = this._study.properties()
|
|
.styles[this._plotName].minHeight.value(), e.maxHeight = this._study
|
|
.properties().styles[this._plotName].maxHeight.value();
|
|
const a = new O.CompositeRenderer;
|
|
if (a.append(new Se(e)), this._model.selection().isSelected(this._study) && null !==
|
|
this._selectionData) {
|
|
const e = this._selectionData;
|
|
e.barSpacing = i, a.append(new ye(e))
|
|
}
|
|
return a
|
|
}
|
|
_fillItemWithPointStyle(e, t, i) {
|
|
const r = Object(s.ensureDefined)(e.style);
|
|
e.isUp ? void 0 !== t.colors[A.ColorerType.Up] ? r.color = Object(M.generateColor)(
|
|
Object(s.ensureDefined)(t.colors[A.ColorerType.Up]), i) : r.color = Object(M
|
|
.generateColor)(this._study.properties().styles[this._plotName].colorup
|
|
.value(), i) : void 0 !== t.colors[A.ColorerType.Down] ? r.color = Object(M
|
|
.generateColor)(Object(s.ensureDefined)(t.colors[A.ColorerType.Down]), i) :
|
|
r.color = Object(M.generateColor)(this._study.properties().styles[this
|
|
._plotName].colordown.value(), i)
|
|
}
|
|
_createItem(e, t, i, s) {
|
|
if (0 === t) return null;
|
|
Math.abs(t) > this._maxAbsValue && (this._maxAbsValue = Math.abs(t));
|
|
const r = t > 0;
|
|
let n;
|
|
if (r) {
|
|
const t = this._getSeriesVal(s, e);
|
|
if (null === t) return null;
|
|
n = t
|
|
} else {
|
|
const t = this._getSeriesVal(i, e);
|
|
if (null === t) return null;
|
|
n = t
|
|
}
|
|
return new ge(e, n, t, r)
|
|
}
|
|
_convertItemsToCoordinates() {
|
|
const e = this._model.timeScale(),
|
|
t = Object(s.ensureNotNull)(this._study.priceScale());
|
|
e.timedValuesToCoordinates(this._items), t.pointsArrayToCoordinates(this._items,
|
|
Object(s.ensureNotNull)(this._study.firstValue()));
|
|
let i = Math.abs(this._study.properties().styles[this._plotName].minHeight.value()),
|
|
r = Math.abs(this._study.properties().styles[this._plotName].maxHeight.value());
|
|
if (i > r) {
|
|
const e = i;
|
|
i = r, r = e
|
|
}
|
|
const n = (r - i) / this._maxAbsValue,
|
|
o = this._items;
|
|
for (let e = 0; e < o.length; e++) {
|
|
const t = o[e],
|
|
s = Math.abs(t.height);
|
|
t.height = s * n + i
|
|
}
|
|
}
|
|
}
|
|
var Pe = i("29fS");
|
|
class Ce {
|
|
constructor(e, t, i, s) {
|
|
this._bars = [], this._invalidated = !1, this._isMarkersEnabled = T.enabled(
|
|
"source_selection_markers"), this._selectionData = null, this
|
|
._ohlcPlotIndexes = new Map, this._study = e, this._series = t, this._model = i,
|
|
this._plotName = s, this._isMarkersEnabled = T.enabled(
|
|
"source_selection_markers"), this._colorProvider = Object(E
|
|
.createStudyPlotColorProvider)(e.metaInfo(), e.properties(), s), this
|
|
._selectionIndexer = new j.SelectionIndexes(i.timeScale());
|
|
const r = this._study.metaInfo().plots;
|
|
for (let e = 0; e < r.length; e++) {
|
|
const t = r[e];
|
|
"target" in t && (t.target === this._plotName && (Object(x.isOhlcOpenPlot)(t) &&
|
|
this._ohlcPlotIndexes.set(1, e), Object(x.isOhlcHighPlot)(t) && this
|
|
._ohlcPlotIndexes.set(2, e), Object(x.isOhlcLowPlot)(t) && this
|
|
._ohlcPlotIndexes.set(3, e), Object(x.isOhlcClosePlot)(t) && this
|
|
._ohlcPlotIndexes.set(4, e)))
|
|
}
|
|
}
|
|
update() {
|
|
this._invalidated = !0
|
|
}
|
|
items() {
|
|
return this._bars
|
|
}
|
|
_updateImpl() {
|
|
this._bars.length = 0;
|
|
const e = this._study.priceScale();
|
|
if (this._model.timeScale().isEmpty() || null === e || e.isEmpty()) return;
|
|
const t = this._model.timeScale().visibleBarsStrictRange();
|
|
if (null === t) return;
|
|
let i = this._series.nearestIndex(t.firstBar(), c.PlotRowSearchMode.NearestRight);
|
|
const r = this._series.nearestIndex(t.lastBar(), c.PlotRowSearchMode.NearestLeft);
|
|
if (void 0 === i || void 0 === r) return;
|
|
const n = this._study.getMinFirstBarIndexForPlot(this._plotName);
|
|
if (n > r) return;
|
|
i = Math.max(n, i);
|
|
const o = this._study.data(),
|
|
a = this._study.firstValue();
|
|
if (null === a) return;
|
|
const l = o.rangeIterator(i, r),
|
|
h = this._study.properties().ohlcPlots[this._plotName],
|
|
u = new Map,
|
|
d = (e, t) => {
|
|
const i = e + "@" + t;
|
|
if (!u.has(i)) {
|
|
const s = Object(M.generateColor)(e, t);
|
|
return u.set(i, s), s
|
|
}
|
|
return u.get(i)
|
|
},
|
|
p = Object(A.createEmptyStyle)();
|
|
for (; l.hasNext();) {
|
|
const e = l.next();
|
|
let t = e.index;
|
|
const i = e.value;
|
|
t = Math.floor(t);
|
|
let r = !0;
|
|
const n = new Map;
|
|
for (let e = 1; e <= 4; ++e) {
|
|
const t = this._ohlcPlotIndexes.get(e);
|
|
if (void 0 === t) {
|
|
r = !1;
|
|
break
|
|
}
|
|
const s = i[t + 1];
|
|
if (null == s) {
|
|
r = !1;
|
|
break
|
|
}
|
|
n.set(e, s)
|
|
}
|
|
if (!r) continue;
|
|
const o = Object(s.ensureDefined)(n.get(1)),
|
|
a = Object(s.ensureDefined)(n.get(4)),
|
|
c = Object(s.ensureDefined)(n.get(2)),
|
|
u = Object(s.ensureDefined)(n.get(3)),
|
|
_ = Math.max(o, c, u, a),
|
|
m = Math.min(o, c, u, a);
|
|
let f = Object(s.ensureDefined)(d(h.color.value(), 0));
|
|
const g = this._colorProvider.getPlotPointStyle(i, p);
|
|
void 0 !== g.colors[A.ColorerType.Main] && (f = Object(s.ensureDefined)(g
|
|
.colors[A.ColorerType.Main]));
|
|
const b = {
|
|
time: Math.round(t),
|
|
open: o,
|
|
high: _,
|
|
low: m,
|
|
close: a,
|
|
color: f,
|
|
wickColor: g.colors[A.ColorerType.Wick],
|
|
borderColor: g.colors[A.ColorerType.Border],
|
|
hollow: null
|
|
};
|
|
this._bars.push(b)
|
|
}
|
|
if (e.barPricesToCoordinates(this._bars, a), this._model.timeScale()
|
|
.barIndexesToCoordinates(this._bars), this._model.selection().isSelected(this
|
|
._study)) {
|
|
const t = this._selectionIndexer.indexes();
|
|
this._selectionData = {
|
|
points: [],
|
|
hittestResult: N.HitTestResult.REGULAR,
|
|
bgColors: [],
|
|
visible: !0,
|
|
barSpacing: this._model.timeScale().barSpacing()
|
|
};
|
|
const i = Object(s.ensureNotNull)(this._model.paneForSource(this._study))
|
|
.height(),
|
|
r = Object(s.ensureDefined)(this._ohlcPlotIndexes.get(4));
|
|
for (let s = 0; s < t.length; s++) {
|
|
const n = t[s],
|
|
o = this._study.data().valueAt(n);
|
|
if (null === o) continue;
|
|
const l = o[r + 1];
|
|
if (null == l) continue;
|
|
const c = this._model.timeScale().indexToCoordinate(Math.floor(n)),
|
|
h = e.priceToCoordinate(l, a);
|
|
this._selectionData.points.push(new I.Point(c, h)), this._selectionData
|
|
.bgColors.push(this._model.backgroundColorAtYPercentFromTop(h / i))
|
|
}
|
|
} else this._selectionIndexer.clear()
|
|
}
|
|
}
|
|
class xe extends Ce {
|
|
renderer() {
|
|
if (!this._study.properties().ohlcPlots[this._plotName].visible.value())
|
|
return null;
|
|
this._invalidated && (this._updateImpl(), this._invalidated = !1);
|
|
const e = {
|
|
bars: this._bars,
|
|
barSpacing: this._model.timeScale().barSpacing(),
|
|
dontDrawOpen: this._series.properties().barStyle.dontDrawOpen.value(),
|
|
thinBars: this._series.properties().barStyle.thinBars.value()
|
|
},
|
|
t = new O.CompositeRenderer;
|
|
return t.append(new Pe.PaneRendererBars(e)), this._model.selection().isSelected(this
|
|
._study) && this._isMarkersEnabled && this._selectionData && t.append(new V
|
|
.SelectionRenderer(this._selectionData)), t
|
|
}
|
|
}
|
|
var Te = i("/hKg");
|
|
class Ie extends Ce {
|
|
renderer() {
|
|
const e = this._study.properties().ohlcPlots[this._plotName];
|
|
if (!e.visible.value()) return null;
|
|
this._invalidated && (this._updateImpl(), this._invalidated = !1);
|
|
const t = this._model.timeScale().barSpacing(),
|
|
i = {
|
|
bars: this._bars,
|
|
barSpacing: t,
|
|
wickVisible: e.drawWick.value(),
|
|
bodyVisible: !0,
|
|
borderVisible: e.drawBorder.value(),
|
|
barWidth: Object(pe.optimalBarWidth)(t),
|
|
borderColor: e.borderColor.value(),
|
|
wickColor: e.wickColor.value()
|
|
},
|
|
s = new O.CompositeRenderer;
|
|
return s.append(new Te.PaneRendererCandles(i)), this._model.selection().isSelected(
|
|
this._series) && this._isMarkersEnabled && this._selectionData && s.append(
|
|
new V.SelectionRenderer(this._selectionData)), s
|
|
}
|
|
}
|
|
var Me = i("KtbP"),
|
|
Oe = i("wYrq"),
|
|
Le = i("2ijp"),
|
|
Ae = i("8Uy/");
|
|
class Ee extends Le.a {
|
|
constructor(e, t) {
|
|
super(), this._lineRendererData.linestyle = Ae.LINESTYLE_DOTTED, this._study =
|
|
e, this._plotName = t
|
|
}
|
|
_updateImpl() {
|
|
this._lineRendererData.visible = !1;
|
|
const e = this._study.properties().styles[this._plotName];
|
|
if (!e.trackPrice.value()) return;
|
|
const t = this._study.lastValueData(this._plotName, !0);
|
|
t.noData || (this._lineRendererData.visible = !0, this._lineRendererData.y = t
|
|
.coordinate, this._lineRendererData.color = t.color, this
|
|
._lineRendererData.linewidth = e.linewidth.value())
|
|
}
|
|
}
|
|
var ke = i("cPgM");
|
|
class De {
|
|
constructor() {
|
|
this._items = [], this._actualLength = 0, this._invalidations = 0
|
|
}
|
|
push(e) {
|
|
this._items.length === this._actualLength ? this._items.push(e) : this._items[this
|
|
._actualLength] !== e && (this._items[this._actualLength] = e), this
|
|
._actualLength += 1
|
|
}
|
|
newItem() {
|
|
const e = this._items.length > this._actualLength ? this._items[this
|
|
._actualLength] : null;
|
|
return null !== e && Boolean(e.invalidateCache) && e.invalidateCache(), e
|
|
}
|
|
invalidateCache() {
|
|
this._invalidations += 1, 3e3 === this._invalidations && (this._items.splice(this
|
|
._actualLength), this._invalidations = 0), this._actualLength = 0
|
|
}
|
|
at(e) {
|
|
return this._items[e]
|
|
}
|
|
data() {
|
|
return this._items
|
|
}
|
|
length() {
|
|
return this._actualLength
|
|
}
|
|
}
|
|
class Ve {
|
|
constructor() {
|
|
this._map = new Map, this._usedKeys = new Set, this._invalidations = 0
|
|
}
|
|
invalidateCache() {
|
|
this._invalidations += 1, 50 === this._invalidations && (this._deleteUnused(), this
|
|
._invalidations = 0), this._usedKeys.clear(), this._map.forEach((e, t) => e
|
|
.invalidateCache())
|
|
}
|
|
get(e) {
|
|
const t = this._map.get(e);
|
|
return void 0 !== t && this._usedKeys.add(e), t
|
|
}
|
|
set(e, t) {
|
|
this._usedKeys.add(e), this._map.set(e, t)
|
|
}
|
|
forEach(e) {
|
|
this._map.forEach((t, i) => {
|
|
this._usedKeys.has(i) && e(t, i)
|
|
})
|
|
}
|
|
delete(e) {
|
|
const t = this._map.get(e);
|
|
void 0 !== t && t.invalidateCache(), this._usedKeys.delete(e)
|
|
}
|
|
_deleteUnused() {
|
|
const e = [];
|
|
this._map.forEach((t, i) => {
|
|
this._usedKeys.has(i) || e.push(i)
|
|
});
|
|
for (const t of e) this._map.delete(t)
|
|
}
|
|
}
|
|
class Be extends De {
|
|
constructor() {
|
|
super(), this.points1 = new De, this.points2 = new De,
|
|
this.push(this.points1), this.push(this.points2)
|
|
}
|
|
addPoints1Point(e, t) {
|
|
let i = this.points1.newItem();
|
|
null !== i ? (i.x = e, i.y = t) : i = {
|
|
x: e,
|
|
y: t
|
|
}, this.points1.push(i)
|
|
}
|
|
addPoints2Point(e, t) {
|
|
let i = this.points2.newItem();
|
|
null !== i ? (i.x = e, i.y = t) : i = {
|
|
x: e,
|
|
y: t
|
|
}, this.points2.push(i)
|
|
}
|
|
invalidateCache() {
|
|
this.points1.invalidateCache(), this.points2.invalidateCache()
|
|
}
|
|
}
|
|
class Re extends ke.ScaledPaneRenderer {
|
|
constructor() {
|
|
super(...arguments), this._data = null
|
|
}
|
|
setData(e) {
|
|
this._data = e
|
|
}
|
|
hitTest(e, t) {
|
|
return null
|
|
}
|
|
_drawImpl(e, t) {
|
|
if (null === this._data) return;
|
|
const i = .25 * this._data.barSpacing,
|
|
s = this._data.transparency;
|
|
this._data.colorAreas.forEach((t, r) => {
|
|
e.beginPath();
|
|
for (let s = 0; s < t.length(); s++) {
|
|
const r = t.at(s);
|
|
if (0 === r.points1.length() || 0 === r.points2.length())
|
|
continue;
|
|
const n = r.points1.at(0).x,
|
|
o = r.points1.at(0).y;
|
|
if (e.moveTo(n, o), 1 !== r.points1.length() && 1 !== r.points2
|
|
.length()) {
|
|
for (let t = 1; t < r.points1.length(); t++) e.lineTo(r
|
|
.points1.at(t).x, r.points1.at(t).y);
|
|
for (let t = r.points2.length() - 1; t >= 0; t--) e.lineTo(r
|
|
.points2.at(t).x, r.points2.at(t).y)
|
|
} else {
|
|
const t = r.points2.at(0).x,
|
|
s = r.points2.at(0).y;
|
|
e.lineTo(n + i, o), e.lineTo(t + i, s), e.lineTo(t - i, s),
|
|
e.lineTo(n - i, o)
|
|
}
|
|
}
|
|
e.closePath(), e.fillStyle = Object(M.generateColor)(r, s), e.fill()
|
|
})
|
|
}
|
|
}
|
|
var Ne = i("ZJKN");
|
|
class je extends De {
|
|
constructor() {
|
|
super(...arguments), this._startIndex = 0
|
|
}
|
|
setStartIndex(e) {
|
|
this._startIndex = e
|
|
}
|
|
at(e) {
|
|
const t = e - this._startIndex;
|
|
for (; t >= this._actualLength;) {
|
|
if (this._items.length <= t) this._items.push({
|
|
plot1Value: void 0,
|
|
plot2Value: void 0,
|
|
colorIndex: void 0
|
|
});
|
|
else {
|
|
const e = this._items[this._actualLength];
|
|
e.plot1Value = void 0, e.plot2Value = void 0, e.colorIndex = void 0
|
|
}
|
|
this._actualLength += 1
|
|
}
|
|
return this._items[t]
|
|
}
|
|
}
|
|
class Fe {
|
|
constructor(e, t = !1) {
|
|
this._isHlineFill = !1, this._bandAKey = null, this._bandBKey = null, this
|
|
._colorPlotIndex = null, this._colorValues = [], this._colors = new De, this
|
|
._areaRenderer = new Re, this._invalidated = !0, this._plIndex1 = null, this
|
|
._plIndex2 = null, this._level1 = 0, this._level2 = 0, this._studyValuesCache =
|
|
new je, this._points1 = new De, this._points2 = new De, this._timePoints =
|
|
new De, this._colorAreas = new Ve, this._source = e, this._fillGaps = t
|
|
}
|
|
update() {
|
|
this._invalidated = !0
|
|
}
|
|
renderer(e, t) {
|
|
return this._invalidated && (this._updateImpl(), this._invalidated = !1), this
|
|
._areaRenderer
|
|
}
|
|
_correctVisibleRange(e) {
|
|
const t = this._source.data(),
|
|
i = t.search(e.firstBar(), c.PlotRowSearchMode.NearestLeft, this._plotIndex1()),
|
|
s = t.search(e.firstBar(), c.PlotRowSearchMode.NearestLeft, this._plotIndex2()),
|
|
r = t.search(e.lastBar(), c.PlotRowSearchMode.NearestRight, this._plotIndex1()),
|
|
n = t.search(e.lastBar(), c.PlotRowSearchMode.NearestRight, this._plotIndex2()),
|
|
o = null !== i ? i.index : e.firstBar(),
|
|
a = null !== s ? s.index : e.firstBar(),
|
|
l = null !== r ? r.index : e.lastBar(),
|
|
h = null !== n ? n.index : e.lastBar();
|
|
return [Math.min(o, a), Math.max(l, h)]
|
|
}
|
|
_plotNames() {
|
|
return this._source.metaInfo().plots.map(e => e.id)
|
|
}
|
|
_plotIndex1() {
|
|
return null === this._plIndex1 && (this._plIndex1 = this._plotNames().indexOf(this
|
|
._plotAId()) + 1), this._plIndex1
|
|
}
|
|
_plotIndex2() {
|
|
return null === this._plIndex2 && (this._plIndex2 = this._plotNames().indexOf(this
|
|
._plotBId()) + 1), this._plIndex2
|
|
}
|
|
_updateImpl() {
|
|
var e, t, i;
|
|
if (this._areaRenderer.setData(null), !this._visible()) return;
|
|
const r = this._source.priceScale(),
|
|
n = this._source.model(),
|
|
o = n.timeScale();
|
|
if (!r || r.isEmpty() || o.isEmpty()) return;
|
|
if (n.mainSeries().bars().isEmpty()) return;
|
|
const a = this._source.firstValue();
|
|
if (null === a) return;
|
|
if (this._isHlineFill) {
|
|
const e = this._source.properties().bands[Object(s.ensureNotNull)(this
|
|
._bandAKey)],
|
|
t = this._source.properties().bands[Object(s.ensureNotNull)(this
|
|
._bandBKey)];
|
|
this._level1 = r.priceToCoordinate(e.value.value(), a), this._level2 = r
|
|
.priceToCoordinate(t.value.value(), a)
|
|
}
|
|
const l = o.visibleBarsStrictRange();
|
|
if (null === l) return;
|
|
this._timePoints.invalidateCache(), this._points1.invalidateCache(), this._points2
|
|
.invalidateCache(), null === (e = this._colors) || void 0 === e || e
|
|
.invalidateCache(), this._colorAreas.invalidateCache();
|
|
const [c, h] = this._correctVisibleRange(l), u = this._isPerBarColoringSupported() ?
|
|
this._colors : null, d = this._source.offset(this._plotAId()), p = this._source
|
|
.offset(this._plotBId()), _ = Math.min(d, p), m = Math.max(d, p), f = this
|
|
._plotIndex1(), g = this._plotIndex2(), b = this._source.data();
|
|
if (b.isEmpty()) return;
|
|
let v, S;
|
|
const y = Object(s.ensureNotNull)(b.firstIndex()),
|
|
w = Object(s.ensureNotNull)(b.lastIndex()),
|
|
C = y - Math.max(0, -_),
|
|
x = w + Math.max(0, m),
|
|
T = Math.max(c - 1, C),
|
|
I = Math.min(h + 1, x),
|
|
M = this._studyValuesCache;
|
|
M.invalidateCache();
|
|
const O = T - m,
|
|
L = b.rangeIterator(O, I - _),
|
|
A = Math.max(l.firstBar() - 1, Math.min(O - m - 1, O - 1 + _));
|
|
M.setStartIndex(A);
|
|
const E = new Ne.BarsRange(l.firstBar() - 1, l.lastBar() + 1);
|
|
for (; L.hasNext();) {
|
|
const e = L.next(),
|
|
t = e.index,
|
|
i = e.value,
|
|
r = i[f],
|
|
n = i[g],
|
|
o = t + d,
|
|
a = t + p;
|
|
if (o === a && E.contains(o)) {
|
|
const e = M.at(o);
|
|
e.plot1Value = r, e.plot2Value = n
|
|
} else {
|
|
if (E.contains(o)) {
|
|
M.at(o).plot1Value = r
|
|
}
|
|
if (E.contains(a)) {
|
|
M.at(a).plot2Value = n
|
|
}
|
|
}
|
|
if (null !== u) {
|
|
const e = t - 1 + _;
|
|
if (l.contains(e)) {
|
|
const t = i[Object(s.ensureNotNull)(this._colorPlotIndex) + 1];
|
|
M.at(e).colorIndex = t
|
|
}
|
|
}
|
|
}
|
|
const k = this._timePoints,
|
|
D = this._points1,
|
|
V = this._points2;
|
|
let B = null;
|
|
const R = A + M.length();
|
|
for (let e = A; e <= R; e++) {
|
|
if (!this._fillGaps && (null === v || null === S)) {
|
|
const t = e - 1;
|
|
k.push(t), D.push(NaN), V.push(NaN), null == u || u.push(null)
|
|
}
|
|
const s = M.at(e);
|
|
if (null !== u) {
|
|
const e = s.colorIndex;
|
|
B = null == e ? null : this._getColorByPlotValue(e)
|
|
}
|
|
if (this._isHlineFill) {
|
|
k.push(e), null !== u && u.push(B);
|
|
continue
|
|
}
|
|
const r = null !== (t = s.plot1Value) && void 0 !== t ? t : null,
|
|
n = null !== (i = s.plot2Value) && void 0 !== i ? i : null;
|
|
(null !== r || null !== n || Number.isFinite(v) || Number.isFinite(S)) && (v =
|
|
r, S = n, D.push(r), V.push(n), k.push(e), null !== u && u.push(B))
|
|
}
|
|
r.pricesArrayToCoordinates(D.data(), a, D.length()), r.pricesArrayToCoordinates(V
|
|
.data(), a, V.length()), o.indexesToCoordinates(k.data(), k.length());
|
|
const N = this._transparency();
|
|
let j = Object(P.isNumber)(N) ? N : 50;
|
|
j = Math.min(j, 100), j = Math.max(j, 0);
|
|
const F = {
|
|
barSpacing: this._source.model().timeScale().barSpacing(),
|
|
transparency: j,
|
|
colorAreas: this._getFilledAreas(k, D, V, u)
|
|
};
|
|
this._areaRenderer.setData(F)
|
|
}
|
|
_getFilledAreas(e, t, i, s) {
|
|
const r = this._isHlineFill;
|
|
if (!r && (0 === t.length() || 0 === i.length())) return new Ve;
|
|
const n = this._colorAreas;
|
|
let o = null,
|
|
a = null;
|
|
const l = this._color();
|
|
for (let c = 0; c < e.length(); c++) {
|
|
const h = r ? this._level1 : t.at(c),
|
|
u = r ? this._level2 : i.at(c),
|
|
d = e.at(c),
|
|
p = Object(pe.coordinateIsValid)(h),
|
|
_ = Object(pe.coordinateIsValid)(u);
|
|
if (this._fillGaps ? p || _ : p && _) {
|
|
const e = s ? s.at(c) || "" : l;
|
|
if (a !== e || null === o) {
|
|
a = e, null !== o && (p && o.addPoints1Point(d, h), _ && o
|
|
.addPoints2Point(d, u));
|
|
const t = n.get(e) || new De;
|
|
o = t.newItem() || new Be, t.push(o), n.set(e, t)
|
|
}
|
|
p && o.addPoints1Point(d, h), _ && o.addPoints2Point(d, u)
|
|
} else this._fillGaps || (a = null, o = null)
|
|
}
|
|
return n.delete(""), n
|
|
}
|
|
}
|
|
class We extends Fe {
|
|
constructor(e) {
|
|
super(e)
|
|
}
|
|
_plotAId() {
|
|
return this._source.properties().area[0].name.value()
|
|
}
|
|
_plotBId() {
|
|
return this._source.properties().area[1].name.value()
|
|
}
|
|
_color() {
|
|
return this._source.properties().areaBackground.backgroundColor.value()
|
|
}
|
|
_transparency() {
|
|
const e = this._source.properties().areaBackground.transparency.value();
|
|
return Object(R.clamp)(e, 0, 100)
|
|
}
|
|
_visible() {
|
|
return this._source.properties().areaBackground.fillBackground.value()
|
|
}
|
|
_getColorByPlotValue(e) {
|
|
return this._color()
|
|
}
|
|
_isPerBarColoringSupported() {
|
|
return !1
|
|
}
|
|
}
|
|
class He extends Fe {
|
|
constructor(e, t, i) {
|
|
super(e, !!t.fillgaps), this._isHlineFill = "hline_hline" === t.type, Object(s
|
|
.assert)(this._isHlineFill || "plot_plot" === t.type,
|
|
"Wrong filledArea type: " + t.type), this._isHlineFill && this
|
|
._initBandIndexes(t.objAId, t.objBId), this._fillMetaInfo = t, this
|
|
._fillStyleProps = i;
|
|
const r = e.metaInfo();
|
|
for (let i = 0; i < r.plots.length; ++i) {
|
|
const n = r.plots[i];
|
|
if ("palette" in n && n.palette === t.palette) {
|
|
this._colorPlotIndex = i, this._colorsMap = Object(s.ensureDefined)(Object(s
|
|
.ensureDefined)(r.palettes)[t.palette]).valToIndex, this
|
|
._colorValues = e.properties().palettes[t.palette].colors;
|
|
break
|
|
}
|
|
if (r.isRGB && "target" in n && n.target === t.id) {
|
|
this._colorPlotIndex = i;
|
|
break
|
|
}
|
|
}
|
|
}
|
|
_getColorByPlotValue(e) {
|
|
if (this._colorsMap) {
|
|
const t = Object(s.ensureDefined)(this._colorsMap)[e];
|
|
return this._colorValues[Object(s.ensureDefined)(t)].childs().color.value()
|
|
}
|
|
return Object(M.rgbaFromInteger)(e)
|
|
}
|
|
_isPerBarColoringSupported() {
|
|
return null !== this._colorPlotIndex
|
|
}
|
|
_plotAId() {
|
|
return this._fillMetaInfo.objAId
|
|
}
|
|
_plotBId() {
|
|
return this._fillMetaInfo.objBId
|
|
}
|
|
_color() {
|
|
return this._fillStyleProps.childs().color.value()
|
|
}
|
|
_transparency() {
|
|
return this._fillStyleProps.childs().transparency.value()
|
|
}
|
|
_correctVisibleRange(e) {
|
|
const [t, i] = super._correctVisibleRange(e), s = this._source
|
|
.getMinFirstBarIndexForPlot(this._fillMetaInfo.id);
|
|
return [Math.max(s, t), i]
|
|
}
|
|
_visible() {
|
|
return this._fillStyleProps.childs().visible.value()
|
|
}
|
|
_initBandIndexes(e, t) {
|
|
this._bandAKey = null, this._bandBKey = null;
|
|
const i = this._source.metaInfo().bands;
|
|
if (void 0 !== i)
|
|
for (let s = 0; s < i.length; ++s) {
|
|
const r = i[s];
|
|
null !== this._bandAKey || r.id !== e ? null === this._bandBKey && r.id ===
|
|
t && (this._bandBKey = s) : this._bandAKey = s
|
|
}
|
|
}
|
|
}
|
|
var Ue = i("l4sv");
|
|
class ze {
|
|
constructor(e, t) {
|
|
this._invalidated = !0, this._lineRenderer = new Ue.HorizontalLineRenderer, this
|
|
._source = t, this._points = [new I.Point(-1, -1)], this._invalidated = !0, this
|
|
._properties = e
|
|
}
|
|
update() {
|
|
this._invalidated = !0
|
|
}
|
|
renderer() {
|
|
this._invalidated && (this._updateImpl(), this._invalidated = !1);
|
|
const e = {
|
|
y: this._points[0].y,
|
|
color: this._properties.childs().color.value(),
|
|
linewidth: this._properties.childs().linewidth.value(),
|
|
linestyle: this._properties.childs().linestyle.value()
|
|
};
|
|
return this._lineRenderer.setData(e), this._lineRenderer
|
|
}
|
|
_updateImpl() {
|
|
const e = this._source.priceScale();
|
|
if (!e || e.isEmpty()) return void(this._points[0] = new I.Point(-1, -1));
|
|
const t = this._properties.childs().value.value(),
|
|
i = this._source.firstValue(),
|
|
s = Object(P.isNumber)(t) && null !== i ? e.priceToCoordinate(t, i) : NaN;
|
|
this._points[0] = new I.Point(-1, s)
|
|
}
|
|
}
|
|
class Ge extends ke.ScaledPaneRenderer {
|
|
constructor() {
|
|
super(), this._data = null, this._data = null
|
|
}
|
|
setData(e = null) {
|
|
this._data = e
|
|
}
|
|
hitTest() {
|
|
return null
|
|
}
|
|
_drawImpl(e, t) {
|
|
if (null === this._data || 0 === this._data.points.length) return;
|
|
const i = t.cssWidth;
|
|
e.fillStyle = Object(M.generateColor)(this._data.backcolor, this._data
|
|
.transparency);
|
|
const s = Math.min(this._data.points[0], this._data.points[1]),
|
|
r = Math.max(this._data.points[0], this._data.points[1]);
|
|
e.fillRect(0, s, i, r - s)
|
|
}
|
|
}
|
|
class qe {
|
|
constructor(e) {
|
|
this._points = [], this._bandBgRenderer = new Ge, this._source = e
|
|
}
|
|
update() {
|
|
if (this._points = [], this._source.properties().bands.length < 2) return;
|
|
if (!this._source.properties().bandsBackground.fillBackground.value()) return;
|
|
const e = this._source.properties().bands[0],
|
|
t = this._source.properties().bands[1],
|
|
i = this._source.priceScale(),
|
|
s = this._source.firstValue();
|
|
i && !i.isEmpty() && null !== s && (this._points.push(i.priceToCoordinate(e.value
|
|
.value(), s)), this._points.push(i.priceToCoordinate(t.value.value(),
|
|
s)))
|
|
}
|
|
renderer() {
|
|
const e = {
|
|
points: this._points,
|
|
backcolor: this._source.properties().bandsBackground.backgroundColor
|
|
.value(),
|
|
transparency: this._source.properties().bandsBackground.transparency.value()
|
|
};
|
|
return this._bandBgRenderer.setData(e), this._bandBgRenderer
|
|
}
|
|
}
|
|
class Ye {
|
|
constructor(e, t, i) {
|
|
this._points = [], this._bandBgRenderer = new Ge, this._bandAKey = null, this
|
|
._bandBKey = null, this._source = e, Object(s.assert)("hline_hline" === t.type,
|
|
"Wrong filledArea type: " + t.type), this._initBandIndexes(t.objAId, t
|
|
.objBId), this._fillStyleProps = i, this._bandBgRenderer = new Ge
|
|
}
|
|
update() {
|
|
if (this._points = [], !this._fillStyleProps.childs().visible.value()) return;
|
|
if (null === this._bandAKey || null === this._bandBKey) return;
|
|
const e = this._source.properties().bands[this._bandAKey],
|
|
t = this._source.properties().bands[this._bandBKey],
|
|
i = this._source.priceScale(),
|
|
s = this._source.firstValue();
|
|
i && !i.isEmpty() && null !== s && (this._points.push(i.priceToCoordinate(e.value
|
|
.value(), s)), this._points.push(i.priceToCoordinate(t.value.value(),
|
|
s)))
|
|
}
|
|
renderer() {
|
|
let e = this._fillStyleProps.childs().transparency.value();
|
|
e = Object(R.clamp)(e, 0, 100);
|
|
const t = {
|
|
points: this._points,
|
|
backcolor: Object(M.generateColor)(this._fillStyleProps.childs().color
|
|
.value(), e),
|
|
transparency: this._fillStyleProps.childs().transparency.value()
|
|
};
|
|
return this._bandBgRenderer.setData(t), this._bandBgRenderer
|
|
}
|
|
_initBandIndexes(e, t) {
|
|
this._bandAKey = null, this._bandBKey = null;
|
|
Object(s.ensureDefined)(this._source.metaInfo().bands).forEach((i, s) => {
|
|
null === this._bandAKey && i.id === e && (this._bandAKey = s), null ===
|
|
this._bandBKey && i.id === t && (this._bandBKey = s)
|
|
})
|
|
}
|
|
}
|
|
var Ke = i("bmVy"),
|
|
Je = i("eCE5");
|
|
i.d(t, "StudyBase", (function() {
|
|
return st
|
|
}));
|
|
const Ze = Object(r.getLogger)("Chart.Study"),
|
|
Xe = window.t("Invalid Symbol");
|
|
const $e = {
|
|
symbolsForDisplay: !1,
|
|
symbolsForChartApi: !0,
|
|
skipHiddenInputs: !1,
|
|
skipFakeInputs: !1,
|
|
skipBooleanInputs: T.enabled("dont_show_boolean_study_arguments"),
|
|
asObject: !0,
|
|
skippedGroups: [],
|
|
skippedInputs: [],
|
|
noExchanges: !1,
|
|
noResolution: !1,
|
|
keepOptionalSymbolsEmpty: !1,
|
|
skipColorInputs: !1,
|
|
skipTimeInputs: !1,
|
|
skipOptionalEmptySymbolInputs: !1
|
|
},
|
|
Qe = T.enabled("study_symbol_ticker_description");
|
|
|
|
function et(e, t) {
|
|
const i = e.plots[t];
|
|
if (!i || !Object(x.isOhlcPlot)(i)) return !1;
|
|
const s = i.target,
|
|
r = e.defaults.styles && e.defaults.styles[s],
|
|
n = e.defaults.ohlcPlots && e.defaults.ohlcPlots[s],
|
|
o = e.ohlcPlots && e.ohlcPlots[s];
|
|
return r && Object(x.isOhlcPlotStyleBars)(r) || n && Object(x.isOhlcPlotStyleBars)(n) || !!
|
|
o && Object(x.isOhlcPlotStyleBars)(o)
|
|
}
|
|
|
|
function tt(e, t) {
|
|
const i = e.plots[t];
|
|
if (!i || !Object(x.isOhlcPlot)(i)) return !1;
|
|
const s = i.target,
|
|
r = e.defaults.styles && e.defaults.styles[s],
|
|
n = e.defaults.ohlcPlots && e.defaults.ohlcPlots[s],
|
|
o = e.ohlcPlots && e.ohlcPlots[s];
|
|
return r && Object(x.isOhlcPlotStyleCandles)(r) || n && Object(x.isOhlcPlotStyleCandles)(
|
|
n) || !!o && Object(x.isOhlcPlotStyleCandles)(o)
|
|
}
|
|
|
|
function it(e, t) {
|
|
Object(s.assert)(void 0 !== e, "zOrder must be defined"), Object(s.assert)(!t.has(e),
|
|
"zOrder must be unique")
|
|
}
|
|
class st extends a.PriceDataSource {
|
|
constructor(e, t, i, s) {
|
|
super(e), this.onStart = new o.a, this._symbolsResolved = new o.a, this
|
|
._statusChanged = new o.a, this._paneViews = [], this._priceAxisViews = [],
|
|
this._resolvedSymbols = {}, this._resolvedSymbolsByInput = {}, this
|
|
._isChildStudy = !1, this._status = {
|
|
type: Ke.StudyStatusType.Undefined
|
|
}, this._studyId = null, this._isSubscribedToSessionId = !1, this
|
|
._titleStrCache = {}, this._titleInPartsCache = {}, this._children = [],
|
|
this._numericFormatter = new C.NumericFormatter, this
|
|
._priceAxisViewsBase = [], this._priceLinesAxisViews = [], this
|
|
._labelPaneViews = [], this._ownFirstValue = null, this
|
|
._pendingResolveSymbols = new Map, this._onIsActualIntervalChange = new o.a,
|
|
this._lastNonEmptyPlotRowCache = {}, this._chartApi = e.chartApi(), this
|
|
._properties = t, this._metaInfo = s, this._series = this._model
|
|
.mainSeries(), this._series.onIntervalChanged().subscribe(this, this
|
|
._calcIsActualInterval), this._showStudyArgumentsProperty = e
|
|
.properties().paneProperties.legendProperties.showStudyArguments,
|
|
i instanceof st && (this._source = i, this._isChildStudy = !0, this._source
|
|
.setChild(this));
|
|
const r = this.parentSource();
|
|
r.currencyChanged().subscribe(this, this._onSourceCurrencyChanged), r
|
|
.unitChanged().subscribe(this, this._onSourceUnitChanged), r
|
|
.priceRangeReadyChanged().subscribe(this, this
|
|
._onSourcePriceRangeReadyChanged), r.formatterChanged().subscribe(this,
|
|
this._onSourceFormatterChanged), r.priceStepChanged().subscribe(this,
|
|
this._onSourcePriceStepChanged), Qe && this._model.mainSeries()
|
|
.properties().statusViewStyle.symbolTextSource.listeners().subscribe(this,
|
|
() => {
|
|
this.invalidateTitleCache(!0)
|
|
}), this._properties.subscribe(this, this._onPropertiesChanged), this
|
|
._properties.visible.subscribe(this, this._visibleChanged), this._properties
|
|
.visible.subscribe(this, this.processHibernate),
|
|
this._properties.intervalsVisibilities.subscribe(this, this
|
|
._calcIsActualInterval);
|
|
for (let e = 0; e < this._metaInfo.plots.length; e++) {
|
|
const t = this._metaInfo.plots[e].id,
|
|
i = this.properties().styles[t];
|
|
null != i && null != i.visible && i.visible.subscribe(this, this
|
|
.processHibernate)
|
|
}
|
|
for (const e of Object.keys(this._metaInfo.graphics))
|
|
for (const t of Object.keys(this._metaInfo.graphics[e])) {
|
|
const i = this._properties.graphics[e][t];
|
|
i.visible && i.visible.subscribe(this, this.processHibernate)
|
|
}
|
|
this._isActualInterval = Object(Je.a)(this._series.intervalObj(), this
|
|
.properties().intervalsVisibilities)
|
|
}
|
|
destroy() {
|
|
const e = this.parentSource();
|
|
e.currencyChanged().unsubscribeAll(this), e.unitChanged().unsubscribeAll(this),
|
|
e.priceRangeReadyChanged().unsubscribeAll(this), e.formatterChanged()
|
|
.unsubscribeAll(this), e.priceStepChanged().unsubscribeAll(this), this
|
|
._series.properties().statusViewStyle.symbolTextSource.unsubscribeAll(this),
|
|
this._series.onIntervalChanged().unsubscribeAll(this)
|
|
}
|
|
isSymbolInvalid() {
|
|
return this._status.type === Ke.StudyStatusType.Error && this._status
|
|
.errorDescription.error === Xe
|
|
}
|
|
isActualInterval() {
|
|
return this._isActualInterval
|
|
}
|
|
onIsActualIntervalChange() {
|
|
return this._onIsActualIntervalChange
|
|
}
|
|
isVisible() {
|
|
if (!this.properties().visible.value() || !this.isActualInterval()) return !1;
|
|
const e = this.metaInfo();
|
|
if (e.plots.length > 0) return !0;
|
|
for (const t of Object.keys(e.graphics))
|
|
for (const i of Object.keys(e.graphics[t])) {
|
|
const e = this.properties().graphics[t][i];
|
|
if (!e.visible || e.visible.value()) return !0
|
|
}
|
|
return !(!e.isTVScriptStrategy && !e.hasAlertFunction)
|
|
}
|
|
inputs(e) {
|
|
const t = Object(P.merge)(Object(P.clone)($e), e || {});
|
|
return t.skipOptionalEmptySymbolInputs && (t.keepOptionalSymbolsEmpty = !0),
|
|
this._buildInputs(t)
|
|
}
|
|
status() {
|
|
return this._status
|
|
}
|
|
title(e, t, i, s) {
|
|
i = void 0 === i ? !this._showStudyArgumentsProperty.value() : i;
|
|
const r = JSON.stringify([e, t, i, s]);
|
|
if (this._titleStrCache[r]) return this._titleStrCache[r];
|
|
if (this._titleInPartsCache[r]) return this._joinTitlesParts(this
|
|
._titleInPartsCache[r]);
|
|
const n = this._title(e, t, i, s);
|
|
return this._titleStrCache[r] = n, n
|
|
}
|
|
titleInParts(e, t, i, s) {
|
|
i = void 0 === i ? !this._showStudyArgumentsProperty.value() : i;
|
|
const r = JSON.stringify([e, t, i, s]);
|
|
if (this._titleInPartsCache[r]) return this._titleInPartsCache[r];
|
|
const n = this._titleInParts(e, t, i, s);
|
|
return this._titleInPartsCache[r] = n, n
|
|
}
|
|
invalidateTitleCache(e) {
|
|
if (this._titleStrCache = {}, this._titleInPartsCache = {}, !0 === e && this
|
|
._children)
|
|
for (let t = 0; t < this._children.length; ++t) this._children[t]
|
|
.invalidateTitleCache(e)
|
|
}
|
|
setOwnFirstValue(e) {
|
|
this._ownFirstValue = e
|
|
}
|
|
firstValue(e) {
|
|
var t, i, s;
|
|
if (!this._isChildStudy && "Compare@tv-basicstudies" === (null === (t = this
|
|
._metaInfo) || void 0 === t ? void 0 : t.id) || !(null === (i = this
|
|
._metaInfo) || void 0 === i ? void 0 : i.is_price_study)) {
|
|
const t = this._model.timeScale().visibleBarsStrictRange();
|
|
if (null === t) return null;
|
|
if (!this.properties().visible.value() || !this.isActualInterval())
|
|
return this._ownFirstValue;
|
|
const i = t.firstBar(),
|
|
r = t.lastBar();
|
|
let n = null;
|
|
const o = (null === (s = this._metaInfo) || void 0 === s ? void 0 : s
|
|
.plots) || [];
|
|
if (null === n) {
|
|
const t = this.data().rangeIterator(i, r);
|
|
for (; t.hasNext();) {
|
|
const i = t.next().value;
|
|
for (let t = 0; t < o.length; ++t) {
|
|
if (Object(x.isColorerPlot)(o[t])) continue;
|
|
const s = i[t + 1];
|
|
if (null == s) continue;
|
|
const r = o[t].id,
|
|
a = this.properties().styles[r];
|
|
if (a.visible && a.visible.value() && !(e && Math.abs(s) <
|
|
1e-10)) {
|
|
n = s;
|
|
break
|
|
}
|
|
}
|
|
if (null !== n) break
|
|
}
|
|
}
|
|
return this._ownFirstValue = n, null !== n ? n : this._bandsFirstValue(e)
|
|
}
|
|
if (this._isChildStudy) {
|
|
const e = this._getNonPriceParent();
|
|
if (e && this.priceScale() === e.priceScale()) return null !== e
|
|
._ownFirstValue ? e._ownFirstValue : e.firstValue()
|
|
}
|
|
return this._series.firstValue()
|
|
}
|
|
priceRange(e, t) {
|
|
let i = null;
|
|
const r = Object(s.ensureNotNull)(this._metaInfo),
|
|
n = this._fillPrecalculatedAutoscaleInfo(e, t);
|
|
let o = this.data().minMaxOnRangeCached(e, t, n.fields);
|
|
if (o = Object(c.mergeMinMax)(n.baseValueMinMax, o), n.useMainSeriesRange) {
|
|
const i = [{
|
|
name: "low",
|
|
offset: 0
|
|
}, {
|
|
name: "high",
|
|
offset: 0
|
|
}],
|
|
s = this.series().data().bars().minMaxOnRangeCached(e, t, i);
|
|
o = Object(c.mergeMinMax)(o, s)
|
|
}
|
|
if (null !== o && (i = new l.PriceRange(o.min, o.max)), r.bands)
|
|
for (let e = 0; e < r.bands.length; e++)
|
|
if (this.properties().bands[e].visible.value()) {
|
|
const t = this.properties().bands[e].value.value();
|
|
if (!Object(P.isNumber)(t)) continue;
|
|
i ? i.apply(t, t) : i = new l.PriceRange(t, t)
|
|
} return this._postProcessPriceRange(i)
|
|
}
|
|
autoScaleInfo(e, t) {
|
|
const i = {
|
|
topPixelMargin: 0,
|
|
bottomPixelMargin: 0
|
|
};
|
|
return {
|
|
range: this.priceRange(e, t),
|
|
topPixelMargin: i.topPixelMargin,
|
|
bottomPixelMargin: i.bottomPixelMargin
|
|
}
|
|
}
|
|
resolvedSymbolInfoBySymbol(e) {
|
|
return this._resolvedSymbols && e && this._resolvedSymbols[this
|
|
._getSymbolForResolve(e)] || null
|
|
}
|
|
currency() {
|
|
const e = this.metaInfo();
|
|
return Boolean(e) && e.is_price_study ? this.parentSource().currency() : null
|
|
}
|
|
unit() {
|
|
const e = this.metaInfo();
|
|
return Boolean(e) && e.is_price_study ? this.parentSource().unit() : null
|
|
}
|
|
sessionId() {
|
|
return this.parentSource().sessionId()
|
|
}
|
|
sessionIdChanged() {
|
|
return this.parentSource().sessionIdChanged()
|
|
}
|
|
getSymbolString(e) {
|
|
return "" === e ? "" : Object(v.encodeExtendedSymbolOrGetSimpleSymbolString)(
|
|
this._getSymbolObject(e))
|
|
}
|
|
onStatusChanged() {
|
|
return this._statusChanged
|
|
}
|
|
symbolsResolved() {
|
|
return this._symbolsResolved
|
|
}
|
|
valuesProvider() {
|
|
return new m.a(this, this.model())
|
|
}
|
|
statusProvider(e) {
|
|
return new w.a(this, this._model.properties().scalesProperties.textColor)
|
|
}
|
|
correctScaleMargins(e) {
|
|
if ("Volume" === this.metaInfo().shortId) {
|
|
const t = this.model().paneForSource(this);
|
|
return null !== t && t.isOverlay(this) && t.containsMainSeries() ? {
|
|
top: .75,
|
|
bottom: 0
|
|
} : {
|
|
top: e.top,
|
|
bottom: 0
|
|
}
|
|
}
|
|
return e
|
|
}
|
|
canBeHiddenByGlobalFlag() {
|
|
return !0
|
|
}
|
|
isSourceHidden() {
|
|
return !this.isVisible() || this.canBeHiddenByGlobalFlag() && g
|
|
.hideAllIndicators().value()
|
|
}
|
|
_invalidateLastNonEmptyPlotRowCache() {
|
|
this._lastNonEmptyPlotRowCache = {}
|
|
}
|
|
processHibernate() {
|
|
this.isHibernateAllowed() && (!this.isStarted() && this.isVisible() && this
|
|
.start(), this.isStarted() && !this.isVisible() && this.stop())
|
|
}
|
|
isHibernated() {
|
|
return !this.isVisible() && !this.isStarted()
|
|
}
|
|
_createViews() {
|
|
var e, t, i;
|
|
this._priceAxisViewsBase = [], this._priceLinesAxisViews = [], this
|
|
._paneViews = [], this._labelPaneViews = [];
|
|
const r = new Set,
|
|
n = this.metaInfo(),
|
|
o = Boolean(n.usePlotsZOrder),
|
|
a = new Map;
|
|
if (n.plots)
|
|
for (let t = 0; t < n.plots.length; t++) {
|
|
const i = n.plots[t];
|
|
let l, c, h, u, d;
|
|
if (Object(x.isNonVisualPlot)(i)) continue;
|
|
let p = n.plots[t].id,
|
|
_ = n.styles;
|
|
if (Object(x.isBgColorerPlot)(i)) l = new k(this, this._series, this
|
|
._model, p);
|
|
else if (Object(x.isShapesPlot)(i)) l = new he(this, this._series, this
|
|
._model, p);
|
|
else if (Object(x.isCharsPlot)(i)) l = new me(this, this._series, this
|
|
._model, p);
|
|
else if (Object(x.isArrowsPlot)(i)) l = new we(this, this._series, this
|
|
._model, p);
|
|
else if (Object(x.isOhlcPlot)(i)) {
|
|
const e = i.target;
|
|
if (r.has(e)) continue;
|
|
if (r.add(e), et(n, t)) l = new xe(this, this._series, this._model,
|
|
e);
|
|
else {
|
|
if (!tt(n, t)) {
|
|
Ze.logError(`plot ${i.id} looks to be invalid`);
|
|
continue
|
|
}
|
|
l = new Ie(this, this._series, this._model, e)
|
|
}
|
|
u = this.createPriceAxisView(e), h = new Me.PanePriceAxisView(u,
|
|
this, this._model), p = e, _ = n.ohlcPlots
|
|
} else u = this.createPriceAxisView(p), d = this
|
|
.createPriceLineAxisView(p), l = new Oe.a(this, this._series, this
|
|
._model, p), this.properties().styles[p].trackPrice.value() && (
|
|
c = new Ee(this, p)), h = new Me.PanePriceAxisView(u, this, this
|
|
._model);
|
|
const m = o ? Object(s.ensureDefined)(null === (e = null == _ ? void 0 :
|
|
_[p]) || void 0 === e ? void 0 : e.zorder) : a.size;
|
|
it(m, a);
|
|
const f = {
|
|
paneViews: [l],
|
|
labelView: h,
|
|
priceAxisView: u,
|
|
priceLineAxisView: d
|
|
};
|
|
void 0 !== c && f.paneViews.push(c), a.set(m, f)
|
|
}(null !== (i = null === (t = this._metaInfo) || void 0 === t ? void 0 : t
|
|
.bands) && void 0 !== i ? i : []).forEach((e, t) => {
|
|
const i = this._properties.bands[t];
|
|
if (i && i.visible.value()) {
|
|
const t = new ze(i, this),
|
|
r = o ? Object(s.ensureDefined)(e.zorder) : a.size;
|
|
it(r, a), a.set(r, {
|
|
paneViews: [t]
|
|
})
|
|
}
|
|
}), this._properties.bandsBackground && (Object(s.assert)(!o,
|
|
"'usePlotsZOrder' flag does not supported"), a.set(a.size, {
|
|
paneViews: [new qe(this)]
|
|
}));
|
|
const l = this._paneViews;
|
|
Object(d.createGraphicsPaneViews)(this, this.model()).then(e => {
|
|
for (let t = 0; t < e.length; t++) l.push(e[t]);
|
|
this._model.lightUpdate()
|
|
}), this._properties.areaBackground && (Object(s.assert)(!o,
|
|
"'usePlotsZOrder' flag does not supported"), a.set(a.size, {
|
|
paneViews: [new We(this)]
|
|
}));
|
|
const c = e => n.plots.some(t => Object(x.isColorerPlot)(t) && t.target === e);
|
|
if (this._properties.filledAreas && n.filledAreas)
|
|
for (let e = 0; e < n.filledAreas.length; ++e) {
|
|
const t = n.filledAreas[e],
|
|
i = this._properties.filledAreasStyle[t.id],
|
|
r = c(t.id);
|
|
let l;
|
|
if ("plot_plot" === t.type || r ? l = new He(this, t, i) :
|
|
"hline_hline" === t.type ? l = new Ye(this, t, i) : Ze.logWarn(
|
|
"Unsupported filledArea type: " + t.type), void 0 !== l) {
|
|
const e = o ? Object(s.ensureDefined)(t.zorder) : a.size;
|
|
it(e, a), a.set(e, {
|
|
paneViews: [l]
|
|
})
|
|
}
|
|
}
|
|
const h = Array.from(a.keys()).sort((e, t) => e - t);
|
|
for (let e = 0; e < h.length; e++) {
|
|
const t = Object(s.ensureDefined)(a.get(h[e]));
|
|
this._paneViews.push(...t.paneViews), t.labelView && this._labelPaneViews
|
|
.push(t.labelView), t.priceAxisView && this._priceAxisViewsBase.push(t
|
|
.priceAxisView), t.priceLineAxisView && this._priceLinesAxisViews
|
|
.push(t.priceLineAxisView)
|
|
}
|
|
this._dataWindowView || (this._dataWindowView = new _.StudyDataWindowView(this,
|
|
this._model)), this._legendView || (this._legendView = new f(this, this
|
|
._model)), this._statusView || (this._statusView = new b
|
|
.StudyStatusView(this)), this._concatPriceAxisViews()
|
|
}
|
|
_titleInputs(e, t) {
|
|
return this.inputs(this._titleInputsOptions(e, t))
|
|
}
|
|
_titleInputsOptions(e, t) {
|
|
return {
|
|
symbolsForDisplay: !0,
|
|
skipHiddenInputs: !0,
|
|
skipFakeInputs: !1,
|
|
fakeInputsForDisplay: !0,
|
|
asObject: !1,
|
|
skippedGroups: [],
|
|
noExchanges: e,
|
|
noResolution: t,
|
|
skipColorInputs: !0,
|
|
skipTimeInputs: !0
|
|
}
|
|
}
|
|
_subscribeToSessionId() {
|
|
!this._isSubscribedToSessionId && this.hasSymbolInputs() && (this
|
|
.sessionIdChanged().subscribe(this, this._onSessionIdChanged), this
|
|
._isSubscribedToSessionId = !0)
|
|
}
|
|
_unsubscribeToSessionId() {
|
|
this._isSubscribedToSessionId && (this.sessionIdChanged().unsubscribe(this, this
|
|
._onSessionIdChanged), this._isSubscribedToSessionId = !1)
|
|
}
|
|
_onSessionIdChanged() {
|
|
this.restart(!0)
|
|
}
|
|
_title(e, t, i, s) {
|
|
const r = this._titleInParts(e, t, i, s);
|
|
return this._joinTitlesParts(r)
|
|
}
|
|
_postProcessPriceRange(e) {
|
|
if (e && e.minValue() === e.maxValue() && !this.metaInfo().is_price_study) {
|
|
const t = .005 * e.minValue();
|
|
e = new l.PriceRange(e.minValue() - t, e.maxValue() + t)
|
|
}
|
|
const t = this.priceScale();
|
|
return t && t.isLog() && e ? new l.PriceRange(t.priceToLogical(e.minValue()), t
|
|
.priceToLogical(e.maxValue())) : e
|
|
}
|
|
_joinTitlesParts(e) {
|
|
const t = e[1] ? e[1].join(", ") : "";
|
|
return e[0] + (t.length > 0 ? " (" + t + ")" : "")
|
|
}
|
|
_titleInParts(e, t, i, s) {
|
|
let r = "";
|
|
r = e ? this.metaInfo().shortDescription || this._properties.shortDescription &&
|
|
this._properties.shortDescription.value() || "Study" : this.metaInfo()
|
|
.description || this._properties.description && this._properties.description
|
|
.value() || "Study", t = t || {};
|
|
const n = [window.t(r, {
|
|
context: "study"
|
|
})];
|
|
let o = [];
|
|
if (!i) {
|
|
const i = this._getMTFResolutionInputTitle();
|
|
null !== i && i.length > 0 && n.push(i);
|
|
const r = this.metaInfo(),
|
|
a = this._titleInputs(s, !0) || [];
|
|
if (a.length > 0) {
|
|
const i = {};
|
|
if (this._isChildStudy)
|
|
for (let t = 0; t < r.inputs.length; ++t) {
|
|
const n = r.inputs[t];
|
|
if (!u.a.isSourceInput(n)) continue;
|
|
const o = n.id,
|
|
a = this._properties.inputs[o].value();
|
|
if (a.indexOf("$") >= 0 && this._source) {
|
|
const t = this._source.metaInfo(),
|
|
r = this._source.title(e, {}, !0, s);
|
|
if (1 === t.plots.length) i[a] = r;
|
|
else {
|
|
const e = a.split("$")[1],
|
|
s = t.plots[parseInt(e)].id,
|
|
n = t.styles && t.styles[s],
|
|
o = n && n.title || s;
|
|
i[a] = r + ": " + o
|
|
}
|
|
}
|
|
break
|
|
}
|
|
o = a.map(e => {
|
|
let s = Object(P.isNumber)(e) ? this._numericFormatter
|
|
.format(e) : i && i[e.toString()] || e.toString();
|
|
return t && t[s.toString()] && (s = t[s.toString()]), s
|
|
})
|
|
}
|
|
}
|
|
return [n.join(" · "), o]
|
|
}
|
|
_getMTFResolutionInputTitle() {
|
|
const e = this.metaInfo();
|
|
for (let t = 0; t < e.inputs.length; t++) {
|
|
const i = e.inputs[t];
|
|
if ("resolution" === i.type && i.isMTFResolution) return this._properties
|
|
.inputs[i.id].value()
|
|
}
|
|
return null
|
|
}
|
|
isHibernateAllowed() {
|
|
return !this.hasChildren()
|
|
}
|
|
_getSymbolForResolve(e) {
|
|
return this.getSymbolString(this._getSymbolForApi(e))
|
|
}
|
|
_allSymbolsAreResolved() {
|
|
const e = this.metaInfo(),
|
|
t = [];
|
|
let i = !1;
|
|
for (let s = 0; s < e.inputs.length; s++)
|
|
if ("symbol" === e.inputs[s].type) {
|
|
const r = e.inputs[s].id,
|
|
n = this._properties.inputs[r].value(),
|
|
o = this._getSymbolForResolve(n);
|
|
if ("" !== o)
|
|
if (this._resolvedSymbols[o]) i = !0;
|
|
else {
|
|
const e = this._resolveSymbol(o, n);
|
|
t.push(e)
|
|
}
|
|
} if (0 === t.length) {
|
|
const e = Promise.resolve();
|
|
return i ? e.then(() => this._symbolsResolved.fire()) : e
|
|
}
|
|
return Promise.all(t).catch(e => (this._setStatus({
|
|
type: Ke.StudyStatusType.Error,
|
|
errorDescription: {
|
|
error: Xe
|
|
}
|
|
}), this.stop(!0), this._model.updateSource(this), Promise.reject(
|
|
"Invalid symbol, " + e))).then(() => {
|
|
null !== this._studyId && this.stop(!0), this.start(!0),
|
|
this._symbolsResolved.fire(), this._recheckLineToolsActuality()
|
|
})
|
|
}
|
|
_getSymbolForApi(e) {
|
|
return e
|
|
}
|
|
_resolveSymbol(e, t) {
|
|
if ("" === e) return Promise.resolve();
|
|
let i = this._pendingResolveSymbols.get(e);
|
|
return void 0 !== i || (i = new Promise((i, s) => {
|
|
this._chartApi.resolveSymbol(Object(S.makeNextSymbolId)(), e,
|
|
r => {
|
|
switch (this._pendingResolveSymbols.delete(e), r
|
|
.method) {
|
|
case "symbol_resolved":
|
|
this._setStatus({
|
|
type: Ke.StudyStatusType
|
|
.Undefined
|
|
}), this._resolvedSymbols[e] = r.params[
|
|
1], this._resolvedSymbolsByInput[
|
|
t] = r.params[1], this
|
|
._onSymbolResolved(e, t, r.params[1]),
|
|
this.invalidateTitleCache(!0), i();
|
|
break;
|
|
case "symbol_error":
|
|
if (this._setStatus({
|
|
type: Ke.StudyStatusType.Error,
|
|
errorDescription: {
|
|
error: r.params[1]
|
|
}
|
|
}), r.params[1] === y
|
|
.permissionDenied && r.params[2])
|
|
switch (r.params[2]) {
|
|
case y
|
|
.SymbolErrorPermissionDeniedReason
|
|
.Symbol:
|
|
if (r.params[3])
|
|
return void this
|
|
._resolveSymbol(r
|
|
.params[3], t).then(
|
|
i);
|
|
break;
|
|
default:
|
|
return void this._resolveSymbol(
|
|
r.params[2], t).then(i)
|
|
}
|
|
0, s()
|
|
}
|
|
})
|
|
}), this._pendingResolveSymbols.set(e, i)), i
|
|
}
|
|
_recheckLineToolsActuality() {
|
|
const e = this._model.paneForSource(this);
|
|
null !== e && e.sourcesByGroup().lineSourcesForAllSymbols().forEach(e => {
|
|
e.ownerSource() === this && e.calcIsActualSymbol()
|
|
})
|
|
}
|
|
_getSymbolObject(e) {
|
|
const t = {
|
|
symbol: e
|
|
};
|
|
return t.session = this.sessionId(), t
|
|
}
|
|
_onSymbolResolved(e, t, i) {
|
|
0
|
|
}
|
|
_setStatus(e) {
|
|
this._status = e, this._statusView && this._statusView.update(), this._model
|
|
.updateSource(this), this._statusChanged.fire(e)
|
|
}
|
|
_bandsFirstValue(e) {
|
|
const t = Object(s.ensureNotNull)(this._metaInfo);
|
|
if (!t.bands) return null;
|
|
for (let i = 0; i < t.bands.length; i++) {
|
|
const t = this.properties().childs().bands.childs()[i];
|
|
if (t.childs().visible.value()) {
|
|
const i = t.childs().value.value();
|
|
if (e && 0 === i) continue;
|
|
return i
|
|
}
|
|
}
|
|
return null
|
|
}
|
|
_prepareInputs(e) {
|
|
Object(s.assert)(!!e, "options not set");
|
|
const t = this.metaInfo(),
|
|
i = {},
|
|
r = e.allowedInputTypes ? new Set(e.allowedInputTypes) : null;
|
|
for (let s = 0; s < t.inputs.length; s++) {
|
|
const n = t.inputs[s];
|
|
if (null !== r && !r.has(n.type)) continue;
|
|
if (n.isFake && e.skipFakeInputs) continue;
|
|
if (n.isMTFResolution && e.noResolution) continue;
|
|
if (n.isHidden && e.skipHiddenInputs) continue;
|
|
if ("bool" === n.type && e.skipHiddenInputs && e.skipBooleanInputs)
|
|
continue;
|
|
if ("color" === n.type && e.skipHiddenInputs && e.skipColorInputs) continue;
|
|
if ("time" === n.type && e.skipHiddenInputs && e.skipTimeInputs) continue;
|
|
if (void 0 !== n.groupId && -1 !== e.skippedGroups.indexOf(n.groupId))
|
|
continue;
|
|
if (-1 !== e.skippedInputs.indexOf(n.id)) continue;
|
|
const o = this._prepareInput(n, e);
|
|
"symbol" === n.type && e.skipOptionalEmptySymbolInputs && "" === o || (i[n
|
|
.id] = Object(P.clone)(o))
|
|
}
|
|
return i
|
|
}
|
|
_lastNonEmptyPlotRow(e) {
|
|
var t;
|
|
if (!Object(P.isInteger)(e)) return Ze.logDebug(
|
|
"_lastNonEmptyPlotRow: incorrect plotIndex"), null;
|
|
let i = null !== (t = this._lastNonEmptyPlotRowCache[e]) && void 0 !== t ? t :
|
|
null;
|
|
if (null !== i) return i;
|
|
return i = this.data().findLast((t, i) => void 0 !== i[e], 1e3), null === i ?
|
|
null : (this._lastNonEmptyPlotRowCache[e] = i, i)
|
|
}
|
|
_applyPlotToPrecalculatedAutoscaleInfo(e, t, i, s) {
|
|
const r = s.id,
|
|
n = this.properties().styles[r],
|
|
o = Object(x.isShapesPlot)(s) || Object(x.isCharsPlot)(s);
|
|
i.useMainSeriesRange = i.useMainSeriesRange || Object(x.isArrowsPlot)(s);
|
|
let a = Object(x.isLinePlot)(s) || Object(x.isOhlcPlot)(s);
|
|
if (o) {
|
|
const e = n.location.value(),
|
|
t = [p.c.Absolute, p.c.Top, p.c.Bottom].indexOf(e) < 0;
|
|
i.useMainSeriesRange = i.useMainSeriesRange || o && t, a = a || e === p.c
|
|
.Absolute
|
|
}
|
|
if (!a) return i;
|
|
const l = {
|
|
name: r,
|
|
offset: this.offset(r)
|
|
},
|
|
h = n.plottype.value();
|
|
if (!this.properties().skipHistogramBaseOnAutoScale && [x.LineStudyPlotStyle
|
|
.Histogram, x.LineStudyPlotStyle.Columns, x.LineStudyPlotStyle.Area
|
|
].indexOf(h) >= 0) {
|
|
const s = n.histogramBase.value(),
|
|
r = this.data().minMaxOnRangeCached(e, t, [l]);
|
|
return Object(P.isNumber)(s) && null !== r && (i.baseValueMinMax = Object(c
|
|
.mergeMinMax)(i.baseValueMinMax, {
|
|
min: s,
|
|
max: s
|
|
}), i.baseValueMinMax = Object(c.mergeMinMax)(i.baseValueMinMax, r)), i
|
|
}
|
|
return i.fields.push(l), i
|
|
}
|
|
_fillPrecalculatedAutoscaleInfo(e, t) {
|
|
return Object(s.ensureNotNull)(this._metaInfo).plots.filter(e => !Object(x
|
|
.isPlotWithTechnicalValues)(e)).filter(e => {
|
|
const t = e.id;
|
|
let i;
|
|
if (Object(x.isOhlcPlot)(e)) {
|
|
const t = e.target;
|
|
i = this.properties().ohlcPlots[t]
|
|
} else i = this.properties().styles[t];
|
|
return i.visible.value()
|
|
}).reduce((i, s) => this._applyPlotToPrecalculatedAutoscaleInfo(e, t, i,
|
|
s), {
|
|
fields: [],
|
|
useMainSeriesRange: !1,
|
|
baseValueMinMax: null
|
|
})
|
|
}
|
|
_buildInputs(e) {
|
|
Object(s.assert)(!!e, "options not set");
|
|
let t = {};
|
|
try {
|
|
t = this._prepareInputs(e)
|
|
} catch (e) {
|
|
Ze.logWarn("Failed to prepare study inputs: " + e)
|
|
}
|
|
if (e.asObject) {
|
|
const e = {};
|
|
return Object.keys(t).forEach(i => {
|
|
null != t[i] && (e[i] = t[i])
|
|
}), e
|
|
} {
|
|
const e = [];
|
|
return Object.keys(t).forEach(i => {
|
|
null != t[i] && e.push(t[i])
|
|
}), e
|
|
}
|
|
}
|
|
_prepareInput(e, t) {
|
|
const i = this._prepareInputValue(e, t);
|
|
return !e.isFake || t.fakeInputsForDisplay || t.onlyAtomValues ? i : {
|
|
v: i,
|
|
f: !0,
|
|
t: e.type
|
|
}
|
|
}
|
|
_calcIsActualInterval() {
|
|
const e = this._isActualInterval;
|
|
this._isActualInterval = Object(Je.a)(this._series.intervalObj(), this
|
|
.properties().intervalsVisibilities), e !== this._isActualInterval && (
|
|
this._onIsActualIntervalChange.fire(), this._visibleChanged(), this
|
|
.processHibernate())
|
|
}
|
|
_visibleChanged() {
|
|
this._series.invalidateBarColorerCache()
|
|
}
|
|
_getNonPriceParent() {
|
|
const e = this.source();
|
|
if (e instanceof st) {
|
|
const t = e.metaInfo();
|
|
return t.is_price_study && "Compare@tv-basicstudies" !== t.id ? e
|
|
._getNonPriceParent() : e
|
|
}
|
|
return null
|
|
}
|
|
}
|
|
},
|
|
IiTo: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("jCNj"),
|
|
r = i("LxhU"),
|
|
n = i("Hr11"),
|
|
o = i("ZmuQ"),
|
|
a = i("E6p6");
|
|
class l extends o.a {
|
|
constructor(e, t) {
|
|
super(), this._sessionStartMs = -Number.MAX_VALUE, this._sessionEndMs = -Number
|
|
.MAX_VALUE, this._periodSec = e, this._session = t
|
|
}
|
|
alignTimeIfPossible(e) {
|
|
const t = this.alignTime(e);
|
|
return isNaN(t) ? e : t
|
|
}
|
|
indexOfBar(e) {
|
|
return e < this._sessionStartMs ? a.SessionStage.PRE_SESSION : e >= this
|
|
._sessionEndMs ? a.SessionStage.POST_SESSION : Object(n.toInt)(s
|
|
.time_seconds_diff(e, this._sessionStartMs) / this._periodSec)
|
|
}
|
|
startOfBar(e) {
|
|
if (e === a.SessionStage.PRE_SESSION) {
|
|
const e = s.get_cal_from_unix_timestamp_ms(this._session.timezone, this
|
|
._sessionStartMs - 1),
|
|
t = this._session.spec.alignToNearestSessionEnd(e, -1);
|
|
return s.cal_to_utc(this._session.timezone, t)
|
|
}
|
|
if (e === a.SessionStage.POST_SESSION) return this._sessionEndMs;
|
|
if (e < 0) throw new Error("Negative offset is not supported");
|
|
return this._sessionStartMs + s.time_seconds(this._periodSec * e)
|
|
}
|
|
endOfBar(e) {
|
|
if (e < 0) throw new Error("Index cannot be negative");
|
|
const t = this.startOfBar(e) + 1e3 * this._periodSec;
|
|
return t > this._sessionEndMs ? this._sessionEndMs : t
|
|
}
|
|
isLastBar(e, t) {
|
|
return t >= this._sessionStartMs + s.time_seconds(this._periodSec * (e + 1) - 1)
|
|
}
|
|
moveTo(e) {
|
|
const t = this._session.timezone,
|
|
i = s.utc_to_cal(t, e),
|
|
r = this._session.spec.alignToSessionStart(i);
|
|
this._sessionStartMs = s.cal_to_utc(t, i), s.add_minutes(i, r), this
|
|
._sessionEndMs = s.cal_to_utc(t, i)
|
|
}
|
|
indexOfLastBarInSession() {
|
|
return Object(n.toInt)((this._sessionEndMs - 1 - this._sessionStartMs) / 1e3 /
|
|
this._periodSec)
|
|
}
|
|
moveNext() {
|
|
this.moveTo(this._sessionEndMs)
|
|
}
|
|
}
|
|
var c = i("OBgQ");
|
|
|
|
function h(e, t) {
|
|
const i = s.clone(t),
|
|
r = e.businessDaysToCalendarDays(i, 1);
|
|
r > 1 && s.add_date(i, r - 1);
|
|
const n = e.leftBorderOfDailyBar(i);
|
|
if (null === n) throw new Error("Cannot calculate left border of daily bar");
|
|
return s.cal_to_utc(s.get_timezone(e.timezone()), n)
|
|
}
|
|
class u extends o.a {
|
|
constructor(e, t, i, s, r = !1) {
|
|
super(), this._periodStart = -Number.MAX_VALUE, this._periodEnd = -Number
|
|
.MAX_VALUE, this._periodLastBarStart = -Number.MAX_VALUE, this
|
|
._periodStartDay = new c.a(0, 0, 0), this._periodEndDay = new c.a(0, 0, 0),
|
|
this._period = i, this._sessionTgt = e, this._builder = s, this
|
|
._useBusinessDays = r, this._sessionSrc = r ? new o.b("Etc/UTC", "24x7") :
|
|
t || e
|
|
}
|
|
builder() {
|
|
return this._builder
|
|
}
|
|
alignTimeIfPossible(e) {
|
|
return this.tradingDayToSessionStart(e)
|
|
}
|
|
tradingDayToSessionStart(e) {
|
|
return this.moveTo(e), this.startOfBar(0)
|
|
}
|
|
indexOfBar(e) {
|
|
if (this._useBusinessDays) {
|
|
const t = c.a.fromCalendar(s.get_cal_from_unix_timestamp_ms(this._sessionSrc
|
|
.timezone, e));
|
|
return t.before(this._periodStartDay) ? a.SessionStage.PRE_SESSION : this
|
|
._periodEndDay.before(t) ? a.SessionStage.POST_SESSION : 0
|
|
}
|
|
return e < this._periodStart ? a.SessionStage.PRE_SESSION : e >= this
|
|
._periodEnd ? a.SessionStage.POST_SESSION : 0
|
|
}
|
|
startOfBar(e) {
|
|
if (e === a.SessionStage.PRE_SESSION) {
|
|
const e = s.get_cal_from_unix_timestamp_ms(this._sessionTgt.timezone, this
|
|
._periodStart - 1),
|
|
t = this._sessionTgt.spec.alignToNearestSessionEnd(e, -1);
|
|
return s.cal_to_utc(this._sessionTgt.timezone, t) - 1
|
|
}
|
|
return e === a.SessionStage.POST_SESSION || e > 0 ? this._periodEnd : e === a
|
|
.SessionStage.LASTBAR_SESSION ? this._periodLastBarStart : this._periodStart
|
|
}
|
|
moveTo(e) {
|
|
const t = s.get_cal_from_unix_timestamp_ms(this._sessionSrc.timezone, e);
|
|
this._sessionSrc.spec.correctTradingDay(t);
|
|
const i = s.get_year(t),
|
|
r = this._indexOfPeriodInYear(t),
|
|
n = r + this._period,
|
|
o = this._sessionTgt.spec,
|
|
a = this._sessionTgt.timezone,
|
|
l = this._builder.startOfPeriod(a, r, i);
|
|
this._periodStart = h(o, l);
|
|
const u = s.clone(l),
|
|
d = o.businessDaysToCalendarDays(u, 1);
|
|
d > 1 && s.add_date(u, d - 1), this._periodStartDay = c.a.fromCalendar(u);
|
|
const p = this._builder.startOfPeriod(a, n, i);
|
|
this._periodEnd = h(o, p);
|
|
const _ = s.clone(p);
|
|
for (s.add_date(_, -1); o.isCalWeekEnd(_);) s.add_date(_, -1);
|
|
this._periodEndDay = c.a.fromCalendar(_), s.add_date(p, -1),
|
|
function(e, t) {
|
|
for (; e.isCalWeekEnd(t);) s.add_date(t, -1)
|
|
}(this._sessionTgt.spec, p), this._periodLastBarStart = h(o, p), (this
|
|
._periodLastBarStart < this._periodStart || this._periodLastBarStart ===
|
|
this._periodEnd) && (this._periodLastBarStart = this._periodStart)
|
|
}
|
|
endOfBar(e) {
|
|
if (0 !== e) throw new Error("index should be 0");
|
|
return this._periodEnd
|
|
}
|
|
isLastBar(e, t) {
|
|
if (0 !== e) throw new Error("index should be 0");
|
|
return t >= this._periodLastBarStart
|
|
}
|
|
currentRange() {
|
|
return {
|
|
from: this._periodStartDay,
|
|
to: this._periodEndDay
|
|
}
|
|
}
|
|
indexOfBarInYear(e) {
|
|
const t = s.get_cal_from_unix_timestamp_ms(this._sessionSrc.timezone, e),
|
|
i = s.get_year(t),
|
|
r = this._builder.indexOfPeriod(t),
|
|
o = this._sessionTgt.timezone;
|
|
let a = this._builder.startOfPeriod(o, r, i),
|
|
l = h(this._sessionTgt.spec, a);
|
|
return a = s.get_cal_from_unix_timestamp_ms(s.get_timezone("Etc/UTC"), l), i < s
|
|
.get_year(a) ? (a = this._builder.startOfPeriod(o, r - 1, i), l = h(this
|
|
._sessionTgt.spec, a), {
|
|
index: (r - 1) / this._period,
|
|
time: l
|
|
}) : {
|
|
index: Object(n.toInt)(r / this._period),
|
|
time: l
|
|
}
|
|
}
|
|
sessionSrc() {
|
|
return this._sessionSrc
|
|
}
|
|
_indexOfPeriodInYear(e) {
|
|
const t = this._builder.indexOfPeriod(e);
|
|
let i = Object(n.toInt)(t / this._period) * this._period;
|
|
return -1 === t && (i = -this._period), i
|
|
}
|
|
}
|
|
|
|
function d(e, t) {
|
|
const i = s.get_day_of_week(t) - e.firstDayOfWeek();
|
|
return i < 0 ? i + 7 : i
|
|
}
|
|
|
|
function p(e, t) {
|
|
const i = s.get_day_of_year(t) - 1;
|
|
let r = d(e, t) - i % 7;
|
|
return 0 === r ? Object(n.toInt)(i / 7) : (r >= 0 && (r -= 7), Object(n.toInt)((r + i) / 7))
|
|
}
|
|
class _ {
|
|
indexOfPeriod(e) {
|
|
return s.get_day_of_year(e) - 1
|
|
}
|
|
startOfPeriod(e, t, i) {
|
|
const r = s.days_per_year(i);
|
|
return s.get_cal(s.get_timezone("Etc/UTC"), i, s.JANUARY, 1 + Math.min(t, r))
|
|
}
|
|
}
|
|
class m extends _ {
|
|
constructor(e) {
|
|
super(), this._sessionsSpec = e
|
|
}
|
|
indexOfPeriod(e) {
|
|
return super.indexOfPeriod(e) - function(e, t) {
|
|
const i = p(e, t),
|
|
r = s.get_cal(s.get_timezone("Etc/UTC"), s.get_year(t), s.JANUARY, 1);
|
|
s.add_date(r, 7 * i);
|
|
const n = i * e.weekEndsCount() + e.holidaysFromYearStart(r),
|
|
o = s.get_day_of_year(t) - s.get_day_of_year(r);
|
|
return n + o - e.calendarDaysToBusinessDays(r, o)
|
|
}(this._sessionsSpec, e)
|
|
}
|
|
startOfPeriod(e, t, i) {
|
|
const r = 7 - this._sessionsSpec.weekEndsCount(),
|
|
o = Math.max(0, Object(n.toInt)(t / r) - 1),
|
|
a = s.get_cal(s.get_timezone("Etc/UTC"), i, s.JANUARY, 1),
|
|
l = s.get_days_per_year(a);
|
|
if (s.add_date(a, 7 * o), (t -= r * o - this._sessionsSpec.holidaysFromYearStart(
|
|
a)) > 0) {
|
|
const e = this._sessionsSpec.businessDaysToCalendarDays(a, t);
|
|
s.add_date(a, e)
|
|
}
|
|
let c = s.get_day_of_year(a) - 1;
|
|
return i < s.get_year(a) && (c += l), super.startOfPeriod(e, c, i)
|
|
}
|
|
}
|
|
class f {
|
|
constructor(e) {
|
|
this._builder = null, this._initialized = !1, this._session = e
|
|
}
|
|
indexOfPeriod(e) {
|
|
return this._getBuilder().indexOfPeriod(e)
|
|
}
|
|
startOfPeriod(e, t, i) {
|
|
return this._getBuilder().startOfPeriod(e, t, i)
|
|
}
|
|
_getBuilder() {
|
|
return null !== this._builder && this._initialized || (this._builder = this._session
|
|
.spec.hasWeekEnds() ? new m(this._session.spec) : new _, this
|
|
._initialized = !0), this._builder
|
|
}
|
|
}
|
|
class g {
|
|
constructor(e) {
|
|
this._session = e
|
|
}
|
|
indexOfPeriod(e) {
|
|
let t = p(this._session.spec, e);
|
|
if (0 === t) {
|
|
const i = s.get_timezone(this._session.spec.timezone());
|
|
e < this.startOfPeriod(i, 0, s.get_year(e)) && (t = -1)
|
|
}
|
|
return t
|
|
}
|
|
startOfPeriod(e, t, i) {
|
|
if (t < 0) {
|
|
i--;
|
|
const r = s.get_cal(s.get_timezone("Etc/UTC"), i, s.DECEMBER, 31, 23, 59, 59),
|
|
o = this.indexOfPeriod(r),
|
|
a = -1 * t,
|
|
l = Object(n.toInt)(o / a) * a;
|
|
return this.startOfPeriod(e, l, i)
|
|
}
|
|
const r = s.get_cal(s.get_timezone("Etc/UTC"), i, s.JANUARY, 1),
|
|
o = d(this._session.spec, r),
|
|
a = 0 === o ? 7 * t : 7 * (t + 1) - o;
|
|
return a > s.get_days_per_year(r) ? this.startOfPeriod(e, 0, i + 1) : (s.add_date(r,
|
|
a), r)
|
|
}
|
|
}
|
|
class b {
|
|
indexOfPeriod(e) {
|
|
return s.get_month(e)
|
|
}
|
|
startOfPeriod(e, t, i) {
|
|
if (t < 0) {
|
|
const e = Object(n.toInt)((11 - t) / 12);
|
|
i -= e, t += 12 * e
|
|
} else t > s.DECEMBER && (i++, t = s.JANUARY);
|
|
return s.get_cal(s.get_timezone("Etc/UTC"), i, t, 1)
|
|
}
|
|
}
|
|
|
|
function v(e, t, i, s = !1) {
|
|
const n = r.Interval.parse(e),
|
|
o = n.multiplier();
|
|
return n.isMinutes() ? new l(60 * o, t) : n.isSeconds() ? new l(o, t) : n.isTicks() ? new l(
|
|
1, t) : n.isRange() ? new l(60 * o, t) : new u(t, i, o, function(e, t) {
|
|
switch (e) {
|
|
case r.ResolutionKind.Days:
|
|
return new f(t);
|
|
case r.ResolutionKind.Weeks:
|
|
return new g(t);
|
|
case r.ResolutionKind.Months:
|
|
return new b
|
|
}
|
|
throw new Error("Unknown dwm resolution: " + e)
|
|
}(n.kind(), t), s)
|
|
}
|
|
|
|
function S(e, t, i, s, r, n, o) {
|
|
return w(e, t, i, s, r, n, o, 0)
|
|
}
|
|
|
|
function y(e, t, i, s, r, n, o) {
|
|
return w(e, t, i, s, r, n, o, 1)
|
|
}
|
|
|
|
function w(e, t, i, s, n, a, l, c) {
|
|
const h = r.Interval.parse(n + s);
|
|
if (h.isMonths()) {
|
|
const e = new Date(l);
|
|
return 0 === c && e.setUTCDate(1),
|
|
function(e, t) {
|
|
T(e, Math.floor(t / 12));
|
|
let i = e.getUTCMonth() - t % 12;
|
|
i < 0 && (T(e, 1), i += 12);
|
|
e.setUTCMonth(i);
|
|
for (; e.getUTCMonth() !== i;) I(e, 1)
|
|
}(e, a * h.multiplier()), e.getTime()
|
|
}
|
|
const u = new o.b("Etc/UTC", e, t, i),
|
|
d = h.inMilliseconds(),
|
|
p = h.isDWM();
|
|
let _;
|
|
_ = p ? 864e5 : 60 * u.spec.maxTradingDayLength() * 1e3;
|
|
let m = 0;
|
|
m = h.isWeeks() ? 7 : 7 - u.spec.weekEndsCount();
|
|
const f = _ / d,
|
|
g = m * f;
|
|
let b;
|
|
if (a < g) b = a / f;
|
|
else {
|
|
b = 7 * (a / g)
|
|
}
|
|
return p && (b = Math.floor(b)), l - 864e5 * b
|
|
}
|
|
|
|
function P(e, t, i, s, n, a, l) {
|
|
const c = r.Interval.parse(n + s);
|
|
if (c.isMonths()) {
|
|
const e = new Date(a),
|
|
t = new Date(l);
|
|
let i = 12 * (t.getUTCFullYear() - e.getUTCFullYear());
|
|
return i += t.getUTCMonth() - e.getUTCMonth(), Math.ceil(i / c.multiplier())
|
|
}
|
|
const h = new o.b("Etc/UTC", e, t, i),
|
|
u = c.inMilliseconds();
|
|
let d;
|
|
d = c.isDWM() ? 864e5 : 60 * h.spec.maxTradingDayLength() * 1e3;
|
|
let p = 0;
|
|
p = c.isWeeks() ? 7 : 7 - h.spec.weekEndsCount();
|
|
const _ = l - a,
|
|
m = d / u,
|
|
f = p * m;
|
|
let g = _ / 864e5 * m;
|
|
return g >= f && (g = _ / 6048e5 * f), Math.ceil(g)
|
|
}
|
|
|
|
function C(e, t) {
|
|
const i = s.clone(t);
|
|
return e.alignToSessionStart(i), s.cal_to_utc(s.get_timezone(e.timezone()), i)
|
|
}
|
|
|
|
function x(e, t) {
|
|
const i = s.utc_to_cal(t.timezone, +e);
|
|
let r = s.get_day_of_week(i),
|
|
n = s.get_minutes_from_midnight(i);
|
|
const o = t.spec.findSession(t.spec.getWeekIndex(i), r, n).getEntry();
|
|
return o.isOvernight() && n > o.startOffset() + o.length() && r === o.dayOfWeek() - 1 && (
|
|
r++, n -= 1440), r === o.dayOfWeek() && n >= o.startOffset() && n < o
|
|
.startOffset() + o.length()
|
|
}
|
|
|
|
function T(e, t) {
|
|
const i = e.getUTCMonth();
|
|
e.setUTCFullYear(e.getUTCFullYear() - t), e.getUTCMonth() !== i && I(e, 1)
|
|
}
|
|
|
|
function I(e, t) {
|
|
e.setTime(e.getTime() - 864e5 * t)
|
|
}
|
|
i.d(t, "newBarBuilder", (function() {
|
|
return v
|
|
})), i.d(t, "alignPeriodsBackForDataRequest", (function() {
|
|
return S
|
|
})), i.d(t, "alignPeriodsBackForVisibleRange", (function() {
|
|
return y
|
|
})), i.d(t, "getPeriodsBetweenDates", (function() {
|
|
return P
|
|
})), i.d(t, "alignExchangeTimeToSessionStartAndReturnUTC", (function() {
|
|
return C
|
|
})), i.d(t, "isTradingNow", (function() {
|
|
return x
|
|
})), i.d(t, "SessionInfo", (function() {
|
|
return o.b
|
|
}))
|
|
},
|
|
IjC5: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "RectangleRenderer", (function() {
|
|
return u
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("aO4+"),
|
|
n = i("f6yo"),
|
|
o = i("GEp6"),
|
|
a = i("VdBB"),
|
|
l = i("Tmoa"),
|
|
c = i("8Uy/"),
|
|
h = i("gAom");
|
|
class u {
|
|
constructor(e, t, i) {
|
|
this._data = null, this._hitTestResult = e || new a.HitTestResult(a.HitTestResult
|
|
.MOVEPOINT),
|
|
this._backHitTestResult = t || new a.HitTestResult(a.HitTestResult
|
|
.MOVEPOINT_BACKGROUND), this._forceOverrideTransparency = Boolean(i)
|
|
}
|
|
setData(e) {
|
|
this._data = e
|
|
}
|
|
hitTest(e, t) {
|
|
if (null === this._data || this._data.points.length < 2 || this._data.nohittest)
|
|
return null;
|
|
const [i, s] = this._getPointsInPhysicalSpace(t), n = new r.Point(s.x, i.y), a =
|
|
new r.Point(i.x, s.y), l = new r.Point(e.x * t.pixelRatio, e.y * t.pixelRatio),
|
|
c = this._extendAndHitTestLineSegment(l, i, n, t);
|
|
if (null !== c) return c;
|
|
const h = this._extendAndHitTestLineSegment(l, a, s, t);
|
|
if (null !== h) return h;
|
|
let u = Object(o.distanceToSegment)(n, s, l);
|
|
return u.distance <= 3 ? this._hitTestResult : (u = Object(o.distanceToSegment)(i,
|
|
a, l), u.distance <= 3 ? this._hitTestResult : this._data
|
|
.fillBackground ? this._hitTestBackground(l, i, s, t) : null)
|
|
}
|
|
getColor() {
|
|
const e = Object(s.ensure)(this._data);
|
|
return void 0 === e.transparency ? e.backcolor : Object(l.generateColor)(e
|
|
.backcolor, e.transparency, this._forceOverrideTransparency)
|
|
}
|
|
draw(e, t) {
|
|
if (null === this._data || this._data.points.length < 2 || this._data.linewidth <=
|
|
0 && !this._data.fillBackground) return;
|
|
e.save();
|
|
const [i, s] = this._getPointsInPhysicalSpace(t), r = this._data.linewidth ? Math
|
|
.max(1, Math.floor(this._data.linewidth * t.pixelRatio)) : 0, n = this._data
|
|
.fillBackground ? this.getColor() : void 0, o = Math.max(1, Math.floor(t
|
|
.pixelRatio));
|
|
Object(h.fillRectWithBorder)(e, i.x, i.y, s.x, s.y, n, this._data.color, r, c
|
|
.LINESTYLE_SOLID, this._data.extendLeft, this._data.extendRight, "center", t
|
|
.physicalWidth, this._data.includeRightEdge && 1 === o ? 1 : 0), e.restore()
|
|
}
|
|
_getPointsInPhysicalSpace(e, t = 0) {
|
|
const i = Object(s.ensureNotNull)(this._data),
|
|
[n, o] = i.points,
|
|
a = e.pixelRatio,
|
|
l = Math.min(n.x, o.x),
|
|
c = Math.max(n.x, o.x),
|
|
h = Math.min(n.y, o.y),
|
|
u = Math.max(n.y, o.y),
|
|
d = Math.round(l * a) + t,
|
|
p = Math.round(c * a) + t,
|
|
_ = Math.round(h * a) + t,
|
|
m = Math.round(u * a) + t;
|
|
return [new r.Point(d, _), new r.Point(p, m)]
|
|
}
|
|
_extendAndHitTestLineSegment(e, t, i, s) {
|
|
const r = this._extendAndClipLineSegment(t, i, s);
|
|
if (null !== r) {
|
|
if (Object(o.distanceToSegment)(r[0], r[1], e).distance <= 3) return this
|
|
._hitTestResult
|
|
}
|
|
return null
|
|
}
|
|
_extendAndClipLineSegment(e, t, i) {
|
|
const n = Object(s.ensureNotNull)(this._data);
|
|
if (Object(r.equalPoints)(e, t)) return null;
|
|
const o = i.physicalWidth,
|
|
a = Math.min(e.x, t.x),
|
|
l = Math.max(e.x, t.x),
|
|
c = n.extendLeft ? 0 : Math.max(a, 0),
|
|
h = n.extendRight ? o : Math.min(l, o);
|
|
return c > h || h <= 0 || c >= o ? null : [new r.Point(c, e.y), new r.Point(h, t.y)]
|
|
}
|
|
_hitTestBackground(e, t, i, s) {
|
|
const o = this._extendAndClipLineSegment(t, i, s);
|
|
return null !== o && Object(n.pointInBox)(e, Object(r.box)(o[0], o[1])) ? this
|
|
._backHitTestResult : null
|
|
}
|
|
}
|
|
},
|
|
InMJ: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Ss5c").LineDataSource,
|
|
r = i("Ocx9").DefaultProperty;
|
|
class n extends s {
|
|
constructor(e, t) {
|
|
super(e, t || n.createProperties()), this.version = n.version, i.e("lt-pane-views")
|
|
.then(i.t.bind(null, "gr7S", 7)).then(({
|
|
FlatBottomPaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
pointsCount() {
|
|
return 3
|
|
}
|
|
name() {
|
|
return "Flat Bottom"
|
|
}
|
|
hasEditableCoordinates() {
|
|
return !1
|
|
}
|
|
addPoint(e, t) {
|
|
return t && t.shift() && 2 === this.points().length && this._snapPoint45Degree(e,
|
|
this.points()[this.points().length - 2]), s.prototype.addPoint.call(this, e)
|
|
}
|
|
setLastPoint(e, t) {
|
|
return t && t.shift() && 2 === this.points().length && this._snapPoint45Degree(e,
|
|
this.points()[this.points().length - 2]), s.prototype.setLastPoint.call(
|
|
this, e)
|
|
}
|
|
setPoint(e, t, i) {
|
|
if (i && i.shift() && 1 === e) {
|
|
this._snapPoint45Degree(t, this.points()[0])
|
|
}
|
|
if (2 === e) this._points[1].index = t.index;
|
|
else if (3 === e) return this._points[0].index = t.index, this._points[2].price = t
|
|
.price, void this.normalizePoints();
|
|
super.setPoint(e, t)
|
|
}
|
|
getPoint(e) {
|
|
return e < 3 ? s.prototype.getPoint.call(this, e) : 3 === e ? {
|
|
index: this._points[0].index,
|
|
price: this._points[2].price
|
|
} : void 0
|
|
}
|
|
canHasAlert() {
|
|
return !0
|
|
}
|
|
_getAlertPlots() {
|
|
var e = this._points[0],
|
|
t = this._points[1],
|
|
i = [];
|
|
e.index <= t.index ? (i.push(e), i.push(t)) : (i.push(t), i.push(e));
|
|
var s = this._points[2];
|
|
s.time = t.time, s.index = t.index;
|
|
var r, n, o, a, l = {
|
|
price: s.price,
|
|
time: e.time,
|
|
index: e.index
|
|
},
|
|
c = [];
|
|
s.index <= l.index ? (c.push(s), c.push(l)) : (c.push(l), c.push(s)), i[0].price >
|
|
c[0].price ? (r = i, n = c) : c[0].price > i[0].price || c[1].price > i[1]
|
|
.price ? (r = c, n = i) : (r = i, n = c);
|
|
var h = this.properties().extendLeft.value(),
|
|
u = this.properties().extendRight.value();
|
|
return e.index <= t.index ? (o = h, a = u) : (o = u, a = h), [this
|
|
._linePointsToAlertPlot(r, "Upper", o, a), this._linePointsToAlertPlot(n,
|
|
"Lower", h, a)
|
|
]
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "vm8R")))
|
|
.GeneralTrendFiguresDefinitionsViewModel
|
|
}
|
|
static createProperties(e) {
|
|
var t = new r("linetoolflatbottom", e);
|
|
return n._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
s._configureProperties(e)
|
|
}
|
|
}
|
|
n.version = 1, t.LineToolFlatBottom = n
|
|
},
|
|
J2xC: function(e, t, i) {
|
|
e.exports = {
|
|
"css-value-header-toolbar-height": "38px"
|
|
}
|
|
},
|
|
JT5O: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "StudyMarket", (function() {
|
|
return n
|
|
}));
|
|
var s = i("hY0g"),
|
|
r = i.n(s);
|
|
class n {
|
|
constructor(e, t) {
|
|
this._visibility = new r.a(!1), this._dialogPromise = null, this._dialog = null,
|
|
this._chartWidgetCollection = e, this._options = t
|
|
}
|
|
visible() {
|
|
return this._visibility.readonly()
|
|
}
|
|
show(e) {
|
|
var t;
|
|
null === this._dialog && this._requestDialog(e), null === (t = this._dialog) ||
|
|
void 0 === t || t.open(e, void 0)
|
|
}
|
|
hide() {
|
|
var e;
|
|
null === (e = this._dialog) || void 0 === e || e.hide()
|
|
}
|
|
resetAllPages() {
|
|
var e;
|
|
null === (e = this._dialog) || void 0 === e || e.resetAllStudies()
|
|
}
|
|
_requestDialog(e) {
|
|
if (null === this._dialogPromise) {
|
|
let t;
|
|
t = Promise.all([i.e("react"), i.e(1), i.e(3), i.e(4), i.e(8), i.e(9), i.e(17),
|
|
i.e(19), i.e(24), i.e(68), i.e(78), i.e(0), i.e(2), i.e(18), i.e(
|
|
"study-market")
|
|
]).then(i.bind(null, "zbLM")).then(e => new e.IndicatorsLibraryContainer(
|
|
this._chartWidgetCollection, this._options)), this._dialogPromise = t
|
|
.then(t => {
|
|
this._dialog = t, this._dialog.visible().subscribe(e => {
|
|
this._visibility.setValue(e)
|
|
}), this._dialog.open(e)
|
|
})
|
|
}
|
|
return this._dialogPromise
|
|
}
|
|
}
|
|
},
|
|
JWMC: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "trackEvent", (function() {
|
|
return l
|
|
}));
|
|
i("bSeV");
|
|
var s = i("FQhm"),
|
|
r = i("Kxc7"),
|
|
n = i("txPx");
|
|
const o = Object(n.getLogger)("Common.TrackEvent"),
|
|
a = [/Study_(Drawing)_(.*)/, /(Study)_(.*)@tv-basicstudies/, /(Study)_(.*)/,
|
|
/(Chart Style) (.*)/
|
|
],
|
|
l = (e, t, i) => {
|
|
if (r.enabled("charting_library_base")) return void((e, t, i) => {
|
|
t = t || e || i || "";
|
|
let r = "";
|
|
for (let e = 0; e < a.length; e++) {
|
|
const i = t.match(a[e]);
|
|
if (i && 3 === i.length) {
|
|
t = i[1], r = i[2];
|
|
break
|
|
}
|
|
}
|
|
Object(s.emit)(t.toLowerCase().replace(" ", "_"), {
|
|
category: e,
|
|
label: i,
|
|
value: r
|
|
})
|
|
})(e, t, i);
|
|
let n = (e ? e + ":" : "") + t;
|
|
i && (n += " " + i), o.logNormal(n), r.enabled("widget") || !window._UNIT_TESTS &&
|
|
window.gtag && window.gtag("event", t, {
|
|
event_category: e,
|
|
event_label: i
|
|
})
|
|
};
|
|
"undefined" != typeof window && (window.TradingView = window.TradingView || {}, window
|
|
.TradingView.trackEvent = l)
|
|
},
|
|
JcHK: function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e) {
|
|
return e.getAll().some(e => e.isInitialized())
|
|
}
|
|
|
|
function r(e, t) {
|
|
const i = e.getAll(),
|
|
s = () => {
|
|
t(), i.forEach(e => {
|
|
e.chartWidgetInitialized.unsubscribe(null, s)
|
|
})
|
|
};
|
|
i.forEach(e => {
|
|
e.chartWidgetInitialized.subscribe(null, s, !0)
|
|
})
|
|
}
|
|
i.r(t), i.d(t, "isAnyChartWidgetInitialized", (function() {
|
|
return s
|
|
})), i.d(t, "waitAnyChartWidgetInitialized", (function() {
|
|
return r
|
|
}))
|
|
},
|
|
JjUe: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "OverlayDataWindowView", (function() {
|
|
return h
|
|
}));
|
|
var s = i("ivNn"),
|
|
r = i("4miz"),
|
|
n = i("qFKp"),
|
|
o = i("e92V"),
|
|
a = i("mMWL"),
|
|
l = i("e1Hy");
|
|
const c = n.CheckMobile.any();
|
|
class h extends r.b {
|
|
constructor(e, t) {
|
|
super(), this._invalidated = !0, this._study = e, this._model = t, this
|
|
._valueProvider = this._createValuesProvider(e, t), this._items = this
|
|
._valueProvider.getItems().map(e => new r.a(e.title, "")), this.update()
|
|
}
|
|
items() {
|
|
return this._invalidated && (this._updateImpl(), this._invalidated = !1), this
|
|
._items
|
|
}
|
|
update() {
|
|
this._invalidated = !0
|
|
}
|
|
study() {
|
|
return this._study
|
|
}
|
|
_updateImpl() {
|
|
this._header = this._study.title();
|
|
let e;
|
|
this._showLastPriceAndChangeOnly() ? e = this._study.data().lastIndex() : (e =
|
|
this._model.crossHairSource().appliedIndex(), Object(s.isNumber)(e) || (
|
|
e = this._study.data().lastIndex()));
|
|
const t = this._valueProvider.getValues(e);
|
|
for (let e = 0; e < t.length; ++e) {
|
|
const i = t[e],
|
|
s = this._items[e];
|
|
s.setValue(i.value), s.setVisible(i.visible), s.setColor(i.color)
|
|
}
|
|
}
|
|
_showLastPriceAndChangeOnly() {
|
|
return c && (null === this._model.crossHairSource().pane || Object(o
|
|
.isLineToolName)(a.tool.value()) || null !== this._model
|
|
.lineBeingEdited())
|
|
}
|
|
_createValuesProvider(e, t) {
|
|
return new l.a(e, t)
|
|
}
|
|
}
|
|
},
|
|
JmuD: function(e, t, i) {
|
|
"use strict";
|
|
Object.defineProperty(t, "__esModule", {
|
|
value: !0
|
|
}), t.hasProperty = t.isObject = void 0, t.isObject = function(e) {
|
|
var t = typeof e;
|
|
return null !== e && ("object" === t || "function" === t)
|
|
}, t.hasProperty = function(e, t) {
|
|
return t in e
|
|
}
|
|
},
|
|
JpbW: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "showChangeIntervalDialogAsync", (function() {
|
|
return n
|
|
}));
|
|
var s = i("6KAu");
|
|
let r = null;
|
|
|
|
function n(e) {
|
|
const t = r = Object(s.a)().then(i => {
|
|
t === r && i.showChangeIntervalDialog(e)
|
|
});
|
|
return t
|
|
}
|
|
},
|
|
K4L1: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Eyy1").assert,
|
|
r = i("lCO3").Version,
|
|
n = i("txPx").getLogger("Chart.Study.Versioning"),
|
|
o = i("Wt0y"),
|
|
a = i("0YCj"),
|
|
l = i("TcSq").extractPineId,
|
|
c = i("Si3H").migrateMetaInfoAndPropState;
|
|
|
|
function h(e, t) {
|
|
if (!e) throw new Error("No studies metainfo");
|
|
var s = i("EyEd");
|
|
if (this._studiesMetainfo = e, !t) throw new Error("No studies migrations");
|
|
this._studiesMigrations = t, this._migrations = {};
|
|
for (var r = 0; r < this._studiesMigrations.length; r++)
|
|
for (var o = this._studiesMigrations[r], a = o.versFrom, l = o.versTo, c = 0; c < o
|
|
.studyMigrations.length; c++) {
|
|
var h = o.studyMigrations[c],
|
|
u = h.studyId;
|
|
if (0 !== h.rules.length) {
|
|
var d = u in this._migrations ? this._migrations[u] : new s(u);
|
|
d.addMigration(a, l, h.rules), this._migrations[u] = d
|
|
} else n.logError("Study Migration should have at least one convertion rule")
|
|
}
|
|
this._clientMigrations = [function(e, t) {
|
|
if (0 === this._studiesMetainfo.length || !e.isTVScript || e.version >= 22)
|
|
return t;
|
|
for (var i = {}, s = 0, r = 0;;) {
|
|
var n = t[r];
|
|
if (void 0 === n) break;
|
|
var o = t[n.id];
|
|
n.isFake && (n.id = "in_" + s++), i[r] = n, i[n.id] = o, r++
|
|
}
|
|
return i
|
|
}]
|
|
}
|
|
h.prototype.updateMetaInfo = function(e) {
|
|
if (!e) return e;
|
|
s(!e.isTVScript,
|
|
"This method should update only built-in java indicators metaInfo. For Pine indicators use updateMetaInfoAsync"
|
|
);
|
|
for (var t = null, i = this._studiesMetainfo, r = 0; r < i.length; r++)
|
|
if (i[r].id === e.id) {
|
|
t = i[r];
|
|
break
|
|
} return TradingView.clone(t)
|
|
}, h.prototype.updateMetaInfoAsync = function(e) {
|
|
if (!e) return {
|
|
sync: !1,
|
|
result: Promise.reject("No old metaInfo was given")
|
|
};
|
|
new a(e), a.versionOf(e);
|
|
for (var t = null, i = this._studiesMetainfo, s = 0; s < i.length; s++)
|
|
if (i[s].id === e.id) {
|
|
t = i[s];
|
|
break
|
|
} return {
|
|
sync: !0,
|
|
result: t ? TradingView.clone(t) : null
|
|
}
|
|
}, h.prototype.lastVersionOfStudy = function(e) {
|
|
return this._studiesMetainfo.find((function(t) {
|
|
return t.id === e
|
|
})).version
|
|
}, h.prototype.updateStudyInputs = function(e, t, i, s, o) {
|
|
var a = TradingView.clone(s);
|
|
if (e in this._migrations) {
|
|
var l, c = r.parse(t);
|
|
if ("last" === i) {
|
|
var h = this.lastVersionOfStudy(e);
|
|
l = r.parse(h)
|
|
} else l = r.parse(i);
|
|
a = this._migrations[e].updateInputs(c, l, a)
|
|
}
|
|
if (null == o) return a;
|
|
for (var u in o) u in a || (a[u] = o[u]);
|
|
for (var u in a)
|
|
if (!(u in o)) {
|
|
var d = a[u];
|
|
n.logWarn("Extra input detected, studyId=" + e + ", versionFrom=" + t +
|
|
", inputId=" + u + ", inputValue=" + d + ", removing it and continue..."
|
|
), delete a[u]
|
|
} return a
|
|
}, h.prototype.updateStudyState = function(e, t, i) {
|
|
if (null == e || null == t || null == i) return e;
|
|
if (e = TradingView.clone(e), !(t.isTVScript || !!t.pine) && t.version !== i.version) {
|
|
var s = i && i.defaults.inputs,
|
|
r = this.updateStudyInputs(t.id, t.version, i.version, e.inputs, s);
|
|
e.inputs = r
|
|
}
|
|
for (var o = 0; o < this._clientMigrations.length; ++o) {
|
|
r = this._clientMigrations[o].call(this, t, e.inputs);
|
|
Object.keys(r).length === Object.keys(e.inputs).length ? e.inputs = r : n.logWarn(
|
|
"StudyVersioning._clientMigrations application returned bad result. Skipping it..."
|
|
)
|
|
}
|
|
var l = a.versionOf(t);
|
|
if (t.isTVScript && t.TVScriptSourceCode && l >= 12 && l <= 26) {
|
|
var c = {};
|
|
for (o = 0; o < t.plots.length; ++o) {
|
|
var h = t.plots[o],
|
|
u = i.plots[o];
|
|
c[h.id] = u.id
|
|
}
|
|
var d = Object.keys(e.styles);
|
|
for (o = 0; o < d.length; ++o) {
|
|
var p = d[o],
|
|
_ = e.styles[p];
|
|
delete e.styles[p];
|
|
var m = c[p];
|
|
e.styles[m] = _
|
|
}
|
|
var f = Object.keys(e.plots);
|
|
for (o = 0; o < f.length; ++o) {
|
|
var g = f[o];
|
|
p = e.plots[g].id;
|
|
e.plots[g].id = c[p]
|
|
}
|
|
}
|
|
return e
|
|
}, h.prototype.patchPointsBasedStudyState = function(e) {
|
|
return h._fixInputsMaxValue(e.state, e.metaInfo), e
|
|
}, h.prototype.patchPointsBasedStudyData = function(e, t) {
|
|
if (!o.isProd()) return t;
|
|
if (!e || !t) return t;
|
|
var i = TradingView.clone(t);
|
|
return "VbPFixed@tv-volumebyprice" === e.id && e.version && e.version <= 4 && h
|
|
._patchOldVolumeProfiles(0, i), i
|
|
}, h.prototype.patchStudyData = function(e, t, i, s) {
|
|
if (!o.isProd()) return {
|
|
data: t,
|
|
nsData: i,
|
|
indexes: s
|
|
};
|
|
var r = TradingView.clone(t),
|
|
n = TradingView.clone(i),
|
|
l = TradingView.clone(s);
|
|
"VbPVisible@tv-volumebyprice" === e.id && e.version && e.version <= 4 && h
|
|
._patchOldVolumeProfiles(0, r.graphics), "VbPSessions@tv-volumebyprice" === e.id &&
|
|
e.version && e.version <= 4 && h._patchOldVolumeProfiles(0, r.graphics);
|
|
var c = a.versionOf(e);
|
|
if (e.isTVScript && e.TVScriptSourceCode && c >= 12 && c <= 26) {
|
|
var u = r.columns;
|
|
r.columns = [];
|
|
for (var d = 0; d < u.length; ++d) {
|
|
var p = "plot_" + d;
|
|
r.columns.push(p)
|
|
}
|
|
}
|
|
return {
|
|
data: r,
|
|
nsData: n,
|
|
indexes: l
|
|
}
|
|
}, h._patchOldVolumeProfiles = function(e, t) {
|
|
var i = t.hhists[e].data,
|
|
s = [];
|
|
for (var r in i) s = s.concat(i[r]);
|
|
t.hhists[0].data = s
|
|
}, h._fixInputsOrder = function(e, t) {
|
|
for (var i = a.getOrderedInputIds(t), s = h.splitInputs(e.inputs), r = s.arr, n = s.obj,
|
|
o = TradingView.merge({}, n), l = 0; l < i.length; ++l) {
|
|
var c = i[l],
|
|
u = h.findInputKeyById(r, c);
|
|
if (null !== u) {
|
|
var d = r[u];
|
|
o[l] = d
|
|
}
|
|
}
|
|
e.inputs = o
|
|
}, h.INPUT_MAX_VALUE = 1e12, h._verifyInputsMaxValue = function(e) {
|
|
var t = h.INPUT_MAX_VALUE;
|
|
if (e.inputs)
|
|
for (var i = 0; i < e.inputs.length; i++) {
|
|
var s = e.inputs[i];
|
|
"integer" === s.type && (s.max && s.max > t && n.logWarn(
|
|
"Bad integer input max value in metaInfo id=" + e.id + " title=" + e
|
|
.description))
|
|
}
|
|
}, h._fixInputsMaxValue = function(e, t) {
|
|
if (!TradingView.isAbsent(t)) {
|
|
var i = h.INPUT_MAX_VALUE;
|
|
if (t.inputs)
|
|
for (var s = 0; s < t.inputs.length; s++) {
|
|
"integer" === (a = t.inputs[s]).type && (a.max && a.max > i && (a.max = i))
|
|
}
|
|
if (e && e.inputs) {
|
|
var r = h.splitInputs(e.inputs),
|
|
n = r.arr;
|
|
for (var o in n) {
|
|
var a;
|
|
"integer" === (a = n[o]).type && (a.max && a.max > i && (a.max = i))
|
|
}
|
|
e.inputs = TradingView.merge(r.obj, r.arr)
|
|
}
|
|
}
|
|
}, h.prototype.patchPropsStateAndMetaInfo = function(e, t, i) {
|
|
"Script$BOOKER" !== t.productId || t.alerts || delete e.alerts, h._fixInputsOrder(e, t),
|
|
h._fixInputsMaxValue(e, t);
|
|
var s = h.splitInputs(e.inputs);
|
|
e.inputs = s.obj;
|
|
var r = a.versionOf(t);
|
|
r < a.METAINFO_FORMAT_VERSION_SOS_V2 && t.isChildStudy && (e.isChildStudy = t
|
|
.isChildStudy);
|
|
if (t.isTVScript && t.version < 60 && ("Script$TV_EARNINGS@tv-scripting" !== t.id &&
|
|
"Script$TV_DIVIDENDS@tv-scripting" !== t.id &&
|
|
"Script$TV_SPLITS@tv-scripting" !== t.id || delete t.TVScriptSourceCode),
|
|
"Volume" !== t.id && "Volume@tv-basicstudies" !== t.id || 0 !== t.inputs.length || (
|
|
t.inputs = [{
|
|
id: "length",
|
|
type: "integer",
|
|
defval: 20,
|
|
min: 1,
|
|
max: 1e3
|
|
}], t.plots.push({
|
|
id: "vol_ma",
|
|
type: "line"
|
|
})), "Volume@tv-basicstudies" === t.id && t.version && t.version <= 46 &&
|
|
void 0 === e.styles.vol.transparency && (e.styles.vol.transparency = e
|
|
.transparency || 87), "PivotPointsStandard@tv-basicstudies" === t.id && (0 === t
|
|
.inputs.length ? (e.inputs = {
|
|
kind: "Traditional",
|
|
showHistoricalPivots: !0
|
|
}, t.inputs = [{
|
|
defval: "Traditional",
|
|
id: "kind",
|
|
type: "text",
|
|
options: ["Traditional", "Fibonacci", "Woodie", "Classic", "DeMark",
|
|
"Camarilla"
|
|
]
|
|
}, {
|
|
id: "showHistoricalPivots",
|
|
type: "bool",
|
|
defval: !0
|
|
}]) : 1 === t.inputs.length && (e.inputs = {
|
|
kind: "Traditional"
|
|
}, t.inputs = [{
|
|
defval: "Traditional",
|
|
id: "kind",
|
|
type: "text",
|
|
options: ["Traditional", "Fibonacci", "Woodie", "Classic", "DeMark",
|
|
"Camarilla"
|
|
]
|
|
}, {
|
|
id: "showHistoricalPivots",
|
|
type: "bool",
|
|
defval: !0
|
|
}]), void 0 === e._hardCodedDefaultsVersion)) {
|
|
e._hardCodedDefaultsVersion = 1;
|
|
var n = e.color;
|
|
delete e.color, e.levelsStyle = {
|
|
colors: {
|
|
P: n,
|
|
"S1/R1": n,
|
|
"S2/R2": n,
|
|
"S3/R3": n,
|
|
"S4/R4": n,
|
|
"S5/R5": n
|
|
}
|
|
}
|
|
}
|
|
"CMF" === t.shortId && 2 === t.inputs.length && (e.inputs = {
|
|
length: e.inputs["length fast"]
|
|
}, t.inputs = t.inputs.splice(0, 1),
|
|
t.inputs[0].id = "length"), t.defaults && void 0 === t.defaults.precision && r <
|
|
a.VERSION_NEW_STUDY_PRECISION_FORMAT && (-1 !== ["Volume@tv-basicstudies",
|
|
"VbPVisible@tv-volumebyprice", "VbPSessions@tv-volumebyprice"
|
|
].indexOf(t.id) ? t.defaults.precision = 0 : t.defaults.precision = 4);
|
|
if (t.version < 60)
|
|
for (var o = ["TV_DIVIDENDS", "TV_SPLITS", "TV_EARNINGS"], u = "Script".length, d =
|
|
0; d < o.length; d++) t.id.startsWith("Script$" + o[d] + "@tv-scripting") &&
|
|
(t.fullId = "ESD" + t.fullId.substring(u), t.id = "ESD" + t.id.substring(u), t
|
|
.name = "ESD" + t.name.substring(u), t.shortId = "ESD" + t.shortId
|
|
.substring(u), t.productId = "ESD" + t.productId.substring(u));
|
|
var p = {
|
|
"ESD$TV_EARNINGS@tv-scripting": {
|
|
fullId: "Earnings@tv-basicstudies-129!",
|
|
id: "Earnings@tv-basicstudies",
|
|
name: "Earnings@tv-basicstudies",
|
|
shortId: "Earnings",
|
|
productId: "tv-basicstudies"
|
|
},
|
|
"ESD$TV_SPLITS@tv-scripting": {
|
|
fullId: "Splits@tv-basicstudies-129!",
|
|
id: "Splits@tv-basicstudies",
|
|
name: "Splits@tv-basicstudies",
|
|
shortId: "Splits",
|
|
productId: "tv-basicstudies"
|
|
},
|
|
"ESD$TV_DIVIDENDS@tv-scripting": {
|
|
fullId: "Dividends@tv-basicstudies-129!",
|
|
id: "Dividends@tv-basicstudies",
|
|
name: "Dividends@tv-basicstudies",
|
|
shortId: "Dividends",
|
|
productId: "tv-basicstudies"
|
|
}
|
|
};
|
|
if (t.id in p && Object.assign(t, p[t.id]), r < a.VERSION_PINE_PROTECT_TV_4164) {
|
|
var _ = {
|
|
"StrategyScript$STD;Consecutive%1Ups/Downs%1Strategy": {
|
|
pineId: "STD;Consecutive%1Ups%1Downs%1Strategy",
|
|
className: "StrategyScript"
|
|
},
|
|
Script$EDGR_NET_INCOME_FROM_CONTINUING_OPERATIONS_APPLICABLE_TO_COMMON_V2: {
|
|
pineId: "Script$EDGR_NET_INCOME_FROM_CONTINUING_OPS_APPLICABLE_TO_COMMON_V2",
|
|
className: "Script"
|
|
}
|
|
};
|
|
if (t.shortId in _) {
|
|
var m = _[t.shortId].className + "$" + _[t.shortId].pineId,
|
|
f = {
|
|
scriptIdPart: _[t.shortId].pineId,
|
|
fullId: t.fullId.replace(t.shortId, m),
|
|
id: t.id.replace(t.shortId, m),
|
|
name: t.name.replace(t.shortId, m),
|
|
shortId: m
|
|
};
|
|
TradingView.merge(t, f), TradingView.merge(e, f)
|
|
}
|
|
var g = l(t.fullId),
|
|
b = g && g.match(/^(USER)(_\d+)(;)(.*)$/);
|
|
if (b) {
|
|
var v = b[0],
|
|
S = b[1] + b[3] + b[2] + b[4];
|
|
f = {
|
|
scriptIdPart: S,
|
|
fullId: t.fullId.replace(v, S),
|
|
id: t.id.replace(v, S),
|
|
name: t.name.replace(v, S),
|
|
shortId: t.shortId.replace(v, S)
|
|
};
|
|
TradingView.merge(t, f), TradingView.merge(e, f)
|
|
}
|
|
}
|
|
if ("MA" === t.id) {
|
|
var y = new a({
|
|
id: "MAExp",
|
|
properties: [{
|
|
id: "is_price_study",
|
|
type: "bool",
|
|
value: "true"
|
|
}],
|
|
inputs: [{
|
|
id: "length",
|
|
type: "integer",
|
|
defval: 20,
|
|
min: 1,
|
|
max: 500
|
|
}, {
|
|
id: "source",
|
|
type: "text",
|
|
defval: "close",
|
|
options: ["open", "high", "low", "close"]
|
|
}],
|
|
plots: [{
|
|
id: "MovAvgExp",
|
|
type: "line"
|
|
}],
|
|
palettes: {}
|
|
}),
|
|
w = new a({
|
|
id: "MASimple",
|
|
properties: [{
|
|
id: "is_price_study",
|
|
type: "bool",
|
|
value: "true"
|
|
}],
|
|
inputs: [{
|
|
id: "length",
|
|
type: "integer",
|
|
defval: 20,
|
|
min: 1,
|
|
max: 500
|
|
}, {
|
|
id: "source",
|
|
type: "text",
|
|
defval: "close",
|
|
options: ["open", "high", "low", "close"]
|
|
}],
|
|
plots: [{
|
|
id: "MovAvgSimple",
|
|
type: "line"
|
|
}],
|
|
palettes: {}
|
|
}),
|
|
P = new a({
|
|
id: "MAVolumeWeighted",
|
|
properties: [{
|
|
id: "is_price_study",
|
|
type: "bool",
|
|
value: "true"
|
|
}],
|
|
inputs: [{
|
|
id: "length",
|
|
type: "integer",
|
|
defval: 20,
|
|
min: 1,
|
|
max: 500
|
|
}, {
|
|
id: "source",
|
|
type: "text",
|
|
defval: "close",
|
|
options: ["open", "high", "low", "close"]
|
|
}],
|
|
plots: [{
|
|
id: "MovAvgVolumeWeighted",
|
|
type: "line"
|
|
}],
|
|
palettes: {}
|
|
}),
|
|
C = new a({
|
|
id: "MAWeighted",
|
|
properties: [{
|
|
id: "is_price_study",
|
|
type: "bool",
|
|
value: "true"
|
|
}],
|
|
inputs: [{
|
|
id: "length",
|
|
type: "integer",
|
|
defval: 20,
|
|
min: 1,
|
|
max: 500
|
|
}, {
|
|
id: "source",
|
|
type: "text",
|
|
defval: "close",
|
|
options: ["open", "high", "low", "close"]
|
|
}],
|
|
plots: [{
|
|
id: "MovAvgWeighted",
|
|
type: "line"
|
|
}],
|
|
palettes: {}
|
|
});
|
|
switch (e.inputs.type) {
|
|
case "exp":
|
|
t = y;
|
|
break;
|
|
case "simple":
|
|
t = w;
|
|
break;
|
|
case "weighted":
|
|
t = C;
|
|
break;
|
|
case "volume weighted":
|
|
t = P
|
|
}
|
|
e.styles[t.plots[0].id] = e.styles.MovAvg, delete e.styles.MovAvg, delete e.inputs
|
|
.type
|
|
}
|
|
return i.oldShowStudyLastValueProperty && (e.oldShowLastValue = e.showLastValue),
|
|
delete e.showLastValue, delete e.showStudyArguments, c(t, e), {
|
|
propsState: e,
|
|
metaInfo: t
|
|
}
|
|
}, h.mergeInputs = function(e, t) {
|
|
h.mergeInputsArrPart(e, t), h.mergeInputsObjPart(e, t)
|
|
}, h.mergeInputsArrPart = function(e, t) {
|
|
var i = h.splitInputs(t);
|
|
for (var s in i.arr) {
|
|
var r = h.findInputKeyById(e, i.arr[s].id);
|
|
r ? TradingView.merge(e[r], i.arr[s]) : h.appendInputInfoToArr(e, i.arr[s])
|
|
}
|
|
}, h.mergeInputsObjPart = function(e, t) {
|
|
var i = h.splitInputs(t);
|
|
TradingView.merge(e, i.obj)
|
|
}, h.appendInputInfoToArr = function(e, t) {
|
|
var i = -1;
|
|
for (var s in e) {
|
|
var r = parseInt(s, 10);
|
|
isNumber(r) && (r > i && (i = r))
|
|
}
|
|
e[i + 1] = t
|
|
}, h.splitInputs = function(e) {
|
|
var t = {},
|
|
i = {};
|
|
for (var s in e) isNumber(parseInt(s, 10)) ? t[s] = e[s] : i[s] = e[s];
|
|
return {
|
|
arr: t,
|
|
obj: i
|
|
}
|
|
}, h.findInputKeyById = function(e, t) {
|
|
var i = null;
|
|
for (var s in e)
|
|
if (isNumber(parseInt(s, 10)) && e[s].id === t) {
|
|
i = s;
|
|
break
|
|
} return i
|
|
}, h.getInputKeyById = function(e, t) {
|
|
var i = h.findInputKeyById(e, t);
|
|
if (!i) throw new Error("Cannot find input with id: " + t);
|
|
return i
|
|
}, e.exports = h
|
|
},
|
|
K5cv: function(e, t, i) {
|
|
"use strict";
|
|
let s;
|
|
|
|
function r() {
|
|
return s
|
|
}
|
|
|
|
function n(e) {
|
|
s = e
|
|
}
|
|
i.r(t), i.d(t, "getSearchRequestDelay", (function() {
|
|
return r
|
|
})), i.d(t, "setSearchRequestDelay", (function() {
|
|
return n
|
|
}))
|
|
},
|
|
K8V9: function(e, t) {
|
|
e.exports =
|
|
'<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28"><g fill="none" fill-rule="evenodd" stroke="currentColor"><path d="M13.111 18.5H10.5a1 1 0 0 1-1-1v-11a1 1 0 0 1 1-1h11a1 1 0 0 1 1 1v11a1 1 0 0 1-1 1h-8.389z"/><path d="M18.5 20v1.5a1 1 0 0 1-1 1h-11a1 1 0 0 1-1-1v-11a1 1 0 0 1 1-1H8"/></g></svg>'
|
|
},
|
|
K9GE: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "b", (function() {
|
|
return s
|
|
})), i.d(t, "c", (function() {
|
|
return r
|
|
})), i.d(t, "a", (function() {
|
|
return n
|
|
}));
|
|
const s = 350,
|
|
r = {
|
|
linear: e => e,
|
|
easeInQuad: e => e * e,
|
|
easeOutQuad: e => e * (2 - e),
|
|
easeInOutQuad: e => e < .5 ? 2 * e * e : (4 - 2 * e) * e - 1,
|
|
easeInCubic: e => e * e * e,
|
|
easeOutCubic: e => --e * e * e + 1,
|
|
easeInOutCubic: e => e < .5 ? 4 * e * e * e : (e - 1) * (2 * e - 2) * (2 * e - 2) + 1,
|
|
easeInQuart: e => e * e * e * e,
|
|
easeOutQuart: e => 1 - --e * e * e * e,
|
|
easeInOutQuart: e => e < .5 ? 8 * e * e * e * e : 1 - 8 * --e * e * e * e,
|
|
easeInQuint: e => e * e * e * e * e,
|
|
easeOutQuint: e => 1 + --e * e * e * e * e,
|
|
easeInOutQuint: e => e < .5 ? 16 * e * e * e * e * e : 1 + 16 * --e * e * e * e * e
|
|
};
|
|
class n {
|
|
constructor(e, t, i, s) {
|
|
this._mX1 = e, this._mY1 = t, this._mX2 = i, this._mY2 = s
|
|
}
|
|
easingFunc(e) {
|
|
return this._mX1 === this._mY1 && this._mX2 === this._mY2 ? e : this._calcBezier(
|
|
this._getTForX(e))
|
|
}
|
|
_a(e, t) {
|
|
return 1 - 3 * t + 3 * e
|
|
}
|
|
_b(e, t) {
|
|
return 3 * t - 6 * e
|
|
}
|
|
_c(e) {
|
|
return 3 * e
|
|
}
|
|
_calcBezier(e) {
|
|
return ((this._a(this._mY1, this._mY2) * e + this._b(this._mY1, this._mY2)) * e +
|
|
this._c(this._mY1)) * e
|
|
}
|
|
_getSlope(e) {
|
|
return 3 * this._a(this._mX1, this._mX2) * e * e + 2 * this._b(this._mX1, this
|
|
._mX2) * e + this._c(this._mX1)
|
|
}
|
|
_getTForX(e) {
|
|
let t = e;
|
|
for (let i = 0; i < 4; ++i) {
|
|
const i = this._getSlope(t);
|
|
if (0 === i) return t;
|
|
t -= (this._calcBezier(t) - e) / i
|
|
}
|
|
return t
|
|
}
|
|
}
|
|
},
|
|
"KG+6": function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return s
|
|
})), i.d(t, "b", (function() {
|
|
return r
|
|
})), i.d(t, "d", (function() {
|
|
return l
|
|
})), i.d(t, "c", (function() {
|
|
return c
|
|
}));
|
|
var s, r, n = i("Eyy1"),
|
|
o = i("tqok"),
|
|
a = i("hsV8");
|
|
|
|
function l(e, t) {
|
|
if (e.firstBarTime >= t.length || e.lastBarTime >= t.length) return null;
|
|
const i = t[e.firstBarTime],
|
|
s = t[e.lastBarTime];
|
|
return i === o.INVALID_TIME_POINT_INDEX || s === o.INVALID_TIME_POINT_INDEX ? null : (
|
|
Object(n.assert)(i <= s, "firstBarTime should not exceed lastBarTime"), Object(n
|
|
.assert)(e.priceLow <= e.priceHigh, "priceLow should not exceed priceHigh"), {
|
|
firstBarTime: i,
|
|
lastBarTime: s,
|
|
rate: e.rate,
|
|
priceHigh: e.priceHigh,
|
|
priceLow: e.priceLow
|
|
})
|
|
}
|
|
|
|
function c(e, t, i) {
|
|
const s = Object(a.ensureTimePointIndexIndex)(i.indexOf(e.firstBarTime)),
|
|
r = Object(a.ensureTimePointIndexIndex)(i.indexOf(e.lastBarTime));
|
|
return {
|
|
id: t,
|
|
...e,
|
|
firstBarTime: s,
|
|
lastBarTime: r
|
|
}
|
|
}! function(e) {
|
|
e.LeftToRight = "left_to_right", e.RightToLeft = "right_to_left"
|
|
}(s || (s = {})),
|
|
function(e) {
|
|
e.Relative = "relative", e.Absolute = "absolute"
|
|
}(r || (r = {}))
|
|
},
|
|
KcY8: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("aO4+"),
|
|
r = i("f6yo"),
|
|
n = i("VaSN"),
|
|
o = i("Tmoa"),
|
|
a = i("Ialn"),
|
|
l = i("ikwP"),
|
|
c = i("VdBB"),
|
|
h = i("gAom"),
|
|
u = i("//lt");
|
|
class d {
|
|
constructor(e, t) {
|
|
this.setData(e, t)
|
|
}
|
|
setData(e, t) {
|
|
this._data = {
|
|
...e
|
|
}, this._commonData = {
|
|
...t
|
|
}
|
|
}
|
|
draw(e, t, i, s, r, n) {
|
|
if (!this._data.visible) return;
|
|
e.save(), e.font = t.font;
|
|
const c = void 0 !== this._data.labelIcon,
|
|
u = this._data.ignoreOffset ? 0 : t.offsetSize,
|
|
d = t.borderSize,
|
|
p = t.paddingTop + this._commonData.additionalPaddingTop,
|
|
_ = t.paddingBottom + this._commonData.additionalPaddingBottom,
|
|
m = t.paddingInner,
|
|
f = t.paddingOuter,
|
|
g = t.fontSize;
|
|
let b = this._data.text,
|
|
v = this._data.textColor || this._commonData.textColor,
|
|
S = this._data.secondLine || "",
|
|
y = this._commonData.secondLineTextColor || v,
|
|
w = this._data.thirdLine || "";
|
|
const P = this._commonData.thirdLineTextColor || v;
|
|
0 === S.length && (S = w, y = P, w = ""), 0 === b.length && (b = S, v = y, S = w,
|
|
y = P, w = "");
|
|
const C = i.yMidCorrection(e, b) * n,
|
|
x = Math.ceil(i.measureText(e, b)),
|
|
T = g + p + _,
|
|
I = Boolean(S),
|
|
M = Boolean(w),
|
|
O = I ? Math.ceil(i.measureText(e, S)) : 0,
|
|
L = M ? Math.ceil(i.measureText(e, w)) : 0,
|
|
A = d + m + f + x + u,
|
|
E = O > 0 ? d + m + f + O + u : 0,
|
|
k = L > 0 ? d + m + f + L + u : 0,
|
|
D = Math.max(A, E, k),
|
|
V = Math.max(1, Math.floor(n));
|
|
let B = Math.round(T * n);
|
|
B % 2 != V % 2 && (B += 1);
|
|
const R = Math.round((g + t.lineSpacing) * n),
|
|
N = Math.round(2 * (g + t.lineSpacing) * n),
|
|
j = Math.max(1, Math.floor(d * n)),
|
|
F = this._data.separatorVisible ? j : 0,
|
|
W = this._data.borderVisible ? j : 0,
|
|
H = c ? B : Math.round(D * n),
|
|
U = Math.round(u * n),
|
|
z = Math.ceil(s * n),
|
|
G = Math.ceil(m * n);
|
|
let q = this._commonData.coordinate;
|
|
this._commonData.fixedCoordinate && (q = this._commonData.fixedCoordinate), q = Math
|
|
.round(q * n) - Math.floor(.5 * n);
|
|
const Y = Math.floor(q + V / 2 - B / 2),
|
|
K = Y + B,
|
|
J = "right" === r,
|
|
Z = J ? z - F : F,
|
|
X = z;
|
|
let $, Q = Z;
|
|
const ee = Object(o.resetTransparency)(this._data.backgroung || this._commonData
|
|
.background);
|
|
e.fillStyle = ee;
|
|
const te = 2 * n;
|
|
if (e.textAlign = J ? "right" : "left", e.textBaseline = "middle", J ? (Q = Z - H,
|
|
$ = Z - U - G - 1) : (Q = Z + H, $ = Z + U + G), b || c) {
|
|
const i = M ? B + N : I ? B + R : B;
|
|
if (((t, s, r) => {
|
|
J ? Object(h.drawRoundRectWithInnerBorder)(e, Q, Y, H, i, t, [te, 0,
|
|
0, te
|
|
], W, s, r) : Object(h.drawRoundRectWithInnerBorder)(e, Z, Y, H,
|
|
i, t, [0, te, te, 0], W, s, r)
|
|
})(ee, this._commonData.borderColor || ee, this._commonData.borderStyle),
|
|
this._data.separatorVisible && (e.fillStyle = t.paneBackgroundColor, e
|
|
.fillRect(J ? X - F : 0, Y, F, K - Y)), c) {
|
|
switch (this._data.labelIcon) {
|
|
case 0:
|
|
this._drawPlusIcon(e, Z, Q, Y, q, K, V);
|
|
break;
|
|
case 1:
|
|
this._drawClockIcon(e, Z, Q, q, V, n)
|
|
}
|
|
return
|
|
}
|
|
e.save(), e.translate($, (Y + K) / 2 + C), Object(l.drawScaled)(e, n, () => {
|
|
e.fillStyle = v, e.fillText(b, 0, 0)
|
|
}), e.restore()
|
|
}
|
|
I && (e.fillStyle = y, e.save(), e.translate($, (Y + K) / 2 + C + R), Object(l
|
|
.drawScaled)(e, n, () => {
|
|
e.fillText(Object(a.startWithLTR)(S), 0, 0)
|
|
}), e.restore()), M && (e.fillStyle = P, e.save(), e.translate($, (Y + K) / 2 +
|
|
C + N), Object(l.drawScaled)(e, n, () => {
|
|
e.fillText(Object(a.startWithLTR)(w), 0, 0)
|
|
}), e.restore()), e.restore()
|
|
}
|
|
height(e) {
|
|
const t = this._data,
|
|
i = (t.text ? 1 : 0) + (t.secondLine ? 1 : 0) + (t.thirdLine ? 1 : 0);
|
|
return t.visible && 0 !== i ? i * e.fontSize + (i - 1) * e.lineSpacing + e
|
|
.paddingTop + this._commonData.additionalPaddingTop + e.paddingBottom + this
|
|
._commonData.additionalPaddingBottom : 0
|
|
}
|
|
hitTest(e) {
|
|
const t = this._data.hitTestData;
|
|
if (void 0 === t || !this._data.visible) return null;
|
|
const i = Object(n.lastEventIsTouch)() ? 10 : 0,
|
|
o = Object(s.box)(new s.Point(t.xl - i, t.y - i), new s.Point(t.xl + t
|
|
.containerWidth + i, t.y + t.containerHeight + i)),
|
|
a = t.left && Object(r.pointInBox)(e, o),
|
|
l = Object(s.box)(new s.Point(t.xr - i, t.y - i), new s.Point(t.xr + t
|
|
.containerWidth + i, t.y + t.containerHeight + i)),
|
|
h = t.right && Object(r.pointInBox)(e, l);
|
|
if (a || h) {
|
|
const i = a ? "left" : "right";
|
|
return new c.HitTestResult(c.HitTestResult.CUSTOM, {
|
|
cursorType: u.PaneCursorType.Default,
|
|
clickHandler: void 0 === t.clickHandler ? void 0 : t.clickHandler
|
|
.bind(this, e, i),
|
|
tapHandler: void 0 === t.clickHandler ? void 0 : t.clickHandler
|
|
.bind(this, e, i),
|
|
tooltip: t.tooltip
|
|
})
|
|
}
|
|
return null
|
|
}
|
|
_drawPlusIcon(e, t, i, s, r, n, o) {
|
|
e.fillStyle = this._commonData.textColor, e.strokeStyle = this._commonData
|
|
.textColor, e.lineWidth = o;
|
|
const a = Math.abs(t - i);
|
|
let l = Math.round(.35 * a);
|
|
l % 2 != o % 2 && (l += 1);
|
|
let c = Math.round(.65 * a);
|
|
c % 2 != o % 2 && (c += 1);
|
|
const h = Math.floor((a - l) / 2),
|
|
u = Math.min(t, i),
|
|
d = u + Math.floor(a / 2 - o / 2);
|
|
e.fillRect(u + h, r, l, o), e.fillRect(d, s + h, o, l), e.beginPath(), e.arc(d + o /
|
|
2, r + o / 2, c / 2, 0, 2 * Math.PI, !1), e.stroke()
|
|
}
|
|
_drawClockIcon(e, t, i, s, r, n) {
|
|
e.fillStyle = this._commonData.textColor, e.lineWidth = r;
|
|
const o = Math.abs(t - i);
|
|
let a = Math.round(.35 * o);
|
|
a % 2 != r % 2 && (a += 1);
|
|
let l = Math.round(.65 * o);
|
|
l % 2 != r % 2 && (l += 1);
|
|
const c = Math.min(t, i) + Math.floor(o / 2 - r / 2);
|
|
e.save(), e.translate(c + r / 2 - l / 2, s + r / 2 - l / 2), e.scale(n, n);
|
|
const h = new Path2D(
|
|
"M7.5 0.8a1 1 0 0 0 0 13.4 1 1 0 0 0 0-13.4zm0 1a1 1 0 0 1 0 11 1 1 0 0 1 0-11zm-.97-.25A3.5 3.5 0 0 0 3.5 0 3.5 3.5 0 0 0 0 3.5a3.5 3.5 0 0 0 1.75 3.03l.5-.86A2.5 2.5 0 0 1 1 3.5 2.5 2.5 0 0 1 3.5 1a2.5 2.5 0 0 1 2.17 1.25zm6.72 4.78A3.5 3.5 0 0 0 15 3.5 3.5 3.5 0 0 0 11.5 0a3.5 3.5 0 0 0-3.03 1.75l.86.5A2.5 2.5 0 0 1 11.5 1 2.5 2.5 0 0 1 14 3.5a2.5 2.5 0 0 1-1.25 2.17zM7 5h1v5H7zm3 2v1H5V7z"
|
|
);
|
|
e.fill(h), e.restore()
|
|
}
|
|
}
|
|
i.d(t, "a", (function() {
|
|
return p
|
|
}));
|
|
class p {
|
|
constructor(e) {
|
|
this._commonRendererData = {
|
|
coordinate: 0,
|
|
textColor: "#FFF",
|
|
background: "#000",
|
|
additionalPaddingBottom: 0,
|
|
additionalPaddingTop: 0
|
|
}, this._axisRendererData = {
|
|
text: "",
|
|
visible: !1,
|
|
separatorVisible: !1,
|
|
borderVisible: !1,
|
|
ignoreOffset: !1
|
|
}, this._paneRendererData = {
|
|
text: "",
|
|
visible: !1,
|
|
separatorVisible: !0,
|
|
borderVisible: !1,
|
|
ignoreOffset: !0
|
|
}, this._invalidated = !0, this._axisRenderer = new(e || d)(this
|
|
._axisRendererData, this._commonRendererData), this._paneRenderer = new(e ||
|
|
d)(this._paneRendererData, this._commonRendererData)
|
|
}
|
|
text() {
|
|
return this._updateRendererDataIfNeeded(), this._axisRendererData.text
|
|
}
|
|
secondLineText() {
|
|
return this._updateRendererDataIfNeeded(), this._axisRendererData.secondLine
|
|
}
|
|
thirdLineText() {
|
|
return this._updateRendererDataIfNeeded(), this._axisRendererData.thirdLine
|
|
}
|
|
background() {
|
|
return this._updateRendererDataIfNeeded(), this._commonRendererData.background
|
|
}
|
|
color() {
|
|
return this._updateRendererDataIfNeeded(), this.generateTextColor(this.background())
|
|
}
|
|
generateTextColor(e) {
|
|
return Object(o.colorFromBackground)(e)
|
|
}
|
|
coordinate() {
|
|
return this._updateRendererDataIfNeeded(), this._commonRendererData.coordinate
|
|
}
|
|
floatCoordinate() {
|
|
return this._updateRendererDataIfNeeded(), this._commonRendererData
|
|
.floatCoordinate || this._commonRendererData.coordinate
|
|
}
|
|
update() {
|
|
this._invalidated = !0
|
|
}
|
|
height(e) {
|
|
return this._updateRendererDataIfNeeded(), Math.max(this._axisRenderer.height(e),
|
|
this._paneRenderer.height(e))
|
|
}
|
|
getFixedCoordinate() {
|
|
return this._commonRendererData.fixedCoordinate || 0
|
|
}
|
|
setFixedCoordinate(e) {
|
|
this._commonRendererData.fixedCoordinate = e
|
|
}
|
|
isVisible() {
|
|
return this._updateRendererDataIfNeeded(), this._axisRendererData.visible || this
|
|
._paneRendererData.visible
|
|
}
|
|
isAxisLabelVisible() {
|
|
return this._updateRendererDataIfNeeded(), this._axisRendererData.visible
|
|
}
|
|
isPaneLabelVisible() {
|
|
return this._updateRendererDataIfNeeded(), this._paneRendererData.visible
|
|
}
|
|
renderer() {
|
|
return this._updateRendererDataIfNeeded(), this._axisRenderer
|
|
}
|
|
paneRenderer() {
|
|
return this._updateRendererDataIfNeeded(), this._paneRenderer
|
|
}
|
|
setPaneRendererLabelIcon(e) {
|
|
this._paneRendererData.labelIcon = e
|
|
}
|
|
setPaneLabelVisible(e) {
|
|
this._paneRendererData.visible = e, this._invalidated = !0
|
|
}
|
|
ignoreAlignment() {
|
|
return !1
|
|
}
|
|
_updateRendererDataIfNeeded() {
|
|
this._invalidated && (this._updateRendererData(this._axisRendererData, this
|
|
._paneRendererData, this._commonRendererData), this._invalidated = !1), this
|
|
._axisRenderer.setData(this._axisRendererData, this._commonRendererData), this
|
|
._paneRenderer.setData(this._paneRendererData, this._commonRendererData)
|
|
}
|
|
}
|
|
},
|
|
Khfk: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LollipopRenderer", (function() {
|
|
return h
|
|
}));
|
|
var s = i("f6yo"),
|
|
r = i("aO4+"),
|
|
n = i("jFln"),
|
|
o = i("8Uy/"),
|
|
a = i("gAom"),
|
|
l = i("ikwP"),
|
|
c = i("Zp/P");
|
|
class h {
|
|
constructor(e, t, i) {
|
|
this._data = e, this._hittest = t, this._textWidthCache = i
|
|
}
|
|
draw(e, t) {
|
|
const i = t.pixelRatio,
|
|
s = this._data.centerPoint,
|
|
n = Math.round(s.x * i),
|
|
o = Math.round(s.y * i),
|
|
a = Math.max(1, Math.floor(i)) % 2 / 2,
|
|
l = new r.Point(n + a, o - a);
|
|
this._drawLollipop(e, l, t), this._drawLabel(e, l, t.pixelRatio)
|
|
}
|
|
hitTest(e, t) {
|
|
const i = Object(c.interactionTolerance)().esd,
|
|
n = this._data.centerPoint.y - this._data.style.height / 2 - i,
|
|
o = this._data.centerPoint.x - this._data.style.width / 2 - i,
|
|
a = Object(r.box)(new r.Point(o, n), new r.Point(o + this._data.style.width +
|
|
2 * i, n + this._data.style.height + 2 * i));
|
|
return Object(s.pointInBox)(e, a) ? this._hittest : null
|
|
}
|
|
_drawLollipop(e, t, i) {
|
|
const s = this._data.style,
|
|
r = i.pixelRatio,
|
|
l = Math.max(1, Math.floor(r));
|
|
let c = Math.round(s.width * r);
|
|
c % 2 != l % 2 && (c += 1);
|
|
const h = c / 2;
|
|
s.fillCircle && s.backgroundColor && (e.fillStyle = s.backgroundColor, Object(a
|
|
.createCircle)(e, t.x, t.y, h), e.fill());
|
|
const u = Math.round(s.lineWidth * r);
|
|
e.strokeStyle = s.strokeStyle, e.lineWidth = u, Object(n.setLineStyle)(e, o
|
|
.LINESTYLE_SOLID);
|
|
const d = h - Math.round(1 * r + u / 2);
|
|
Object(a.createCircle)(e, t.x, t.y, d), s.fillCircle && s.fillStyle && (e
|
|
.fillStyle = s.fillStyle, e.fill()), e.stroke()
|
|
}
|
|
_drawLabel(e, t, i) {
|
|
const s = this._data.style.text,
|
|
r = s.label;
|
|
e.textAlign = "center", e.textBaseline = "middle", e.fillStyle = s.strokeStyle, e
|
|
.font = s.font;
|
|
const n = this._textWidthCache.yMidCorrection(e, r);
|
|
e.translate(t.x, t.y + ((s.deltaY || 0) + n) * i), Object(l.drawScaled)(e, i,
|
|
() => {
|
|
e.fillText(r, 0, 0)
|
|
})
|
|
}
|
|
}
|
|
},
|
|
KnF9: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return r
|
|
}));
|
|
var s = i("qFKp");
|
|
class r {
|
|
constructor(e) {
|
|
this._shift = !1, this._control = !1, this._alt = !1, void 0 !== e && (this._shift =
|
|
Boolean(e.shiftKey), this._control = Boolean(Object(s.isMac)() ? e.metaKey :
|
|
e.ctrlKey), this._alt = Boolean(e.altKey))
|
|
}
|
|
shift() {
|
|
return this._shift
|
|
}
|
|
control() {
|
|
return this._control
|
|
}
|
|
alt() {
|
|
return this._alt
|
|
}
|
|
shiftOnly() {
|
|
return this._shift && !this._control && !this._alt
|
|
}
|
|
controlOnly() {
|
|
return this._control && !this._shift && !this._alt
|
|
}
|
|
altOnly() {
|
|
return this._alt && !this._shift && !this._control
|
|
}
|
|
controlShift() {
|
|
return this._shift && this._control && !this._alt
|
|
}
|
|
static create(e = !1, t = !1, i = !1) {
|
|
return new r({
|
|
shiftKey: e,
|
|
ctrlKey: t,
|
|
metaKey: t,
|
|
altKey: i
|
|
})
|
|
}
|
|
}
|
|
},
|
|
KtbP: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "PanePriceAxisView", (function() {
|
|
return n
|
|
}));
|
|
var s = i("u+0B");
|
|
class r {
|
|
constructor(e) {
|
|
this._priceAxisViewRenderer = null, this._rendererOptions = null, this._align =
|
|
"right", this._width = 0, this._textWidthCache = e
|
|
}
|
|
setParams(e, t, i, s) {
|
|
this._priceAxisViewRenderer = e, this._rendererOptions = t, this._width = i, this
|
|
._align = s
|
|
}
|
|
draw(e, t) {
|
|
null !== this._rendererOptions && null !== this._priceAxisViewRenderer && this
|
|
._priceAxisViewRenderer.draw(e, this._rendererOptions, this._textWidthCache,
|
|
this._width, this._align, t.pixelRatio)
|
|
}
|
|
hitTest(e) {
|
|
var t, i;
|
|
return void 0 === (null === (t = this._priceAxisViewRenderer) || void 0 === t ?
|
|
void 0 : t.hitTest) ? null : null === (i = this._priceAxisViewRenderer) ||
|
|
void 0 === i ? void 0 : i.hitTest(e, this._width, this._align)
|
|
}
|
|
}
|
|
class n {
|
|
constructor(e, t, i) {
|
|
this._renderer = null, this._invalidated = !0, this._priceAxisView = e, this
|
|
._textWidthCache = new s.TextWidthCache(50), this._dataSource = t, this
|
|
._chartModel = i, this._fontSize = -1, this._panePriceAxisViewRenderer = new r(
|
|
this._textWidthCache)
|
|
}
|
|
update() {
|
|
this._invalidated = !0
|
|
}
|
|
renderer(e, t) {
|
|
return this._invalidated && this._updateImpl(e, t), this._renderer
|
|
}
|
|
_updateImpl(e, t) {
|
|
this._priceAxisView.update(), this._renderer = null;
|
|
const i = this._chartModel.crossHairSource(),
|
|
s = this._dataSource === i ? i.pane : this._chartModel.paneForSource(this
|
|
._dataSource);
|
|
if (null === s) return;
|
|
const r = this._priceScale();
|
|
if (null === r) return;
|
|
let n = s.priceScalePosition(r);
|
|
if ("overlay" === n && (n = s.priceScalePosition(s.defaultPriceScale())),
|
|
"overlay" === n) return;
|
|
const o = this._chartModel.priceAxisRendererOptions();
|
|
o.fontSize !== this._fontSize && (this._fontSize = o.fontSize, this._textWidthCache
|
|
.reset()),
|
|
this._panePriceAxisViewRenderer.setParams(this._priceAxisView.paneRenderer(), o,
|
|
t, n), this._renderer = this._panePriceAxisViewRenderer, this
|
|
._invalidated = !1
|
|
}
|
|
_priceScale() {
|
|
return this._dataSource.priceScale()
|
|
}
|
|
}
|
|
},
|
|
"L/Ed": function(e, t, i) {
|
|
"use strict";
|
|
var s;
|
|
i.r(t), i.d(t, "ToolboxType", (function() {
|
|
return s
|
|
})),
|
|
function(e) {
|
|
e[e.Delete = 0] = "Delete"
|
|
}(s || (s = {}))
|
|
},
|
|
L6rT: function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e) {
|
|
return e.reduce((function(e, t, i) {
|
|
return ~e.indexOf(t) || e.push(t), e
|
|
}), [])
|
|
}
|
|
i.r(t), i.d(t, "uniq", (function() {
|
|
return s
|
|
}))
|
|
},
|
|
LAp3: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return a
|
|
}));
|
|
var s = i("ogJP"),
|
|
r = i("5rJj"),
|
|
n = i.n(r);
|
|
class o extends n.a {
|
|
constructor(e, t) {
|
|
super(e, t, !1, {
|
|
names: ["width", "color", "visible"]
|
|
})
|
|
}
|
|
_iterateLevels(e, t) {
|
|
for (const i in e.levels)
|
|
if (e.levels[i] && Object(s.isSameType)(e.levels[i], t.typecheck())) {
|
|
let s = t.tpl();
|
|
for (const r in this._map.names) this._map.names.hasOwnProperty(r) && (
|
|
s = t.fill(r, this._map.names[r], e.levels[i], s));
|
|
e.levels[i] = s
|
|
} return e
|
|
}
|
|
}
|
|
|
|
function a(e, t) {
|
|
return new o(e, t)
|
|
}
|
|
},
|
|
LdoW: function(e, t) {
|
|
e.exports =
|
|
'<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28"><g fill="none" fill-rule="evenodd" stroke="currentColor"><path d="M6.5 15A8.5 8.5 0 1 0 15 6.5H8.5"/><path d="M12 10L8.5 6.5 12 3"/></g></svg>'
|
|
},
|
|
LxhU: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "ResolutionKind", (function() {
|
|
return n
|
|
})), i.d(t, "SpecialResolutionKind", (function() {
|
|
return o
|
|
})), i.d(t, "Interval", (function() {
|
|
return h
|
|
})), i.d(t, "isHour", (function() {
|
|
return d
|
|
}));
|
|
const s = /^(\d*)([TSHDWMR])$/,
|
|
r = /^(\d+)$/;
|
|
var n, o;
|
|
! function(e) {
|
|
e.Ticks = "ticks", e.Seconds = "seconds", e.Minutes = "minutes", e.Days = "days", e.Weeks =
|
|
"weeks", e.Months = "months", e.Range = "range", e.Invalid = "invalid"
|
|
}(n || (n = {})),
|
|
function(e) {
|
|
e.Hours = "hours"
|
|
}(o || (o = {}));
|
|
const a = {};
|
|
a[n.Ticks] = 1e3, a[n.Seconds] = 1e3, a[n.Minutes] = 60 * a[n.Seconds], a[n.Days] = 1440 * a[n
|
|
.Minutes], a[n.Weeks] = 7 * a[n.Days];
|
|
const l = {
|
|
T: n.Ticks,
|
|
S: n.Seconds,
|
|
D: n.Days,
|
|
W: n.Weeks,
|
|
M: n.Months,
|
|
R: n.Range
|
|
},
|
|
c = new Set([n.Ticks, n.Seconds, n.Minutes]);
|
|
class h {
|
|
constructor(e, t) {
|
|
this._kind = n.Invalid, this._multiplier = 0, e !== n.Invalid && t > 0 && (this
|
|
._kind = e, this._multiplier = t)
|
|
}
|
|
kind() {
|
|
return this._kind
|
|
}
|
|
multiplier() {
|
|
return this._multiplier
|
|
}
|
|
isValid() {
|
|
return this.kind() !== n.Invalid && this.multiplier() > 0
|
|
}
|
|
isDWM() {
|
|
return this.isValid() && !this.isRange() && !this.isIntraday() && !this.isTicks()
|
|
}
|
|
isIntraday() {
|
|
const e = c.has(this.kind());
|
|
return this.isValid() && e
|
|
}
|
|
isSeconds() {
|
|
return this.kind() === n.Seconds
|
|
}
|
|
isMinutes() {
|
|
return this.kind() === n.Minutes
|
|
}
|
|
isMinuteHours() {
|
|
return this.kind() === n.Minutes && d(this.multiplier())
|
|
}
|
|
isDays() {
|
|
return this.kind() === n.Days
|
|
}
|
|
isWeeks() {
|
|
return this.kind() === n.Weeks
|
|
}
|
|
isMonths() {
|
|
return this.kind() === n.Months
|
|
}
|
|
isRange() {
|
|
return this.kind() === n.Range
|
|
}
|
|
isTicks() {
|
|
return this.kind() === n.Ticks
|
|
}
|
|
isTimeBased() {
|
|
return !this.isRange()
|
|
}
|
|
letter() {
|
|
return this.isValid() && this.kind() !== n.Minutes ? this.kind()[0].toUpperCase() :
|
|
""
|
|
}
|
|
value() {
|
|
return this.isValid() ? this.kind() === n.Minutes ? this.multiplier() + "" : this
|
|
.multiplier() + this.letter() : ""
|
|
}
|
|
isEqualTo(e) {
|
|
if (!(e instanceof h)) throw new Error("Argument is not an Interval");
|
|
return !(!this.isValid() || !e.isValid()) && (this.kind() === e.kind() && this
|
|
.multiplier() === e.multiplier())
|
|
}
|
|
inMilliseconds(e = Date.now()) {
|
|
if (!this.isValid() || this.isRange()) return NaN;
|
|
if (this.isMonths()) {
|
|
const t = new Date(e);
|
|
t.setUTCMonth(t.getUTCMonth() + (this.multiplier() || 1));
|
|
return +t - e
|
|
}
|
|
const t = this.multiplier();
|
|
return a[this.kind()] * t
|
|
}
|
|
static isEqual(e, t) {
|
|
return e === t || h.parse(e).isEqualTo(h.parse(t))
|
|
}
|
|
static parse(e) {
|
|
e = (e + "").toUpperCase().split(",")[0];
|
|
let t = s.exec(e);
|
|
return null !== t ? "H" === t[2] ? new h(n.Minutes, 60 * u(t[1])) : new h(l[t[2]],
|
|
u(t[1])) : (t = r.exec(e), null !== t ? new h(n.Minutes, u(t[1])) : new h(n
|
|
.Invalid, 0))
|
|
}
|
|
static kind(e) {
|
|
return h.parse(e).kind()
|
|
}
|
|
static isValid(e) {
|
|
return h.parse(e).isValid()
|
|
}
|
|
static isDWM(e) {
|
|
return h.parse(e).isDWM()
|
|
}
|
|
static isIntraday(e) {
|
|
return h.parse(e).isIntraday()
|
|
}
|
|
static isSeconds(e) {
|
|
return h.parse(e).isSeconds()
|
|
}
|
|
static isMinutes(e) {
|
|
return h.parse(e).isMinutes()
|
|
}
|
|
static isMinuteHours(e) {
|
|
return h.parse(e).isMinuteHours()
|
|
}
|
|
static isDays(e) {
|
|
return h.parse(e).isDays()
|
|
}
|
|
static isWeeks(e) {
|
|
return h.parse(e).isWeeks()
|
|
}
|
|
static isMonths(e) {
|
|
return h.parse(e).isMonths()
|
|
}
|
|
static isRange(e) {
|
|
return h.parse(e).isRange()
|
|
}
|
|
static isTicks(e) {
|
|
return h.parse(e).isTicks()
|
|
}
|
|
static isTimeBased(e) {
|
|
return h.parse(e).isTimeBased()
|
|
}
|
|
static normalize(e) {
|
|
const t = h.parse(e);
|
|
return t.isValid() ? t.value() : null
|
|
}
|
|
}
|
|
|
|
function u(e) {
|
|
return 0 === e.length ? 1 : parseInt(e, 10)
|
|
}
|
|
|
|
function d(e) {
|
|
return e >= 60 && !(e % 60)
|
|
}
|
|
},
|
|
"M7/j": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "itemsRangeIsValid", (function() {
|
|
return h
|
|
})), i.d(t, "splitItems", (function() {
|
|
return u
|
|
})), i.d(t, "PaneRendererBaseline", (function() {
|
|
return d
|
|
}));
|
|
var s = i("aO4+"),
|
|
r = i("hBTJ"),
|
|
n = i("GEp6"),
|
|
o = i("Zp/P"),
|
|
a = i("Y7w9"),
|
|
l = i("cPgM"),
|
|
c = i("VdBB");
|
|
|
|
function h(e) {
|
|
if (0 === e.length) return !1;
|
|
const t = e.findIndex(e => Object(o.coordinateIsValid)(e.y));
|
|
if (-1 === t) return !1;
|
|
let i = e.length - 1;
|
|
for (; i > t && !Object(o.coordinateIsValid)(e[i].y);) i--;
|
|
return !(t > i)
|
|
}
|
|
|
|
function u(e, t) {
|
|
const i = [],
|
|
n = [];
|
|
let a = null;
|
|
for (let l = 0; l < e.length; l++) {
|
|
let c = e[l];
|
|
const h = e[l + 1] || {};
|
|
if (Object(o.coordinateIsValid)(c.y)) c.y <= t && i.push(c), c.y >= t && n.push(c), a =
|
|
c;
|
|
else {
|
|
if (null === a) continue;
|
|
c = a
|
|
}
|
|
if (Object(o.coordinateIsValid)(h.y) && (c.y > t && h.y < t || c.y < t && h.y > t))
|
|
if (Math.abs(c.x - h.x) < 1) {
|
|
const e = new s.Point(c.x, t);
|
|
i.push(e), n.push(e)
|
|
} else {
|
|
const e = Object(r.intersectLineSegments)(c, h, new s.Point(c.x, t), new s
|
|
.Point(h.x, t));
|
|
if (null !== e) {
|
|
const t = c.add(h.subtract(c).scaled(e));
|
|
i.push(t), n.push(t)
|
|
}
|
|
}
|
|
}
|
|
return {
|
|
topItems: i,
|
|
bottomItems: n
|
|
}
|
|
}
|
|
class d extends l.ScaledPaneRenderer {
|
|
constructor() {
|
|
super(...arguments), this._data = null
|
|
}
|
|
setData(e) {
|
|
this._data = e
|
|
}
|
|
hitTest(e) {
|
|
if (null === this._data) return null;
|
|
const {
|
|
items: t,
|
|
topLineWidth: i,
|
|
bottomLineWidth: r
|
|
} = this._data, l = Object(o.interactionTolerance)().series + (i + r) / 4, h =
|
|
Object(a.lowerbound)(t, e, (e, t) => e.x <= t.x), u = Math.max(1, h - 1),
|
|
d = Math.min(t.length - 1, h + 1);
|
|
for (let i = u; i <= d; ++i) {
|
|
const r = t[i - 1],
|
|
o = t[i],
|
|
{
|
|
distance: a
|
|
} = Object(n.distanceToSegment)(new s.Point(r.x, r.y), new s.Point(o.x,
|
|
o.y), new s.Point(e.x, e.y));
|
|
if (a <= l) return new c.HitTestResult(c.HitTestResult.REGULAR)
|
|
}
|
|
return null
|
|
}
|
|
_drawImpl(e) {
|
|
if (null === this._data) return;
|
|
const {
|
|
items: t,
|
|
baseLevelCoordinate: i,
|
|
bottom: s,
|
|
bottomFillColor1: r,
|
|
bottomFillColor2: n,
|
|
topFillColor1: o,
|
|
topFillColor2: a,
|
|
topLineColor: l,
|
|
bottomLineColor: c,
|
|
topLineWidth: d,
|
|
bottomLineWidth: p
|
|
} = this._data;
|
|
if (!h(t)) return;
|
|
const {
|
|
topItems: _,
|
|
bottomItems: m
|
|
} = u(t, i);
|
|
e.lineCap = "round", e.lineJoin = "round", 0 !== _.length && (e.beginPath(), e
|
|
.moveTo(_[0].x, i), this._makeLine(e, _, !0, 0), e.closePath(), e
|
|
.fillStyle = this._makeLinearGradient(e, o, a, i - s, i), e.fill(), e
|
|
.beginPath(), this._makeLine(e, _, !1, 0), e.lineWidth = d, e
|
|
.strokeStyle = l, e.stroke()), 0 !== m.length && (e.beginPath(), e
|
|
.moveTo(m[0].x, i), this._makeLine(e, m, !0, 1), e.closePath(), e
|
|
.fillStyle = this._makeLinearGradient(e, r, n, i, i + s), e.fill(), e
|
|
.beginPath(), this._makeLine(e, m, !1, 1), e.lineWidth = p, e
|
|
.strokeStyle = c, e.stroke())
|
|
}
|
|
_makeLine(e, t, i, s) {
|
|
if (null === this._data) return;
|
|
const r = t.findIndex(e => Object(o.coordinateIsValid)(e.y));
|
|
if (-1 === r) return;
|
|
const {
|
|
barSpacing: n,
|
|
baseLevelCoordinate: a
|
|
} = this._data, l = .25 * n;
|
|
let c;
|
|
const h = t.length;
|
|
for (let n = r; n < h; n++) {
|
|
const h = t[n],
|
|
u = t[n + 1] || {};
|
|
if (Object(o.coordinateIsValid)(h.y)) {
|
|
if (0 === s) {
|
|
if (c && c.y >= a && h.y >= a) {
|
|
e.moveTo(h.x, h.y);
|
|
continue
|
|
}
|
|
} else if (c && c.y <= a && h.y <= a) {
|
|
e.moveTo(h.x, h.y);
|
|
continue
|
|
}
|
|
if (c && Object(o.coordinateIsValid)(c.y)) e.lineTo(h.x, h.y), i && !
|
|
Object(o.coordinateIsValid)(u.y) && e.lineTo(h.x, a);
|
|
else if (u && Object(o.coordinateIsValid)(u.y)) i ? (n !== r && e
|
|
.lineTo(h.x, a), e.lineTo(h.x, h.y)) : e.moveTo(h.x, h.y);
|
|
else if (i) {
|
|
if (0 === n) continue;
|
|
n !== r && e.lineTo(h.x - l, a), e.lineTo(h.x - l, h.y), e.lineTo(h
|
|
.x + l, h.y), e.lineTo(h.x + l, a)
|
|
} else e.moveTo(h.x - l, h.y), e.lineTo(h.x + l, h.y);
|
|
c = h
|
|
}
|
|
}
|
|
}
|
|
_makeLinearGradient(e, t, i, s, r) {
|
|
const n = e.createLinearGradient(0, s, 0, r);
|
|
return n.addColorStop(0, t), n.addColorStop(1, i), n
|
|
}
|
|
}
|
|
},
|
|
MA5A: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineToolCrossLine", (function() {
|
|
return a
|
|
}));
|
|
var s = i("Ocx9"),
|
|
r = i("p1SQ"),
|
|
n = i("GmZZ"),
|
|
o = i("Ss5c");
|
|
class a extends o.LineDataSource {
|
|
constructor(e, t) {
|
|
super(e, t || a.createProperties()), this._priceAxisView = new r
|
|
.LineToolHorzLinePriceAxisView(this), this._timeAxisView = new n.a(this), i
|
|
.e("lt-pane-views").then(i.bind(null, "amUF")).then(({
|
|
CrossLinePaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
pointsCount() {
|
|
return 1
|
|
}
|
|
name() {
|
|
return "Cross Line"
|
|
}
|
|
priceAxisViews(e, t) {
|
|
return this.isSourceHidden() ? null : t === this.priceScale() && this
|
|
.properties().showPrice.value() && this._model.paneForSource(this) === e ? [
|
|
this._priceAxisView
|
|
] : null
|
|
}
|
|
timeAxisViews() {
|
|
return this.isSourceHidden() ? null : this.properties().showTime.value() ? [this
|
|
._timeAxisView
|
|
] : null
|
|
}
|
|
updateAllViews() {
|
|
super.updateAllViews(), this._priceAxisView.update(), this._timeAxisView
|
|
.update()
|
|
}
|
|
canHasAlert() {
|
|
return !1
|
|
}
|
|
lineColor() {
|
|
return this.properties().linecolor.value()
|
|
}
|
|
lineWidth() {
|
|
return this.properties().linewidth.value()
|
|
}
|
|
lineStyle() {
|
|
return this.properties().linestyle.value()
|
|
}
|
|
static createProperties(e) {
|
|
const t = new s.DefaultProperty("linetoolcrossline", e);
|
|
return a._configureProperties(t), t
|
|
}
|
|
_getPropertyDefinitionsViewModelClass() {
|
|
return Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "xrdl")).then(
|
|
e => e.CrossLineDefinitionsViewModel)
|
|
}
|
|
static _configureProperties(e) {
|
|
o.LineDataSource._configureProperties(e)
|
|
}
|
|
}
|
|
},
|
|
MROS: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "ModelSelection", (function() {
|
|
return o
|
|
}));
|
|
var s = i("Y7w9"),
|
|
r = i("GxN8"),
|
|
n = i("CW80");
|
|
class o {
|
|
constructor() {
|
|
this._items = [], this._set = new Set
|
|
}
|
|
isEmpty() {
|
|
return 0 === this._items.length
|
|
}
|
|
add(e) {
|
|
if (this._items.length > 0 && !Object(n.isLineTool)(this._items[0]) && this.clear(),
|
|
Object(n.isLineTool)(e)) {
|
|
const t = Object(s.lowerbound)(this._items, e, (e, t) => e.zorder() < t
|
|
.zorder());
|
|
this._items.splice(t, 0, e)
|
|
} else this.clear(), this._items = [e];
|
|
this._set.add(e)
|
|
}
|
|
canBeAddedToSelection(e) {
|
|
return 0 === this._items.length || Object(n.isLineTool)(this._items[0]) && Object(n
|
|
.isLineTool)(e)
|
|
}
|
|
isSelected(e) {
|
|
return this._set.has(e)
|
|
}
|
|
allSources() {
|
|
return this._items.slice(0)
|
|
}
|
|
dataSources() {
|
|
return this._items.filter(r.a)
|
|
}
|
|
lineDataSources() {
|
|
return this._items.filter(n.isLineTool)
|
|
}
|
|
customSources() {
|
|
return this._items.filter(e => !Object(r.a)(e))
|
|
}
|
|
checkLineToolSelection() {
|
|
this._items.forEach(e => Object(n.isLineTool)(e) && e.calcIsActualSymbol()), this
|
|
._items = this._items.filter(e => !Object(n.isLineTool)(e) || e
|
|
.isActualSymbol())
|
|
}
|
|
remove(e) {
|
|
this._items = this._items.filter(t => t !== e), this._set.delete(e)
|
|
}
|
|
clear() {
|
|
this._items = [], this._set.clear()
|
|
}
|
|
notFixedSources() {
|
|
return this._items.filter(e => !Object(n.isLineTool)(e) || !e.isFixed())
|
|
}
|
|
}
|
|
},
|
|
MSvv: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "StudyLineDataSource", (function() {
|
|
return g
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("ogJP"),
|
|
n = i("k9/m"),
|
|
o = i("Ss5c"),
|
|
a = i("Ocx9"),
|
|
l = i("0YCj"),
|
|
c = i.n(l),
|
|
h = i("jenN"),
|
|
u = i("ZAxB"),
|
|
d = i("gvrv"),
|
|
p = i("w4Ji"),
|
|
_ = i("GVHu"),
|
|
m = i("jCNj"),
|
|
f = i("OLhd");
|
|
class g extends o.LineDataSource {
|
|
constructor(e, t, s, r) {
|
|
super(e, r), this._indexes = null, this._inputs = null, this._pointsetPoints =
|
|
null, this._loadedPlots = null, this._loadedGraphics = null, this
|
|
._beingCreatedPaneView = null, this._anchorsPaneView = null, this
|
|
._definitionsViewModel = null, this._alignerCache = null, Promise.all([i.e(
|
|
"lt-pane-views").then(i.bind(null, "pGCE")), i.e(
|
|
"lt-pane-views").then(i.bind(null, "AOzI"))]).then(t => {
|
|
const {
|
|
LineToolBeingCreatedPaneView: i
|
|
} = t[0], {
|
|
StudyLineDataSourceAnchorsPaneView: s
|
|
} = t[1];
|
|
this._beingCreatedPaneView = new i(this, e), this._anchorsPaneView =
|
|
new s(this, this.model()), this._model.lightUpdate()
|
|
}), this._metaInfo = t, this._dataSource = new d.a(e.chartApi(), e
|
|
.mainSeries().seriesSource(), s, t), this._dataSource.dataCleared()
|
|
.subscribe(this, this._onDataCleared), this._dataSource.dataUpdated()
|
|
.subscribe(this, this._onDataUpdated)
|
|
}
|
|
destroy() {
|
|
this._dataSource.dataUpdated().unsubscribe(this, this._onDataUpdated), this
|
|
._dataSource.dataCleared().unsubscribe(this, this._onDataCleared), this
|
|
._dataSource.destroy(), null !== this._definitionsViewModel && (this
|
|
._definitionsViewModel.destroy(), this._definitionsViewModel = null),
|
|
this._unsubscribeApplyInputsOnSeriesCompleted(), this._isDestroyed = !0,
|
|
super.destroy()
|
|
}
|
|
stop() {
|
|
super.stop(), this._isDestroyed || (this._dataSource.stop(), this.clearData())
|
|
}
|
|
start() {
|
|
super.start(), this._isDestroyed || null === this._inputs || this._dataSource
|
|
.start()
|
|
}
|
|
metaInfo() {
|
|
return this._metaInfo
|
|
}
|
|
graphicsInfo() {
|
|
return this._metaInfo.graphics
|
|
}
|
|
series() {
|
|
return this._model.mainSeries()
|
|
}
|
|
translatedType() {
|
|
return this._metaInfo.description
|
|
}
|
|
name() {
|
|
return this._metaInfo.description
|
|
}
|
|
studyId() {
|
|
return this._metaInfo.id
|
|
}
|
|
setPoint(e, t, i) {
|
|
super.setPoint(e, this._preparePoint(t, i))
|
|
}
|
|
move(e) {}
|
|
clearData() {
|
|
this._clearAllDataExceptPointsetPoints(), this._pointsetPoints = null, this
|
|
.updateAllViews()
|
|
}
|
|
data() {
|
|
return this.plots()
|
|
}
|
|
plots() {
|
|
return this._loadedPlots || this._dataSource.plots()
|
|
}
|
|
graphics() {
|
|
return this._loadedGraphics || this._dataSource.graphics()
|
|
}
|
|
firstValue() {
|
|
return this._model.mainSeries().firstValue()
|
|
}
|
|
state(e) {
|
|
const t = super.state(e);
|
|
let i;
|
|
this.metaInfo() instanceof c.a ? i = this.metaInfo().state() : (i = Object(r
|
|
.clone)(this.metaInfo()), i.id = c.a.parseIdString(i.id + (i
|
|
.version ? "-" + i.version : "")).fullId);
|
|
const s = {
|
|
...t,
|
|
metaInfo: i
|
|
};
|
|
return e && (s.data = this.plots().state(), s.nonseriesindexes = this._indexes,
|
|
s.graphics = Object(h.saveStudyGraphics)(this.graphics())), s
|
|
}
|
|
restoreData(e) {
|
|
void 0 !== e.data && (this._loadedPlots = new n.PlotList(Object(p
|
|
.studyPlotFunctionMap)(this._metaInfo), p
|
|
.studyEmptyPlotValuePredicate), this._loadedPlots.restoreState(e
|
|
.data)), this._indexes = e.nonseriesindexes ? e.nonseriesindexes : null,
|
|
this._loadedGraphics = e.graphics ? Object(h.loadStudyGraphics)(e
|
|
.graphics) : null
|
|
}
|
|
getPropertyDefinitionsViewModel() {
|
|
return null === this._definitionsViewModel ? this
|
|
._getPropertyDefinitionsViewModelClass().then(e => null === e || this
|
|
._isDestroyed ? null : (null === this._definitionsViewModel && (this
|
|
._definitionsViewModel = new e(this._model.undoModel(), this)),
|
|
this._definitionsViewModel)) : Promise.resolve(this
|
|
._definitionsViewModel)
|
|
}
|
|
paneViews(e) {
|
|
let t = [];
|
|
if (this.isSourceHidden()) return t;
|
|
if (this._isReady() && this._changeStatesStack.isEmpty()) {
|
|
const i = super.paneViews(e);
|
|
null !== i && (t = t.concat(i))
|
|
} else null !== this._beingCreatedPaneView && t.push(this
|
|
._beingCreatedPaneView);
|
|
return null !== this._anchorsPaneView && t.push(this._anchorsPaneView), t
|
|
}
|
|
propertiesChanged(e) {
|
|
super.propertiesChanged(e), this._onStudyInputsMayChange()
|
|
}
|
|
dataAndViewsReady() {
|
|
return super.dataAndViewsReady() && this._isReady()
|
|
}
|
|
endChanging(e, t) {
|
|
const i = super.endChanging(e, t);
|
|
return i.indexesChanged ? this.clearData() : this._updateAnchorsPrice(), i
|
|
}
|
|
moveData(e) {
|
|
this._dataSource.moveData(e)
|
|
}
|
|
static createPropertiesFromStudyMetaInfoAndState(e, t, i, s) {
|
|
const r = Object(_.prepareStudyPropertiesForLoadChart)(e, t, i, null, s);
|
|
return g._configureProperties(r), r
|
|
}
|
|
_isReady() {
|
|
return !0
|
|
}
|
|
_updateAllPaneViews() {
|
|
var e, t;
|
|
super._updateAllPaneViews(), null === (e = this._beingCreatedPaneView) ||
|
|
void 0 === e || e.update(), null === (t = this._anchorsPaneView) ||
|
|
void 0 === t || t.update()
|
|
}
|
|
_getPointTime(e, t) {
|
|
const i = e.index,
|
|
s = this._model.timeScale().indexToTimePoint(i);
|
|
if (null !== s) return s;
|
|
if (t || void 0 === e.time) return null;
|
|
const r = this._model.mainSeries().symbolInfo();
|
|
if (null === r) return null;
|
|
let n = this._model.properties().timezone.value();
|
|
"exchange" === n && (n = r.timezone);
|
|
const o = Object(m.cal_to_utc)(Object(m.get_timezone)(n), e.time);
|
|
return this._getStartBarAligner()(o) / 1e3
|
|
}
|
|
_updateAnchorsPrice() {}
|
|
_onPointsetUpdated(e) {
|
|
super._onPointsetUpdated(e), this._pointsetPoints = this._points.map(e => ({
|
|
price: e.price,
|
|
index: e.index,
|
|
time: e.time
|
|
})), this._onStudyInputsMayChange()
|
|
}
|
|
_onDataCleared() {
|
|
this.updateAllViews(),
|
|
this._model.updateSource(this)
|
|
}
|
|
_onDataUpdated(e, t, i) {
|
|
this._updateAnchorsPrice(), this.updateAllViews(), this._model.updateSource(
|
|
this)
|
|
}
|
|
_onStudyInputsMayChange() {
|
|
let e = null;
|
|
null !== this._pointsetPoints && this._pointsetPoints.length === this
|
|
.pointsCount() && (e = this._studyInputs(this._pointsetPoints), null ===
|
|
e && (this._clearAllDataExceptPointsetPoints(), this.updateAllViews())),
|
|
this._areInputsEqual(this._inputs, e) || this._applyStudyInputs(e)
|
|
}
|
|
_onMainSeriesSymbolResolved() {
|
|
super._onMainSeriesSymbolResolved(), this._alignerCache = null
|
|
}
|
|
_preparePoint(e, t) {
|
|
return super._preparePoint(this._alignPointToRangeOfActualData(e), t)
|
|
}
|
|
_getPropertyDefinitionsViewModelClass() {
|
|
return Promise.resolve(null)
|
|
}
|
|
_subscribeApplyInputsOnSeriesCompleted() {
|
|
this._unsubscribeApplyInputsOnSeriesCompleted(), this._model.mainSeries()
|
|
.dataEvents().completed().subscribe(this, () => this
|
|
._onStudyInputsMayChange(), !0)
|
|
}
|
|
_unsubscribeApplyInputsOnSeriesCompleted() {
|
|
this._model.mainSeries().dataEvents().completed().unsubscribeAll(this)
|
|
}
|
|
static _createPropertiesFromStudyIdAndState(e, t) {
|
|
const i = c.a.getStudyPropertyRootNameById(e),
|
|
s = new a.DefaultProperty(i, t);
|
|
return g._configureProperties(s), s
|
|
}
|
|
static _createPropertiesFromStudyMetaInfo(e, t) {
|
|
const i = Object(_.prepareStudyProperties)(e, null, null, t);
|
|
return g._configureProperties(i), i
|
|
}
|
|
static _configureProperties(e) {
|
|
o.LineDataSource._configureProperties(e)
|
|
}
|
|
_areInputsEqual(e, t) {
|
|
return null === t ? null === e : null !== e && Object(u.a)(this._metaInfo
|
|
.inputs, e, t)
|
|
}
|
|
_applyStudyInputs(e) {
|
|
const t = this._inputs;
|
|
this._inputs = e, null !== e && (this
|
|
._unsubscribeApplyInputsOnSeriesCompleted(), this._dataSource.setInputs(
|
|
e),
|
|
null === t && this.isStarted() && !this._dataSource.isStarted() && this
|
|
._dataSource.start())
|
|
}
|
|
_clearAllDataExceptPointsetPoints() {
|
|
this._inputs = null, this._dataSource.clearData(), this._loadedPlots = null,
|
|
this._indexes = null, this._loadedGraphics = null
|
|
}
|
|
_getStartBarAligner() {
|
|
const e = this._model.mainSeries().interval();
|
|
return null !== this._alignerCache && this._alignerCache.resolution === this
|
|
._model.mainSeries().interval() || (this._alignerCache = {
|
|
resolution: e,
|
|
aligner: Object(f.createTimeToBarTimeAligner)(e, Object(s
|
|
.ensureNotNull)(this._model.mainSeries().symbolInfo()))
|
|
}), this._alignerCache.aligner
|
|
}
|
|
}
|
|
},
|
|
MWAT: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "PriceScaleSelectionStrategyEvenly", (function() {
|
|
return o
|
|
})), i.d(t, "PriceScaleSelectionStrategyAllRight", (function() {
|
|
return a
|
|
})), i.d(t, "PriceScaleSelectionStrategyAllLeft", (function() {
|
|
return l
|
|
})), i.d(t, "createPriceScaleSelectionStrategy", (function() {
|
|
return h
|
|
})), i.d(t, "allPriceScaleSelectionStrategyInfo", (function() {
|
|
return u
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("3ClC");
|
|
class n {
|
|
constructor(e) {
|
|
this._priceScalesLimit = 8, this._metaInfo = e
|
|
}
|
|
metaInfo() {
|
|
return this._metaInfo
|
|
}
|
|
findSuitableScale(e, t, i, s) {
|
|
if (void 0 !== s) return this._tryToGetDesiredPriceScale(e, t, s, i);
|
|
if (Object(r.isStudy)(t)) {
|
|
const s = t.metaInfo();
|
|
if ("Volume" === s.shortId && e.containsMainSeries()) return e
|
|
.createPriceScaleAtPosition("overlay");
|
|
const n = t.desiredPriceScalePosition();
|
|
if (null !== n) return this._tryToGetDesiredPriceScale(e, t, n, i);
|
|
if (void 0 !== i && (Object(r.isStudy)(i) || e.isMainPane()) && s
|
|
.is_price_study) return this._getPriceScaleTheSameAsForSource(i, e)
|
|
}
|
|
let n = !1;
|
|
if (Object(r.isStudy)(t)) {
|
|
const i = t.metaInfo().groupingKey;
|
|
if (void 0 !== i) {
|
|
const t = e.model().findNonOverlayStudyWithGroupingKey(i, e);
|
|
if (null !== t) return this._getPriceScaleTheSameAsForSource(t.study, t
|
|
.pane)
|
|
}
|
|
n = Boolean(t.metaInfo().is_price_study)
|
|
} else t === e.model().mainSeries() && (n = !0);
|
|
if (n) {
|
|
const t = this._findFirstScaleForPriceStudy(e);
|
|
if (null !== t) return t
|
|
}
|
|
return this.createNewPriceScaleIfPossible(e)
|
|
}
|
|
canCreateNewPriceScale(e) {
|
|
return e.leftPriceScales().length + e.rightPriceScales().length < this
|
|
._priceScalesLimit
|
|
}
|
|
_getPriceScaleTheSameAsForSource(e, t) {
|
|
return t.isOverlay(e) ? t.createPriceScaleAtPosition("overlay") : Object(s
|
|
.ensureNotNull)(e.priceScale())
|
|
}
|
|
_priceScaleIsPrice(e, t) {
|
|
const i = e.mainSource();
|
|
return !!i && (i === t.mainSeries() || !!Object(r.isStudy)(i) && Boolean(i
|
|
.metaInfo().is_price_study))
|
|
}
|
|
_findFirstScaleForPriceStudy(e) {
|
|
const t = e.model();
|
|
for (let i = 0; i < this._priceScalesLimit; i++) {
|
|
if (e.rightPriceScales().length > i && this._priceScaleIsPrice(e
|
|
.rightPriceScales()[i], t)) return e.rightPriceScales()[i];
|
|
if (e.leftPriceScales().length > i && this._priceScaleIsPrice(e
|
|
.leftPriceScales()[i], t)) return e.leftPriceScales()[i]
|
|
}
|
|
return null
|
|
}
|
|
_targetPriceScaleIndex(e, t) {
|
|
if (e.mainSource() === t.mainSeries()) return 0
|
|
}
|
|
_tryToGetDesiredPriceScale(e, t, i, r) {
|
|
switch (i) {
|
|
case "left":
|
|
return this.canCreateNewPriceScale(e) ? e.createPriceScaleAtPosition(
|
|
"left") : e.createPriceScaleAtPosition("overlay");
|
|
case "right":
|
|
return this.canCreateNewPriceScale(e) ? e.createPriceScaleAtPosition(
|
|
"right") : e.createPriceScaleAtPosition("overlay");
|
|
case "as-series":
|
|
return void 0 !== r ? Object(s.ensureNotNull)(r.priceScale()) : e
|
|
.isMainPane() ? Object(s.ensureNotNull)(Object(s.ensureNotNull)(e
|
|
.mainDataSource()).priceScale()) : this
|
|
.createNewPriceScaleIfPossible(e);
|
|
case "overlay":
|
|
return e.createPriceScaleAtPosition("overlay")
|
|
}
|
|
}
|
|
}
|
|
class o extends n {
|
|
constructor(e) {
|
|
super(e)
|
|
}
|
|
apply(e) {
|
|
if (e.containsMainSeries()) {
|
|
const t = Object(s.ensureNotNull)(Object(s.ensureNotNull)(e.mainDataSource())
|
|
.priceScale());
|
|
e.movePriceScale(t, "right", 0)
|
|
}
|
|
const t = e.model();
|
|
for (; e.leftPriceScales().length > e.rightPriceScales().length;) {
|
|
const i = e.leftPriceScales()[e.leftPriceScales().length - 1];
|
|
e.movePriceScale(i, "right", this._targetPriceScaleIndex(i, t))
|
|
}
|
|
for (; e.rightPriceScales().length - e.leftPriceScales().length > 1;) {
|
|
const i = e.rightPriceScales()[e.rightPriceScales().length - 1];
|
|
e.movePriceScale(i, "left", this._targetPriceScaleIndex(i, t))
|
|
}
|
|
}
|
|
createNewPriceScaleIfPossible(e) {
|
|
if (!this.canCreateNewPriceScale(e)) return e.createPriceScaleAtPosition("overlay");
|
|
const t = e.leftPriceScales().length < e.rightPriceScales().length ? "left" :
|
|
"right";
|
|
return e.createPriceScaleAtPosition(t)
|
|
}
|
|
}
|
|
class a extends n {
|
|
constructor(e) {
|
|
super(e)
|
|
}
|
|
apply(e) {
|
|
const t = e.model();
|
|
e.leftPriceScales().slice(0).forEach(i => e.movePriceScale(i, "right", this
|
|
._targetPriceScaleIndex(i, t)))
|
|
}
|
|
createNewPriceScaleIfPossible(e) {
|
|
return this.canCreateNewPriceScale(e) ? e.createPriceScaleAtPosition("right") : e
|
|
.createPriceScaleAtPosition("overlay")
|
|
}
|
|
}
|
|
class l extends n {
|
|
constructor(e) {
|
|
super(e)
|
|
}
|
|
apply(e) {
|
|
const t = e.model();
|
|
e.rightPriceScales().slice(0).forEach(i => e.movePriceScale(i, "left", this
|
|
._targetPriceScaleIndex(i, t)))
|
|
}
|
|
createNewPriceScaleIfPossible(e) {
|
|
return this.canCreateNewPriceScale(e) ? e.createPriceScaleAtPosition("left") : e
|
|
.createPriceScaleAtPosition("overlay")
|
|
}
|
|
}
|
|
const c = [{
|
|
name: "left",
|
|
title: window.t("Stack On The Left"),
|
|
ctor: l
|
|
}, {
|
|
name: "right",
|
|
title: window.t("Stack On The Right"),
|
|
ctor: a
|
|
}, {
|
|
name: "auto",
|
|
title: window.t("Auto"),
|
|
ctor: o
|
|
}];
|
|
|
|
function h(e) {
|
|
const t = Object(s.ensureDefined)(c.find(t => t.name === e));
|
|
return new t.ctor(t)
|
|
}
|
|
|
|
function u() {
|
|
return c
|
|
}
|
|
},
|
|
MXV9: function(e, t) {
|
|
e.exports =
|
|
'<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28"><g fill="none" fill-rule="evenodd" stroke="currentColor" transform="translate(4 4)"><path d="M.5 10.992c0 .287.226.508.505.508H2.65c.19.93.55 1.82 1.09 2.63L2.577 15.3a.5.5 0 0 0-.007.71l1.42 1.42a.5.5 0 0 0 .71-.007l1.17-1.163c.81.54 1.71.9 2.63 1.09v1.645c0 .284.227.505.508.505h1.984c.28 0 .508-.221.508-.505V17.35a7.46 7.46 0 0 0 2.63-1.09l1.17 1.163a.5.5 0 0 0 .71.007l1.42-1.42a.5.5 0 0 0-.007-.71l-1.163-1.17c.54-.81.9-1.7 1.09-2.63h1.645a.502.502 0 0 0 .505-.508V9.008a.503.503 0 0 0-.505-.508H17.35c-.19-.93-.55-1.82-1.09-2.63l1.163-1.17a.5.5 0 0 0 .007-.71l-1.42-1.42a.5.5 0 0 0-.71.007L14.13 3.74a7.46 7.46 0 0 0-2.63-1.09V1.005A.504.504 0 0 0 10.992.5H9.008a.504.504 0 0 0-.508.505V2.65c-.92.19-1.82.55-2.63 1.09L4.7 2.577a.5.5 0 0 0-.71-.007L2.57 3.99a.5.5 0 0 0 .007.71L3.74 5.87c-.54.81-.9 1.7-1.09 2.63H1.005a.503.503 0 0 0-.505.508v1.984z"/><circle cx="10" cy="10" r="2.5"/></g></svg>'
|
|
},
|
|
MY2c: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return l
|
|
}));
|
|
var s = i("RDU5"),
|
|
r = i("aIyQ"),
|
|
n = i.n(r),
|
|
o = i("txPx");
|
|
const a = Object(o.getLogger)("Common.UndoStack");
|
|
class l {
|
|
constructor() {
|
|
this._commands = [], this._onChange = new n.a
|
|
}
|
|
onChange() {
|
|
return this._onChange
|
|
}
|
|
isEmpty() {
|
|
return 0 === this._commands.length
|
|
}
|
|
clear() {
|
|
this.isEmpty() || (this._commands.length = 0, this._onChange.fire())
|
|
}
|
|
push(e) {
|
|
if (!(e instanceof s.UndoCommand)) throw new TypeError(
|
|
"argument must be an instance of UndoCommand");
|
|
this._commands.push(e), this._onChange.fire(e)
|
|
}
|
|
pop() {
|
|
if (this.isEmpty()) return void a.logDebug("pop: undo stack is empty");
|
|
const e = this._commands.pop();
|
|
return this._onChange.fire(e), e
|
|
}
|
|
head() {
|
|
if (!this.isEmpty()) return this._commands[this._commands.length - 1]
|
|
}
|
|
}
|
|
},
|
|
MbIA: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return o
|
|
}));
|
|
var s = i("4kQX"),
|
|
r = i("gQ5K");
|
|
const n = {
|
|
dateFormat: "yyyy-MM-dd",
|
|
timeFormat: "%h:%m:%s",
|
|
dateTimeSeparator: " "
|
|
};
|
|
class o {
|
|
constructor(e = {}) {
|
|
const t = Object.assign({}, n, e);
|
|
this._dateFormatter = new r.DateFormatter(t.dateFormat), this._timeFormatter = new s
|
|
.TimeFormatter(t.timeFormat), this._separator = t.dateTimeSeparator
|
|
}
|
|
format(e) {
|
|
return `${this._dateFormatter.format(e)}${this._separator}${this._timeFormatter.format(e)}`
|
|
}
|
|
formatLocal(e) {
|
|
return `${this._dateFormatter.formatLocal(e)}${this._separator}${this._timeFormatter.formatLocal(e)}`
|
|
}
|
|
}
|
|
},
|
|
MrEN: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("aIyQ"),
|
|
r = function(e, t) {
|
|
this._server = e, this._session = t, this.seriesCompleted = new s, this.seriesError =
|
|
new s
|
|
};
|
|
r.prototype.onRequestMetadata = function(e, t) {
|
|
this._server.receiveLocalResponse({
|
|
method: "studies_metadata",
|
|
params: [this._session, e, {
|
|
errors: [],
|
|
hash: "",
|
|
metainfo: t,
|
|
migrations: []
|
|
}]
|
|
})
|
|
}, r.prototype.onSymbolResolved = function(e, t) {
|
|
this._server.receiveLocalResponse({
|
|
method: "symbol_resolved",
|
|
params: [this._session, e, t]
|
|
})
|
|
}, r.prototype.onSymbolError = function(e, t) {
|
|
this._server.receiveLocalResponse({
|
|
method: "symbol_error",
|
|
params: [this._session, e, t]
|
|
})
|
|
}, r.prototype.onStudyError = function(e, t, i) {
|
|
this._server.receiveLocalResponse({
|
|
method: "study_error",
|
|
params: [this._session, e, t, i]
|
|
})
|
|
}, r.prototype.onSeriesLoading = function(e, t) {
|
|
this._server.receiveLocalResponse({
|
|
method: "series_loading",
|
|
params: [this._session, e, t]
|
|
})
|
|
}, r.prototype.onSeriesCompleted = function(e, t, i) {
|
|
this._server.receiveLocalResponse({
|
|
method: "series_completed",
|
|
params: [this._session, e, i, t]
|
|
}), this.seriesCompleted.fire(e, t)
|
|
}, r.prototype.onSeriesError = function(e, t, i) {
|
|
this._server.receiveLocalResponse({
|
|
method: "series_error",
|
|
params: [this._session, e, t, i]
|
|
}), this.seriesError.fire(e, t)
|
|
}, r.prototype.onStudyCompleted = function(e, t) {
|
|
this._server.receiveLocalResponse({
|
|
method: "study_completed",
|
|
params: [this._session, e, t]
|
|
})
|
|
}, r.prototype.onStudyLoading = function(e, t) {
|
|
this._server.receiveLocalResponse({
|
|
method: "study_loading",
|
|
params: [this._session, e, t]
|
|
})
|
|
}, r.prototype.onTickmarksUpdated = function(e, t) {
|
|
var i = {
|
|
method: "tickmark_update",
|
|
params: [this._session, {
|
|
index: e,
|
|
zoffset: 0,
|
|
changes: [],
|
|
marks: t,
|
|
index_diff: []
|
|
}]
|
|
};
|
|
this._server.receiveLocalResponse(i)
|
|
}, r.prototype.onTimescaleUpdate = function(e, t) {
|
|
var i = {
|
|
method: "timescale_update",
|
|
params: [this._session, this._prepareDataUpdateObjects(t), {
|
|
index: e.pointsIndex,
|
|
zoffset: 0,
|
|
changes: e.points,
|
|
marks: e.marks,
|
|
index_diff: e.indexChange,
|
|
baseIndex: e.baseIndex
|
|
}]
|
|
};
|
|
this._server.receiveLocalResponse(i)
|
|
}, r.prototype.onTimescaleCompleted = function(e) {
|
|
this._server.receiveLocalResponse({
|
|
method: "timescale_completed",
|
|
params: [this._session, e]
|
|
})
|
|
}, r.prototype.onSeriesTimeframeUpdate = function(e, t, i, s, r) {
|
|
var n = {
|
|
method: "series_timeframe",
|
|
params: [this._session, e, t, i, s, null, !0, r]
|
|
};
|
|
this._server.receiveLocalResponse(n)
|
|
}, r.prototype.onPointsetDataUpdate = function(e, t, i) {
|
|
this.onDataUpdate(e, t, i, null)
|
|
}, r.prototype._prepareDataUpdateObjects = function(e) {
|
|
var t = {};
|
|
return e.forEach((function(e) {
|
|
t[e.objId] = {
|
|
series: e.data,
|
|
turnaround: e.turnaround
|
|
}, e.nonSeriesData && (e.nonSeriesData.data ? t[e.objId]
|
|
.nonseries = {
|
|
d: JSON.stringify(e.nonSeriesData.data),
|
|
indexes: e.nonSeriesData.indexes
|
|
} : t[e.objId].nonseries = {
|
|
d: "",
|
|
indexes: []
|
|
})
|
|
})), t
|
|
}, r.prototype.onDataUpdate = function(e, t, i, s) {
|
|
var r = {
|
|
method: "data_update",
|
|
params: [this._session, this._prepareDataUpdateObjects([{
|
|
objId: e,
|
|
turnaround: t,
|
|
data: i,
|
|
nonSeriesData: s
|
|
}])]
|
|
};
|
|
this._server.receiveLocalResponse(r)
|
|
}, r.prototype.onQuotesData = function(e) {
|
|
this._server.receiveLocalResponse({
|
|
method: "quote_symbol_data",
|
|
params: e
|
|
})
|
|
}, r.prototype.onDepthData = function(e) {
|
|
this._server.receiveLocalResponse({
|
|
method: "dd",
|
|
params: e
|
|
})
|
|
}, r.prototype.onDepthUpdate = function(e) {
|
|
this._server.receiveLocalResponse({
|
|
method: "dpu",
|
|
params: e
|
|
})
|
|
}, r.prototype.onClearData = function(e) {
|
|
this._server.receiveLocalResponse({
|
|
method: "clear_data",
|
|
params: [this._session, e]
|
|
})
|
|
}, TradingView.ChartapiMessagerInstances = [], e.exports = r
|
|
},
|
|
"N+BX": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineToolBezierCubic", (function() {
|
|
return n
|
|
}));
|
|
var s = i("Ocx9"),
|
|
r = i("Ss5c");
|
|
class n extends r.LineDataSource {
|
|
constructor(e, t) {
|
|
const s = t || n.createProperties();
|
|
super(e, s), this._controlPoints = null, i.e("lt-pane-views").then(i.bind(null,
|
|
"a6on")).then(t => {
|
|
this._setPaneViews([new t.BezierCubicPaneView(this, e)])
|
|
})
|
|
}
|
|
pointsCount() {
|
|
return 2
|
|
}
|
|
name() {
|
|
return "Double Curve"
|
|
}
|
|
properties() {
|
|
return super.properties()
|
|
}
|
|
setLastPoint(e, t) {
|
|
super.setLastPoint(e, t), this._controlPoints = this._calculateControlPoints()
|
|
}
|
|
addPoint(e, t, i) {
|
|
const s = super.addPoint(e, t, i);
|
|
if (s) {
|
|
const e = this._calculateControlPoints();
|
|
this._controlPoints = null, this._points.push(e[0]), this._points.push(e[
|
|
1]), i || (this.normalizePoints(), this.createServerPoints()), this
|
|
._createPointProperty(2), this._createPointProperty(3)
|
|
}
|
|
return s
|
|
}
|
|
restorePoints(e, t, i) {
|
|
super.restorePoints(e, t, i), this._createPointProperty(2), this
|
|
._createPointProperty(3)
|
|
}
|
|
controlPoints() {
|
|
return this._controlPoints
|
|
}
|
|
static createProperties(e) {
|
|
const t = new s.DefaultProperty("linetoolbeziercubic", e);
|
|
return n._configureProperties(t), t
|
|
}
|
|
_getPropertyDefinitionsViewModelClass() {
|
|
return Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "b4fl")).then(
|
|
e => e.GeneralBezierDefinitionsViewModel)
|
|
}
|
|
static _configureProperties(e) {
|
|
r.LineDataSource._configureProperties(e)
|
|
}
|
|
_calculateControlPoints() {
|
|
const e = this.pointToScreenPoint(this.points()[0])[0],
|
|
t = this.pointToScreenPoint(this.points()[1])[0],
|
|
i = t.subtract(e).scaled(.5).transposed().scaled(.3),
|
|
s = e.add(t).scaled(.33),
|
|
r = e.add(t).scaled(.67),
|
|
n = s.add(i),
|
|
o = r.subtract(i);
|
|
return [this.screenPointToPoint(n), this.screenPointToPoint(o)]
|
|
}
|
|
}
|
|
},
|
|
N1UO: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "StudyApi", (function() {
|
|
return v
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("aIyQ"),
|
|
n = i.n(r),
|
|
o = i("ogJP"),
|
|
a = i("9iCb"),
|
|
l = i("xo8u"),
|
|
c = i("gaBL"),
|
|
h = i("HGup"),
|
|
u = i("jRfx"),
|
|
d = i("/ToI"),
|
|
p = i("HZKX"),
|
|
_ = i("SwuQ"),
|
|
m = i("Yt+L"),
|
|
f = i("GD+X"),
|
|
g = i("bmVy"),
|
|
b = i("pZDF");
|
|
class v {
|
|
constructor(e, t) {
|
|
this._onStudyCompleted = new n.a, this._onStudyError = new n.a, this._study = e,
|
|
this._chartWidget = t, this._undoModel = this._chartWidget.model(), this
|
|
._model = this._undoModel.model(), this._study.onAboutToBeDestroyed().subscribe(
|
|
this, () => {
|
|
this._study.onStatusChanged().unsubscribeAll(this), this._study
|
|
.onAboutToBeDestroyed().unsubscribeAll(this)
|
|
}), this._study.onStatusChanged().subscribe(this, e => {
|
|
switch (e.type) {
|
|
case g.StudyStatusType.Completed:
|
|
this._onStudyCompleted.fire();
|
|
break;
|
|
case g.StudyStatusType.Error:
|
|
this._onStudyError.fire()
|
|
}
|
|
})
|
|
}
|
|
isUserEditEnabled() {
|
|
return this._study.userEditEnabled()
|
|
}
|
|
setUserEditEnabled(e) {
|
|
this._study.setUserEditEnabled(e)
|
|
}
|
|
getInputsInfo() {
|
|
return Object(b.getStudyInputsInfo)(this._study.metaInfo())
|
|
}
|
|
getInputValues() {
|
|
const e = this._study.inputs({
|
|
symbolsForChartApi: !1,
|
|
asObject: !0
|
|
});
|
|
return Object.keys(e).map(t => {
|
|
const i = e[t];
|
|
return {
|
|
id: t,
|
|
value: Object(o.isObject)(i) ? i.v : i
|
|
}
|
|
})
|
|
}
|
|
setInputValues(e) {
|
|
const t = this.getInputValues();
|
|
for (const i of e) {
|
|
void 0 !== t.find(e => e.id === i.id) ? this._study.properties().inputs[i.id]
|
|
.setValue(i.value) : console.warn(`There is no such input: "${i.id}"`)
|
|
}
|
|
}
|
|
mergeUp() {
|
|
this._model.isMergeUpAvailableForSource(this._study) && new u.c(this._model, this
|
|
._study, "").redo()
|
|
}
|
|
mergeDown() {
|
|
this._model.isMergeDownAvailableForSource(this._study) && new u.a(this._model, this
|
|
._study, "").redo()
|
|
}
|
|
unmergeUp() {
|
|
this._model.isUnmergeAvailableForSource(this._study) && new h.c(this._model, this
|
|
._study, "").redo()
|
|
}
|
|
unmergeDown() {
|
|
this._model.isUnmergeAvailableForSource(this._study) && new h.a(this._model, this
|
|
._study, "").redo()
|
|
}
|
|
onDataLoaded() {
|
|
return this._onStudyCompleted
|
|
}
|
|
onStudyError() {
|
|
return this._onStudyError
|
|
}
|
|
mergeUpWithUndo() {
|
|
this._model.isMergeUpAvailableForSource(this._study) && this._undoModel
|
|
.mergeSourceUp(this._study)
|
|
}
|
|
mergeDownWithUndo() {
|
|
this._model.isMergeDownAvailableForSource(this._study) && this._undoModel
|
|
.mergeSourceDown(this._study)
|
|
}
|
|
unmergeUpWithUndo() {
|
|
this._model.isUnmergeAvailableForSource(this._study) && this._undoModel
|
|
.unmergeSourceUp(this._study)
|
|
}
|
|
unmergeDownWithUndo() {
|
|
this._model.isUnmergeAvailableForSource(this._study) && this._undoModel
|
|
.unmergeSourceDown(this._study)
|
|
}
|
|
priceScale() {
|
|
return new f.a(this._undoModel, Object(s.ensureNotNull)(this._study.priceScale()))
|
|
}
|
|
symbolSource() {
|
|
const e = Object(s.ensureNotNull)(this._study.symbolSource());
|
|
return {
|
|
symbol: e.symbol(),
|
|
currencyId: e.currency(),
|
|
unitId: e.unit()
|
|
}
|
|
}
|
|
changePriceScale(e) {
|
|
const t = Object(s.ensureNotNull)(this._model.paneForSource(this._model
|
|
.mainSeries())),
|
|
i = Object(s.ensureNotNull)(this._model.paneForSource(this._study));
|
|
switch (e) {
|
|
case "no-scale":
|
|
Object(s.assert)(i.actionNoScaleIsEnabled(this._study),
|
|
"Unable to leave a pane without any non-overlay price scale"), new d
|
|
.b(this._model, this._study, i, "overlay", "").redo();
|
|
break;
|
|
case "as-series":
|
|
Object(s.assert)(i === t, "Study should be on the main pane"), new d.a(this
|
|
._model, this._study, i, this._model.mainSeries().priceScale(), "")
|
|
.redo();
|
|
break;
|
|
case "new-left":
|
|
new d.b(this._model, this._study, i, "left", "").redo();
|
|
break;
|
|
case "new-right":
|
|
new d.b(this._model, this._study, i, "right", "").redo();
|
|
break;
|
|
default:
|
|
const r = this._model.dataSourceForId(e);
|
|
if (null === r) throw new Error(`There is no study with entityId='${e}'`);
|
|
const n = i === this._model.paneForSource(r);
|
|
Object(s.assert)(n, "Both studies should be on the same pane");
|
|
const o = Object(s.ensureNotNull)(r.priceScale()),
|
|
a = Object(c.sourceNewCurrencyOnPinningToPriceScale)(this._study, o,
|
|
this._model),
|
|
h = Object(_.sourceNewUnitOnPinningToPriceScale)(this._study, o, this
|
|
._model);
|
|
new d.a(this._model, this._study, i, o, "").redo(), null !== a && new l.a(o,
|
|
a, this._undoModel.chartWidget(), "").redo(), null !== h && new m.a(
|
|
o, h, this._undoModel.chartWidget(), "").redo()
|
|
}
|
|
}
|
|
isVisible() {
|
|
return this._study.properties().visible.value()
|
|
}
|
|
setVisible(e) {
|
|
this._study.properties().visible.setValue(e)
|
|
}
|
|
bringToFront() {
|
|
this._model.bringToFront([this._study])
|
|
}
|
|
sendToBack() {
|
|
this._model.sendToBack([this._study])
|
|
}
|
|
applyOverrides(e) {
|
|
Object(a.applyOverridesToStudy)(this._study, e)
|
|
}
|
|
dataLength() {
|
|
return this._study.status().type !== g.StudyStatusType.Completed ? 0 : this._study
|
|
.metaInfo().plots.length > 0 ? this._study.data().size() : this._model
|
|
.mainSeries().bars().size()
|
|
}
|
|
isLoading() {
|
|
return this._study.isLoading()
|
|
}
|
|
async applyToEntireLayout() {
|
|
const e = new p.ActionsProvider(this._chartWidget),
|
|
t = (await e.contextMenuActionsForSources([this._study])).find(e =>
|
|
"applyStudyToEntireLayout" === e.id);
|
|
t && t.execute()
|
|
}
|
|
}
|
|
},
|
|
N22A: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return n
|
|
}));
|
|
var s = i("eqEH");
|
|
const r = {
|
|
id: "TradingService"
|
|
};
|
|
|
|
function n() {
|
|
return Object(s.hasService)(r) ? Object(s.service)(r) : null
|
|
}
|
|
},
|
|
NJRZ: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineTool5PointsPattern", (function() {
|
|
return a
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("Ocx9"),
|
|
n = i("Ss5c"),
|
|
o = i("j3hX");
|
|
class a extends n.LineDataSource {
|
|
constructor(e, t) {
|
|
super(e, t || a.createProperties()), this._loadPaneViews(e)
|
|
}
|
|
pointsCount() {
|
|
return 5
|
|
}
|
|
name() {
|
|
return "XABCD Pattern"
|
|
}
|
|
properties() {
|
|
return super.properties()
|
|
}
|
|
static createProperties(e) {
|
|
const t = new r.DefaultProperty("linetool5pointspattern", e);
|
|
return a._configureProperties(t), t
|
|
}
|
|
_getPropertyDefinitionsViewModelClass() {
|
|
return Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "/HOw")).then(
|
|
e => e.PatternWithBackgroundDefinitionViewModel)
|
|
}
|
|
_loadPaneViews(e) {
|
|
i.e("lt-pane-views").then(i.bind(null, "6MfG")).then(t => {
|
|
this._setPaneViews([new t.Pattern5pointsPaneView(this, e)])
|
|
})
|
|
}
|
|
static _configureProperties(e) {
|
|
n.LineDataSource._configureProperties(e), e.addChild("linesColors", new o
|
|
.LineToolColorsProperty([Object(s.ensureDefined)(e.child("color"))])), e
|
|
.addChild("textsColors", new o.LineToolColorsProperty([Object(s
|
|
.ensureDefined)(e.child("textcolor"))]))
|
|
}
|
|
}
|
|
},
|
|
NSoL: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "clientSnapshot", (function() {
|
|
return y
|
|
}));
|
|
var s = i("aO4+"),
|
|
r = i("eJTA"),
|
|
n = i("zM7N"),
|
|
o = i("Y7w9"),
|
|
a = i("ikwP"),
|
|
l = i("zDbI"),
|
|
c = i("XlJ7"),
|
|
h = i("EsvI"),
|
|
u = i("Dq3s"),
|
|
d = i("Kxc7"),
|
|
p = i("4GHa");
|
|
const _ = !d.enabled("widget_logo");
|
|
|
|
function m(e, t = null, i = null) {
|
|
let s = {};
|
|
if ("number" == typeof e) return {
|
|
relativePositions: {
|
|
[e]: {
|
|
l: t,
|
|
t: i
|
|
}
|
|
},
|
|
nextElementLeft: e,
|
|
nextElementTop: e
|
|
};
|
|
const [r, ...n] = e;
|
|
if ("v" === r) {
|
|
let e = null;
|
|
for (const r of n) {
|
|
const n = m(r, t, i);
|
|
s = {
|
|
...s,
|
|
...n.relativePositions
|
|
}, i = n.nextElementTop, e = n.nextElementLeft
|
|
}
|
|
t = e
|
|
}
|
|
if ("h" === r) {
|
|
let e = null;
|
|
for (const r of n) {
|
|
const n = m(r, t, i);
|
|
s = {
|
|
...s,
|
|
...n.relativePositions
|
|
}, t = n.nextElementLeft, e = n.nextElementTop
|
|
}
|
|
i = e
|
|
}
|
|
return {
|
|
relativePositions: s,
|
|
nextElementTop: i,
|
|
nextElementLeft: t
|
|
}
|
|
}
|
|
const f = function(e) {
|
|
const t = {};
|
|
for (const i of Object.keys(e)) {
|
|
const s = m(e[i]).relativePositions;
|
|
t[i] = s
|
|
}
|
|
return t
|
|
}(u);
|
|
|
|
function g(e, t, i, s) {
|
|
return Object(a.drawScaled)(e, s, () => {
|
|
e.fillText(i, t.x / s, t.y / s)
|
|
}), e.measureText(i).width * s
|
|
}
|
|
|
|
function b(e) {
|
|
return e.map(e => ({
|
|
...e,
|
|
title: ""
|
|
}))
|
|
}
|
|
|
|
function v(e, t) {
|
|
const i = [{
|
|
text: e.trim()
|
|
}];
|
|
for (const e of t) e.visible && ("" !== i[i.length - 1].text && i.push({
|
|
text: " "
|
|
}), e.title && i.push({
|
|
text: e.title
|
|
}), i.push({
|
|
text: e.value,
|
|
color: e.color
|
|
}));
|
|
return i
|
|
}
|
|
class S {
|
|
constructor(e, t) {
|
|
this._logoTextColor = null, this._snapshotData = e, t = t || {}, this._options = {
|
|
backgroundColor: h.themes[e.theme].getThemedColor("color-bg-primary"),
|
|
borderColor: h.themes[e.theme].getThemedColor("color-border"),
|
|
font: l.CHART_FONT_FAMILY,
|
|
fontSize: 12,
|
|
legendMode: "vertical",
|
|
hideResolution: !1,
|
|
header: void 0,
|
|
...t
|
|
};
|
|
const i = f[e.layout],
|
|
s = e.charts.map(e => function(e) {
|
|
const t = e.panes[0],
|
|
i = t.canvas.width + t.leftAxis.canvas.width + t.rightAxis.canvas
|
|
.width;
|
|
let s = 0;
|
|
for (const t of e.panes) s += t.canvas.height;
|
|
return void 0 !== e.timeAxis && (s += e.timeAxis.canvas.height), new a
|
|
.Size(i, s)
|
|
}(e));
|
|
if (this._pixelRatio = e.hidpiRatio, this._chartsGeometry = e.charts.map((e, t) =>
|
|
function e(t, i, s, r) {
|
|
let n = Math.round(10 * r),
|
|
o = Math.round(10 * r);
|
|
const a = s[t];
|
|
if (null !== a.l) {
|
|
const t = e(a.l, i, s, r);
|
|
n = t.x + t.width + Math.round(5 * r)
|
|
}
|
|
if (null !== a.t) {
|
|
const t = e(a.t, i, s, r);
|
|
o = t.y + t.height + Math.round(5 * r)
|
|
}
|
|
const l = i[t];
|
|
return {
|
|
x: n,
|
|
y: o,
|
|
width: l.w,
|
|
height: l.h
|
|
}
|
|
}(t, s, i, this._pixelRatio)), !_) {
|
|
let i = e.theme;
|
|
void 0 !== t.backgroundColor && (i = "black" === Object(r.rgbToBlackWhiteString)
|
|
(Object(r.parseRgb)(t.backgroundColor), 150) ? n.a.Dark : n.a.Light),
|
|
this._logoTextColor = h.themes[i].getThemedColor("color-text-primary")
|
|
}
|
|
this._headerDefaultTextColor = h.themes[e.theme].getThemedColor(
|
|
"color-text-primary")
|
|
}
|
|
async getImage() {
|
|
const e = this._pixelRatio;
|
|
let t = 0,
|
|
i = 0,
|
|
r = 0;
|
|
if (this._options.header) {
|
|
r = Math.ceil(1.4 * this._options.fontSize * e) * this._options.header.length
|
|
}
|
|
i += r;
|
|
let n = 0,
|
|
o = 0;
|
|
for (const e of this._chartsGeometry) n = Math.max(n, e.x + e.width), o = Math.max(
|
|
o, e.y + e.height);
|
|
const h = i;
|
|
t += n, i += o, t += Math.round(10 * e);
|
|
const u = _ ? Math.round(10 * e) : Math.round(35 * e),
|
|
d = i;
|
|
i += u;
|
|
const m = Object(a.createDisconnectedCanvas)(document, new a.Size(t, i), 1),
|
|
f = Object(a.getContext2D)(m);
|
|
f.font = Object(c.makeFont)(this._options.fontSize, this._options.font), f
|
|
.textBaseline = "top", f.fillStyle = this._options.backgroundColor, f.fillRect(
|
|
0, 0, t, i), this._options.header && this._drawHeader(f, t, new s.Point(Math
|
|
.round(10 * e), Math.round(10 * e)));
|
|
for (let e = 0; e < this._snapshotData.charts.length; ++e) {
|
|
const t = this._snapshotData.charts[e],
|
|
i = this._chartsGeometry[e];
|
|
this._drawChart(t, i, f, new s.Point(0, h))
|
|
}
|
|
if (null !== this._logoTextColor) {
|
|
const t = await
|
|
|
|
function(e, t, i) {
|
|
var s;
|
|
const r = (new DOMParser).parseFromString(p, "image/svg+xml");
|
|
null === (s = null == r ? void 0 : r.firstElementChild) || void 0 === s || s
|
|
.setAttribute("color", i);
|
|
const n = URL.createObjectURL(new Blob([(new XMLSerializer)
|
|
.serializeToString(r)
|
|
], {
|
|
type: "image/svg+xml"
|
|
}));
|
|
return new Promise(i => {
|
|
const s = new Image;
|
|
s.width = e, s.height = t, s.onload = () => {
|
|
i({
|
|
image: s,
|
|
width: e,
|
|
height: t
|
|
})
|
|
}, s.src = n
|
|
})
|
|
}(Math.round(20 * e), Math.round(15 * e), this._logoTextColor);
|
|
f.fillStyle = this._logoTextColor, f.font = Object(c.makeFont)(13, l
|
|
.CHART_FONT_FAMILY);
|
|
const i = d + Math.round(u / 2 - t.height / 2);
|
|
! function(e, t, i, s, r) {
|
|
e.save(), e.drawImage(s.image, t, i, s.width, s.height), e.textBaseline =
|
|
"bottom";
|
|
const n = (t + s.width) / r + 3,
|
|
o = (i + s.height) / r;
|
|
Object(a.drawScaled)(e, r, () => {
|
|
e.fillText("TradingView", n, o)
|
|
}), e.restore()
|
|
}(f, Math.round(10 * e), i, t, e)
|
|
}
|
|
return m
|
|
}
|
|
_drawChart(e, t, i, r) {
|
|
i.save(), i.translate(t.x + r.x, t.y + r.y);
|
|
let n = 0;
|
|
for (const t of e.panes) {
|
|
let r = 0;
|
|
const o = t.leftAxis.canvas.width + Math.round(8 * this._pixelRatio),
|
|
a = n,
|
|
l = n + Math.round(10 * this._pixelRatio);
|
|
t.leftAxis.contentWidth > 0 && (i.drawImage(t.leftAxis.canvas, r, n),
|
|
r += t.leftAxis.canvas.width), i.drawImage(t.canvas, r, n), r += t
|
|
.canvas.width, t.rightAxis.contentWidth > 0 && i.drawImage(t.rightAxis
|
|
.canvas, r, n), "pane" === t.type && (i.fillStyle = e.colors.text, this
|
|
._drawLegend(t, i, new s.Point(o, l), a)), n += t.canvas.height
|
|
}
|
|
if (void 0 !== e.timeAxis) {
|
|
let t = 0;
|
|
e.timeAxis.lhsStub.contentWidth > 0 && (i.drawImage(e.timeAxis.lhsStub.canvas,
|
|
t, n), t += e.timeAxis.lhsStub.canvas.width), i.drawImage(e.timeAxis
|
|
.canvas, t, n), t += e.timeAxis.canvas.width, e.timeAxis.rhsStub
|
|
.contentWidth > 0 && i.drawImage(e.timeAxis.rhsStub.canvas, t, n)
|
|
}
|
|
i.strokeStyle = this._options.borderColor, i.strokeRect(0, 0, t.width, t.height), i
|
|
.restore()
|
|
}
|
|
_drawHeader(e, t, i) {
|
|
const {
|
|
header: r
|
|
} = this._options;
|
|
if (!r) return;
|
|
e.save(), e.fillStyle = this._headerDefaultTextColor;
|
|
const n = Math.ceil(1.4 * this._options.fontSize * this._pixelRatio);
|
|
r.forEach((r, o) => {
|
|
this._drawLegendLine(e, new s.Point(i.x, i.y + n * o), t, [{
|
|
...r,
|
|
text: r.text.trim()
|
|
}], !0)
|
|
}), e.restore()
|
|
}
|
|
_drawLegend(e, t, i, r) {
|
|
let n = !0;
|
|
const o = Math.ceil(1.4 * this._options.fontSize * this._pixelRatio);
|
|
let a = i.x,
|
|
l = i.y;
|
|
if (e.mainSeriesText && l + o < r + e.canvas.height) {
|
|
const i = this._drawLegendLine(t, new s.Point(a, l), e.contentWidth * this
|
|
._pixelRatio, v(e.mainSeriesText, e.mainSeriesValues), !0);
|
|
"horizontal" !== this._options.legendMode ? l += o : (a = i + 1.4 * this
|
|
._options.fontSize * this._pixelRatio, n = !1)
|
|
}
|
|
for (let c = 0; c < e.studies.length; ++c)
|
|
if (l + o < r + e.canvas.height) {
|
|
const r = e.studies[c],
|
|
h = e.studiesValues[c];
|
|
let u = null;
|
|
for (; null === u;) u = this._drawLegendLine(t, new s.Point(a, l), e
|
|
.contentWidth * this._pixelRatio, v(r, b(h)), n), "horizontal" !==
|
|
this._options.legendMode ? l += o : null === u ? (n = !0, a = i.x, l +=
|
|
o) : (a = u + 1.4 * this._options.fontSize * this._pixelRatio, n = !
|
|
1)
|
|
}
|
|
}
|
|
_drawLegendLine(e, t, i, r, n) {
|
|
const a = r.map(e => e.text).join("");
|
|
let l = t.x;
|
|
const c = function(e, t, i, s) {
|
|
if (e.measureText(t).width * s <= i) return {
|
|
text: t,
|
|
elided: !1
|
|
};
|
|
const r = e.measureText("...").width * s,
|
|
n = [];
|
|
for (let e = 0; e < t.length; ++e) n.push(e);
|
|
const a = Object(o.upperbound)(n, i, (n, o) => e.measureText(t.slice(0, o +
|
|
1)).width * s + r > i);
|
|
return {
|
|
text: (t = t.slice(0, a)).trim(),
|
|
elided: !0
|
|
}
|
|
}(e, a, i - l, this._pixelRatio);
|
|
if (c.elided && !n) return null;
|
|
const h = [];
|
|
let u = 0;
|
|
for (const e of r) {
|
|
if (u + e.text.length > c.text.length) break;
|
|
h.push(e.text), u += e.text.length
|
|
}
|
|
const d = h.join("").trim().length;
|
|
u = 0;
|
|
for (const i of r) {
|
|
if (u + i.text.length > d) break;
|
|
i.color && (e.save(), e.fillStyle = i.color), l += g(e, new s.Point(l, t.y), i
|
|
.text, this._pixelRatio), i.color && e.restore(), u += i.text.length
|
|
}
|
|
return c.elided && (l += g(e, new s.Point(l, t.y), "...", this._pixelRatio)), l
|
|
}
|
|
}
|
|
async function y(e, t) {
|
|
return new S(e, t).getImage()
|
|
}
|
|
},
|
|
NhkU: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Ss5c").LineDataSource,
|
|
r = i("5rJj"),
|
|
n = i("j3hX"),
|
|
o = n.LineToolWidthsProperty,
|
|
a = n.LineToolColorsProperty;
|
|
class l extends s {
|
|
constructor(e, t) {
|
|
super(e, t || l.createProperties()), i.e("lt-pane-views").then(i.t.bind(null,
|
|
"l5Au", 7)).then(({
|
|
PitchfanLinePaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
levelsCount() {
|
|
return l.LevelsCount
|
|
}
|
|
pointsCount() {
|
|
return 3
|
|
}
|
|
name() {
|
|
return "Pitchfan"
|
|
}
|
|
processErase(e, t) {
|
|
var i = "level" + t,
|
|
s = this.properties()[i].visible;
|
|
e.setProperty(s, !1, "Erase level line")
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "D+Nk")))
|
|
.PitchBaseDefinitionsViewModel
|
|
}
|
|
static createProperties(e) {
|
|
var t = new r("linetoolpitchfan", e, !1, {
|
|
range: [0, 8]
|
|
});
|
|
return l._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
s._configureProperties(e);
|
|
for (var t = [e.child("median").child("linewidth")], i = [e.child("median").child(
|
|
"color")], r = 0; r <= l.LevelsCount; r++) t.push(e.child("level" + r)
|
|
.child("linewidth")), i.push(e.child("level" + r).child("color"));
|
|
e.addChild("linesColors", new a(i)), e.addChild("linesWidths", new o(t))
|
|
}
|
|
}
|
|
l.LevelsCount = 8, t.LineToolPitchfan = l
|
|
},
|
|
NsVT: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("hY0g"),
|
|
r = i.n(s),
|
|
n = i("HySD");
|
|
|
|
function o(e, t) {
|
|
let i = 0;
|
|
for (const {
|
|
min: s,
|
|
max: r
|
|
} of t) {
|
|
if (e < s || r < s) continue;
|
|
const t = Math.min(e, r);
|
|
if (i = Math.max(i, t), e === i) break
|
|
}
|
|
return i
|
|
}
|
|
|
|
function a(e) {
|
|
const t = [];
|
|
if (void 0 === e) return [];
|
|
Array.isArray(e) || (e = [e]);
|
|
for (const i of e) {
|
|
let e, s;
|
|
isFinite(i) ? e = s = Number(i) : (e = +i.min, s = +i.max), (e < 0 || isNaN(e)) && (e =
|
|
0), isNaN(s) && (s = 1 / 0), e <= s && s > 0 && t.push({
|
|
min: e,
|
|
max: s
|
|
})
|
|
}
|
|
return t.sort((e, t) => e.min - t.min || e.max - t.max), t
|
|
}
|
|
|
|
function l(e, t) {
|
|
if (e.length !== t.length) return !1;
|
|
for (let i = e.length; i--;) {
|
|
if (e[i].min !== t[i].min) return !1;
|
|
if (e[i].max !== t[i].max) return !1
|
|
}
|
|
return !0
|
|
}
|
|
var c = i("+GxX"),
|
|
h = i("Kxc7");
|
|
i.d(t, "ChartPage", (function() {
|
|
return d
|
|
}));
|
|
const u = h.enabled("no_min_chart_width");
|
|
class d {
|
|
constructor(e) {
|
|
this._processVisibility = e => {
|
|
const t = e.container.value();
|
|
return this._affectsLayout(e.name) ? (t && t.classList.toggle("js-hidden", !
|
|
1), !0) : (t && t.classList.toggle("js-hidden", !0), !1)
|
|
}, this._setWidth = (e, t) => {
|
|
let i = t;
|
|
this._fullscreenArea !== e.name && (e.availWidth.setValue(t), e.canNegotiate
|
|
.width && (i = o(t, e.negotiations.width)));
|
|
const s = e.container.value();
|
|
return s && (s.style.width = i + "px"), e.width.setValue(i), i
|
|
}, this._setHeight = (e, t) => {
|
|
let i = t;
|
|
this._fullscreenArea !== e.name && (e.availHeight.setValue(t), e
|
|
.canNegotiate.height && (i = o(t, e.negotiations.height)));
|
|
const s = e.container.value();
|
|
return s && (s.style.height = i + "px"), e.height.setValue(i), i
|
|
};
|
|
const t = e.container.value();
|
|
if (!t) throw new Error("bridge.container.value() must be an element");
|
|
this._container = t, this._availableAreas = ["left", "tradingpanel", "right", "top",
|
|
"bottom", "center", "topleft", "extratop"
|
|
], this._areas = {}, this._bridge = e, this._width = e.width, this._height = e
|
|
.height, this._width.subscribe(() => this.recalculate()), this._height
|
|
.subscribe(() => this.recalculate()), this._bridge.visible.subscribe(() => this
|
|
._updateVisibility()), this._bridge.fullscreen.subscribe(() => this
|
|
._onParentFullscreenChange()), this.recalculate()
|
|
}
|
|
allocate(e) {
|
|
const t = e && e.areaName;
|
|
if (-1 === this._availableAreas.indexOf(t)) throw new Error(
|
|
"unknown options.areaName");
|
|
this.free(t);
|
|
const i = this._createDOM(t),
|
|
s = {
|
|
name: t,
|
|
canNegotiate: {
|
|
width: "left" === t || "right" === t || "tradingpanel" === t ||
|
|
"topleft" === t,
|
|
height: "top" === t || "bottom" === t || "topleft" === t ||
|
|
"extratop" === t
|
|
},
|
|
negotiations: {
|
|
width: [],
|
|
height: []
|
|
},
|
|
remove: () => {
|
|
for (const e in this._areas) this._areas[e] === s && this.free(e)
|
|
},
|
|
negotiateWidth: e => {
|
|
if (!s.canNegotiate.width) return;
|
|
const t = a(e);
|
|
l(s.negotiations.width, t) || (s.negotiations.width = t, this
|
|
.recalculate())
|
|
},
|
|
negotiateHeight: e => {
|
|
if (!s.canNegotiate.height) return;
|
|
const t = a(e);
|
|
l(s.negotiations.height, t) || (s.negotiations.height = t, this
|
|
.recalculate())
|
|
},
|
|
requestFullscreen: () => {
|
|
this._fullscreenArea || ("right" !== t && "center" !== t || (this
|
|
._fullscreenArea = t), "center" === t && this._bridge
|
|
.requestFullscreen(), this._updateFullscreen())
|
|
},
|
|
exitFullscreen: () => {
|
|
t === this._fullscreenArea && (this._fullscreenArea = void 0,
|
|
"center" === t && this._bridge.exitFullscreen(), this
|
|
._updateFullscreen())
|
|
},
|
|
width: new r.a,
|
|
height: new r.a,
|
|
availWidth: new r.a,
|
|
availHeight: new r.a,
|
|
alive: new r.a(!0),
|
|
container: new r.a(i),
|
|
visible: new r.a(!0),
|
|
fullscreen: new r.a(!0),
|
|
rdState: new n.ResizerDetacherState
|
|
};
|
|
return s.rdState.pushOwner(s), this._areas[t] = s, s.rdState.owner.subscribe(e => {
|
|
const i = s.container.value();
|
|
if (e !== s) i && (i.innerHTML = "", i.parentElement && i.parentElement
|
|
.removeChild(i));
|
|
else {
|
|
let e = null;
|
|
for (let i = this._availableAreas.indexOf(t); i--;) {
|
|
const t = this._availableAreas[i];
|
|
if (this._affectsLayout(t)) {
|
|
e = this._areas[t].container.value();
|
|
break
|
|
}
|
|
}
|
|
i && (e && i.parentElement ? i.insertAdjacentElement("afterend",
|
|
e) : this._container.appendChild(i))
|
|
}
|
|
this.recalculate()
|
|
}, {
|
|
callWithLast: !0
|
|
}), s.rdState.bridge()
|
|
}
|
|
free(e) {
|
|
const t = this._areas[e];
|
|
if (!t) return;
|
|
this._areas[e] = void 0;
|
|
const i = t.container.value();
|
|
i && i.parentElement && i.parentElement.removeChild(i), t.alive.setValue(!1)
|
|
}
|
|
recalculate() {
|
|
const e = {};
|
|
this._recalcSingleRunToken = e;
|
|
const t = this._areas.topleft,
|
|
i = this._areas.left,
|
|
s = this._areas.tradingpanel,
|
|
r = this._areas.right,
|
|
n = this._areas.top,
|
|
o = this._areas.bottom,
|
|
a = this._areas.center,
|
|
l = this._areas.extratop,
|
|
c = this._width.value(),
|
|
h = this._height.value();
|
|
let d = 0,
|
|
p = 0,
|
|
_ = 0,
|
|
m = 0,
|
|
f = 0,
|
|
g = 0,
|
|
b = 0,
|
|
v = 0;
|
|
if (e === this._recalcSingleRunToken && l && this._processVisibility(l) && (v = this
|
|
._setHeight(l, h), this._setWidth(l, c)), e === this
|
|
._recalcSingleRunToken && t && this._processVisibility(t)) {
|
|
b = this._setHeight(t, h), g = this._setWidth(t, c), g && (g += 4);
|
|
const e = t.container.value();
|
|
e && (e.style.top = v + "px")
|
|
}
|
|
if (e === this._recalcSingleRunToken && i && this._processVisibility(i)) {
|
|
const e = i.container.value();
|
|
e && (e.style.top = b + v + "px"), this._setHeight(i, h - b - v), _ = this
|
|
._setWidth(i, c), _ && (_ += 4)
|
|
}
|
|
if (e === this._recalcSingleRunToken && s && this._processVisibility(s)) {
|
|
this._setHeight(s, h);
|
|
let e = c - _;
|
|
u || (e -= 300), f = this._setWidth(s, e)
|
|
}
|
|
if (e === this._recalcSingleRunToken && r && this._processVisibility(r)) {
|
|
this._setHeight(r, h - v);
|
|
let e = c - _ - f;
|
|
u || (e -= 300), m = this._setWidth(r, e);
|
|
const t = r.container.value();
|
|
t && (t.style.top = v + "px")
|
|
}
|
|
const S = f + m,
|
|
y = S ? 4 : 0;
|
|
if (e === this._recalcSingleRunToken && n && this._processVisibility(n)) {
|
|
const e = Math.max(g, _),
|
|
t = n.container.value();
|
|
t && (t.style.left = e + "px", t.style.top = v + "px");
|
|
const i = c - e - f - m - y;
|
|
this._setWidth(n, i), d = this._setHeight(n, h)
|
|
}
|
|
let w = 0;
|
|
const P = c - _ - f - m - y;
|
|
if (e === this._recalcSingleRunToken && o && this._processVisibility(o)) {
|
|
const e = o.container.value();
|
|
e && (e.style.left = _ + "px", e.classList.toggle("no-border-top-left-radius", !
|
|
_), e.classList.toggle("no-border-top-right-radius", !S)), this
|
|
._setWidth(o, P);
|
|
const t = h - d - v;
|
|
w = Math.min(300, t - 0), p = this._setHeight(o, t) + 4
|
|
}
|
|
if (e === this._recalcSingleRunToken && a && this._processVisibility(a)) {
|
|
const e = a.container.value();
|
|
e && (e.style.left = _ + "px", e.style.top = d + v + "px", e.classList.toggle(
|
|
"no-border-bottom-left-radius", !p || !_), e.classList.toggle(
|
|
"no-border-bottom-right-radius", !S || !p)), this._setWidth(a, P);
|
|
const t = h - d - p - v;
|
|
this._setHeight(a, Math.max(t, w))
|
|
}
|
|
if (e === this._recalcSingleRunToken && s && this._affectsLayout("tradingpanel")) {
|
|
const e = s.container.value();
|
|
e && (e.style.right = m + "px", e.style.top = v + "px")
|
|
}
|
|
e === this._recalcSingleRunToken && this._updateVisibility()
|
|
}
|
|
_affectsLayout(e) {
|
|
const t = this._areas[e];
|
|
if (!t) return !1;
|
|
if (t.rdState.owner.value() !== t) return !1;
|
|
if (this._fullscreenArea && this._fullscreenArea !== e) return p(e);
|
|
if (this._width.value() <= 567 || this._height.value() <= 445) {
|
|
const t = ["center", "top", "left", "topleft", "extratop"];
|
|
if (Object(c.isFeatureEnabled)("mobile_show_bottom_panel") && t.push("bottom"),
|
|
!t.includes(e)) return !1
|
|
}
|
|
return !0
|
|
}
|
|
_updateVisibility() {
|
|
const e = this._bridge.visible.value();
|
|
for (let t = 0; t < this._availableAreas.length; t++) {
|
|
const i = this._availableAreas[t],
|
|
s = this._areas[i];
|
|
s && (e && this._affectsLayout(i) ? s.visible.setValue(!0) : s.visible.setValue(
|
|
!1))
|
|
}
|
|
}
|
|
_onParentFullscreenChange() {
|
|
this._bridge.fullscreen.value() || (this._fullscreenArea = void 0, this
|
|
._updateFullscreen())
|
|
}
|
|
_updateFullscreen() {
|
|
const e = void 0 !== this._fullscreenArea;
|
|
for (let t = 0; t < this._availableAreas.length; t++) {
|
|
const i = this._availableAreas[t],
|
|
s = this._areas[i];
|
|
if (!s) continue;
|
|
if (i === this._fullscreenArea) {
|
|
s.fullscreen.setValue(!0);
|
|
continue
|
|
}
|
|
const r = s.container.value();
|
|
r && r.classList.toggle("js-hidden", e && !p(i))
|
|
}
|
|
this._updateVisibility(), this.recalculate()
|
|
}
|
|
_createDOM(e) {
|
|
const t = document.createElement("div");
|
|
return t.classList.add("layout__area--" + e), t.style.position = "absolute",
|
|
"bottom" === e ? t.style.bottom = "0" : t.style.top = "0", "right" === e ||
|
|
"tradingpanel" === e ? t.style.right = "0" : t.style.left = "0", t
|
|
}
|
|
}
|
|
|
|
function p(e) {
|
|
const t = h.enabled("side_toolbar_in_fullscreen_mode"),
|
|
i = h.enabled("header_in_fullscreen_mode");
|
|
return "center" === e || "left" === e && t || "top" === e && i
|
|
}
|
|
},
|
|
Nu4p: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return s
|
|
}));
|
|
i("YFKU");
|
|
const s = {
|
|
shape_arrow_down: {
|
|
guiName: window.t("Arrow Down"),
|
|
id: "shape_arrow_down",
|
|
paneRendererClass: "PaneRendererArrowDown",
|
|
pineName: "shape.arrowdown",
|
|
icon: "arrow_down"
|
|
},
|
|
shape_arrow_up: {
|
|
guiName: window.t("Arrow Up"),
|
|
id: "shape_arrow_up",
|
|
paneRendererClass: "PaneRendererArrowUp",
|
|
pineName: "shape.arrowup",
|
|
icon: "arrow_up"
|
|
},
|
|
shape_circle: {
|
|
guiName: window.t("Circle"),
|
|
id: "shape_circle",
|
|
paneRendererClass: "PaneRendererCircleShape",
|
|
pineName: "shape.circle",
|
|
icon: "circle"
|
|
},
|
|
shape_cross: {
|
|
guiName: window.t("Cross"),
|
|
id: "shape_cross",
|
|
paneRendererClass: "PaneRendererCrossShape",
|
|
pineName: "shape.cross",
|
|
icon: "cross"
|
|
},
|
|
shape_diamond: {
|
|
guiName: window.t("Diamond"),
|
|
id: "shape_diamond",
|
|
paneRendererClass: "PaneRendererDiamond",
|
|
pineName: "shape.diamond",
|
|
icon: "diamond"
|
|
},
|
|
shape_flag: {
|
|
guiName: window.t("Flag"),
|
|
id: "shape_flag",
|
|
paneRendererClass: "PaneRendererFlagShape",
|
|
pineName: "shape.flag",
|
|
icon: "flag"
|
|
},
|
|
shape_label_down: {
|
|
guiName: window.t("Label Down"),
|
|
id: "shape_label_down",
|
|
paneRendererClass: "PaneRendererLabelDown",
|
|
pineName: "shape.labeldown",
|
|
icon: "label_down"
|
|
},
|
|
shape_label_up: {
|
|
guiName: window.t("Label Up"),
|
|
id: "shape_label_up",
|
|
paneRendererClass: "PaneRendererLabelUp",
|
|
pineName: "shape.labelup",
|
|
icon: "label_up"
|
|
},
|
|
shape_square: {
|
|
guiName: window.t("Square"),
|
|
id: "shape_square",
|
|
paneRendererClass: "PaneRendererSquare",
|
|
pineName: "shape.square",
|
|
icon: "square"
|
|
},
|
|
shape_triangle_down: {
|
|
guiName: window.t("Triangle Down"),
|
|
id: "shape_triangle_down",
|
|
paneRendererClass: "PaneRendererTriangleApexDown",
|
|
pineName: "shape.triangledown",
|
|
icon: "triangle_down"
|
|
},
|
|
shape_triangle_up: {
|
|
guiName: window.t("Triangle Up"),
|
|
id: "shape_triangle_up",
|
|
paneRendererClass: "PaneRendererTriangleApexUp",
|
|
pineName: "shape.triangleup",
|
|
icon: "triangle_up"
|
|
},
|
|
shape_xcross: {
|
|
guiName: window.t("X Cross"),
|
|
id: "shape_xcross",
|
|
paneRendererClass: "PaneRendererXCross",
|
|
pineName: "shape.xcross",
|
|
icon: "x_cross"
|
|
}
|
|
}
|
|
},
|
|
"O+9b": function(e, t, i) {
|
|
"use strict";
|
|
var s = i("ocLq"),
|
|
r = i("LxhU");
|
|
class n {
|
|
constructor(e, t) {
|
|
this._minTick = NaN, this._minPrice = NaN, this._maxPrice = NaN, this._low = NaN,
|
|
this._high = NaN, this._startPrice = NaN, this._indexLowVbP = NaN, this
|
|
._indexHighVbP = NaN, this._rowSize = e, this._type = t
|
|
}
|
|
init(e, t, i, s, r) {
|
|
this._minTick = e, this._minPrice = t, this._maxPrice = i, this._low = s, this
|
|
._high = r
|
|
}
|
|
getStartPrice() {
|
|
return this._startPrice
|
|
}
|
|
setStartPrice(e) {
|
|
this._startPrice = e
|
|
}
|
|
getIndexLowVbP() {
|
|
return this._indexLowVbP
|
|
}
|
|
setIndexLowVbP(e) {
|
|
this._indexLowVbP = e
|
|
}
|
|
getIndexHighVbP() {
|
|
return this._indexHighVbP
|
|
}
|
|
setIndexHighVbP(e) {
|
|
this._indexHighVbP = e
|
|
}
|
|
type() {
|
|
return this._type
|
|
}
|
|
}
|
|
class o extends n {
|
|
constructor(e) {
|
|
super(e, 0)
|
|
}
|
|
calculate() {
|
|
this.setStartPrice(this._minPrice);
|
|
const e = this.rowWidth();
|
|
let t = Math.floor((this._low - this._minPrice) / e),
|
|
i = Math.ceil((this._high - this._minPrice) / e) - 1;
|
|
t = Math.max(t, 0), i = Math.max(i, 0), i = Math.min(i, this._rowSize - 1), t = Math
|
|
.min(t, i), this.setIndexLowVbP(t), this.setIndexHighVbP(i)
|
|
}
|
|
rowWidth() {
|
|
return Math.max((this._maxPrice - this._minPrice) / this._rowSize, this._minTick)
|
|
}
|
|
}
|
|
class a extends n {
|
|
constructor(e) {
|
|
super(e, 1)
|
|
}
|
|
calculate() {
|
|
this.setStartPrice(0);
|
|
const e = this.rowWidth();
|
|
let t = Math.floor(this._low / e);
|
|
const i = Math.ceil(this._high / e) - 1;
|
|
t = Math.min(t, i), this.setIndexLowVbP(t), this.setIndexHighVbP(i)
|
|
}
|
|
rowWidth() {
|
|
return this._minTick * this._rowSize
|
|
}
|
|
}
|
|
var l = i("Kxc7");
|
|
|
|
function c() {
|
|
return 6e3
|
|
}
|
|
|
|
function h(e) {
|
|
switch (e) {
|
|
case "Up/Down":
|
|
return 2;
|
|
case "Total":
|
|
return 1;
|
|
default:
|
|
s.Std.error("Invalid study argument value: " + e)
|
|
}
|
|
}
|
|
i.d(t, "b", (function() {
|
|
return c
|
|
})), i.d(t, "c", (function() {
|
|
return h
|
|
})), i.d(t, "a", (function() {
|
|
return u
|
|
}));
|
|
class u {
|
|
findBasicResolutionForFromTo(e, t, i, n) {
|
|
const o = Object(s.getVolumeProfileResolutionForPeriod)(e.value(), t, i, n),
|
|
a = r.Interval.parse(o);
|
|
return l.enabled("charting_library_debug_mode") && console.log(
|
|
`Selected resolution ${a.value()} for (${e.value()}, ${t}, ${i})`), a
|
|
}
|
|
verifyRowSizeInput(e, t) {
|
|
"Number Of Rows" === t && e > 6e3 && s.Std.error(
|
|
'Histogram is too large, please reduce "Row Size" input.')
|
|
}
|
|
_getRowsLayout(e, t) {
|
|
return "Number Of Rows" === e ? new o(t) : new a(t)
|
|
}
|
|
}
|
|
},
|
|
OBgQ: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return r
|
|
}));
|
|
var s = i("jCNj");
|
|
class r {
|
|
constructor(e, t, i) {
|
|
this.year = e, this.month = t, this.day = i
|
|
}
|
|
toString() {
|
|
return `${this.year}-${this.month}-${this.day}`
|
|
}
|
|
compareTo(e) {
|
|
return this.year > e.year || this.year === e.year && this.month > e.month || this
|
|
.year === e.year && this.month === e.month && this.day > e.day ? 1 : this
|
|
.year === e.year && this.month === e.month && this.day === e.day ? 0 : -1
|
|
}
|
|
before(e) {
|
|
return -1 === this.compareTo(e)
|
|
}
|
|
toCalendar(e) {
|
|
return s.get_cal(s.get_timezone("Etc/UTC"), this.year, this.month - 1, this.day)
|
|
}
|
|
addDays(e) {
|
|
const t = this.toCalendar(s.get_timezone("Etc/UTC"));
|
|
return s.add_date(t, e), r.fromCalendar(t)
|
|
}
|
|
static fromCalendar(e) {
|
|
return new r(s.get_year(e), s.get_month(e) + 1, s.get_day_of_month(e))
|
|
}
|
|
}
|
|
},
|
|
OH2X: function(e, t, i) {
|
|
"use strict";
|
|
t.LineToolFibRetracement = i("t2ex").LineToolFibRetracement, t.LineToolFibChannel = i("xnA2")
|
|
.LineToolFibChannel, t.LineToolFibSpeedResistanceArcs = i("Yjuu")
|
|
.LineToolFibSpeedResistanceArcs, t.LineToolProjection = i("68at").LineToolProjection, t
|
|
.LineToolTrendBasedFibExtension = i("ZtA1").LineToolTrendBasedFibExtension, t
|
|
.LineToolElliott = i("xz+e").LineToolElliott, t.LineToolFibCircles = i("4bfY")
|
|
.LineToolFibCircles, t.LineToolVertLine = i("n40Z").LineToolVertLine, t.LineToolCrossLine =
|
|
i("MA5A").LineToolCrossLine, t.LineToolBarsPattern = i("2bPF").LineToolBarsPattern, t
|
|
.LineToolTrendBasedFibTime = i("yUly").LineToolTrendBasedFibTime, t.LineToolFibTimeZone = i(
|
|
"FsE7").LineToolFibTimeZone, t.LineToolCircleLines = i("tG6Q").LineToolCircleLines, t
|
|
.LineToolDateRange = i("WkYF").LineToolDateRange, t.LineToolPriceRange = i("RDDl")
|
|
.LineToolPriceRange, t.LineToolDateAndPriceRange = i("UCMi").LineToolDateAndPriceRange, t
|
|
.LineToolParallelChannel = i("qcGP").LineToolParallelChannel, t.LineToolTrendAngle = i(
|
|
"nW7S").LineToolTrendAngle, t.LineToolTrendLine = i("WPQD").LineToolTrendLine, t
|
|
.LineToolInfoLine = i("yi8X").LineToolInfoLine, t.LineToolArrowMark = i("TohL")
|
|
.LineToolArrowMark, t.LineToolExecution = i("704P").LineToolExecution, t.LineToolPitchfan =
|
|
i("NhkU").LineToolPitchfan, t.LineToolGannSquare = i("Z0Sh").LineToolGannSquare, t
|
|
.LineToolFibSpeedResistanceFan = i("zZ5f").LineToolFibSpeedResistanceFan, t
|
|
.LineToolGannComplex = i("nd9+").LineToolGannComplex, t.LineToolGannFixed = i("TBaH")
|
|
.LineToolGannFixed, t.LineToolGannFan = i("4u8j").LineToolGannFan, t.LineToolFibWedge = i(
|
|
"9QkW").LineToolFibWedge, t.LineToolPitchfork = i("aDyP").LineToolPitchfork, t
|
|
.LineToolDisjointAngle = i("oIoN").LineToolDisjointChannel, t.LineToolFlatBottom = i("InMJ")
|
|
.LineToolFlatBottom, t.LineToolIcon = i("icPo").LineToolIcon, t.LineToolRotatedRectangle =
|
|
i("Az04").LineToolRotatedRectangle, t.LineToolFibSpiral = i("i80N").LineToolFibSpiral, t
|
|
.LineToolHeadAndShoulders = i("aILO").LineToolHeadAndShoulders, t.LineToolTriangle = i(
|
|
"isVH").LineToolTriangle, t.LineToolTrianglePattern = i("lNN+").LineToolTrianglePattern,
|
|
t.LineTool5PointsPattern = i("NJRZ").LineTool5PointsPattern, t.LineToolThreeDrivers = i(
|
|
"PYn8").LineToolThreeDrivers, t.LineToolABCD = i("pKDv").LineToolABCD, t
|
|
.LineToolPolyline = i("hP9j").LineToolPolyline, t.LineToolPath = i("YdVo").LineToolPath, t
|
|
.LineToolPrediction = i("Wh6B").LineToolPrediction, t.LineToolPriceLabel = i("zqZp")
|
|
.LineToolPriceLabel, t.LineToolArrowMarker = i("wiuq").LineToolArrowMarker, t.LineToolNote =
|
|
i("gLxC").LineToolNote,
|
|
t.LineToolNoteAbsolute = i("gLxC").LineToolNoteAbsolute, t.LineToolSignpost = i("gASG")
|
|
.LineToolSignpost, t.LineToolBrush = i("+hLl").LineToolBrush, t.LineToolArc = i("0Pxc")
|
|
.LineToolArc, t.LineToolCallout = i("odCa").LineToolCallout, t.LineToolBalloon = i("me8f")
|
|
.LineToolBalloon, t.LineToolText = i("V3Oj").LineToolText, t.LineToolHorzLine = i("/DxK")
|
|
.LineToolHorzLine, t.LineToolHorzRay = i("CJIV").LineToolHorzRay, t.LineToolRectangle = i(
|
|
"7qI1").LineToolRectangle, t.LineToolEllipse = i("V086").LineToolEllipse, t
|
|
.LineToolTimeCycles = i("kIXa").LineToolTimeCycles, t.LineToolSineLine = i("bv/X")
|
|
.LineToolSineLine, t.LineToolGhostFeed = i("XUCF").LineToolGhostFeed, t
|
|
.LineToolBezierQuadro = i("Xyly").LineToolBezierQuadro, t.LineToolBezierCubic = i("N+BX")
|
|
.LineToolBezierCubic, t.LineToolArrow = i("QQu0").LineToolArrow, t.LineToolRay = i("5ZUI")
|
|
.LineToolRay, t.LineToolExtended = i("CHw2").LineToolExtended, t.LineToolSchiffPitchfork =
|
|
i("v5F8").LineToolSchiffPitchfork, t.LineToolSchiffPitchfork2 = i("XFad")
|
|
.LineToolSchiffPitchfork2, t.LineToolInsidePitchfork = i("EqoR").LineToolInsidePitchfork, t
|
|
.LineToolTextAbsolute = i("V3Oj").LineToolTextAbsolute, t.LineToolArrowMarkLeft = i("TohL")
|
|
.LineToolArrowMarkLeft, t.LineToolArrowMarkRight = i("TohL").LineToolArrowMarkRight, t
|
|
.LineToolArrowMarkUp = i("TohL").LineToolArrowMarkUp, t.LineToolArrowMarkDown = i("TohL")
|
|
.LineToolArrowMarkDown, t.LineToolFlagMark = i("aIha").LineToolFlagMark, t
|
|
.LineToolCypherPattern = i("bTqm").LineToolCypherPattern, t.LineToolElliottImpulse = i(
|
|
"xz+e").LineToolElliottImpulse, t.LineToolElliottTriangle = i("xz+e")
|
|
.LineToolElliottTriangle, t.LineToolElliottTripleCombo = i("xz+e")
|
|
.LineToolElliottTripleCombo, t.LineToolElliottCorrection = i("xz+e")
|
|
.LineToolElliottCorrection, t.LineToolElliottDoubleCombo = i("xz+e")
|
|
.LineToolElliottDoubleCombo, t.LineToolRiskRewardLong = i("tDUI").LineToolRiskRewardLong, t
|
|
.LineToolRiskRewardShort = i("tDUI").LineToolRiskRewardShort, t.LineToolPosition = i("ziJ5")
|
|
.LineToolPosition, t.LineToolOrder = i("B4/o").LineToolOrder, t.LineToolHighlighter = i(
|
|
"SMvR").LineToolHighlighter, t.LineToolPriceNote = i("Zl0W").LineToolPriceNote
|
|
},
|
|
"OK+B": function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Eyy1").assert,
|
|
r = i("eJTA"),
|
|
n = r.rgba,
|
|
o = r.rgbaToString,
|
|
a = r.parseRgb,
|
|
l = (i("vTIA").TradingSourcesHorizontalAlignment, i("cWHH")),
|
|
c = i("1Wlv").PriceScale,
|
|
h = i("8sOK").StudyStub,
|
|
u = i("CW80"),
|
|
d = u.createLineTool,
|
|
p = u.createLineToolProperties,
|
|
_ = u.createStudyLineToolProperties,
|
|
m = u.isLineToolName,
|
|
f = u.isStudyLineToolName,
|
|
g = i("Ss5c").LineDataSource,
|
|
b = i("OH2X").LineToolBarsPattern,
|
|
v = i("OH2X").LineToolCallout,
|
|
S = i("CW80").isLineTool,
|
|
y = i("HLXm"),
|
|
w = i("GVHu"),
|
|
P = w.Study,
|
|
C = w.prepareStudyPropertiesForLoadChart,
|
|
x = i("3ClC").createStudy,
|
|
T = i("qJq3").Series,
|
|
I = i("dfhE"),
|
|
M = i("n5al"),
|
|
O = i("0YCj"),
|
|
L = i("Kxc7"),
|
|
A = i("txPx").getLogger("Chart.Serialization"),
|
|
E = i("OH2X").LineToolParallelChannel,
|
|
k = i("OH2X").LineToolTrendAngle,
|
|
D = i("OH2X").LineToolGhostFeed,
|
|
V = i("OH2X").LineToolElliott,
|
|
B = i("7ktv").PriceDataSource,
|
|
R = i("iDOr").Pane,
|
|
N = i("Tmoa"),
|
|
j = i("jofe").createDeferredPromise,
|
|
F = i("ApcL").preferencesByWhiteList,
|
|
W = (A = i("txPx").getLogger("Chart.Serialization"), i("mPvX").LineToolsGroupModel),
|
|
H = i("bmVy").StudyStatusType;
|
|
const {
|
|
isLineToolState: U,
|
|
isMainSeriesState: z,
|
|
isStudyState: G
|
|
} = i("Vs8b"), {
|
|
reorderDataSourcesStateZOrder: q
|
|
} = i("2jby");
|
|
l.prototype.state = function(e, t, i, s) {
|
|
for (var r = {
|
|
panes: []
|
|
}, n = 0; n < this.panes().length; n++) r.panes.push(this.panes()[n].state(!0, e, !
|
|
1, t, i, s));
|
|
r.timeScale = this._timeScale.state(e);
|
|
var o = null,
|
|
a = this.properties(),
|
|
l = a.tradingProperties.state();
|
|
return r.chartProperties = {
|
|
paneProperties: a.paneProperties.state(),
|
|
scalesProperties: a.scalesProperties.state(),
|
|
publishedChartsTimelineProperties: o ? o.state(e) : void 0,
|
|
chartEventsSourceProperties: a.chartEventsSourceProperties.state(),
|
|
tradingProperties: l,
|
|
priceScaleSelectionStrategyName: a.priceScaleSelectionStrategyName.value()
|
|
}, a.chartEventsSourceProperties && (r.chartProperties.chartEventsSourceProperties =
|
|
a.chartEventsSourceProperties.state()), s || (r.lineToolsGroups = this
|
|
.lineToolsGroupModel().state(t)), r.version = this.version(), r.timezone = this
|
|
.timezone(), r.sessions = this.sessions().state(e), r.shouldBeSavedEvenIfHidden =
|
|
this._shouldBeSavedEvenIfHidden, r
|
|
}, l.prototype.chartPropertiesTransparencyMigrate = function(e) {
|
|
var t, i, s;
|
|
e.chartProperties.paneProperties.crossHairProperties && (s = e.chartProperties
|
|
.paneProperties.crossHairProperties, N.isHexColor(s.color) && (i = s
|
|
.transparency / 100, t = a(s.color), s.color = o(n(t, i)))), e
|
|
.chartProperties.paneProperties.dataWindowProperties && (s = e.chartProperties
|
|
.paneProperties.dataWindowProperties, N.isHexColor(s.color) && (i = s
|
|
.transparency / 100, t = a(s.color), s.color = o(n(t, i))))
|
|
}, l.prototype.resetDeferredStudies = function() {
|
|
new Y(this).reset()
|
|
}, l.prototype._getExceedingChildStudies = function(e) {
|
|
for (var t = [], i = 0; i < e.length; ++i) t = t.concat(e[i].sources || []);
|
|
var s = 0;
|
|
for (var r = [], n = {}, o = 0, a = 1e6; t.length && --a;) {
|
|
var l = t[o];
|
|
(l.ownerSource && n[l.ownerSource] || !l.ownerSource) && (n[l.id] = l, t.splice(t
|
|
.indexOf(l), 1), l.ownerSource && "Study" === l.type && l.state && l.state
|
|
.isChildStudy && ++s > 1 && r.push(l)), o = (o + 1) % t.length
|
|
}
|
|
return r
|
|
}, l.prototype.restoreState = function(e, t, i) {
|
|
new Y(this).reset();
|
|
var s = {};
|
|
if (!e.panes) return void A.logDebug("ChartModel.restoreState: invalid state");
|
|
if (!Array.isArray(e.panes)) return void A.logDebug(
|
|
"ChartModel.restoreState: invalid state");
|
|
if (e.panes.length < 1) return void A.logDebug(
|
|
"ChartModel.restoreState: invalid state");
|
|
if (this._shouldBeSavedEvenIfHidden = void 0 === e.shouldBeSavedEvenIfHidden || e
|
|
.shouldBeSavedEvenIfHidden, e.chartProperties && !e.chartProperties.timezone && (e
|
|
.chartProperties.timezone = e.timezone), e.chartProperties) {
|
|
var r = TradingView.factoryDefaults("chartproperties").scalesProperties;
|
|
if (TradingView.merge(r, e.chartProperties.scalesProperties), !("showLastValue" in
|
|
r) || "showSeriesLastValue" in r || "showStudyLastValue" in r || (r
|
|
.showSeriesLastValueProperty = r.showLastValue, r
|
|
.showStudyLastValueProperty = r.showLastValue), "showSeriesLastValue" in
|
|
r && (s.showSeriesLastValueProperty = !0), "showStudyLastValue" in r && (s
|
|
.showStudyLastValueProperty = !0), e.chartProperties.paneProperties
|
|
.vertGridProperties = e.chartProperties.paneProperties.vertGridProperties ||
|
|
TradingView.clone(e.chartProperties.paneProperties.gridProperties),
|
|
e.chartProperties.paneProperties.horzGridProperties = e.chartProperties
|
|
.paneProperties.horzGridProperties || TradingView.clone(e.chartProperties
|
|
.paneProperties.gridProperties), "backgroundType" in e.chartProperties
|
|
.paneProperties || (e.chartProperties.paneProperties.backgroundType = "solid"),
|
|
this._properties.paneProperties.mergeAndFire(e.chartProperties.paneProperties),
|
|
this._properties.scalesProperties.mergeAndFire(r), e.chartProperties.timezone &&
|
|
this._properties.timezone.setValue(e.chartProperties.timezone), e
|
|
.chartProperties.chartEventsSourceProperties && this._properties
|
|
.chartEventsSourceProperties && this._properties.chartEventsSourceProperties
|
|
.mergeAndFire(e.chartProperties.chartEventsSourceProperties), e.chartProperties
|
|
.tradingProperties && this._properties.tradingProperties) {
|
|
e.chartProperties.tradingProperties.lineLength;
|
|
0, this._properties.tradingProperties.mergeAndFire(e.chartProperties
|
|
.tradingProperties)
|
|
}
|
|
this._timeScale.restoreState(e.timeScale, t), this._updateDateTimeFormatter()
|
|
}
|
|
if (e.timeScale && this._timeScale.restoreState(e.timeScale, t), !this.readOnly()) {
|
|
var n = this._getExceedingChildStudies(e.panes);
|
|
if (n.length) {
|
|
for (var o = e.panes.length - 1; o >= 0; --o) {
|
|
for (var a = (d = e.panes[o]).sources.length - 1; a >= 0; --a) {
|
|
var l = d.sources[a];
|
|
~n.indexOf(l) && d.sources.splice(a, 1)
|
|
}
|
|
d.sources.length || e.panes.splice(o, 1)
|
|
}
|
|
0
|
|
}
|
|
}
|
|
const c = e.version || 0;
|
|
var h = e.panes;
|
|
this.panes()[0].restoreState(h[0], t, c, s, i, !0);
|
|
var u = 1;
|
|
for (o = 1; o < e.panes.length; o++) {
|
|
var d, p = e.panes[o];
|
|
if (0 !== p.sources.length)(d = this.panes()[u] || this.createPane()).restoreState(
|
|
p, t, c, s, i, !0), d.mainDataSource() ? u += 1 : this.removePane(d);
|
|
else A.logWarn("Empty pane detected - restoring is skipped. idx=" + o + ", state=" +
|
|
JSON.stringify(p))
|
|
}
|
|
this._invalidateBarColorerCaches();
|
|
var _ = this.dataSources(),
|
|
m = 0;
|
|
for (o = 0; o < _.length; o++) {
|
|
var f = _[o];
|
|
TradingView.isInherited(f.constructor, g) && (m++, f.calcIsActualSymbol())
|
|
}
|
|
this.updateTimeScaleBaseIndex(), this.recalculateAllPanes(), this.fullUpdate(), this
|
|
.syncESD();
|
|
var b = TVLocalStorage.getItem("linetools_limit") || 1e3;
|
|
return window.is_authenticated && window.user && window.user.settings && (b = window
|
|
.user.settings.linetools_limit || b), e.sessions && this.sessions()
|
|
.restoreState(e.sessions, t), e.lineToolsGroups && (this._lineToolsGroupModel = W
|
|
.fromState(this, e.lineToolsGroups)), m > b && m % 100 == 0 ? {
|
|
lines_limit_exceeded: !0,
|
|
line_tools_count: m
|
|
} : (this.panes().forEach(function(e) {
|
|
this._dataSourceCollectionChanged.fire(e)
|
|
}.bind(this)), this._lineToolsGroupModel.fireChangedAll(), {})
|
|
}, R.prototype.state = function(e, t, i, s, r, n) {
|
|
var o = {},
|
|
a = new Map;
|
|
|
|
function l(e) {
|
|
if (a.has(e)) return a.get(e);
|
|
var o = null,
|
|
l = i && !e.isSavedInStudyTemplates() || !e.state || S(e) && n || !(o = e.state(
|
|
t, r)) || !e.isSavedInChart(t) || s && e.isActualSymbol && !e
|
|
.isActualSymbol() || e.isPhantom() ? null : o;
|
|
return a.set(e, l), l
|
|
}
|
|
if (e) {
|
|
o.sources = [];
|
|
for (var c = 0; c < this.m_dataSources.length; c++) {
|
|
var h = l(this.m_dataSources[c]);
|
|
null !== h && o.sources.push(h)
|
|
}
|
|
}
|
|
|
|
function u(e) {
|
|
return null !== a.get(e)
|
|
}
|
|
|
|
function d(e) {
|
|
return !n || !S(e)
|
|
}
|
|
o.leftAxisesState = this._leftPriceScales.map((function(e) {
|
|
var t = {};
|
|
return t.state = e.state(), t.sources = e.dataSources().filter(u)
|
|
.filter(d).map((function(e) {
|
|
return e.id()
|
|
})), t
|
|
})), o.rightAxisesState = this._rightPriceScales.map((function(e) {
|
|
var t = {};
|
|
return t.state = e.state(), t.sources = e.dataSources().filter(u)
|
|
.filter(d).map((function(e) {
|
|
return e.id()
|
|
})), t
|
|
})), o.overlayPriceScales = {};
|
|
for (c = 0; c < this.m_dataSources.length; c++) {
|
|
var p = this.m_dataSources[c];
|
|
if (this.isOverlay(p) && p.isSavedInChart(t)) {
|
|
var _ = p.priceScale();
|
|
o.overlayPriceScales[p.id()] = _ ? _.state() : null
|
|
}
|
|
}
|
|
return o.stretchFactor = this._stretchFactor, this.m_mainDataSource && (o.mainSourceId =
|
|
this.m_mainDataSource.id()), o.priceScaleRatio = this._currentPriceScaleRatio, o
|
|
}, R.prototype.sourceById = function(e) {
|
|
for (var t = 0; t < this.m_dataSources.length; t++)
|
|
if (this.m_dataSources[t].id() === e) return this.m_dataSources[t];
|
|
return null
|
|
}, R.prototype.isESDStudy = function(e) {
|
|
return "Script$TV_EARNINGS@tv-scripting" === e.id ||
|
|
"Script$TV_DIVIDENDS@tv-scripting" === e.id || "Script$TV_SPLITS@tv-scripting" === e
|
|
.id || "ESD$TV_EARNINGS@tv-scripting" === e.id ||
|
|
"ESD$TV_DIVIDENDS@tv-scripting" === e.id || "ESD$TV_SPLITS@tv-scripting" === e.id ||
|
|
"Earnings@tv-basicstudies" === e.id || "Dividends@tv-basicstudies" === e.id ||
|
|
"Splits@tv-basicstudies" === e.id
|
|
}, R.prototype.isStudyToSkip = function(e) {
|
|
return !!this.isESDStudy(e)
|
|
}, R.prototype.restoreState = function(e, t, i, s, r, n) {
|
|
s = s || {}, e.stretchFactor && (this._stretchFactor = e.stretchFactor);
|
|
var o = {};
|
|
if (e.sources) {
|
|
var a = e.sources.filter((function(e) {
|
|
return !!e && ("MainSeries" === e.type || (!e.points || !e.points
|
|
.some((function(e) {
|
|
return null === e.time_t || !isFinite(e
|
|
.time_t)
|
|
})) || (A.logNormal("Dropped invalid " + e.type +
|
|
". Reason: non-numeric point time"), !1)))
|
|
}), this);
|
|
const c = a.findIndex(z); - 1 !== c && this.model().mainSeries().setObsoleteZOrder(
|
|
a[c].zorder), i < 3 && q(a);
|
|
var l = -1 !== this.m_dataSources.indexOf(this._model.mainSeries());
|
|
this.clearSeries(n), this.m_mainDataSource = null, l && this
|
|
._addSourceToCollections(this._model.mainSeries(), n),
|
|
function() {
|
|
var t = a.find((function(t) {
|
|
return t.id === e.mainSourceId
|
|
}));
|
|
if (void 0 !== t)
|
|
if (TradingView[t.type] && m(t.type)) {
|
|
for (var i = null, s = 0; s < a.length; s++) {
|
|
var r = a[s];
|
|
if (!TradingView[t.type] || !m(r.type)) {
|
|
if (null !== i) return void A.logWarn(
|
|
"Pane contains more than 1 possibly main sources - auto fix cannot be applied"
|
|
);
|
|
i = r
|
|
}
|
|
}
|
|
if (null !== i) {
|
|
var n = e.mainSourceId,
|
|
o = 0;
|
|
e.mainSourceId = i.id, a.forEach((function(e) {
|
|
e.ownerSource === n && (e.ownerSource = i.id,
|
|
o += 1)
|
|
})), A.logNormal(
|
|
"Auto fix broken pane is applied, changed line tools=" +
|
|
o + ", changed from=" + n + " to=" + i.id)
|
|
} else A.logWarn(
|
|
"Pane contains only line tools - possible we need to remove this pane?"
|
|
)
|
|
} else A.logNormal(
|
|
"The type of main source is not line tool - fix is unnecessary");
|
|
else A.logWarn("There is no main source with id " + e.mainSourceId +
|
|
", total sources=" + a.length)
|
|
}();
|
|
for (var h = 0; h < a.length; h++) {
|
|
if ("study_Sessions" === (u = a[h]).type) {
|
|
this.model().sessions().restoreOldState(u, t);
|
|
break
|
|
}
|
|
}
|
|
for (h = 0; h < a.length; h++) {
|
|
var u;
|
|
if ("study_Sessions" !== (u = a[h]).type) {
|
|
var d = u.id;
|
|
null === this._model.dataSourceForId(u.id) || "MainSeries" === u.type ? (o[
|
|
d] = u.ownerSource, z(u) ? this._restoreMainSeries(u, t, l, s,
|
|
r, n) : G(u) ? this.restoreStudy(u, t, s, n) : U(u) ? (u
|
|
.state && (u.state.zOrderVersion = 2),
|
|
this.restoreLineTool(u, t, void 0, n)) : TradingView[u.type] &&
|
|
TradingView[u.type].createFromState && this._restoreSpecialSource(u,
|
|
t, n)) : A.logError("Duplicate id while restoring pane: " + u
|
|
.type + "," + u.id)
|
|
}
|
|
}
|
|
}
|
|
var p, _, f = new Set,
|
|
b = this;
|
|
|
|
function v(e) {
|
|
var t = defaults("chartproperties").paneProperties.axisProperties,
|
|
i = new c(b.model().properties().scalesProperties, t);
|
|
return i.restoreState(e.state), e.sources.forEach((function(e) {
|
|
var s = b.dataSourceForId(e);
|
|
s && function e(t, i, s) {
|
|
f.has(t) || (f.add(t), void 0 !== s.m_showSymbolLabels &&
|
|
t instanceof T && b.model().properties()
|
|
.scalesProperties.showSymbolLabels.setValue(s
|
|
.m_showSymbolLabels), L(t, i), b._model
|
|
.children(t, !0).forEach((function(t) {
|
|
e(t, i, s)
|
|
})))
|
|
}(s, i, t)
|
|
})), 0 === i.dataSources().length ? null : i
|
|
}
|
|
if (e.leftAxisesState) p = e.leftAxisesState.map(v).filter((function(e) {
|
|
return null !== e
|
|
}));
|
|
else {
|
|
var S = v({
|
|
state: e.leftAxisState,
|
|
sources: e.leftAxisSources
|
|
});
|
|
p = null !== S ? [S] : []
|
|
}
|
|
if (this._leftPriceScales.slice().forEach(function(e) {
|
|
this.removePriceScale(e)
|
|
}.bind(this)), this._leftPriceScales = [], p.forEach((function(e) {
|
|
b._placePriceScale(e, "left")
|
|
})), e.rightAxisesState) _ = e.rightAxisesState.map(v).filter((function(e) {
|
|
return null !== e
|
|
}));
|
|
else {
|
|
var y = v({
|
|
state: e.rightAxisState,
|
|
sources: e.rightAxisSources
|
|
});
|
|
_ = null !== y ? [y] : []
|
|
}
|
|
this._rightPriceScales.forEach(function(e) {
|
|
this.removePriceScale(e)
|
|
}.bind(this)), this._rightPriceScales = [], _.forEach((function(e) {
|
|
b._placePriceScale(e, "right")
|
|
})), this._currentPriceScaleRatio = e.priceScaleRatio || e.leftPriceScaleRatio || e
|
|
.rightPriceScaleRatio || null;
|
|
var w = new Map;
|
|
for (h = 0; h < this.m_dataSources.length; h++) {
|
|
var C = this.m_dataSources[h];
|
|
if (!f.has(C)) {
|
|
var x;
|
|
if (e.overlayPriceScales && e.overlayPriceScales[C.id()]) {
|
|
var I = e.overlayPriceScales[C.id()];
|
|
w.has(I.id) ? x = w.get(I.id) : ((x = new c(this._model.properties()
|
|
.scalesProperties)).setHeight(this.m_height), I
|
|
.m_isAutoScale = !0, I.m_isLog = !1, I.m_isPercentage = !1, I
|
|
.m_isLockScale = !1, x.restoreState(I), w.set(I.id, x))
|
|
} else(x = new c(this._model.properties().scalesProperties)).setHeight(this
|
|
.m_height);
|
|
L(C, x)
|
|
}
|
|
}
|
|
for (var d in o) {
|
|
var M = o[d];
|
|
if (M)(C = this.dataSourceForId(d)) && this.dataSourceForId(d).setOwnerSource(this
|
|
.dataSourceForId(M))
|
|
}
|
|
if (e.mainSourceId && !this.containsMainSeries() && (this.m_mainDataSource = this
|
|
.dataSourceForId(e.mainSourceId)), !this.m_mainDataSource)
|
|
for (h = 0; h < this.m_dataSources.length; h++) {
|
|
C = this.m_dataSources[h];
|
|
if (TradingView.isInherited(C.constructor, B)) {
|
|
this.m_mainDataSource = C;
|
|
break
|
|
}
|
|
}
|
|
for (h = 0; h < this.m_dataSources.length; h++) {
|
|
C = this.m_dataSources[h];
|
|
if (TradingView.isInherited(C.constructor, g)) C.ownerSource() || C.setOwnerSource(
|
|
this.mainDataSource()), C.isFixed() && C.restoreFixedPoints();
|
|
else if (TradingView.isInherited(C.constructor, P)) {
|
|
var O = C.properties();
|
|
O.linkedToSeries && O.linkedToSeries.value() && (C.ownerSource() || C
|
|
.setOwnerSource(this.model().mainSeries()))
|
|
}
|
|
}
|
|
|
|
function L(e, t) {
|
|
b.removeSourceFromPriceScale(e), e.setPriceScale(t), t.addDataSource(e)
|
|
}
|
|
this._updateMargins(), this._cachedOrderedSources.clear()
|
|
}, R.prototype._restoreMainSeries = function(e, t, i, s, r, n) {
|
|
var o = e.id,
|
|
a = e.state;
|
|
if (a && r && (a.style = r.style || a.style, a.interval = r.interval || a.interval,
|
|
a.symbol = r.symbol || a.symbol, r.symbol && delete a.currencyId), a && (a
|
|
.style, I.STYLE_HILO), a && ["candleStyle", "hollowCandleStyle", "haStyle"]
|
|
.forEach((function(e) {
|
|
a[e] && (a[e].wickUpColor = a[e].wickUpColor || a[e].wickColor, a[e]
|
|
.wickDownColor = a[e].wickDownColor || a[e].wickColor)
|
|
})), a && (a.statusViewStyle = a.statusViewStyle || {}, !a.statusViewStyle
|
|
.symbolTextSource)) {
|
|
var l = !!a.statusViewStyle.showSymbolAsDescription;
|
|
a.statusViewStyle.symbolTextSource = l ? "ticker" : "description"
|
|
}
|
|
if (a && (a.extendedHours ? a.sessionId = "extended" : a.sessionId || (a.sessionId =
|
|
"regular"), delete a.extendedHours), !i) {
|
|
var c = this._model.mainSeries();
|
|
this._model.paneForSource(c).removeDataSource(c, !1, n), this
|
|
._addSourceToCollections(c, n)
|
|
}
|
|
const h = this.model().mainSeries(),
|
|
u = h.properties();
|
|
if (this.m_mainDataSource = h, (g = a && a.style ? a.style : void 0) === T.STYLE_PNF &&
|
|
"ATR" === u.pnfStyle.inputs.style.value() ? u.pnfStyle.inputs.style._value =
|
|
"Traditional" : g === T.STYLE_RENKO && "ATR" === u.renkoStyle.inputs.style
|
|
.value() && (u.renkoStyle.inputs.style._value = "Traditional"), a && !a
|
|
.hasOwnProperty(
|
|
"showSessions") && (a.showSessions = !1), a && t && (a.showCountdown = !1), a &&
|
|
(t && !("showSeriesLastValueProperty" in s) && "showLastValue" in a && this._model
|
|
.properties().scalesProperties.showSeriesLastValue.setValue(a.showLastValue),
|
|
delete a.showLastValue), a)
|
|
for (var d = {
|
|
haStyle: M.chartStyleStudyId(T.STYLE_HEIKEN_ASHI, !0),
|
|
renkoStyle: M.chartStyleStudyId(T.STYLE_RENKO, !0),
|
|
pbStyle: M.chartStyleStudyId(T.STYLE_PB, !0),
|
|
kagiStyle: M.chartStyleStudyId(T.STYLE_KAGI, !0),
|
|
pnfStyle: M.chartStyleStudyId(T.STYLE_PNF, !0),
|
|
rangeStyle: M.chartStyleStudyId(T.STYLE_RANGE, !0)
|
|
}, p = this._model.studyVersioning(), _ = h.styleStudyInfos(), m = Object
|
|
.keys(I.SYMBOL_STRING_DATA), f = 0; f < m.length; f++) {
|
|
var g = m[f],
|
|
b = I.STYLE_SHORT_NAMES[g] + "Style",
|
|
v = b in e ? e[b].studyId : d[b];
|
|
if (null != (g = a[b])) {
|
|
var S = g.inputs,
|
|
y = O.parseIdString(v),
|
|
w = _[b].studyId,
|
|
P = O.parseIdString(w),
|
|
C = p.updateStudyInputs(y.id, y.version, P.version, S, null);
|
|
g.inputs = C
|
|
}
|
|
}
|
|
const x = h.sessionId();
|
|
h.restoreState(e, t), this.changeSourceId(h, o), h.sessionId() !== x && u.sessionId
|
|
.listeners().fire(u.sessionId)
|
|
}, R.prototype.restoreStudy = function(e, t, i, s) {
|
|
if (t && void 0 === e.data && void 0 === e.nonSeriesData && void 0 === e.indexes) A
|
|
.logError("Cannot restore (skipping) study without data " + e.id + ", " + e.metaInfo
|
|
.id);
|
|
else {
|
|
var r = e.id,
|
|
n = e.state,
|
|
o = e.zorder,
|
|
a = e.ownerSource,
|
|
l = TradingView.clone(e.metaInfo);
|
|
if (Object.assign(l, O.parseIdString(l.id)), !this.isStudyToSkip(l) || t) {
|
|
var c = n,
|
|
u = this._model.studyVersioning(),
|
|
d = u.patchPropsStateAndMetaInfo(c, l, {
|
|
oldShowStudyLastValueProperty: t && !i.showStudyLastValueProperty
|
|
});
|
|
c = d.propsState, l = d.metaInfo;
|
|
var p = new h(this._model, e, l.shortDescription);
|
|
p.setId(r), p.setZorder(o);
|
|
var _ = this;
|
|
if (t) f(null);
|
|
else {
|
|
var m = u.updateMetaInfoAsync(l);
|
|
m.sync ? f(m.result) : m.result.then((function(e) {
|
|
f(e)
|
|
})).catch((function(e) {
|
|
p.setFailed("error: " + e)
|
|
}))
|
|
}
|
|
return p && (p.setZorder(o), this._addSourceToCollections(p, s), this
|
|
._processMainSourceChange()), this._cachedOrderedSources.clear(), p
|
|
}
|
|
A.logNormal("Skipping study " + l.id)
|
|
}
|
|
|
|
function f(i) {
|
|
p.setStatus({
|
|
type: H.Undefined
|
|
});
|
|
var s = i || new O(l),
|
|
n = new Y(_._model);
|
|
|
|
function o(o) {
|
|
var a = C(l, i, c, null, u, o),
|
|
h = x(_._model, a, o || _._model.mainSeries(), s);
|
|
if (h.setId(r), h.setOwnFirstValue(void 0 === e.ownFirstValue ? null : e
|
|
.ownFirstValue), t) {
|
|
var d = u.patchStudyData(l, e.data, e.nonSeriesData, e.indexes);
|
|
h.restoreData(d.data, d.nsData, d.indexes)
|
|
}
|
|
_._model.replaceStudyStub(p, h) || (p = h), n.add(r, h)
|
|
}
|
|
a && e.state.isChildStudy ? n.get(a).then(o) : o()
|
|
}
|
|
}, R.prototype.restoreLineTool = function(e, t, i, r) {
|
|
delete e.state.lastUpdateTime, i = void 0 === i || i, V.migrateState(e), y.migrateState(
|
|
e);
|
|
var n = e.type,
|
|
o = e.id,
|
|
a = e.state,
|
|
l = i ? e.zorder : this.newLineToolZOrder();
|
|
s(m(n), "invalid data source type:" + n + " (expected to be a Line Tool)");
|
|
var c, h, u = null;
|
|
if (f(n)) {
|
|
var g = (e = (u = this._model.studyVersioning()).patchPointsBasedStudyState(e))
|
|
.metaInfo;
|
|
Object.assign(g, O.parseIdString(g.fullId));
|
|
var S = u.updateMetaInfo(g) || g;
|
|
h = _(n, g, S, a, u), t ? h.merge({
|
|
fixedSize: !1
|
|
}) : h.merge({
|
|
fixedSize: !0
|
|
}), c = d(n, this._model, h, S, !0)
|
|
} else h = p(n, a), t ? h.merge({
|
|
fixedSize: !1
|
|
}) : h.merge({
|
|
fixedSize: !0
|
|
}), c = d(n, this._model, h, null, !0);
|
|
c.setId(o), c.linkKey().setValue(e.linkKey || null);
|
|
var w = e.alertId;
|
|
w && c.canHasAlert() && "function" == typeof c.setAlert && L.enabled("alerts") && !this
|
|
._model.readOnly() && !this._model.isJustClonedChart() && c.setAlert(w, {
|
|
noChartSave: !0
|
|
});
|
|
var P = e.indexes ? e.indexes : [];
|
|
if (P = P.slice(0, e.points.length), c.isFixed() ? c.restorePositionPercents(e
|
|
.positionPercents) : c.restorePoints(e.points, P, t), c instanceof b ||
|
|
c instanceof v || c instanceof k || c instanceof D || c instanceof E ||
|
|
c instanceof E) c.restoreData(e);
|
|
else if (t && c.restoreData) {
|
|
var C = e;
|
|
u && (C.graphics = u.patchPointsBasedStudyData(C.metaInfo, C.graphics)), c
|
|
.restoreData(C)
|
|
}
|
|
var x = null == e.version ? 1 : e.version,
|
|
T = null == c.version ? 1 : c.version;
|
|
return x !== T && "function" == typeof c.migrateVersion && c.migrateVersion(x, T, {
|
|
pane: this,
|
|
model: this._model,
|
|
properties: h
|
|
}), void 0 !== l && c.setZorder(l), this._addSourceToCollections(c, r), this
|
|
._cachedOrderedSources.clear(), c
|
|
}, R.prototype._restoreSpecialSource = function(e, t, i) {
|
|
var s = TradingView[e.type];
|
|
if (s && s.createFromState) {
|
|
var r = s.createFromState(e, t, this._model);
|
|
r && (r.setId(e.id), this._addSourceToCollections(r, i), r.zorder && r.setZorder(r
|
|
.zorder))
|
|
}
|
|
}, l.prototype.restoreTheme = function(e, t, i) {
|
|
var s = {
|
|
hollowCandle: {
|
|
related: "candle"
|
|
}
|
|
};
|
|
for (var r in s)
|
|
if (!e.mainSourceProperties[r + "Style"]) {
|
|
var n = e.mainSourceProperties[s[r].related + "Style"];
|
|
e.mainSourceProperties[r + "Style"] = TradingView.clone(n)
|
|
} this._undoModel.chartLoadTheme(this, e, t, i)
|
|
}, l.prototype.preferences = function() {
|
|
return F(this, this.mainSeries())
|
|
};
|
|
var Y = function() {
|
|
var e = [],
|
|
t = [];
|
|
|
|
function i(s) {
|
|
var r = e.indexOf(s);
|
|
return ~r ? t[r] : this instanceof i ? (this._source = s, this._studies = {}, this
|
|
._deferreds = {}, e.push(s), void t.push(this)) : new i(s)
|
|
}
|
|
return i.prototype.add = function(e, t) {
|
|
this._deferreds[e] && (this._deferreds[e].resolve(t), delete this._deferreds[
|
|
e]), this._studies[e] = t
|
|
}, i.prototype.get = function(e) {
|
|
return this._studies[e] ? Promise.resolve(this._studies[e]) : (this._deferreds[
|
|
e] || (this._deferreds[e] = j()), this._deferreds[e].promise)
|
|
}, i.prototype.reset = function() {
|
|
var i = e.indexOf(this._source);
|
|
~i && (e.splice(i, 1), t.splice(i, 1))
|
|
}, i
|
|
}();
|
|
e.exports = l
|
|
},
|
|
OLhd: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "createDwmAligner", (function() {
|
|
return c
|
|
})), i.d(t, "isAlignmentEnabled", (function() {
|
|
return h
|
|
})), i.d(t, "createTimeToBarTimeAligner", (function() {
|
|
return u
|
|
}));
|
|
var s = i("jCNj"),
|
|
r = i("Kxc7"),
|
|
n = i("LxhU"),
|
|
o = i("ZmuQ"),
|
|
a = i("IiTo");
|
|
const l = new o.b("Etc/UTC", "0000-0000:1234567");
|
|
|
|
function c(e, t) {
|
|
if (!h() || !n.Interval.isDWM(e)) return null;
|
|
const i = new o.b(t.timezone, t.session, t.session_holidays, t.corrections),
|
|
r = Object(a.newBarBuilder)(e, i, l);
|
|
return {
|
|
timeToSessionStart: e => r.tradingDayToSessionStart(e),
|
|
timeToExchangeTradingDay: e => {
|
|
const t = s.utc_to_cal(i.timezone, e),
|
|
r = i.spec.correctTradingDay(t);
|
|
return s.set_hms(r, 0, 0, 0, 0, s.get_timezone("Etc/UTC")), r.getTime()
|
|
}
|
|
}
|
|
}
|
|
|
|
function h() {
|
|
return !r.enabled("disable_resolution_rebuild")
|
|
}
|
|
|
|
function u(e, t) {
|
|
if (!h()) return e => e;
|
|
const i = new o.b(t.timezone, t.session, t.session_holidays, t.corrections),
|
|
s = Object(a.newBarBuilder)(e, i, i, !1);
|
|
return e => s.alignTimeIfPossible(e)
|
|
}
|
|
},
|
|
Ocx9: function(e, t, i) {
|
|
"use strict";
|
|
(function(e) {
|
|
var s = i("wZIs"),
|
|
r = i("tc+8");
|
|
|
|
function n(e, t, i, r) {
|
|
var n = e ? s.defaults : s.factoryDefaults,
|
|
a = t.startsWith("study_") ? TradingView.clone(n("study")) : {},
|
|
l = TradingView.clone(n(t, r));
|
|
return t.startsWith("study_") && l.inputs && delete l.inputs.symbol,
|
|
"linetoolicon" === t && e && (l.icon = s.defaults(t).icon), l = o(l, i),
|
|
TradingView.merge(a, l), a
|
|
}
|
|
|
|
function o(e, t) {
|
|
var i = {};
|
|
for (var s in e) t.indexOf(s) < 0 && (i[s] = e[s]);
|
|
return i
|
|
}
|
|
|
|
function a(t, i, s, o) {
|
|
var l;
|
|
void 0 === o && (o = !0), this._defaultName = t, s ? l = i : (l = n(o, t, [], null),
|
|
i && TradingView.merge(l, i)), r.call(this, l), this._defaultName = t, this
|
|
._useUserPreferences = o, this.listeners().subscribe(this, a.prototype
|
|
.onPropertyChanged), this._exclusions = [], this
|
|
._restoreFactoryDefaultsEvent = new e
|
|
}
|
|
inherit(a, r), a._saveDefaults = !1, a.prototype.preferences = function() {
|
|
return this.state(this._exclusions)
|
|
}, a.prototype.mergePreferences = function(e) {
|
|
this.mergeAndFire(o(e, this._exclusions))
|
|
}, a.prototype.addExclusion = function(e) {
|
|
this._exclusions.indexOf(e) < 0 && this._exclusions.push(e)
|
|
}, a.prototype.restoreFactoryDefaults = function() {
|
|
var e = n(!1, this._defaultName, this._exclusions, null);
|
|
this.mergeAndFire(e), this._defaultName.startsWith("study_") && !this
|
|
._defaultName.startsWith("study_VbPFixed") || this.saveDefaults(), this
|
|
._restoreFactoryDefaultsEvent.fire()
|
|
}, a.prototype.onRestoreFactoryDefaults = function() {
|
|
return this._restoreFactoryDefaultsEvent
|
|
}, a.prototype.onPropertyChanged = function() {
|
|
!a._saveDefaults || this._defaultName.startsWith("study_") && !this._defaultName
|
|
.startsWith("study_VbPFixed") || this.saveDefaults()
|
|
}, a.prototype.saveDefaults = function() {
|
|
this._useUserPreferences && s.saveDefaults(this._defaultName, this
|
|
.preferences())
|
|
}, a.prototype.clone = function(e) {
|
|
for (var t = new a(this._defaultName, this.state(), e && e.replaceByState, this
|
|
._useUserPreferences), i = 0; i < this._exclusions.length; ++i) t
|
|
.addExclusion(this._exclusions[i]);
|
|
return t
|
|
}, t.DefaultProperty = a, t.saveDefaultProperties = function(e) {
|
|
a._saveDefaults = e
|
|
}
|
|
}).call(this, i("aIyQ"))
|
|
},
|
|
OiSa: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "isDrawingToolbarVisible", (function() {
|
|
return c
|
|
}));
|
|
var s = i("Vdly"),
|
|
r = i("Kxc7"),
|
|
n = i("hY0g"),
|
|
o = i.n(n);
|
|
const a = !r.enabled("hide_left_toolbar_by_default"),
|
|
l = s.getBool("ChartDrawingToolbarWidget.visible", a),
|
|
c = new o.a(l)
|
|
},
|
|
OsWk: function(e, t) {
|
|
e.exports =
|
|
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15 15" width="15" height="15" fill="none"><path d="M3.00004 7.50008C3.00004 6.25729 3.50318 5.13298 4.31807 4.31809L3.61097 3.61098C2.6162 4.60574 2.00004 5.98143 2.00004 7.50008H3.00004ZM4.31807 4.31809C5.13296 3.50321 6.25727 3.00008 7.50004 3.00008V2.00008C5.98141 2.00008 4.60572 2.61623 3.61097 3.61098L4.31807 4.31809ZM4.31808 3.61098L2.55033 1.84323L1.84322 2.55033L3.61097 4.31809L4.31808 3.61098ZM7.50004 3.00008C8.74283 3.00008 9.86715 3.50321 10.682 4.31811L11.3891 3.611C10.3944 2.61624 9.01869 2.00008 7.50004 2.00008V3.00008ZM10.682 4.31811C11.4969 5.13299 12 6.2573 12 7.50008H13C13 5.98144 12.3839 4.60576 11.3891 3.611L10.682 4.31811ZM11.3891 4.31811L13.1569 2.55033L12.4498 1.84322L10.682 3.611L11.3891 4.31811ZM12 7.50008C12 8.74285 11.4969 9.86716 10.682 10.682L11.3891 11.3892C12.3839 10.3944 13 9.01872 13 7.50008H12ZM10.682 10.682C9.86715 11.4969 8.74283 12.0001 7.50004 12.0001V13.0001C9.01869 13.0001 10.3944 12.3839 11.3891 11.3892L10.682 10.682ZM10.682 11.3892L12.4498 13.1569L13.1569 12.4498L11.3891 10.682L10.682 11.3892ZM7.50004 12.0001C6.25727 12.0001 5.13296 11.497 4.31807 10.6821L3.61097 11.3892C4.60572 12.3839 5.98141 13.0001 7.50004 13.0001V12.0001ZM4.31807 10.6821C3.50318 9.86718 3.00004 8.74286 3.00004 7.50008H2.00004C2.00004 9.01873 2.6162 10.3944 3.61097 11.3892L4.31807 10.6821ZM2.55033 13.1569L4.31808 11.3892L3.61097 10.6821L1.84322 12.4498L2.55033 13.1569ZM8.00004 2.50007L8 -8.77353e-06L7 8.77353e-06L7.00004 2.50009L8.00004 2.50007ZM12.5001 8.00008L15 8L15 7L12.5 7.00008L12.5001 8.00008ZM2.50006 7.00008L1.564e-05 7L-1.564e-05 8L2.50003 8.00008L2.50006 7.00008ZM7.00004 12.5001L7 15L8 15L8.00004 12.5001L7.00004 12.5001Z"/></svg>'
|
|
},
|
|
OwDf: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "PivotPointsStandardLastPricesView", (function() {
|
|
return o
|
|
}));
|
|
var s = i("k9/m");
|
|
const r = ["p", "s1", "r1", "s2", "r2", "s3", "r3", "s4", "r4", "s5", "r5"],
|
|
n = {
|
|
P: "P",
|
|
S1: "S1/R1",
|
|
S2: "S2/R2",
|
|
S3: "S3/R3",
|
|
S4: "S4/R4",
|
|
S5: "S5/R5",
|
|
R1: "S1/R1",
|
|
R2: "S2/R2",
|
|
R3: "S3/R3",
|
|
R4: "S4/R4",
|
|
R5: "S5/R5"
|
|
};
|
|
class o {
|
|
constructor(e) {
|
|
this._visiblePivots = new Set, this._invidated = !0, this._prices = [], this
|
|
._source = e
|
|
}
|
|
visiblePivots() {
|
|
return this._visiblePivots
|
|
}
|
|
update() {
|
|
this._invidated = !0
|
|
}
|
|
prices() {
|
|
return this._invidated && (this._updateImpl(), this._invidated = !1), this._prices
|
|
}
|
|
_updateImpl() {
|
|
this._visiblePivots.clear();
|
|
const e = this._source.model(),
|
|
t = this._source.priceScale();
|
|
if (null === t) return;
|
|
if (e.timeScale().isEmpty() || t.isEmpty()) return;
|
|
const i = e.timeScale().visibleBarsStrictRange();
|
|
if (null === i) return;
|
|
if (!this._source.customData() || !this._source.customData().pivots) return;
|
|
const o = e.mainSeries().bars().search(i.lastBar(), s.PlotRowSearchMode
|
|
.NearestLeft);
|
|
if (null === o) return;
|
|
const a = o.index,
|
|
l = this._source.customData().pivots,
|
|
c = this._source.indexes(),
|
|
h = this._source.properties(),
|
|
u = this._source.firstValue();
|
|
for (let e = 0; e < l.length; e++) {
|
|
if (!l[e]) continue;
|
|
const i = c[l[e].startIndex],
|
|
s = c[l[e].endIndex],
|
|
o = h.inputs.showHistoricalPivots.value();
|
|
if (i <= a && (s >= a || o)) {
|
|
this._visiblePivots.add(l[e]), this._prices = [];
|
|
for (let i = 0; i < r.length; i++) {
|
|
const s = r[i],
|
|
o = l[e][s];
|
|
if (void 0 === o || null === u) continue;
|
|
const a = t.priceToCoordinate(o, u),
|
|
c = s.toUpperCase(),
|
|
d = n[c],
|
|
p = h.levelsStyle.colors[d].value();
|
|
this._prices.push({
|
|
formatted: t.formatPrice(o, u),
|
|
price: o,
|
|
coordinate: a,
|
|
color: p
|
|
})
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
Owlf: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return s
|
|
}));
|
|
const s = "large"
|
|
},
|
|
Oy0l: function(e, t, i) {},
|
|
PAcw: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "GridRenderer", (function() {
|
|
return n
|
|
}));
|
|
var s = i("jFln"),
|
|
r = i("gAom");
|
|
class n {
|
|
constructor() {
|
|
this._data = null
|
|
}
|
|
setData(e) {
|
|
this._data = e
|
|
}
|
|
draw(e, t) {
|
|
if (null === this._data) return;
|
|
const i = t.pixelRatio,
|
|
n = Math.max(1, Math.floor(i));
|
|
e.lineWidth = n;
|
|
const o = Math.ceil(this._data.h * i),
|
|
a = Math.ceil(this._data.w * i);
|
|
if (e.save(), e.lineCap = "butt", this._data.vertLinesVisible) {
|
|
e.strokeStyle = this._data.vertLinesColor, Object(s.setLineStyle)(e, this._data
|
|
.vertLineStyle);
|
|
for (const t of this._data.timeMarks) {
|
|
const s = Math.round(t.coord * i);
|
|
Object(r.drawVerticalLine)(e, s, 0, o)
|
|
}
|
|
}
|
|
if (this._data.horzLinesVisible) {
|
|
e.strokeStyle = this._data.horzLinesColor, Object(s.setLineStyle)(e, this._data
|
|
.horzLineStyle);
|
|
for (const t of this._data.priceMarks) {
|
|
const s = Math.round(t.coord * i);
|
|
Object(r.drawHorizontalLine)(e, s, 0, a)
|
|
}
|
|
}
|
|
e.restore()
|
|
}
|
|
hitTest(e) {
|
|
return null
|
|
}
|
|
}
|
|
},
|
|
PL0c: function(e, t, i) {
|
|
"use strict";
|
|
(function(e) {
|
|
var s = i("aO4+").Point,
|
|
r = i("2kV1").StudyStatusView,
|
|
n = i("it7y").StudyDataWindowView,
|
|
o = i("Qq0B").NonSeriesStudy,
|
|
a = i("UHyS").StandardPivotPointsPriceAxisView,
|
|
l = i("KtbP").PanePriceAxisView,
|
|
c = i("VdBB").HitTestResult,
|
|
h = i("Zy3/").CompositeRenderer,
|
|
u = i("c44N").areEqualPaneRenderParams,
|
|
d = i("2EnG").StandardPivotPointsImageCache,
|
|
p = i("OwDf").PivotPointsStandardLastPricesView,
|
|
_ = i("Fdrt").PaneRendererStandardPivotLabel,
|
|
m = i("l4sv").HorizontalLineRenderer;
|
|
class f {
|
|
constructor(e, t) {
|
|
this._model = e, this._source = t, this._pivots = [], this._textCache = {}
|
|
}
|
|
setCache(e) {
|
|
this._cache = e
|
|
}
|
|
priceAxisViews(e, t) {
|
|
return this._priceAxisViews
|
|
}
|
|
mergeLabel(e, t, i) {
|
|
var s = "" + t;
|
|
void 0 === e[s] ? (e[s] = {}, e[s].text = i, e[s].ids = [this.complete(
|
|
i)]) : (e[s].text += "/" + i, e[s].ids.push(this.complete(i)))
|
|
}
|
|
complete(e) {
|
|
return "P" === e ? e : "S" + e[1] + "/R" + e[1]
|
|
}
|
|
update() {
|
|
this._invalidated = !0
|
|
}
|
|
_updateImpl() {
|
|
if (this._source.pricesView().prices(), this._pivots = [], this._source
|
|
.customData() && this._source.customData().pivots && this._source
|
|
.properties().visible.value()) {
|
|
var e = this._source.customData().pivots,
|
|
t = this._source._indexes,
|
|
i = this._model.timeScale(),
|
|
s = this._source.priceScale();
|
|
if (s && !s.isEmpty() && !i.isEmpty() && e) {
|
|
var r = i.visibleBarsStrictRange(),
|
|
n = r.firstBar(),
|
|
o = r.lastBar();
|
|
if (this._source.ownerSource())
|
|
for (var a = this._source.ownerSource().firstValue(), l = 0; l <
|
|
e.length; l++)
|
|
if (e[l]) {
|
|
var c = t[e[l].startIndex],
|
|
h = t[e[l].endIndex];
|
|
if (!(h < n || c > o)) {
|
|
var u = {},
|
|
d = this._source.properties().levelsStyle
|
|
.visibility;
|
|
d.P.value() && this.mergeLabel(u, e[l].p, "P"), d[
|
|
"S1/R1"].value() && (this.mergeLabel(u, e[l]
|
|
.s1, "S1"), this.mergeLabel(u, e[l].r1,
|
|
"R1")), d["S2/R2"].value() && (this
|
|
.mergeLabel(u, e[l].s2, "S2"),
|
|
this.mergeLabel(u, e[l].r2, "R2")), d[
|
|
"S3/R3"].value() && (this.mergeLabel(u, e[l]
|
|
.s3, "S3"), this.mergeLabel(u, e[l].r3,
|
|
"R3")), d["S4/R4"].value() && (this
|
|
.mergeLabel(u, e[l].s4, "S4"), this
|
|
.mergeLabel(u, e[l].r4, "R4")), d["S5/R5"]
|
|
.value() && (this.mergeLabel(u, e[l].s5, "S5"),
|
|
this.mergeLabel(u, e[l].r5, "R5"));
|
|
var p = i.indexToCoordinate(c),
|
|
_ = i.indexToCoordinate(h);
|
|
for (var m in u) {
|
|
var f = parseFloat(m),
|
|
g = s.priceToCoordinate(f, a);
|
|
this._pivots.push({
|
|
x1: p,
|
|
x2: _,
|
|
y: g,
|
|
label: u[m].text,
|
|
labelIds: u[m].ids,
|
|
src: e[l]
|
|
})
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
renderer() {
|
|
this._invalidated && (this._updateImpl(), this._invalidated = !1);
|
|
for (var e = new h, t = this._source.properties().levelsStyle.colors, i =
|
|
this._source.properties().levelsStyle.widths, r = this._source
|
|
.visiblePivots(), n = 0; n < this._pivots.length; n++) {
|
|
var o = this._pivots[n];
|
|
if (r.has(o.src)) {
|
|
var a = {
|
|
width: this._model.timeScale().width(),
|
|
height: this._source.priceScale().height(),
|
|
color: t[o.labelIds[0]].value(),
|
|
linewidth: i[o.labelIds[0]].value(),
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
y: o.y,
|
|
left: o.x1,
|
|
right: o.x2
|
|
},
|
|
l = new m;
|
|
if (l.setData(a), l.setHitTest(new c(c.REGULAR)), e.append(l), this
|
|
._source.properties().levelsStyle.showLabels.value()) {
|
|
var u = function(e) {
|
|
return this._source.getCache(e)
|
|
}.bind(this);
|
|
e.append(new _(u, new s(o.x1, o.y), o.label))
|
|
}
|
|
}
|
|
}
|
|
return e
|
|
}
|
|
}
|
|
t.study_PivotPointsStandard = class extends o {
|
|
constructor(e, t, i, s) {
|
|
super(e, t, i, s);
|
|
for (var r = ["P", "S1/R1", "S2/R2", "S3/R3", "S4/R4", "S5/R5"], n =
|
|
this.properties().levelsStyle.visibility, o = 0; o < r
|
|
.length; o++) n[r[o]].listeners().subscribe(this, this
|
|
.processHibernate);
|
|
this._cacheDrawParams = null, this._cache = null
|
|
}
|
|
indexes() {
|
|
return this._indexes
|
|
}
|
|
getCache(e) {
|
|
return this.createCacheIfRequred(e), this._cache
|
|
}
|
|
createCacheIfRequred(e) {
|
|
if (null === this._cache || null == this._cacheDrawParams || !u(e, this
|
|
._cacheDrawParams)) {
|
|
this._cache && this._cache.destroy();
|
|
var t = this._getActualCacheParams();
|
|
this._cache = new d(e, t.font, t.fontSize, t.backColors), this
|
|
._cache.setPrices(this._pricesView.prices()), this
|
|
._cacheDrawParams = e, this._cacheInvalidated = !1, this._cache
|
|
.reset(t), this._cache.setPrices(this._pricesView.prices())
|
|
}
|
|
}
|
|
lastValueData(e, t, i) {
|
|
var s = ["P", "S1", "R1", "S2", "R2", "S3", "R3", "S4", "R4", "S5",
|
|
"R5"
|
|
].indexOf(e.toUpperCase()),
|
|
r = this._pricesView.prices()[s];
|
|
return null != r ? r : {
|
|
noData: !0
|
|
}
|
|
}
|
|
priceLabelText(e) {
|
|
return this._metaInfo.shortDescription + ":" + e.toUpperCase()
|
|
}
|
|
pricesView() {
|
|
return this._pricesView
|
|
}
|
|
_getActualCacheParams() {
|
|
var e = {};
|
|
return e.font = this.properties().font.value(), e.fontSize = this
|
|
.properties().fontsize.value(), e.backColors = [this.properties()
|
|
.levelsStyle.colors.P.value(), this.properties().levelsStyle
|
|
.colors["S1/R1"].value(), this.properties().levelsStyle.colors[
|
|
"S1/R1"].value(), this.properties().levelsStyle.colors[
|
|
"S2/R2"].value(), this.properties().levelsStyle.colors[
|
|
"S2/R2"].value(), this.properties().levelsStyle.colors[
|
|
"S3/R3"].value(), this.properties().levelsStyle.colors[
|
|
"S3/R3"].value(), this.properties().levelsStyle.colors[
|
|
"S4/R4"].value(), this.properties().levelsStyle.colors[
|
|
"S4/R4"].value(), this.properties().levelsStyle.colors[
|
|
"S5/R5"].value(), this.properties().levelsStyle.colors[
|
|
"S5/R5"].value()
|
|
], e
|
|
}
|
|
updateAllViews() {
|
|
super.updateAllViews(),
|
|
this._pricesView.update()
|
|
}
|
|
_createViews() {
|
|
this._cache && (this._cache.destroy(), this._cache = null), this
|
|
._priceAxisViews = [];
|
|
var e = ["P", "S1", "R1", "S2", "R2", "S3", "R3", "S4", "R4", "S5",
|
|
"R5"
|
|
];
|
|
this._paneViews.length = 0, this._labelPaneViews = [];
|
|
var t = new f(this._model, this);
|
|
t.setCache(this._cache), this._paneViews.push(t), this._mainPaneView =
|
|
t;
|
|
for (var i = 0; i < e.length; i++) {
|
|
var s = new a(this, {
|
|
name: e[i],
|
|
cache: this._cache
|
|
});
|
|
this._priceAxisViews.push(s), this._labelPaneViews.push(new l(s,
|
|
this, this._model))
|
|
}
|
|
this._dataWindowView || (this._dataWindowView = new n(this, this
|
|
._model)), this._statusView || (this._statusView = new r(this,
|
|
this._model.properties().scalesProperties.textColor)), this
|
|
._legendView = null, this._pricesView = new p(this)
|
|
}
|
|
visiblePivots() {
|
|
return this._pricesView.visiblePivots()
|
|
}
|
|
_postProcessGraphics() {}
|
|
isVisible() {
|
|
if (!this.properties().visible.value() || !this.isActualInterval())
|
|
return !1;
|
|
for (var e = ["P", "S1/R1", "S2/R2", "S3/R3", "S4/R4", "S5/R5"], t =
|
|
this.properties().levelsStyle.visibility, i = 0; i < e
|
|
.length; i++)
|
|
if (t[e[i]].value()) return !0;
|
|
return !1
|
|
}
|
|
stop() {
|
|
super.stop(), this._cache && (this._cache.destroy(), this._cache = null)
|
|
}
|
|
priceRange(t, i) {
|
|
if (!this.customData() || !this.customData().pivots || !this._indexes)
|
|
return null;
|
|
if (!this.priceScale()) return null;
|
|
for (var s = this.customData().pivots, r = this._indexes, n = null, o =
|
|
0; o < s.length; o++)
|
|
if (s[o]) {
|
|
var a = r[s[o].startIndex];
|
|
if (!(r[s[o].endIndex] < t || a > i)) {
|
|
var l = [],
|
|
c = this._properties.levelsStyle.visibility;
|
|
c.P.value() && l.push(s[o].p), c["S1/R1"].value() && l.push(
|
|
s[o].s1, s[o].r1), c["S2/R2"].value() && l.push(s[o]
|
|
.s2, s[o].r2), c["S3/R3"].value() && l.push(s[o].s3,
|
|
s[o].r3), c["S4/R4"].value() && l.push(s[o].s4, s[o]
|
|
.r4), c["S5/R5"].value() && l.push(s[o].s5, s[o].r5);
|
|
for (var h = 0; h < l.length; h++) l[h] && (null === n ? n =
|
|
new e(l[h], l[h]) : n.apply(l[h], l[h]))
|
|
}
|
|
} return this.priceScale().isLog() && n ? new e(this.priceScale()
|
|
.priceToLogical(n.minValue()), this.priceScale().priceToLogical(
|
|
n.maxValue())) : n
|
|
}
|
|
}
|
|
}).call(this, i("Qb4w").PriceRange)
|
|
},
|
|
PT1i: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "Linking", (function() {
|
|
return h
|
|
})), i.d(t, "linking", (function() {
|
|
return u
|
|
}));
|
|
var s = i("hbEN"),
|
|
r = i("hY0g"),
|
|
n = i.n(r),
|
|
o = i("Kxc7"),
|
|
a = i("txPx");
|
|
const l = Object(a.getLogger)("Linking");
|
|
var c;
|
|
! function(e) {
|
|
e[e.NotBound = 0] = "NotBound", e[e.BoundToWidget = 1] = "BoundToWidget", e[e.BoundToModel =
|
|
2] = "BoundToModel"
|
|
}(c || (c = {}));
|
|
class h {
|
|
constructor() {
|
|
this._watchedSymbol = new n.a, this._seriesShortSymbol = new n.a, this._proSymbol =
|
|
new n.a, this._watchedInterval = new n.a, this._watchedIntraday = new n.a, this
|
|
._watchedSeconds = new n.a, this._watchedTicks = new n.a, this
|
|
._watchedSupportedResolutions = new n.a, this._symbolNamesList = new n.a, this
|
|
._chartWidgetBindingState = c.NotBound, this._activeChartWidget = null, this
|
|
._watchedSymbolListenerBound = this._watchedSymbolListener.bind(this), this
|
|
._watchedIntervalListenerBound = this._watchedIntervalListener.bind(this), this
|
|
._onSymbolLinkBound = this._onSymbolLink.bind(this), this._searchCharts = null,
|
|
this._searchChartsLoadDebounced = null, this._selfEmit = !1, this
|
|
._preventFeedBySymbol = !1, this._feedBySymbolDebounceCounter = 0
|
|
}
|
|
get symbol() {
|
|
return this._watchedSymbol
|
|
}
|
|
get proSymbol() {
|
|
return this._proSymbol
|
|
}
|
|
get symbolNamesList() {
|
|
return this._symbolNamesList
|
|
}
|
|
get seriesShortSymbol() {
|
|
return this._seriesShortSymbol.readonly()
|
|
}
|
|
get interval() {
|
|
return this._watchedInterval
|
|
}
|
|
get intraday() {
|
|
return this._watchedIntraday.readonly()
|
|
}
|
|
get seconds() {
|
|
return this._watchedSeconds.readonly()
|
|
}
|
|
get ticks() {
|
|
return this._watchedTicks.readonly()
|
|
}
|
|
get supportedResolutions() {
|
|
return this._watchedSupportedResolutions.readonly()
|
|
}
|
|
get preventFeedBySymbol() {
|
|
return this._preventFeedBySymbol
|
|
}
|
|
bindToChartWidget(e) {
|
|
if (this.unbindFromChartWidget(), this._activeChartWidget = e, e.hasModel())
|
|
return void this._onChartModelCreated(e.model());
|
|
e.modelCreated().subscribe(this, this._onChartModelCreated), this
|
|
._chartWidgetBindingState = c.BoundToWidget;
|
|
const t = e.properties().childs().mainSeriesProperties.childs();
|
|
this._watchedSymbol.setValue(t.symbol.value()), this._watchedInterval.setValue(t
|
|
.interval.value())
|
|
}
|
|
unbindFromChartWidget() {
|
|
switch (this._chartWidgetBindingState) {
|
|
case c.BoundToWidget:
|
|
if (!this._activeChartWidget) throw new Error("ChartWidget is undefined");
|
|
this._activeChartWidget.modelCreated().unsubscribe(this, this
|
|
._onChartModelCreated);
|
|
break;
|
|
case c.BoundToModel:
|
|
this._symbolProperty().unsubscribe(this, this._onSymbolPropertyChange), this
|
|
._watchedSymbol.unsubscribe(this._watchedSymbolListenerBound), this
|
|
._mainSeries().dataEvents().symbolResolved().unsubscribe(this, this
|
|
._updateSeriesSymbolInfo), this._mainSeries().dataEvents()
|
|
.symbolError().unsubscribe(this, this._updateSeriesSymbolInfo), this
|
|
._intervalProperty().unsubscribe(this, this._onIntervalPropertyChange),
|
|
this._watchedInterval.unsubscribe(this._watchedIntervalListenerBound),
|
|
delete this._watchedSymbol.hook, delete this._watchedSymbol.writeLock
|
|
}
|
|
this._activeChartWidget = null, this._chartWidgetBindingState = c.NotBound
|
|
}
|
|
getChartWidget() {
|
|
return this._activeChartWidget
|
|
}
|
|
bindToChartWidgetCollection(e) {
|
|
this._chartWidgetCollection = e, this.unbindFromChartWidget(), e.activeChartWidget
|
|
.subscribe(e => {
|
|
this.unbindFromChartWidget(), this.bindToChartWidget(e)
|
|
}, {
|
|
callWithLast: !0
|
|
})
|
|
}
|
|
bindToSearchCharts(e) {
|
|
this.unbindFromSearchCharts(), this._searchCharts = e, e.onSearchBySymbol.subscribe(
|
|
this, this._onSearchBySymbol), e.loadingSymbol.subscribe(e => {
|
|
!1 === e && (this._feedBySymbolDebounceCounter = 0)
|
|
}), this._watchedSymbol.subscribe(this._onSymbolLinkBound)
|
|
}
|
|
unbindFromSearchCharts() {
|
|
this._searchCharts && (this._searchCharts.onSearchBySymbol.unsubscribe(this, this
|
|
._onSearchBySymbol), this._watchedSymbol.unsubscribe(this
|
|
._onSymbolLinkBound), this._searchCharts = null)
|
|
}
|
|
setPreventFeedBySymbol(e) {
|
|
this._preventFeedBySymbol = e
|
|
}
|
|
_onSearchBySymbol(e) {
|
|
if (!e.resolved_symbol) throw new Error("no resolved_symbol");
|
|
this._selfEmit = !0, this._watchedSymbol.setValue(e.resolved_symbol), this
|
|
._selfEmit = !1
|
|
}
|
|
_onSymbolLink(e) {
|
|
if (!this._selfEmit) {
|
|
if (!this._searchCharts) {
|
|
const e = "No search charts defined";
|
|
throw l.logError(e), new Error(e)
|
|
}
|
|
this._preventFeedBySymbol || this._loadSearchCharts(e)
|
|
}
|
|
}
|
|
_loadSearchCharts(e) {
|
|
if (!this._searchCharts) {
|
|
const e = "No search charts defined";
|
|
throw l.logError(e), new Error(e)
|
|
}
|
|
if (this._searchChartsLoadDebounced) return void(this._feedBySymbolDebounceCounter <
|
|
100 && (this._feedBySymbolDebounceCounter++, this
|
|
._searchChartsLoadDebounced(e)));
|
|
const t = e => this._searchCharts ? (!0 === this._searchCharts.loadingSymbol
|
|
.value() ? this._feedBySymbolDebounceCounter < 100 && (this
|
|
._feedBySymbolDebounceCounter++, this._searchChartsLoadDebounced =
|
|
Object(s.default)(t, 2e3), this._searchChartsLoadDebounced(e)) : this
|
|
._searchChartsLoadDebounced = null, this._searchCharts.feedBySymbol.call(
|
|
this._searchCharts, e)) : () => {};
|
|
!0 === this._searchCharts.loadingSymbol.value() ? this
|
|
._feedBySymbolDebounceCounter < 100 && (this._feedBySymbolDebounceCounter++,
|
|
this._searchChartsLoadDebounced = Object(s.default)(t, 2e3), this
|
|
._searchChartsLoadDebounced(e)) : this._searchCharts.feedBySymbol(e)
|
|
}
|
|
_mainSeries() {
|
|
if (!this._activeChartWidget) throw new Error("ChartWidget is undefined");
|
|
return this._activeChartWidget.model().mainSeries()
|
|
}
|
|
_properties() {
|
|
return this._mainSeries().properties()
|
|
}
|
|
_symbolProperty() {
|
|
return this._properties().symbol
|
|
}
|
|
_intervalProperty() {
|
|
return this._properties().interval
|
|
}
|
|
_watchedSymbolListener(e) {
|
|
this._symbolProperty().value() !== e && this._chartWidgetCollection.setSymbol(e)
|
|
}
|
|
_sendSnowplowAnalytics() {
|
|
if (!window.user.do_not_track) throw new Error("unsupported")
|
|
}
|
|
_onSymbolPropertyChange() {
|
|
const e = this._symbolProperty().value() !== this._watchedSymbol.value();
|
|
this._watchedSymbol.setValue(this._symbolProperty().value()), e && this
|
|
._chartWidgetCollection.setSymbol(this._symbolProperty().value())
|
|
}
|
|
_onSymbolResolved(e) {
|
|
const t = this._mainSeries().symbolInfo();
|
|
t && this._applyValuesFromSymbolInfo(t)
|
|
}
|
|
_applyValuesFromSymbolInfo(e) {
|
|
const t = e.pro_name || o.enabled("trading_terminal") && (e.full_name || e.name) ||
|
|
"";
|
|
this._proSymbol.setValue(t), e.aliases && this._symbolNamesList.setValue(e.aliases)
|
|
}
|
|
_updateSeriesSymbolInfo() {
|
|
this._seriesShortSymbol.setValue(this._properties().shortName.value());
|
|
const e = this._mainSeries().symbolInfo();
|
|
e ? (this._applyValuesFromSymbolInfo(e), e.hasOwnProperty("supported_resolutions") ?
|
|
this._watchedSupportedResolutions.setValue(e.supported_resolutions) : this
|
|
._watchedSupportedResolutions.setValue(void 0), this._watchedIntraday
|
|
.setValue(!!e.has_intraday), this._watchedSeconds.setValue(!!e.has_seconds),
|
|
this._watchedTicks.setValue(!!e.has_ticks)) : (this._watchedIntraday
|
|
.deleteValue(), this._watchedSeconds.deleteValue(), this._watchedTicks
|
|
.deleteValue(), this._proSymbol.deleteValue())
|
|
}
|
|
_watchedIntervalListener(e) {
|
|
this._intervalProperty().value() !== e && this._chartWidgetCollection.setResolution(
|
|
e)
|
|
}
|
|
_onIntervalPropertyChange() {
|
|
const e = this._intervalProperty().value() !== this._watchedInterval.value();
|
|
this._watchedInterval.setValue(this._intervalProperty().value()), e && this
|
|
._chartWidgetCollection.setResolution(this._intervalProperty().value())
|
|
}
|
|
_onChartModelCreated(e) {
|
|
if (!this._activeChartWidget) throw new Error("ChartWidget is undefined");
|
|
this._chartWidgetBindingState = c.BoundToModel, this._activeChartWidget
|
|
.modelCreated().unsubscribe(this, this._onChartModelCreated);
|
|
const t = this._symbolProperty();
|
|
t.subscribe(this, this._onSymbolPropertyChange), this._watchedSymbol.setValue(t
|
|
.value()),
|
|
this._watchedSymbol.subscribe(this._watchedSymbolListenerBound);
|
|
const i = this._mainSeries();
|
|
i.dataEvents().symbolResolved().subscribe(this, this._onSymbolResolved), this
|
|
._watchedSymbol.hook = e => (i.symbolSameAsCurrent(e) && (e = i.symbol()), e), i
|
|
.dataEvents().symbolResolved().subscribe(this, this._updateSeriesSymbolInfo), i
|
|
.dataEvents().symbolError().subscribe(this, this._updateSeriesSymbolInfo), i
|
|
.dataEvents().symbolNotPermitted().subscribe(this, this
|
|
._updateSeriesSymbolInfo), i.dataEvents().symbolGroupNotPermitted()
|
|
.subscribe(
|
|
this, this._updateSeriesSymbolInfo), this._updateSeriesSymbolInfo();
|
|
const s = this._intervalProperty();
|
|
s.subscribe(this, this._onIntervalPropertyChange), this._watchedInterval.setValue(s
|
|
.value()), this._watchedInterval.subscribe(this
|
|
._watchedIntervalListenerBound), this._activeChartWidget.readOnly() && (this
|
|
._watchedSymbol.writeLock = !0)
|
|
}
|
|
}
|
|
window.TradingView = window.TradingView || {};
|
|
const u = new h;
|
|
window.TradingView.Linking = u
|
|
},
|
|
PYn8: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineToolThreeDrivers", (function() {
|
|
return o
|
|
}));
|
|
var s = i("Ocx9"),
|
|
r = i("Ss5c"),
|
|
n = i("j3hX");
|
|
class o extends r.LineDataSource {
|
|
constructor(e, t) {
|
|
const s = t || o.createProperties();
|
|
super(e, s), i.e("lt-pane-views").then(i.bind(null, "S6aM")).then(t => {
|
|
this._setPaneViews([new t.LineToolThreeDrivesPaneView(this, e)])
|
|
})
|
|
}
|
|
pointsCount() {
|
|
return 7
|
|
}
|
|
name() {
|
|
return "Three Drives Pattern"
|
|
}
|
|
properties() {
|
|
return super.properties()
|
|
}
|
|
static createProperties(e) {
|
|
const t = new s.DefaultProperty("linetoolthreedrivers", e);
|
|
return o._configureProperties(t), t
|
|
}
|
|
_getPropertyDefinitionsViewModelClass() {
|
|
return Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "aMeN")).then(
|
|
e => e.PatternWithoutBackgroundDefinitionsViewModel)
|
|
}
|
|
static _configureProperties(e) {
|
|
r.LineDataSource._configureProperties(e), e.addChild("linesColors", new n
|
|
.LineToolColorsProperty([e.childs().color])), e.addChild("textsColors",
|
|
new n.LineToolColorsProperty([e.childs().textcolor])), e.addChild(
|
|
"linesWidths", new n.LineToolWidthsProperty([e.childs().linewidth])), e
|
|
.hasChild("backgroundsColors") && e.removeProperty("backgroundsColors")
|
|
}
|
|
}
|
|
},
|
|
PzPU: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "copyToClipboardImageOfChart", (function() {
|
|
return r
|
|
})), i.d(t, "getImageOfChartSilently", (function() {
|
|
return n
|
|
})), i.d(t, "copyToClipboardClientScreenshot", (function() {
|
|
return o
|
|
})), i.d(t, "downloadClientScreenshot", (function() {
|
|
return a
|
|
}));
|
|
const s = () => i.e("take-chart-image-impl").then(i.bind(null, "13es"));
|
|
|
|
function r(e, t = {}) {
|
|
return s().then(i => i.copyToClipboardImageOfChart(e, t))
|
|
}
|
|
|
|
function n(e, t = {}) {
|
|
return s().then(i => i.getImageOfChartSilently(e, t))
|
|
}
|
|
|
|
function o(e) {
|
|
return s().then(t => t.copyToClipboardClientScreenshot(e))
|
|
}
|
|
|
|
function a(e) {
|
|
return s().then(t => t.downloadClientScreenshot(e))
|
|
}
|
|
},
|
|
Q19o: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Eyy1").ensureNotNull,
|
|
r = i("jA0t"),
|
|
n = i("9iCb").applyOverridesToStudy,
|
|
o = i("0YCj"),
|
|
a = i("5JMW"),
|
|
l = a.LineDataSourceApi,
|
|
c = a.isLineToolRiskReward,
|
|
h = i("N1UO").StudyApi,
|
|
u = i("ltKl").SeriesApi,
|
|
d = i("QrSB").SelectionApi,
|
|
p = i("mf9N").PaneApi,
|
|
_ = i("OLhd").createDwmAligner,
|
|
m = i("LxhU").Interval,
|
|
f = i("2jXJ").supportedLineTools,
|
|
g = i("vwKG").showTooManyStudiesNotice,
|
|
b = i("ogJP"),
|
|
v = b.isNumber,
|
|
S = b.deepEquals,
|
|
y = i("CW80").createLineToolProperties,
|
|
w = i("CW80").prepareLineToolPropertiesByOwnerSource,
|
|
P = i("96Yh").lineToolEntityInfo,
|
|
C = i("lReN").LineToolsGroupControllerApi,
|
|
x = i("ocrj").RemoveSourcesCommand,
|
|
T = i("e92V").isLineDrawnWithPressedButton,
|
|
I = i("FDyI").ChartWidgetApiBase,
|
|
M = i("mMWL");
|
|
|
|
function O(e, t) {
|
|
return t.map((function(t) {
|
|
return e.dataSourceForId(t)
|
|
}))
|
|
}
|
|
e.exports = class extends I {
|
|
constructor(e, t) {
|
|
super(e, t), this._panes = new WeakMap, this._studies = new WeakMap, this
|
|
._lineDataSources = new WeakMap, this._selectionApi = null, this
|
|
._prevVisibleRange = null, this._chartWidget.onAboutToBeDestroyed()
|
|
.subscribe(this, this._destroy, !0), this._chartWidget.withModel(this, (
|
|
function() {
|
|
this._chartWidget.model().timeScale().logicalRangeChanged()
|
|
.subscribe(this, this._onLogicalRangeChanged)
|
|
}))
|
|
}
|
|
id() {
|
|
return this._chartWidget.id()
|
|
}
|
|
_getPaneApi(e) {
|
|
var t = this._panes.get(e);
|
|
return void 0 === t && (t = new p(e, this._chartWidget), this._panes.set(e, t)),
|
|
t
|
|
}
|
|
_getStudyApi(e) {
|
|
var t = this._studies.get(e);
|
|
return void 0 === t && (t = new h(e, this._chartWidget), this._studies.set(e,
|
|
t)), t
|
|
}
|
|
_getLineDataSourceApi(e) {
|
|
var t = this._lineDataSources.get(e);
|
|
return void 0 === t && (t = new l(e, this._chartWidget.model().model(), {
|
|
apiPointsToDataSource: this._convertUserPointsToDataSource.bind(
|
|
this),
|
|
dataSourcePointsToPriced: e => {
|
|
var t = this._chartWidget.model().mainSeries()
|
|
.syncModel(),
|
|
i = this._chartWidget.model().timeScale();
|
|
return e.map(e => {
|
|
var s = i.normalizeBarIndex(e.index);
|
|
return {
|
|
price: e.price,
|
|
time: this._convertTimeToPublic(t
|
|
.projectTime(s.time_t, s.offset)
|
|
)
|
|
}
|
|
})
|
|
}
|
|
}), this._lineDataSources.set(e, t)), t
|
|
}
|
|
executeActionById(e) {
|
|
this._chartWidget.executeActionById(e)
|
|
}
|
|
getCheckableActionState(e) {
|
|
return this._chartWidget.getCheckableActionState(e)
|
|
}
|
|
setZoomEnabled(e) {
|
|
this._chartWidget.model().model().setZoomEnabled(e)
|
|
}
|
|
setScrollEnabled(e) {
|
|
this._chartWidget.model().model().setScrollEnabled(e)
|
|
}
|
|
refreshMarks() {
|
|
this._chartWidget.refreshMarks()
|
|
}
|
|
clearMarks() {
|
|
this._chartWidget.clearMarks()
|
|
}
|
|
symbol() {
|
|
return this._chartWidget.getSymbol()
|
|
}
|
|
symbolExt() {
|
|
var e = this._chartWidget.model().mainSeries().symbolInfo();
|
|
return e ? {
|
|
symbol: e.name,
|
|
full_name: e.full_name,
|
|
exchange: e.exchange,
|
|
description: e.description,
|
|
type: e.type,
|
|
pro_name: e.pro_name
|
|
} : null
|
|
}
|
|
resolution() {
|
|
return this._chartWidget.model().mainSeries().properties().interval.value()
|
|
}
|
|
resetData() {
|
|
this._chartWidget.model().mainSeries().rerequestData()
|
|
}
|
|
setEntityVisibility(e, t) {
|
|
console.warn(
|
|
"`setEntityVisibility` is deprecated. Use shape/study API instead");
|
|
var i = this._chartWidget.model().model().dataSourceForId(e);
|
|
if (i) {
|
|
var s = i.properties();
|
|
s && s.visible && s.visible.setValue(t)
|
|
}
|
|
}
|
|
availableZOrderOperations(e) {
|
|
var t = O(this._chartWidget.model().model(), e);
|
|
return this._chartWidget.model().availableZOrderOperations(t)
|
|
}
|
|
sendToBack(e) {
|
|
var t = O(this._chartWidget.model().model(), e);
|
|
this._chartWidget.model().sendToBack(t)
|
|
}
|
|
bringToFront(e) {
|
|
var t = O(this._chartWidget.model().model(), e);
|
|
this._chartWidget.model().bringToFront(t)
|
|
}
|
|
insertAfter(e, t) {
|
|
var i = this._chartWidget.model().model(),
|
|
s = O(i, e),
|
|
r = i.dataSourceForId(t);
|
|
this._chartWidget.model().insertAfter(s, r)
|
|
}
|
|
insertBefore(e, t) {
|
|
var i = this._chartWidget.model().model(),
|
|
s = O(i, e),
|
|
r = i.dataSourceForId(t);
|
|
this._chartWidget.model().insertBefore(s, r)
|
|
}
|
|
bringForward(e) {
|
|
var t = O(this._chartWidget.model().model(), e);
|
|
this._chartWidget.model().bringForward(t)
|
|
}
|
|
sendBackward(e) {
|
|
var t = O(this._chartWidget.model().model(), e);
|
|
this._chartWidget.model().sendBackward(t)
|
|
}
|
|
showPropertiesDialog(e) {
|
|
var t = this._chartWidget.model().model().dataSourceForId(e);
|
|
if (null === t) throw new Error("Study or shape " + e + " does not exist");
|
|
this._chartWidget.showChartPropertiesForSource(t)
|
|
}
|
|
getAllShapes() {
|
|
return this._chartWidget.model().model().allLineTools().map(P).filter((function(
|
|
e) {
|
|
return null !== e.name
|
|
}))
|
|
}
|
|
removeAllShapes() {
|
|
this._chartWidget.removeAllDrawingTools()
|
|
}
|
|
removeAllStudies() {
|
|
this._chartWidget.removeAllStudies()
|
|
}
|
|
removeEntity(e, t) {
|
|
var i = this._chartWidget.model().chartModel().dataSourceForId(e);
|
|
i ? t && t.disableUndo ? new x(this._chartWidget.model().chartModel(), [i], "")
|
|
.redo() : this._chartWidget.model().removeSource(i, !0, !0) : console.warn(
|
|
"Can't find a source with id: " + e)
|
|
}
|
|
removeEntityWithUndo(e) {
|
|
var t = this._chartWidget.model().chartModel().dataSourceForId(e);
|
|
this._chartWidget.model().removeSource(t, !1)
|
|
}
|
|
selection() {
|
|
return null === this._selectionApi && (this._selectionApi = new d(this
|
|
._chartWidget.model().model())), this._selectionApi
|
|
}
|
|
createStudyTemplate(e) {
|
|
return this._chartWidget.model().model().studyTemplate(e.saveSymbol, e
|
|
.saveInterval)
|
|
}
|
|
drawOnAllCharts(e) {
|
|
M.drawOnAllCharts.setValue(e)
|
|
}
|
|
applyStudyTemplate(e) {
|
|
this._chartWidget.model().applyStudyTemplate(e, "" + 1e3 * Math.random())
|
|
}
|
|
setVisibleRange(e, t) {
|
|
return new Promise(function(i) {
|
|
this._chartWidget.setVisibleTimeRange(e.from, e.to, t, i)
|
|
}.bind(this))
|
|
}
|
|
getVisibleRange() {
|
|
var e = {
|
|
from: 0,
|
|
to: 0
|
|
},
|
|
t = this._chartWidget.model().timeScale();
|
|
if (t.isEmpty()) return e;
|
|
var i = t.coordinateToVisibleIndex(0),
|
|
s = t.coordinateToVisibleIndex(t.width() - 1),
|
|
r = this._convertIndexToPublicTime(s);
|
|
return null === r || (e.from = this._convertIndexToPublicTime(Math.max(t
|
|
.points().firstIndex(), i)), e.to = r), e
|
|
}
|
|
getVisiblePriceRange() {
|
|
return console.warn(
|
|
"`getVisiblePriceRange` is deprecated. Use Price Scale API instead"),
|
|
this._chartWidget.model().mainSeries() ? this._chartWidget.model()
|
|
.mainSeries().priceScale().priceRangeInPrice() : null
|
|
}
|
|
scrollPosition() {
|
|
return this._chartWidget.model().timeScale().rightOffset()
|
|
}
|
|
defaultScrollPosition() {
|
|
return this._chartWidget.model().timeScale().defaultRightOffsetProperty()
|
|
.value()
|
|
}
|
|
_createTradingPrimitive(e, t) {
|
|
var i = this;
|
|
var r, n, o = this._chartWidget.model().model(),
|
|
a = o.paneForSource(o.mainSeries());
|
|
return (t ? o : this._chartWidget.model()).createLineTool(a, (r = TradingView
|
|
.CLOSE_PLOT, {
|
|
index: (n = s(i._chartWidget.model().mainSeries().bars()
|
|
.last())).index,
|
|
price: n.value[r]
|
|
}), e)._adapter
|
|
}
|
|
createOrderLine(e) {
|
|
e = e || {};
|
|
return this._createTradingPrimitive("LineToolOrder", e.disableUndo)
|
|
}
|
|
createPositionLine(e) {
|
|
e = e || {};
|
|
return this._createTradingPrimitive("LineToolPosition", e.disableUndo)
|
|
}
|
|
createExecutionShape(e) {
|
|
e = e || {};
|
|
return this._createTradingPrimitive("LineToolExecution", e.disableUndo)
|
|
}
|
|
createShape(e, t) {
|
|
return this.createMultipointShape([e], t)
|
|
}
|
|
_alignPoints(e) {
|
|
var t = this._chartWidget.model().model(),
|
|
i = t.mainSeries(),
|
|
s = i.interval();
|
|
if (t.timeScale().isEmpty() || !m.isDWM(s)) return e;
|
|
var r = _(s, i.symbolInfo());
|
|
return null === r ? e : e.map((function(e) {
|
|
return r.timeToSessionStart(1e3 * e) / 1e3
|
|
}))
|
|
}
|
|
_convertUserPointsToDataSource(e) {
|
|
var t = this._chartWidget.model().model(),
|
|
i = t.mainSeries(),
|
|
s = t.timeScale().points(),
|
|
r = i.data();
|
|
if (t.timeScale().isEmpty()) return null;
|
|
var n = e.map((function(e) {
|
|
return e.time || 0
|
|
})),
|
|
o = this._alignPoints(n);
|
|
|
|
function a(e, t, n) {
|
|
var o = s.closestIndexLeft(e) || 0,
|
|
a = {
|
|
index: o
|
|
},
|
|
l = s.valueAt(o);
|
|
if (e > l && o === s.lastIndex())(c = i.syncModel().distance(l, e))
|
|
.success && (a.index = a.index + c.result);
|
|
else if (e < l && o === s.firstIndex()) {
|
|
var c;
|
|
(c = i.syncModel().distance(e, l)).success && (a.index = a.index - c
|
|
.result)
|
|
}
|
|
if (v(t)) a.price = t;
|
|
else {
|
|
var h = n ? ["open", "high", "low", "close"].indexOf(n) + 1 : 1;
|
|
h <= 0 && (h = 1), a.price = r.valueAt(o)[h]
|
|
}
|
|
return a
|
|
}
|
|
for (var l = [], c = 0; c < e.length; c++) {
|
|
var h = e[c];
|
|
l.push(a(o[c], h.price, h.channel))
|
|
}
|
|
return l
|
|
}
|
|
createMultipointShape(e, t, i) {
|
|
var s = t.disableUndo ? this._chartWidget.model().model() : this._chartWidget
|
|
.model(),
|
|
r = this._chartWidget.model().model(),
|
|
n = r.mainSeries();
|
|
if (!r.timeScale().isEmpty()) {
|
|
var o = r.dataSourceForId(t.ownerStudyId) || n,
|
|
a = r.paneForSource(o),
|
|
l = this._convertUserPointsToDataSource(e),
|
|
h = f[t.shape] || f.flag;
|
|
if (h.onlySelectable) throw new Error('Cannot create "' + t.shape +
|
|
'" shape');
|
|
if ("LineToolPolyline" === h.name || "LineToolPath" === h.name ||
|
|
"LineToolGhostFeed" === h.name) l[0].price === l[l.length - 1].price &&
|
|
l[0].index === l[l.length - 1].index || l.push(l[0]);
|
|
else if ("LineToolIcon" === h.name) {
|
|
if (t.icon = t.icon || t.overrides && t.overrides.icon, !t
|
|
.hasOwnProperty("icon")) throw new Error(
|
|
"icon must be specified in options");
|
|
t.overrides = t.overrides || {}, t.overrides.icon = t.icon
|
|
}
|
|
var u = y(h.name);
|
|
if (w(u, o), t.overrides)
|
|
for (var d in t.overrides) u[d] ? u[d].mergeAndFire(t.overrides[d]) : c(
|
|
h.name) && -1 !== ["profitLevel", "stopLevel"].indexOf(d) && u
|
|
.addProperty(d, t.overrides[d]);
|
|
void 0 !== u.text && t.text && u.text.setValue(t.text);
|
|
var p = s.createLineTool(a, l[0], h.name, u, void 0, o);
|
|
if (c(h.name)) {
|
|
if (l.length > 2) throw new Error("Wrong points count for " + t.shape +
|
|
". Required 1 or 2");
|
|
2 === l.length && (p.startChanging(1, l[1]), p.setPoint(1, l[1]), p
|
|
.endChanging())
|
|
} else {
|
|
var _ = p.pointsCount();
|
|
if (_ !== l.length && -1 !== _) throw new Error(
|
|
"Wrong points count for " + t.shape + ". Required " + _);
|
|
for (var m = T(h.name), g = 1; g < l.length && this._chartWidget.model()
|
|
.lineBeingCreated(); g++) s.continueCreatingLine(l[g], null, g < l
|
|
.length - 1 || m);
|
|
m && (s.finishLineTool(p), s.continueCreatingLine(l[l.length - 1], null,
|
|
!1))
|
|
}
|
|
if (t.lock && p.setUserEditEnabled(!1), t.disableSelection && p
|
|
.setSelectionEnabled(!1), t.disableSave && (p.customization
|
|
.disableSave = !0), t.hasOwnProperty("showInObjectsTree") && (p
|
|
.customization.showInObjectsTree = t.showInObjectsTree),
|
|
t.zOrder) {
|
|
var b = this._chartWidget.model().availableZOrderOperations([p]);
|
|
"top" === t.zOrder && b.bringToFrontEnabled ? s.bringToFront([p]) :
|
|
"bottom" === t.zOrder && b.sendToBackEnabled && s.sendToBack([p])
|
|
}
|
|
return p.id()
|
|
}
|
|
}
|
|
getShapeById(e) {
|
|
var t = this._chartWidget.model().model().getLineToolById(e);
|
|
if (null === t) throw new Error("There is no such shape");
|
|
return this._getLineDataSourceApi(t)
|
|
}
|
|
createStudy(e, t, i, s, a, l) {
|
|
if ("function" == typeof a) return console.warn(
|
|
'"createStudy" does not take "callback" parameter anymore'), Promise
|
|
.resolve(null);
|
|
if (l = l || {}, "string" != typeof e) return this._createStudy(e);
|
|
if (l.checkLimit && !this._chartWidget.model().canCreateStudy()) return g(),
|
|
Promise.resolve(null);
|
|
e = e.toLowerCase();
|
|
var c = l.disableUndo ? this._chartWidget.model().model() : this._chartWidget
|
|
.model(),
|
|
h = o.findStudyMetaInfoByDescription(c.studiesMetaData(), e).id,
|
|
u = c.createStudyInserter({
|
|
type: "java",
|
|
studyId: h
|
|
});
|
|
return u.setForceOverlay(t), l.priceScale && u.setPreferredPriceScale(function(
|
|
e) {
|
|
switch (e) {
|
|
case "no-scale":
|
|
return "overlay";
|
|
case "as-series":
|
|
return "as-series";
|
|
case "new-left":
|
|
return "left";
|
|
case "new-right":
|
|
return "right";
|
|
default:
|
|
throw new Error('The pricescale "' + e +
|
|
'" is invalid, the only valid options are "no-scale", "as-series", "new-left" and "new-right".'
|
|
)
|
|
}
|
|
}(l.priceScale)), l.allowChangeCurrency && u.setAllowChangeCurrency(!0), l
|
|
.allowChangeUnit && u.setAllowChangeUnit(!0), s && (s = r
|
|
.getStudyRecordFromArray([e].concat(s), this._chartWidget).inputs), u
|
|
.insert((function() {
|
|
return Promise.resolve(s || {})
|
|
})).then((function(e) {
|
|
return a && n(e, a), i && e.setUserEditEnabled(!1), e.id()
|
|
}))
|
|
}
|
|
getStudyById(e) {
|
|
var t = this._chartWidget.model().model().getStudyById(e);
|
|
if (null === t) throw new Error("There is no such study");
|
|
return this._getStudyApi(t)
|
|
}
|
|
getSeries() {
|
|
var e = this._chartWidget.model(),
|
|
t = e.mainSeries();
|
|
return new u(t, e)
|
|
}
|
|
chartType() {
|
|
return this._chartWidget.model().mainSeries().properties().style.value()
|
|
}
|
|
priceFormatter() {
|
|
return this._chartWidget.model().mainSeries().priceScale().formatter()
|
|
}
|
|
dataReady(e) {
|
|
var t = !this._chartWidget.hasModel() || !this._chartWidget.model()
|
|
.mainSeries() || this._chartWidget.model().mainSeries().data().isEmpty();
|
|
return e && (t ? this.onDataLoaded().subscribe(null, e, !0) : e()), !t
|
|
}
|
|
_onLogicalRangeChanged() {
|
|
var e = this._chartWidget.model().mainSeries(),
|
|
t = e.data().isEmpty();
|
|
if (null !== this._chartWidget.model().timeScale().visibleBarsStrictRange() &&
|
|
t) e.dataEvents().completed().subscribe(this, this._onLogicalRangeChanged, !
|
|
0);
|
|
else {
|
|
var i = this.getVisibleRange();
|
|
null !== this._prevVisibleRange && S(this._prevVisibleRange, i)[0] || (this
|
|
._prevVisibleRange = i, this._visibleBarsChanged.fire(i))
|
|
}
|
|
}
|
|
_destroy() {
|
|
super._destroy(), this._chartWidget.hasModel() && this._chartWidget.model()
|
|
.timeScale().logicalRangeChanged().unsubscribe(this, this
|
|
._onLogicalRangeChanged)
|
|
}
|
|
setTimezone(e) {
|
|
this._chartWidget.setTimezone(e)
|
|
}
|
|
getTimezone() {
|
|
return this._chartWidget.getTimezone()
|
|
}
|
|
getPanes() {
|
|
return this._chartWidget.model().chartModel().panes().map((function(e) {
|
|
return this._getPaneApi(e)
|
|
}), this)
|
|
}
|
|
canZoomOut() {
|
|
return !this._chartWidget.model().zoomStack().isEmpty()
|
|
}
|
|
zoomOut() {
|
|
this.canZoomOut() && this._chartWidget.model().zoomFromViewport()
|
|
}
|
|
shapesGroupController() {
|
|
return new C(this._chartWidget.model().lineToolsGroupController(), this
|
|
._chartWidget.model())
|
|
}
|
|
isSelectBarRequested() {
|
|
return this._chartWidget.selectPointMode().value()
|
|
}
|
|
requestSelectBar() {
|
|
if (this.isSelectBarRequested()) return Promise.reject("already requested");
|
|
var e = this;
|
|
return new Promise((function(t, i) {
|
|
e._chartWidget.requestSelectPoint("time").then((function(i) {
|
|
t(e._convertTimeToPublic(i.point.time))
|
|
})).catch((function() {
|
|
i("cancelled")
|
|
}))
|
|
}))
|
|
}
|
|
cancelSelectBar() {
|
|
this.isSelectBarRequested() && this._chartWidget.cancelRequestSelectPoint()
|
|
}
|
|
}
|
|
},
|
|
QCyK: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "spreadStudyItem", (function() {
|
|
return n
|
|
}));
|
|
var s = i("7dm8");
|
|
class r extends s.a {
|
|
_doCalculation(e, t, i, s) {
|
|
return e * t - i * s
|
|
}
|
|
}
|
|
const n = {
|
|
name: "Spread",
|
|
metainfo: {
|
|
_metainfoVersion: 15,
|
|
defaults: s.b,
|
|
plots: s.d,
|
|
styles: s.e,
|
|
description: "Spread",
|
|
shortDescription: "Spread",
|
|
is_price_study: !1,
|
|
inputs: s.c,
|
|
id: "Spread@tv-basicstudies-1"
|
|
},
|
|
constructor: r
|
|
}
|
|
},
|
|
QIuV: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Ss5c").LineDataSource,
|
|
r = i("ivNn").fixComputationError;
|
|
class n extends s {
|
|
constructor(e, t) {
|
|
super(e, t), this.customization.forcePriceAxisLabel = !0, this.customization
|
|
.disableErasing = !0, this.customization.showInObjectsTree = !1, this
|
|
.setSelectionEnabled(!1)
|
|
}
|
|
isSynchronizable() {
|
|
return !1
|
|
}
|
|
pointsCount() {
|
|
return n.POINTS_COUNT
|
|
}
|
|
hasContextMenu() {
|
|
return !1
|
|
}
|
|
state() {
|
|
return null
|
|
}
|
|
startMoving() {
|
|
s.prototype.startMoving.apply(this, arguments), this._cursorMoved = !1
|
|
}
|
|
endMoving() {
|
|
s.prototype.endMoving.apply(this, arguments), this._cursorMoved = !1
|
|
}
|
|
_correctPoints(e) {
|
|
this._currentMovingPoint && this._startMovingPoint ? this._currentMovingPoint
|
|
.logical.price - this._startMovingPoint.logical.price && (this._cursorMoved = !
|
|
0) : this._cursorMoved = !1;
|
|
for (var t = 1 / this.priceScale().mainSource().base(), i = 0; i < e.length; i++) {
|
|
var s = e[i];
|
|
this._cursorMoved && (s.price = this._currentMovingPoint.logical.price), s
|
|
.price = r(t * Math.round(s.price / t)), e[i] = s
|
|
}
|
|
}
|
|
userEditEnabled() {
|
|
return !0
|
|
}
|
|
movable() {
|
|
return !1
|
|
}
|
|
canBeHidden() {
|
|
return !1
|
|
}
|
|
isUserDeletable() {
|
|
return !1
|
|
}
|
|
showInObjectTree() {
|
|
return !1
|
|
}
|
|
doesMovingAffectsUndo() {
|
|
return !1
|
|
}
|
|
isAvailableInFloatingWidget() {
|
|
return !1
|
|
}
|
|
timeAxisViews() {
|
|
return null
|
|
}
|
|
cloneable() {
|
|
return !1
|
|
}
|
|
copiable() {
|
|
return !1
|
|
}
|
|
static _configureProperties(e) {
|
|
s._configureProperties(e)
|
|
}
|
|
}
|
|
n.POINTS_COUNT = 1, e.exports.LineToolTrading = n
|
|
},
|
|
QQu0: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("WPQD").LineToolTrendLine,
|
|
r = i("Ocx9").DefaultProperty;
|
|
class n extends s {
|
|
constructor(e, t) {
|
|
super(e, t || n.createProperties())
|
|
}
|
|
name() {
|
|
return "Arrow"
|
|
}
|
|
static createProperties(e) {
|
|
var t = new r("linetoolarrow", e);
|
|
return n._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
s._configureProperties(e)
|
|
}
|
|
}
|
|
t.LineToolArrow = n
|
|
},
|
|
QTwd: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "RestoreDefaultsPreferencesUndoCommand", (function() {
|
|
return h
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("RDU5"),
|
|
n = i("ApcL"),
|
|
o = i("3t3b"),
|
|
a = i("x2L+"),
|
|
l = i("N22A"),
|
|
c = i("GDWD");
|
|
class h extends r.UndoCommand {
|
|
constructor(e) {
|
|
super("Apply All Chart Properties"), this._trading = null, this
|
|
._oldShowSellBuyButtons = null, this._oldNoConfirmEnabled = null,
|
|
this._oldShowOnlyRejectionNotifications = null, this
|
|
._oldShowPricesWithZeroVolume = null, this._oldShowPricesWithSpread = null,
|
|
this._oldOrderExecutedSoundEnabled = null, this._prevWatermarkPreferences =
|
|
null, this._model = e, this._trading = Object(l.a)(), null !== this
|
|
._trading && (this._oldShowSellBuyButtons = this._trading.showSellBuyButtons
|
|
.value(), this._oldNoConfirmEnabled = this._trading.noConfirmEnabled
|
|
.value(), this._oldShowOnlyRejectionNotifications = this._trading
|
|
.showOnlyRejectionNotifications.value(), this
|
|
._oldShowPricesWithZeroVolume = this._trading.showPricesWith()
|
|
.zeroVolume.value(), this._oldShowPricesWithSpread = this._trading
|
|
.showPricesWith().spread.value(), this._oldOrderExecutedSoundEnabled =
|
|
this._trading.orderExecutedSoundParams.enabled.value()), this
|
|
._defaultsPreferences = Object(n.defaultsPreferencesByWhiteList)(this
|
|
._model, this._model.mainSeries()), this._oldPreferences = e
|
|
.preferences(), this._prevDateFormat = o.dateFormatProperty.value(), this
|
|
._prevAddPlusButton = c.addPlusButtonProperty.value(), this
|
|
._prevShowOpenMarkerStatus = a.b.value();
|
|
const t = this._model.watermarkSource();
|
|
null !== t && (this._prevWatermarkPreferences = t.properties().state())
|
|
}
|
|
redo() {
|
|
null !== this._trading && (this._trading.showSellBuyButtons.setValue(!0), this
|
|
._trading.noConfirmEnabled.setValue(!1), this._trading
|
|
.showOnlyRejectionNotifications.setValue(!1), this._trading
|
|
.showPricesWith().zeroVolume.setValue(!0), this._trading
|
|
.showPricesWith().spread.setValue(!0), this._trading
|
|
.orderExecutedSoundParams.enabled.setValue(!1)), this._model
|
|
.applyPreferences(this._defaultsPreferences), this._model.mainSeries()
|
|
.onChartStyleChanged(), this._model.updateScales(), Object(o
|
|
.restoreDateFormatSettingsValue)(), Object(c
|
|
.restoreAddPlusButtonSettingsValue)(), Object(a.a)();
|
|
const e = this._model.watermarkSource();
|
|
null !== e && e.restorePropertiesDefaults()
|
|
}
|
|
undo() {
|
|
null !== this._trading && (this._trading.showSellBuyButtons.setValue(Object(s
|
|
.ensureNotNull)(this._oldShowSellBuyButtons)), this._trading
|
|
.noConfirmEnabled.setValue(Object(s.ensureNotNull)(this
|
|
._oldNoConfirmEnabled)), this._trading
|
|
.showOnlyRejectionNotifications.setValue(Object(s.ensureNotNull)(this
|
|
._oldShowOnlyRejectionNotifications)), this._trading
|
|
.showPricesWith().zeroVolume.setValue(Object(s.ensureNotNull)(this
|
|
._oldShowPricesWithZeroVolume)), this._trading.showPricesWith()
|
|
.spread.setValue(Object(s.ensureNotNull)(this
|
|
._oldShowPricesWithSpread)), this._trading.orderExecutedSoundParams
|
|
.enabled.setValue(Object(s.ensureNotNull)(this
|
|
._oldOrderExecutedSoundEnabled))), this._model.applyPreferences(this
|
|
._oldPreferences), this._model.mainSeries().onChartStyleChanged(), this
|
|
._model.updateScales(), o.dateFormatProperty.setValue(this._prevDateFormat),
|
|
a.b.setValue(this._prevShowOpenMarkerStatus), c.addPlusButtonProperty
|
|
.setValue(this._prevAddPlusButton);
|
|
const e = this._model.watermarkSource();
|
|
null !== e && null !== this._prevWatermarkPreferences && e.properties()
|
|
.mergeAndFire(this._prevWatermarkPreferences)
|
|
}
|
|
}
|
|
},
|
|
Qb4w: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "PriceRange", (function() {
|
|
return o
|
|
}));
|
|
var s = i("ogJP"),
|
|
r = i("txPx");
|
|
const n = Object(r.getLogger)("Chart.PriceRange");
|
|
class o {
|
|
constructor(e, t) {
|
|
if (null !== e && "object" == typeof e) {
|
|
const t = e;
|
|
this._minValue = t.m_minValue, this._maxValue = t.m_maxValue
|
|
} else {
|
|
const i = e;
|
|
this._minValue = i, void 0 !== t && (this._maxValue = t)
|
|
}
|
|
}
|
|
equals(e) {
|
|
return this._minValue === e._minValue && this._maxValue === e._maxValue
|
|
}
|
|
clone() {
|
|
return new o(this._minValue, this._maxValue)
|
|
}
|
|
minValue() {
|
|
return this._minValue
|
|
}
|
|
setMinValue(e) {
|
|
this._minValue = e
|
|
}
|
|
maxValue() {
|
|
return this._maxValue
|
|
}
|
|
setMaxValue(e) {
|
|
this._maxValue = e
|
|
}
|
|
length() {
|
|
return this._maxValue - this._minValue
|
|
}
|
|
isEmpty() {
|
|
return this._maxValue === this._minValue || this._maxValue != this._maxValue || this
|
|
._minValue != this._minValue
|
|
}
|
|
serialize() {
|
|
return {
|
|
m_maxValue: this._maxValue,
|
|
m_minValue: this._minValue
|
|
}
|
|
}
|
|
state() {
|
|
return {
|
|
max: this._maxValue,
|
|
min: this._minValue
|
|
}
|
|
}
|
|
merge(e) {
|
|
return new o(Math.min(this.minValue(), e.minValue()), Math.max(this.maxValue(), e
|
|
.maxValue()))
|
|
}
|
|
apply(e, t) {
|
|
this._minValue = Math.min(this._minValue, e), this._maxValue = Math.max(this
|
|
._maxValue, t)
|
|
}
|
|
set(e, t) {
|
|
this._minValue = e, this._maxValue = t
|
|
}
|
|
scaleAroundCenter(e) {
|
|
if (!Object(s.isNumber)(e)) return void n.logDebug(
|
|
"PriceRange.scaleAroundCenter: invalid coeff");
|
|
if (0 === this._maxValue - this._minValue) return;
|
|
const t = .5 * (this._maxValue + this._minValue);
|
|
let i = this._maxValue - t,
|
|
r = this._minValue - t;
|
|
i *= e, r *= e, this._maxValue = t + i, this._minValue = t + r
|
|
}
|
|
shift(e) {
|
|
Object(s.isNumber)(e) ? (this._maxValue += e, this._minValue += e) : n.logDebug(
|
|
"PriceRange.shift: invalid coeff")
|
|
}
|
|
containsStrictly(e) {
|
|
return e.minValue() > this._minValue && e.maxValue() < this._maxValue
|
|
}
|
|
static compare(e, t) {
|
|
return null === e || null === t ? e === t : e.equals(t)
|
|
}
|
|
}
|
|
},
|
|
QfUd: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return a
|
|
}));
|
|
var s = i("hY0g"),
|
|
r = i.n(s),
|
|
n = i("ogJP");
|
|
|
|
function o(e, t) {
|
|
return Object(n.deepEquals)(e, t)[0]
|
|
}
|
|
class a extends r.a {
|
|
constructor(e, t = o) {
|
|
super(e), this._comparator = t
|
|
}
|
|
setValue(e, t) {
|
|
!1 === this._comparator(this.value(), e) && super.setValue(e, t)
|
|
}
|
|
}
|
|
},
|
|
QloM: function(e, t, i) {
|
|
"use strict";
|
|
var s;
|
|
i.r(t), i.d(t, "TabNames", (function() {
|
|
return s
|
|
})),
|
|
function(e) {
|
|
e.background = "Background", e.coordinates = "Coordinates", e.drawings = "Drawings", e
|
|
.events = "Events", e.eventsAndAlerts = "Events & Alerts", e.inputs = "Inputs", e
|
|
.properties = "Properties", e.scales = "Scales", e.legend = "Legend", e.sourceCode =
|
|
"Source Code", e.style = "Style", e.symbol = "Symbol", e.timezoneSessions =
|
|
"Timezone/Sessions", e.trading = "Trading", e.visibility = "Visibility", e.text =
|
|
"Text"
|
|
}(s || (s = {}))
|
|
},
|
|
Qq0B: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "NonSeriesStudy", (function() {
|
|
return n
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("GVHu");
|
|
class n extends r.Study {
|
|
clearData() {
|
|
this._customData = null, this._indexes = null
|
|
}
|
|
restoreData(e, t, i) {
|
|
r.Study.prototype.restoreData.call(this, e), this._customData = t, this
|
|
._indexes = i
|
|
}
|
|
state(e) {
|
|
const t = super.state(e);
|
|
return e && (t.nonSeriesData = this._customData, t.indexes = this._indexes), t
|
|
}
|
|
customData() {
|
|
return this._customData
|
|
}
|
|
_setPaneViews(e) {
|
|
this._paneViews = e, this.model().lightUpdate()
|
|
}
|
|
_onDataUpdated(e, t, i) {
|
|
null !== t && (t.indexes_replace ? (Object(s.assert)("nochange" !== i), this
|
|
._indexes = i) : (this._customData = t.data, "nochange" !== i && (
|
|
this._indexes = i))), super._onDataUpdated(e, t, i)
|
|
}
|
|
}
|
|
},
|
|
QrSB: function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e, t) {
|
|
const i = e.dataSourceForId(t);
|
|
if (null === i) throw new Error(`Chart has no study or shape with id "${t}"`);
|
|
return i
|
|
}
|
|
i.r(t), i.d(t, "SelectionApi", (function() {
|
|
return r
|
|
}));
|
|
class r {
|
|
constructor(e) {
|
|
this._model = e
|
|
}
|
|
add(e) {
|
|
Array.isArray(e) ? this._model.selectionMacro(t => {
|
|
e.map(s.bind(null, this._model)).forEach(e => t.addSourceToSelection(e))
|
|
}) : this.add([e])
|
|
}
|
|
canBeAddedToSelection(e) {
|
|
const t = s(this._model, e);
|
|
return this._model.selection().canBeAddedToSelection(t)
|
|
}
|
|
set(e) {
|
|
Array.isArray(e) ? this._model.selectionMacro(t => {
|
|
t.clearSelection(), e.map(s.bind(null, this._model)).forEach(e => t
|
|
.addSourceToSelection(e))
|
|
}) : this.set([e])
|
|
}
|
|
remove(e) {
|
|
Array.isArray(e) ? this._model.selectionMacro(t => {
|
|
e.map(s.bind(null, this._model)).forEach(e => t
|
|
.removeSourceFromSelection(e))
|
|
}) : this.remove([e])
|
|
}
|
|
contains(e) {
|
|
const t = s(this._model, e);
|
|
return this._model.selection().isSelected(t)
|
|
}
|
|
allSources() {
|
|
return this._model.selection().dataSources().map(e => e.id())
|
|
}
|
|
isEmpty() {
|
|
return this._model.selection().isEmpty()
|
|
}
|
|
clear() {
|
|
this._model.selectionMacro(e => {
|
|
e.clearSelection()
|
|
})
|
|
}
|
|
onChanged() {
|
|
return this._model.onSelectedSourceChanged()
|
|
}
|
|
}
|
|
},
|
|
Qtjj: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "TimeSynchronizer", (function() {
|
|
return l
|
|
}));
|
|
var s = i("LxhU"),
|
|
r = i("jCNj"),
|
|
n = i.n(r),
|
|
o = i("IiTo");
|
|
let a = null;
|
|
class l {
|
|
constructor(e, t) {
|
|
var i, r;
|
|
this._sourceTargetBarBuilder = null, this._cache = new Map, this._source = e, this
|
|
._target = t, this._isResolutionTheSame = s.Interval.isEqual(e.getResolution(),
|
|
t.getResolution()), this._isSessionTheSame = (i = e.getSymbolInfo(), r = t
|
|
.getSymbolInfo(), i.timezone === r.timezone && i.session === r.session),
|
|
this._shouldCorrectTradingDay = s.Interval.isDWM(e.getResolution()) && !this
|
|
._isSessionTheSame
|
|
}
|
|
sourceTimeToTargetTime(e) {
|
|
if (this._isSessionTheSame && this._isResolutionTheSame) return e;
|
|
if (!this._source.isValid() || !this._target.isValid()) return e;
|
|
let t = this._cache.get(e);
|
|
if (void 0 === t) {
|
|
let i = 1e3 * e;
|
|
if (this._shouldCorrectTradingDay) {
|
|
let e = n.a.utc_to_cal(this._source.getSession().timezone, i);
|
|
e = this._source.getSession().spec.correctTradingDay(e);
|
|
const t = new Date(e);
|
|
n.a.set_hms(t, 0, 0, 0, 0, this._source.getSession().timezone), i = t
|
|
.valueOf()
|
|
}
|
|
const s = this._sourceTargetBuilder();
|
|
s.moveTo(i);
|
|
const r = s.indexOfBar(i);
|
|
t = s.startOfBar(Math.max(0, r)) / 1e3, this._cache.set(e, t)
|
|
}
|
|
return t
|
|
}
|
|
_sourceTargetBuilder() {
|
|
if (null === this._sourceTargetBarBuilder) {
|
|
const e = this._isSessionTheSame ? this._target.getSession() : (null === a && (
|
|
a = new o.SessionInfo("Etc/UTC", "24x7")), a);
|
|
this._sourceTargetBarBuilder = Object(o.newBarBuilder)(this._target
|
|
.getResolution(), this._target.getSession(), e)
|
|
}
|
|
return this._sourceTargetBarBuilder
|
|
}
|
|
}
|
|
},
|
|
RBvv: function(e) {
|
|
e.exports = JSON.parse(
|
|
'{"color-bg-primary":"color-white","color-bg-primary-hover":"color-cold-gray-100","color-bg-secondary":"color-white","color-bg-highlight":"color-cold-gray-50","color-bg-scroll-buttons":"color-cold-gray-100","color-legacy-bg-scroll-buttons":"color-cold-gray-850","color-legacy-bg-widget":"color-white","color-text-primary":"color-cold-gray-900","color-text-secondary":"color-cold-gray-500","color-text-tertiary":"color-cold-gray-400","color-text-disabled":"color-cold-gray-300","color-accent-content":"color-cold-gray-900","color-box-shadow":"color-cold-gray-300","color-divider":"color-cold-gray-150","color-divider-hover":"color-cold-gray-100","color-active-hover-text":"color-cold-gray-900","color-alert-text":"color-cold-gray-900","color-border-table":"color-cold-gray-100","color-brand":"color-tv-blue-500","color-brand-active":"color-tv-blue-700","color-brand-hover":"color-tv-blue-600","color-chart-page-bg":"color-cold-gray-150","color-common-tooltip-bg":"color-cold-gray-800","color-danger":"color-ripe-red-400","color-danger-hover":"color-ripe-red-500","color-danger-active":"color-ripe-red-600","color-depthrenderer-stroke-style":"color-cold-gray-100","color-highlight-new":"color-tan-orange-50","color-input-bg":"color-white","color-input-publish-bg":"color-white","color-link":"color-tv-blue-500","color-link-hover":"color-tv-blue-600","color-link-active":"color-tv-blue-700","color-list-nth-child-bg":"color-cold-gray-50","color-pane-bg":"color-white","color-pane-secondary-bg":"color-cold-gray-100","color-popup-menu-item-hover-bg":"color-cold-gray-100","color-popup-menu-separator":"color-cold-gray-150","color-screener-description":"color-cold-gray-650","color-success":"color-minty-green-500","color-success-hover":"color-minty-green-600","color-success-active":"color-minty-green-700","color-toolbar-button-text":"color-cold-gray-900","color-toolbar-button-text-hover":"color-cold-gray-900","color-toolbar-button-text-active":"color-tv-blue-500","color-toolbar-button-text-active-hover":"color-tv-blue-600","color-toolbar-button-background-hover":"color-cold-gray-100","color-toolbar-button-background-secondary-hover":"color-cold-gray-150","color-toolbar-toggle-button-background-active":"color-tv-blue-500","color-toolbar-toggle-button-background-active-hover":"color-tv-blue-600","color-toolbar-interactive-element-text-normal":"color-cold-gray-900","color-toolbar-interactive-element-text-hover":"color-cold-gray-900","color-toolbar-opened-element-bg":"color-cold-gray-100","color-tooltip-bg":"color-cold-gray-800","color-tv-dialog-caption":"color-cold-gray-650","color-tv-dropdown-item-hover-bg":"color-cold-gray-100","color-underlined-text":"color-cold-gray-500","color-widget-pages-bg":"color-white","color-warning":"color-tan-orange-500","color-growing":"color-minty-green-400","color-falling":"color-ripe-red-400","color-forex-icon":"color-cold-gray-750","color-list-item-active-bg":"color-tv-blue-400","color-list-item-hover-bg":"color-tv-blue-50","color-list-item-text":"color-cold-gray-800","color-price-axis-label-back":"color-cold-gray-150","color-price-axis-label-text":"color-cold-gray-650","color-price-axis-gear":"color-cold-gray-900","color-price-axis-gear-hover":"color-black","color-price-axis-highlight":"color-cold-gray-150","color-bid":"color-tv-blue-500","color-border":"color-cold-gray-150","color-border-chat-fields":"color-cold-gray-250","color-border-hover":"color-cold-gray-250","color-button-hover-bg":"color-cold-gray-150","color-depthrenderer-fill-style":"color-cold-gray-650","color-disabled-border-and-color":"color-cold-gray-150","color-disabled-input":"color-cold-gray-150","color-empty-container-message":"color-cold-gray-500","color-icons":"color-cold-gray-500","color-input-textarea-readonly":"color-cold-gray-650","color-input-placeholder-text":"color-cold-gray-350","color-item-active-blue":"color-tv-blue-50","color-item-hover-active-bg":"color-tv-blue-100","color-item-hover-bg":"color-tv-blue-100","color-item-hover-blue":"color-tv-blue-100","color-item-selected-blue":"color-tv-blue-50","color-item-active-text":"color-white","color-item-active-bg":"color-tv-blue-500","color-list-item":"color-cold-gray-450","color-news-highlight":"color-tv-blue-100","color-placeholder":"color-cold-gray-350","color-row-hover-active-bg":"color-cold-gray-100","color-sb-scrollbar-body-bg":"color-cold-gray-200","color-section-separator-border":"color-cold-gray-300","color-separator-table-chat":"color-cold-gray-150","color-tag-active-bg":"color-cold-gray-200","color-tag-hover-bg":"color-cold-gray-150","color-text-regular":"color-cold-gray-700","color-tv-button-checked":"color-cold-gray-550","color-scroll-bg":"color-cold-gray-400","color-scroll-border":"color-cold-gray-100","color-widget-border":"color-cold-gray-100","color-scroll-buttons-arrow":"color-white","color-control-intent-default":"color-cold-gray-200","color-control-intent-success":"color-minty-green-600","color-control-intent-primary":"color-tv-blue-500","color-control-intent-warning":"color-tan-orange-500","color-control-intent-danger":"color-ripe-red-500","color-pre-market":"color-tan-orange-600","color-pre-market-bg":"color-tan-orange-400","color-post-market":"color-tv-blue-500","color-post-market-bg":"color-tv-blue-400","color-market-open":"color-minty-green-500","color-market-open-bg":"color-minty-green-400","color-market-closed":"color-cold-gray-400","color-market-holiday":"color-cold-gray-400","color-invalid-symbol":"color-ripe-red-400","color-invalid-symbol-hover":"color-ripe-red-700","color-replay-mode":"color-tv-blue-500","color-replay-mode-icon":"color-white","color-replay-mode-hover":"color-tv-blue-600","color-notaccurate-mode":"color-berry-pink-700","color-notaccurate-mode-bg":"color-berry-pink-400","color-delay-mode":"color-tan-orange-700","color-delay-mode-bg":"color-tan-orange-400","color-eod-mode":"color-grapes-purple-700","color-eod-mode-bg":"color-grapes-purple-400","color-data-problem":"color-ripe-red-600","color-data-problem-bg":"color-ripe-red-400","color-data-problem-hover":"color-ripe-red-700","color-list-item-bg-highlighted":"color-tv-blue-50","color-list-item-bg-selected":"color-tv-blue-100","color-list-item-bg-highlighted-hover":"color-tv-blue-100","color-list-item-bg-selected-hover":"color-tv-blue-200","color-screener-header-bg":"color-white","color-screener-header-bg-hover":"color-cold-gray-100","color-marker-flagged":"color-ripe-red-400","color-marker-flagged-hovered":"color-ripe-red-600","color-ask":"color-ripe-red-400","color-sell":"color-ripe-red-400","color-buy":"color-tv-blue-500","color-neutral":"color-cold-gray-500","color-pro":"color-minty-green-400","color-pro-hover":"color-minty-green-600","color-pro-plus":"color-tv-blue-500","color-pro-plus-hover":"color-tv-blue-600","color-pro-premium":"color-tan-orange-500","color-pro-premium-hover":"color-tan-orange-700","color-trial":"color-cold-gray-500","color-trial-hover":"color-cold-gray-600","color-mod":"color-ripe-red-400","color-mod-hover":"color-ripe-red-600","color-top":"color-banana-yellow-700","color-top-hover":"color-banana-yellow-800","color-ad":"color-banana-yellow-a700","color-broker-featured":"color-minty-green-400","color-broker-featured-hover":"color-minty-green-600","color-alert-status-active":"color-minty-green-400","color-alert-status-stopped":"color-ripe-red-500","color-alert-status-triggered":"color-tan-orange-500","color-covid19-confirmed":"color-ripe-red-500","color-covid19-recovered":"color-minty-green-500","color-covid19-deaths":"color-cold-gray-450","color-overlay":"color-cold-gray-400","color-search-button-hover":"color-cold-gray-150","color-brand-light":"color-tv-blue-500","color-common-tooltip-text":"color-cold-gray-100","color-replay-data-mode":"color-radical-red","color-legacy-success":"color-keppel-1","color-collapse-tabs-border":"color-athens-gray-3","color-site-widget-hover":"color-athens-gray-1","color-attention":"color-sunglow","color-card-border":"color-cold-gray-150","color-card-border-hover":"color-cold-gray-300"}'
|
|
)
|
|
},
|
|
RDDl: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineToolPriceRange", (function() {
|
|
return n
|
|
}));
|
|
var s = i("Ocx9"),
|
|
r = i("Ss5c");
|
|
class n extends r.LineDataSource {
|
|
constructor(e, t) {
|
|
super(e, t || n.createProperties()), i.e("lt-pane-views").then(i.bind(null,
|
|
"VghZ")).then(e => {
|
|
this._setPaneViews([new e.PriceRangePaneView(this, this._model)])
|
|
})
|
|
}
|
|
pointsCount() {
|
|
return 2
|
|
}
|
|
properties() {
|
|
return super.properties()
|
|
}
|
|
name() {
|
|
return "Price Range"
|
|
}
|
|
static createProperties(e) {
|
|
const t = new s.DefaultProperty("linetoolpricerange", e);
|
|
return n._configureProperties(t), t
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "Ax76")))
|
|
.GeneralDatePriceRangeDefinitionsViewModel
|
|
}
|
|
static _configureProperties(e) {
|
|
r.LineDataSource._configureProperties(e)
|
|
}
|
|
}
|
|
},
|
|
RDU5: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "UndoCommand", (function() {
|
|
return s
|
|
}));
|
|
class s {
|
|
constructor(e, t = !0) {
|
|
this._customFlags = {}, this._text = e, this._executeOnPush = t
|
|
}
|
|
text() {
|
|
return this._text
|
|
}
|
|
executeOnPush() {
|
|
return this._executeOnPush
|
|
}
|
|
customFlag(e) {
|
|
return this._customFlags[e]
|
|
}
|
|
setCustomFlag(e, t) {
|
|
this._customFlags[e] = t
|
|
}
|
|
canMerge(e) {
|
|
return !1
|
|
}
|
|
merge(e) {
|
|
throw new Error("Should be re-implemented in child classes")
|
|
}
|
|
}
|
|
},
|
|
RTYN: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "PositionAveragePriceAxisView", (function() {
|
|
return r
|
|
}));
|
|
var s = i("4TVt");
|
|
class r extends s.LineToolPriceAxisView {
|
|
_formatPrice(e, t) {
|
|
return this._source.formatter().format(e)
|
|
}
|
|
}
|
|
},
|
|
RXmj: function(e, t, i) {
|
|
"use strict";
|
|
(function(e) {
|
|
var s = i("FIi8").deepExtend,
|
|
r = i("ogJP").deepEquals,
|
|
n = i("zUrt").backend,
|
|
o = i("l+oz").ChartSaverBase;
|
|
window.t(
|
|
"The publication preview could not be loaded. Please disable your browser extensions and try again."
|
|
);
|
|
|
|
function a(e, t) {
|
|
e.content = JSON.stringify(t)
|
|
}
|
|
t.ChartSaver = class extends o {
|
|
constructor(t) {
|
|
super(t), this._chartAboutToBeSavedDelegate = new e, this
|
|
._chartSavedDelegate = new e, this._prevChartState = null, this
|
|
._chartSizeLimitExceededDelegate = new e
|
|
}
|
|
chartSizeLimitExceeded() {
|
|
return this._chartSizeLimitExceededDelegate
|
|
}
|
|
chartAboutToBeSaved() {
|
|
return this._chartAboutToBeSavedDelegate
|
|
}
|
|
chartSaved() {
|
|
return this._chartSavedDelegate
|
|
}
|
|
whenReadyToSave(e) {
|
|
var t = this._chartWidgetCollection.activeChartWidget.value().model()
|
|
.mainSeries();
|
|
if (t.hasDelayedSymbolIntervalChange()) {
|
|
var i, s = null;
|
|
i = function() {
|
|
t.dataEvents().symbolError().unsubscribe(null, s, !0), e()
|
|
}, s = function() {
|
|
t.dataEvents().symbolResolved().unsubscribe(null, i, !0)
|
|
}, t.dataEvents().symbolResolved().subscribe(null, i, !0), t
|
|
.dataEvents().symbolError().subscribe(null, s, !0)
|
|
} else e()
|
|
}
|
|
saveToJSON() {
|
|
var e = this._getCommonSavingInfo(!1);
|
|
return a(e, this._getChartWidgetCollectionState(!1, !0)), e
|
|
}
|
|
_fillAsyncInfo(e, t) {
|
|
var i = JSON.parse(e.content),
|
|
r = this._chartWidgetCollection;
|
|
return (t ? r.asyncState() : r.activeChartWidget.value().asyncState())
|
|
.then((function(t) {
|
|
return e.content = JSON.stringify(s(i, t)), e
|
|
}))
|
|
}
|
|
_getChartWidgetCollectionState(e, t, i, s, r) {
|
|
return e || (t = !0, s = !1), t ? this._chartWidgetCollection.state(!!e,
|
|
i, s, r) : this._chartWidgetCollection.activeChartWidget.value()
|
|
.state(!!e, i, s, r)
|
|
}
|
|
publishChart(e) {}
|
|
publishScript(e, t, i) {}
|
|
onPublish(e, t) {}
|
|
saveChartLineTools(e, t) {
|
|
var i = (void 0)(),
|
|
s = this._chartWidgetCollection.metaInfo.uid.value();
|
|
return i.saveLineToolsAndGroups(s, e, t)
|
|
}
|
|
_saveLineToolsToStorage() {
|
|
return Promise.resolve()
|
|
}
|
|
_saveChartImpl(e, t, i, s, r, o) {
|
|
var a = i,
|
|
l = s;
|
|
if (a = function(s) {
|
|
t.id.value() || (t.id.setValue(s), t.uid.setValue(s)),
|
|
"function" == typeof i && i(t, e)
|
|
}, !e.name) return console.warn(
|
|
"Saving chart with empty name is not allowed"), void s();
|
|
n.saveChart(e.name, e.short_name, e.resolution, e, t).then(a.bind(this))
|
|
.catch(l.bind(this))
|
|
}
|
|
_saveChart(e, t, i, s) {
|
|
var n = this._chartWidgetCollection.metaInfo,
|
|
o = function(o) {
|
|
return r(this._prevChartState, o)[0] && null != n.id.value() ? (
|
|
this._chartSavedDelegate.fire(!0), void(t && t(n, o))) :
|
|
this._saveChartImpl(o, n, t, i, s, e)
|
|
}.bind(this);
|
|
this._saveLineToolsToStorage().then((function() {
|
|
var t = e(!0);
|
|
return o(t)
|
|
})).catch((function(t) {
|
|
var i = e(!1);
|
|
return o(i)
|
|
}))
|
|
}
|
|
saveChartSilently(e, t, i) {
|
|
i = i || {};
|
|
var s = function(e) {
|
|
var t = e && (void 0)("remove_line_tools_from_content"),
|
|
s = this._getChartWidgetCollectionState(!1, void 0, void 0,
|
|
void 0, t),
|
|
r = this._getCommonSavingInfo(!1, t);
|
|
return a(r, s), i.chartName && (r.name = i.chartName), r.name &&
|
|
0 !== r.name.length || !i.defaultChartName || (r.name = i
|
|
.defaultChartName), i.autoSave && (r.autoSave = !0), r
|
|
}.bind(this);
|
|
this._isSaveInProcess = !0, this._chartAboutToBeSavedDelegate.fire(),
|
|
this._saveChart(s, function(t, i) {
|
|
this._chartWidgetCollection.metaInfo.name.setValue(i.name),
|
|
this._prevChartState = i, this._chartSavedDelegate.fire(
|
|
!0), this._isSaveInProcess = !1, e && e({
|
|
uid: t.uid.value(),
|
|
data: i
|
|
}), delete this._prevChartState.savingToken
|
|
}.bind(this), function() {
|
|
this._chartSavedDelegate.fire(!1), this._isSaveInProcess = !
|
|
1, t && t.apply(null, arguments)
|
|
}.bind(this), i)
|
|
}
|
|
isSaveInProcess() {
|
|
return this._isSaveInProcess
|
|
}
|
|
}
|
|
}).call(this, i("aIyQ"))
|
|
},
|
|
RspR: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "property", (function() {
|
|
return n
|
|
})), i.d(t, "availableValues", (function() {
|
|
return o
|
|
})), i.d(t, "actualBehavior", (function() {
|
|
return a
|
|
}));
|
|
var s = i("+jnJ"),
|
|
r = i("1ANp");
|
|
const {
|
|
property: n,
|
|
availableValues: o,
|
|
actualBehavior: a
|
|
} = Object(s.a)("PaneButtons.visibility", r.navigationButtonsVisibilityKey)
|
|
},
|
|
S8xo: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "MouseEventHandler", (function() {
|
|
return h
|
|
}));
|
|
var s = i("qFKp"),
|
|
r = i("Eyy1"),
|
|
n = i("ogJP"),
|
|
o = i("GUQs"),
|
|
a = i("VaSN");
|
|
const l = s.isSafari ? "click" : "auxclick",
|
|
c = {
|
|
treatVertTouchDragAsPageScroll: !1,
|
|
treatHorzTouchDragAsPageScroll: !1
|
|
};
|
|
class h {
|
|
constructor(e, t, i) {
|
|
this._clickCount = 0, this._clickTimeoutId = null, this._clickPosition = {
|
|
x: Number.NEGATIVE_INFINITY,
|
|
y: Number.POSITIVE_INFINITY
|
|
}, this._tapCount = 0, this._tapTimeoutId = null, this._tapPosition = {
|
|
x: Number.NEGATIVE_INFINITY,
|
|
y: Number.POSITIVE_INFINITY
|
|
}, this._longTapTimeoutId = null, this._longTapActive = !1, this
|
|
._mouseMoveStartPosition = null, this._touchMoveStartPosition = null, this
|
|
._touchMoveExceededManhattanDistance = !1, this._cancelClick = !1, this
|
|
._cancelTap = !1, this._unsubscribeOutsideMouseEvents = null, this
|
|
._unsubscribeOutsideTouchEvents = null, this._unsubscribeMobileSafariEvents =
|
|
null, this._unsubscribeMousemove = null, this._unsubscribeRootMouseEvents =
|
|
null, this._unsubscribeRootTouchEvents = null, this._startPinchMiddlePoint =
|
|
null,
|
|
this._startPinchDistance = 0, this._pinchPrevented = !1, this
|
|
._preventTouchDragProcess = !1, this._mousePressed = !1, this
|
|
._lastTouchEventTimeStamp = 0, this._activeTouchId = null, this
|
|
._acceptMouseLeave = !s.CheckMobile.iOS(), this._onFirefoxOutsideMouseUp =
|
|
e => {
|
|
this._mouseUpHandler(e)
|
|
}, this._onMobileSafariDoubleClick = e => {
|
|
if (this._firesTouchEvents(e)) {
|
|
const t = this._makeCompatEvent(e);
|
|
if (++this._tapCount, this._tapTimeoutId && this._tapCount > 1) {
|
|
const {
|
|
manhattanDistance: i
|
|
} = this._touchMouseMoveWithDownInfo(u(e), this._tapPosition);
|
|
i < 30 && !this._cancelTap && this._processTouchEvent(t, this
|
|
._handler.doubleTapEvent), this._resetTapTimeout()
|
|
}
|
|
} else {
|
|
const t = this._makeCompatEvent(e);
|
|
if (++this._clickCount, this._clickTimeoutId && this._clickCount > 1) {
|
|
const {
|
|
manhattanDistance: i
|
|
} = this._touchMouseMoveWithDownInfo(u(e), this._clickPosition);
|
|
i < 5 && !this._cancelClick && this._processMouseEvent(t, this
|
|
._handler.mouseDoubleClickEvent), this._resetClickTimeout()
|
|
}
|
|
}
|
|
}, this._target = e, this._handler = t, this._options = Object(n.merge)(Object(n
|
|
.clone)(c), i || {}), this._init()
|
|
}
|
|
destroy() {
|
|
null !== this._unsubscribeOutsideMouseEvents && (this
|
|
._unsubscribeOutsideMouseEvents(), this._unsubscribeOutsideMouseEvents =
|
|
null), null !== this._unsubscribeOutsideTouchEvents && (this
|
|
._unsubscribeOutsideTouchEvents(), this._unsubscribeOutsideTouchEvents =
|
|
null), null !== this._unsubscribeMousemove && (this._unsubscribeMousemove(),
|
|
this._unsubscribeMousemove = null), null !== this
|
|
._unsubscribeRootMouseEvents && (this._unsubscribeRootMouseEvents(), this
|
|
._unsubscribeRootMouseEvents = null), null !== this
|
|
._unsubscribeRootTouchEvents && (this._unsubscribeRootTouchEvents(), this
|
|
._unsubscribeRootTouchEvents = null), null !== this
|
|
._unsubscribeMobileSafariEvents && (this._unsubscribeMobileSafariEvents(), this
|
|
._unsubscribeMobileSafariEvents = null), this._clearLongTapTimeout(), this
|
|
._resetClickTimeout()
|
|
}
|
|
_mouseEnterHandler(e) {
|
|
this._unsubscribeMousemove && this._unsubscribeMousemove();
|
|
const t = this._mouseMoveHandler.bind(this);
|
|
if (this._unsubscribeMousemove = () => {
|
|
this._target.removeEventListener("mousemove", t)
|
|
}, this._target.addEventListener("mousemove", t), this._firesTouchEvents(e))
|
|
return;
|
|
const i = this._makeCompatEvent(e);
|
|
this._processMouseEvent(i, this._handler.mouseEnterEvent), this
|
|
._acceptMouseLeave = !0
|
|
}
|
|
_resetClickTimeout() {
|
|
null !== this._clickTimeoutId && clearTimeout(this._clickTimeoutId), this
|
|
._clickCount = 0, this._clickTimeoutId = null, this._clickPosition = {
|
|
x: Number.NEGATIVE_INFINITY,
|
|
y: Number.POSITIVE_INFINITY
|
|
}
|
|
}
|
|
_resetTapTimeout() {
|
|
null !== this._tapTimeoutId && clearTimeout(this._tapTimeoutId), this._tapCount = 0,
|
|
this._tapTimeoutId = null, this._tapPosition = {
|
|
x: Number.NEGATIVE_INFINITY,
|
|
y: Number.POSITIVE_INFINITY
|
|
}
|
|
}
|
|
_mouseMoveHandler(e) {
|
|
if (this._mousePressed || null !== this._touchMoveStartPosition) return;
|
|
if (this._firesTouchEvents(e)) return;
|
|
const t = this._makeCompatEvent(e);
|
|
this._processMouseEvent(t, this._handler.mouseMoveEvent), this._acceptMouseLeave = !
|
|
0
|
|
}
|
|
_touchMoveHandler(e) {
|
|
const t = _(e.changedTouches, Object(r.ensureNotNull)(this._activeTouchId));
|
|
if (null === t) return;
|
|
if (this._lastTouchEventTimeStamp = p(e), null !== this._startPinchMiddlePoint)
|
|
return;
|
|
if (this._preventTouchDragProcess) return;
|
|
this._pinchPrevented = !0;
|
|
const i = this._touchMouseMoveWithDownInfo(u(t), Object(r.ensureNotNull)(this
|
|
._touchMoveStartPosition)),
|
|
{
|
|
xOffset: s,
|
|
yOffset: n,
|
|
manhattanDistance: a
|
|
} = i;
|
|
if (this._touchMoveExceededManhattanDistance || !(a < 5)) {
|
|
if (!this._touchMoveExceededManhattanDistance) {
|
|
const e = .5 * s,
|
|
t = n >= e && !this._options.treatVertTouchDragAsPageScroll,
|
|
i = e > n && !this._options.treatHorzTouchDragAsPageScroll;
|
|
t || i || (this._preventTouchDragProcess = !0), this
|
|
._touchMoveExceededManhattanDistance = !0, this._cancelTap = !0, this
|
|
._clearLongTapTimeout(), this._resetTapTimeout()
|
|
}
|
|
if (!this._preventTouchDragProcess) {
|
|
const i = this._makeCompatEvent(e, t);
|
|
this._processTouchEvent(i, this._handler.touchMoveEvent), Object(o.a)(e)
|
|
}
|
|
}
|
|
}
|
|
_mouseMoveWithDownHandler(e) {
|
|
if (0 !== e.button) return;
|
|
const t = this._touchMouseMoveWithDownInfo(u(e), Object(r.ensureNotNull)(this
|
|
._mouseMoveStartPosition)),
|
|
{
|
|
manhattanDistance: i
|
|
} = t;
|
|
if (i >= 5 && (this._cancelClick = !0, this._resetClickTimeout()), this
|
|
._cancelClick) {
|
|
const t = this._makeCompatEvent(e);
|
|
this._processMouseEvent(t, this._handler.pressedMouseMoveEvent)
|
|
}
|
|
}
|
|
_touchMouseMoveWithDownInfo(e, t) {
|
|
const i = Math.abs(t.x - e.x),
|
|
s = Math.abs(t.y - e.y);
|
|
return {
|
|
xOffset: i,
|
|
yOffset: s,
|
|
manhattanDistance: i + s
|
|
}
|
|
}
|
|
_touchEndHandler(e) {
|
|
let t = _(e.changedTouches, Object(r.ensureNotNull)(this._activeTouchId));
|
|
if (null === t && 0 === e.touches.length && (t = e.changedTouches[0]), null === t)
|
|
return;
|
|
this._activeTouchId = null, this._lastTouchEventTimeStamp = p(e), this
|
|
._clearLongTapTimeout(), this._touchMoveStartPosition = null, this
|
|
._unsubscribeRootTouchEvents && (this._unsubscribeRootTouchEvents(), this
|
|
._unsubscribeRootTouchEvents = null);
|
|
const i = this._makeCompatEvent(e, t);
|
|
if (this._processTouchEvent(i, this._handler.touchEndEvent), ++this._tapCount, this
|
|
._tapTimeoutId && this._tapCount > 1) {
|
|
const {
|
|
manhattanDistance: e
|
|
} = this._touchMouseMoveWithDownInfo(u(t), this._tapPosition);
|
|
e < 30 && !this._cancelTap && this._processTouchEvent(i, this._handler
|
|
.doubleTapEvent), this._resetTapTimeout()
|
|
} else this._cancelTap || (this._processTouchEvent(i, this._handler.tapEvent), this
|
|
._handler.tapEvent && Object(o.a)(e));
|
|
0 === this._tapCount && Object(o.a)(e), 0 === e.touches.length && this
|
|
._longTapActive && (this._longTapActive = !1, Object(o.a)(e))
|
|
}
|
|
_mouseUpHandler(e) {
|
|
if (0 !== e.button) return;
|
|
const t = this._makeCompatEvent(e);
|
|
if (this._mouseMoveStartPosition = null, this._mousePressed = !1, this
|
|
._unsubscribeRootMouseEvents && (this._unsubscribeRootMouseEvents(), this
|
|
._unsubscribeRootMouseEvents = null), s.isFF) {
|
|
this._target.ownerDocument.documentElement.removeEventListener("mouseleave",
|
|
this._onFirefoxOutsideMouseUp)
|
|
}
|
|
if (!this._firesTouchEvents(e))
|
|
if (this._processMouseEvent(t, this._handler.mouseUpEvent), ++this._clickCount,
|
|
this._clickTimeoutId && this._clickCount > 1) {
|
|
const {
|
|
manhattanDistance: i
|
|
} = this._touchMouseMoveWithDownInfo(u(e), this._clickPosition);
|
|
i < 5 && !this._cancelClick && this._processMouseEvent(t, this._handler
|
|
.mouseDoubleClickEvent), this._resetClickTimeout()
|
|
} else this._cancelClick || this._processMouseEvent(t, this._handler
|
|
.mouseClickEvent)
|
|
}
|
|
_clearLongTapTimeout() {
|
|
null !== this._longTapTimeoutId && (clearTimeout(this._longTapTimeoutId), this
|
|
._longTapTimeoutId = null)
|
|
}
|
|
_touchStartHandler(e) {
|
|
if (null !== this._activeTouchId) return;
|
|
const t = e.changedTouches[0];
|
|
this._activeTouchId = t.identifier, this._lastTouchEventTimeStamp = p(e);
|
|
const i = this._target.ownerDocument.documentElement;
|
|
this._cancelTap = !1, this._touchMoveExceededManhattanDistance = !1, this
|
|
._preventTouchDragProcess = !1, this._touchMoveStartPosition = u(t), this
|
|
._unsubscribeRootTouchEvents && (this._unsubscribeRootTouchEvents(), this
|
|
._unsubscribeRootTouchEvents = null); {
|
|
const t = this._touchMoveHandler.bind(this),
|
|
s = this._touchEndHandler.bind(this);
|
|
this._unsubscribeRootTouchEvents = () => {
|
|
i.removeEventListener("touchmove", t), i.removeEventListener("touchend",
|
|
s)
|
|
}, i.addEventListener("touchmove", t, {
|
|
passive: !1
|
|
}), i.addEventListener("touchend", s, {
|
|
passive: !1
|
|
}), this._clearLongTapTimeout(), this._longTapTimeoutId = setTimeout(this
|
|
._longTapHandler.bind(this, e), 240)
|
|
}
|
|
const s = this._makeCompatEvent(e, t);
|
|
this._processTouchEvent(s, this._handler.touchStartEvent), this._tapTimeoutId || (
|
|
this._tapCount = 0, this._tapTimeoutId = setTimeout(this._resetTapTimeout
|
|
.bind(this), 500), this._tapPosition = u(t))
|
|
}
|
|
_wheelClickHandler(e) {
|
|
if (1 !== e.button) return;
|
|
if (this._firesTouchEvents(e)) return;
|
|
const t = this._makeCompatEvent(e);
|
|
this._processMouseEvent(t, this._handler.wheelClickEvent)
|
|
}
|
|
_mouseDownHandler(e) {
|
|
if (0 !== e.button) return;
|
|
const t = this._target.ownerDocument.documentElement;
|
|
s.isFF && t.addEventListener("mouseleave", this._onFirefoxOutsideMouseUp), this
|
|
._cancelClick = !1, this._mouseMoveStartPosition = u(e), this
|
|
._unsubscribeRootMouseEvents && (this._unsubscribeRootMouseEvents(), this
|
|
._unsubscribeRootMouseEvents = null); {
|
|
const e = this._mouseMoveWithDownHandler.bind(this),
|
|
i = this._mouseUpHandler.bind(this);
|
|
this._unsubscribeRootMouseEvents = () => {
|
|
t.removeEventListener("mousemove", e), t.removeEventListener("mouseup",
|
|
i)
|
|
}, t.addEventListener("mousemove", e), t.addEventListener("mouseup", i)
|
|
}
|
|
if (this._mousePressed = !0, this._firesTouchEvents(e)) return;
|
|
const i = this._makeCompatEvent(e);
|
|
this._processMouseEvent(i, this._handler.mouseDownEvent), this._clickTimeoutId || (
|
|
this._clickCount = 0, this._clickTimeoutId = setTimeout(this
|
|
._resetClickTimeout.bind(this), 500), this._clickPosition = u(e))
|
|
}
|
|
_init() {
|
|
this._target.addEventListener("mouseenter", this._mouseEnterHandler.bind(this)),
|
|
this._target.addEventListener("touchcancel", this._clearLongTapTimeout.bind(
|
|
this)); {
|
|
const e = this._target.ownerDocument,
|
|
t = e => {
|
|
this._handler.mouseDownOutsideEvent && (e.target && this._target
|
|
.contains(e.target) || this._handler.mouseDownOutsideEvent())
|
|
};
|
|
this._unsubscribeOutsideTouchEvents = () => {
|
|
e.removeEventListener("touchstart", t)
|
|
}, this._unsubscribeOutsideMouseEvents = () => {
|
|
e.removeEventListener("mousedown", t)
|
|
}, e.addEventListener("mousedown", t), e.addEventListener("touchstart", t, {
|
|
passive: !0
|
|
})
|
|
}
|
|
s.CheckMobile.iOS() && (this._unsubscribeMobileSafariEvents = () => {
|
|
this._target.removeEventListener("dblclick", this
|
|
._onMobileSafariDoubleClick)
|
|
}, this._target.addEventListener("dblclick", this
|
|
._onMobileSafariDoubleClick)), this._target.addEventListener("mouseleave",
|
|
this._mouseLeaveHandler.bind(this)), this._target.addEventListener(
|
|
"contextmenu", this._contextMenuHandler.bind(this)),
|
|
this._target.addEventListener("touchstart", this._touchStartHandler.bind(
|
|
this), {
|
|
passive: !0
|
|
}), Object(o.b)(this._target), this._target.addEventListener("mousedown", this
|
|
._mouseDownHandler.bind(this)), this._target.addEventListener(l, this
|
|
._wheelClickHandler.bind(this)), this._initPinch(), this._target
|
|
.addEventListener("touchmove", () => {}, {
|
|
passive: !1
|
|
})
|
|
}
|
|
_initPinch() {
|
|
void 0 === this._handler.pinchStartEvent && void 0 === this._handler.pinchEvent &&
|
|
void 0 === this._handler.pinchEndEvent || (this._target.addEventListener(
|
|
"touchstart", e => this._checkPinchState(e.touches), {
|
|
passive: !0
|
|
}), this._target.addEventListener("touchmove", e => {
|
|
if (2 === e.touches.length && null !== this
|
|
._startPinchMiddlePoint && void 0 !== this._handler.pinchEvent
|
|
) {
|
|
const t = d(e.touches[0], e.touches[1]) / this
|
|
._startPinchDistance;
|
|
this._handler.pinchEvent(this._startPinchMiddlePoint, t),
|
|
Object(o.a)(e)
|
|
}
|
|
}, {
|
|
passive: !1
|
|
}), this._target.addEventListener("touchend", e => {
|
|
this._checkPinchState(e.touches)
|
|
}))
|
|
}
|
|
_checkPinchState(e) {
|
|
1 === e.length && (this._pinchPrevented = !1), 2 !== e.length || this
|
|
._pinchPrevented || this._longTapActive ? this._stopPinch() : this._startPinch(
|
|
e)
|
|
}
|
|
_startPinch(e) {
|
|
const t = this._target.getBoundingClientRect() || {
|
|
left: 0,
|
|
top: 0
|
|
};
|
|
this._startPinchMiddlePoint = {
|
|
x: (e[0].clientX - t.left + (e[1].clientX - t.left)) / 2,
|
|
y: (e[0].clientY - t.top + (e[1].clientY - t.top)) / 2
|
|
}, this._startPinchDistance = d(e[0], e[1]), void 0 !== this._handler
|
|
.pinchStartEvent && this._handler.pinchStartEvent(), this._clearLongTapTimeout()
|
|
}
|
|
_stopPinch() {
|
|
null !== this._startPinchMiddlePoint && (this._startPinchMiddlePoint = null,
|
|
void 0 !== this._handler.pinchEndEvent && this._handler.pinchEndEvent())
|
|
}
|
|
_mouseLeaveHandler(e) {
|
|
if (this._unsubscribeMousemove && this._unsubscribeMousemove(), this
|
|
._firesTouchEvents(e)) return;
|
|
if (!this._acceptMouseLeave) return;
|
|
const t = this._makeCompatEvent(e);
|
|
this._processMouseEvent(t, this._handler.mouseLeaveEvent), this
|
|
._acceptMouseLeave = !s.CheckMobile.iOS()
|
|
}
|
|
_longTapHandler(e) {
|
|
const t = _(e.touches, Object(r.ensureNotNull)(this._activeTouchId));
|
|
if (null === t) return;
|
|
const i = this._makeCompatEvent(e, t);
|
|
this._processTouchEvent(i, this._handler.longTapEvent), this._processTouchEvent(i,
|
|
this._handler.touchContextMenuEvent), this._cancelTap = !0, this
|
|
._longTapActive = !0
|
|
}
|
|
_contextMenuHandler(e) {
|
|
if (Object(o.a)(e), null !== this._touchMoveStartPosition) return;
|
|
if (this._firesTouchEvents(e)) return;
|
|
const t = this._makeCompatEvent(e);
|
|
this._processMouseEvent(t, this._handler.contextMenuEvent), this._cancelClick = !0
|
|
}
|
|
_firesTouchEvents(e) {
|
|
return e.sourceCapabilities && void 0 !== e.sourceCapabilities.firesTouchEvents ? e
|
|
.sourceCapabilities.firesTouchEvents : p(e) < this._lastTouchEventTimeStamp +
|
|
500
|
|
}
|
|
_processTouchEvent(e, t) {
|
|
Object(a.setLastEventIsTouch)(!0), t && t.call(this._handler, e)
|
|
}
|
|
_processMouseEvent(e, t) {
|
|
"mouseleave" !== e.srcType && Object(a.setLastEventIsTouch)(!1), t && t.call(this
|
|
._handler, e)
|
|
}
|
|
_makeCompatEvent(e, t) {
|
|
const i = t || e,
|
|
s = this._target.getBoundingClientRect() || {
|
|
left: 0,
|
|
top: 0
|
|
};
|
|
return {
|
|
clientX: i.clientX,
|
|
clientY: i.clientY,
|
|
pageX: i.pageX,
|
|
pageY: i.pageY,
|
|
screenX: i.screenX,
|
|
screenY: i.screenY,
|
|
localX: i.clientX - s.left,
|
|
localY: i.clientY - s.top,
|
|
ctrlKey: e.ctrlKey,
|
|
altKey: e.altKey,
|
|
shiftKey: e.shiftKey,
|
|
metaKey: e.metaKey,
|
|
isTouch: !e.type.startsWith("mouse") && "contextmenu" !== e.type && "click" !==
|
|
e.type,
|
|
srcType: e.type,
|
|
target: i.target,
|
|
view: e.view,
|
|
preventDefault: () => {
|
|
"touchstart" !== e.type && Object(o.a)(e)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function u(e) {
|
|
return {
|
|
x: e.pageX,
|
|
y: e.pageY
|
|
}
|
|
}
|
|
|
|
function d(e, t) {
|
|
const i = e.clientX - t.clientX,
|
|
s = e.clientY - t.clientY;
|
|
return Math.sqrt(i * i + s * s)
|
|
}
|
|
|
|
function p(e) {
|
|
return e.timeStamp || performance.now()
|
|
}
|
|
|
|
function _(e, t) {
|
|
for (let i = 0; i < e.length; ++i)
|
|
if (e[i].identifier === t) return e[i];
|
|
return null
|
|
}
|
|
},
|
|
SMvR: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineToolHighlighter", (function() {
|
|
return n
|
|
}));
|
|
var s = i("Ocx9"),
|
|
r = i("DVnF");
|
|
class n extends r.a {
|
|
constructor(e, t) {
|
|
super(e, t || n.createProperties()), this._loadPaneViews(e)
|
|
}
|
|
properties() {
|
|
return super.properties()
|
|
}
|
|
smooth() {
|
|
return this.properties().childs().smooth.value()
|
|
}
|
|
name() {
|
|
return "Highlighter"
|
|
}
|
|
static createProperties(e) {
|
|
const t = new s.DefaultProperty("linetoolhighlighter", e);
|
|
return n._configureProperties(t), t
|
|
}
|
|
_getPropertyDefinitionsViewModelClass() {
|
|
return Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "/a/6")).then(
|
|
e => e.HighlighterDefinitionsViewModel)
|
|
}
|
|
_loadPaneViews(e) {
|
|
i.e("lt-pane-views").then(i.bind(null, "uRW3")).then(t => {
|
|
this._setPaneViews([new t.HighlighterPaneView(this, e)])
|
|
})
|
|
}
|
|
static _configureProperties(e) {
|
|
r.a._configureProperties(e)
|
|
}
|
|
}
|
|
},
|
|
Si3H: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("Eyy1"),
|
|
r = i("0YCj"),
|
|
n = i.n(r),
|
|
o = i("ogJP");
|
|
i.d(t, "migrateMetaInfoAndPropState", (function() {
|
|
return l
|
|
}));
|
|
const a = [new class {
|
|
targetMetaInfoVersion() {
|
|
return 47
|
|
}
|
|
migrateMetaInfo(e) {
|
|
const t = e,
|
|
i = e;
|
|
if (i._metainfoVersion = 47, !t.defaults || void 0 === t.defaults.precision)
|
|
return void(i.format = {
|
|
type: "inherit"
|
|
});
|
|
const s = t.defaults && t.defaults.precision,
|
|
r = Object(o.isNumber)(s) ? s : parseInt(s);
|
|
0 === r ? i.format = {
|
|
type: "volume"
|
|
} : isFinite(r) ? i.format = {
|
|
type: "price",
|
|
precision: r
|
|
} : i.format = {
|
|
type: "inherit"
|
|
}, delete t.defaults.precision
|
|
}
|
|
migratePropState(e) {}
|
|
}, new class {
|
|
targetMetaInfoVersion() {
|
|
return 50
|
|
}
|
|
migrateMetaInfo(e) {
|
|
const t = e,
|
|
i = e;
|
|
if (i._metainfoVersion = 50, void 0 === t.defaults || void 0 === t.defaults
|
|
.ohlcPlots || void 0 === t.ohlcPlots) return;
|
|
const r = t.ohlcPlots,
|
|
n = t.defaults.ohlcPlots,
|
|
o = Object(s.ensureDefined)(Object(s.ensureDefined)(i.defaults)
|
|
.ohlcPlots);
|
|
for (const e of Object.keys(n)) {
|
|
const t = n[e];
|
|
if ("ohlc_candles" === t.plottype) {
|
|
let i = !1;
|
|
const s = r[e];
|
|
void 0 !== s && (i = !!s.drawBorder, delete s.drawBorder), o[e] = {
|
|
borderColor: "#000000",
|
|
drawBorder: i,
|
|
...t
|
|
}
|
|
}
|
|
}
|
|
}
|
|
migratePropState(e) {}
|
|
}];
|
|
|
|
function l(e, t) {
|
|
const i = n.a.versionOf(e),
|
|
r = e;
|
|
void 0 === r._serverMetaInfoVersion && (r._serverMetaInfoVersion = i), a.forEach(r => {
|
|
i < 0 || i >= r.targetMetaInfoVersion() || (r.migrateMetaInfo(e), void 0 !==
|
|
t && r.migratePropState(t), Object(s.assert)(e._metainfoVersion === r
|
|
.targetMetaInfoVersion()))
|
|
})
|
|
}
|
|
a.sort((function(e, t) {
|
|
return e.targetMetaInfoVersion() - t.targetMetaInfoVersion()
|
|
}))
|
|
},
|
|
SqfW: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "b", (function() {
|
|
return n
|
|
})), i.d(t, "a", (function() {
|
|
return o
|
|
}));
|
|
var s = i("tqok"),
|
|
r = i("hsV8");
|
|
|
|
function n(e, t) {
|
|
if (e.index >= t.length) return null;
|
|
const i = t[e.index];
|
|
return i === s.INVALID_TIME_POINT_INDEX ? null : {
|
|
startPrice: e.startPrice,
|
|
endPrice: e.endPrice,
|
|
index: i,
|
|
extendTop: e.extendTop,
|
|
extendBottom: e.extendBottom
|
|
}
|
|
}
|
|
|
|
function o(e, t, i) {
|
|
const s = Object(r.ensureTimePointIndexIndex)(i.indexOf(e.index));
|
|
return {
|
|
id: t,
|
|
...e,
|
|
index: s
|
|
}
|
|
}
|
|
},
|
|
Ss5c: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("aO4+").Point,
|
|
r = i("dOnf").deepCopy,
|
|
n = i("4TVt").LineToolPriceAxisView,
|
|
o = i("fJhV").LineDataSourceTimeAxisView,
|
|
a = i("mMWL"),
|
|
l = i("LxhU").Interval,
|
|
c = i("txPx").getLogger("Chart.LineDataSource"),
|
|
h = i("FQhm"),
|
|
u = i("aIyQ"),
|
|
d = i("tc+8"),
|
|
p = i("Ocx9").DefaultProperty,
|
|
_ = i("Kxc7"),
|
|
m = i("0qMc").lineToolsLocalizedNames,
|
|
f = _.enabled("datasource_copypaste"),
|
|
g = i("ng+v").LineDataSourceBase,
|
|
b = i("0C7r").intervalsVisibilitiesDefaults;
|
|
class v extends g {
|
|
constructor(e, t) {
|
|
super(e, t), this._onTemplateApplying = new u, this._onTemplateApplied = new u, this
|
|
._properties.hasChild("interval") || this._properties.addChild("interval",
|
|
new d(e.mainSeries().interval())), this.calcIsActualSymbol(), this
|
|
._properties.intervalsVisibilities.listeners().subscribe(this, v.prototype
|
|
.calcIsActualSymbol);
|
|
var i = this;
|
|
if (this._properties.listeners().subscribe(this, (function(e) {
|
|
i.propertiesChanged()
|
|
})), this._createPointsProperties(), this.pointsCount() > 0)
|
|
for (var s = 0; s < this.pointsCount(); s++) this._priceAxisViews.push(this
|
|
.createPriceAxisView(s)), this._timeAxisViews.push(new o(this, s));
|
|
this._properties.visible.listeners().subscribe(this, (function(e) {
|
|
var t = !1 === a.hideAllDrawings().value();
|
|
e.value() ? e.value() && t && h.emit("drawing_event", this._id,
|
|
"show") : (i._model.selection().isSelected(this) && i._model
|
|
.selectionMacro((function(e) {
|
|
e.removeSourceFromSelection(i)
|
|
})), t && h.emit("drawing_event", this._id, "hide")), i
|
|
._onSourceHiddenMayChange()
|
|
})), a.hideAllDrawings().subscribe(this, this._onSourceHiddenMayChange), this
|
|
.customization = {
|
|
forcePriceAxisLabel: !1,
|
|
disableErasing: !1,
|
|
disableSave: !1,
|
|
showInObjectsTree: !0
|
|
}, this._syncStateExclusions = [], this._definitionsViewModel = null, this
|
|
._isDestroyed = !1, this._syncLineStyleMuted = !1
|
|
}
|
|
getType() {
|
|
return TradingView.className(this.constructor)
|
|
}
|
|
isSavedInChart(e) {
|
|
return !this.customization.disableSave
|
|
}
|
|
setSavingInChartEnabled(e) {
|
|
this.customization.disableSave = !e
|
|
}
|
|
showInObjectTree() {
|
|
return this.customization.showInObjectsTree
|
|
}
|
|
isAvailableInFloatingWidget() {
|
|
return !0
|
|
}
|
|
setShowInObjectsTreeEnabled(e) {
|
|
this.customization.showInObjectsTree = e
|
|
}
|
|
visibilityKeyByInterval(e) {
|
|
var t, i = l.parse(e);
|
|
return v.IntervalsVisibilities.forEach((function(e) {
|
|
e.kind === i.kind() && e.from <= i.multiplier() && e.to >= i
|
|
.multiplier() && (t = e.key)
|
|
})), t
|
|
}
|
|
priceScale() {
|
|
return this._ownerSource ? this._ownerSource.m_priceScale : null
|
|
}
|
|
symbol() {
|
|
return this._properties.symbol.value()
|
|
}
|
|
properties() {
|
|
return this._properties
|
|
}
|
|
isSavedInStudyTemplates() {
|
|
return !1
|
|
}
|
|
state(e) {
|
|
var t = {
|
|
type: TradingView.className(this.constructor),
|
|
id: this.id(),
|
|
state: this.properties().state(this._propertiesStateExclusions()),
|
|
points: r(this._timePoint),
|
|
zorder: this.zorder()
|
|
};
|
|
return this.linkKey().value() && (t.linkKey = this.linkKey().value()), delete t
|
|
.state.points, e && (t.indexes = this._points), this.ownerSource() && (t
|
|
.ownerSource = this.ownerSource().id()), this.isFixed() && (t
|
|
.positionPercents = this._positionPercents || this.calcPositionPercents()),
|
|
"version" in this && 1 !== this.version && (t.version = this.version), this
|
|
.hasAlert.value() && (t.alertId = this._alertId), t
|
|
}
|
|
_propertiesStateExclusions() {
|
|
return null
|
|
}
|
|
template() {
|
|
return this.properties().preferences()
|
|
}
|
|
applyTemplate(e) {
|
|
this._onTemplateApplying.fire(e), this._applyTemplateImpl(e), this
|
|
.calcIsActualSymbol(), this.updateAllViews(), this.model().lightUpdate(), this
|
|
._onTemplateApplied.fire()
|
|
}
|
|
_applyTemplateImpl(e) {
|
|
var t = this.properties();
|
|
t.mergePreferences(e), t.saveDefaults(), this.propertiesChanged()
|
|
}
|
|
restoreExternalState(e) {
|
|
this.properties().mergeAndFire(e)
|
|
}
|
|
restorePositionPercents(e) {
|
|
this._positionPercents = e
|
|
}
|
|
propertiesChanged(e) {
|
|
this.calcIsActualInterval(), this.updateAllViewsAndRedraw(), e || this
|
|
._syncLineStyleIfNeeded()
|
|
}
|
|
syncLineStyleState() {
|
|
const e = this.properties().state(this._syncStateExclusions);
|
|
return delete e.interval, e
|
|
}
|
|
_syncLineStyleIfNeeded() {
|
|
!this._syncLineStyleMuted && this.linkKey().value() && a.changeLineStyle({
|
|
linkKey: this.linkKey().value(),
|
|
state: this.syncLineStyleState(),
|
|
model: this._model
|
|
})
|
|
}
|
|
_muteSyncLineStyle() {
|
|
this._syncLineStyleMuted = !0
|
|
}
|
|
_unmuteSyncLineStyleWithoutApplyingChanges() {
|
|
this.propertiesChanged(), this._syncLineStyleMuted = !1
|
|
}
|
|
fixedPoints() {
|
|
var e = [];
|
|
if (this._positionPercents && !this.priceScale().isEmpty())
|
|
for (var t = 0; t < this._positionPercents.length; t++) {
|
|
var i = this._positionPercents[t],
|
|
r = this._model.timeScale().width() * i.x,
|
|
n = this.priceScale().height() * i.y;
|
|
e.push(new s(r, n))
|
|
} else
|
|
for (t = 0; t < this._fixedPoints.length; t++) e.push(this._fixedPoints[t]
|
|
.clone());
|
|
return this._lastPoint && e.push(this._lastPoint.clone()), this
|
|
._currentMovingPoint && this._startMovingPoint && this._correctFixedPoints(e), e
|
|
}
|
|
addFixedPoint(e) {
|
|
this._fixedPoints.push(e);
|
|
var t = this._fixedPoints.length === this.pointsCount();
|
|
return t && this.calcPositionPercents(), t
|
|
}
|
|
calcPositionPercents() {
|
|
if (!this.priceScale() || this.priceScale().isEmpty()) return [];
|
|
this._positionPercents = [];
|
|
for (var e = 0; e < this._fixedPoints.length; e++) {
|
|
var t = this._fixedPoints[e],
|
|
i = t.x / this._model.timeScale().width(),
|
|
s = t.y / this.priceScale().height();
|
|
this._positionPercents.push({
|
|
x: i,
|
|
y: s
|
|
})
|
|
}
|
|
return this._positionPercents
|
|
}
|
|
calcMiddlePoint(e, t) {
|
|
return new s((e.x + t.x) / 2, (e.y + t.y) / 2)
|
|
}
|
|
getPointByPosition(e, t, i, s) {
|
|
return [t, i, s][e]
|
|
}
|
|
restoreFixedPoints() {
|
|
this._fixedPoints = this.fixedPoints()
|
|
}
|
|
dataWindowView() {
|
|
return null
|
|
}
|
|
statusView() {
|
|
return null
|
|
}
|
|
isSynchronizable() {
|
|
return this.priceScale() === this._model.mainSeries().priceScale()
|
|
}
|
|
priceAxisViews(e, t) {
|
|
if (t !== this.priceScale() || this.isSourceHidden()) return null;
|
|
if (this._model.lineBeingEdited() === this) {
|
|
var i = this._model.linePointBeingEdited();
|
|
if (null !== i && i < this._priceAxisViews.length) {
|
|
var s = this._priceAxisViews.slice(),
|
|
r = s[i];
|
|
return s.splice(i, 1), s.push(r), s
|
|
}
|
|
return this._priceAxisViews
|
|
}
|
|
return this._priceAxisViews
|
|
}
|
|
timeAxisViews() {
|
|
if (this.isSourceHidden()) return null;
|
|
if (this._model.lineBeingEdited() === this) {
|
|
var e = this._model.linePointBeingEdited();
|
|
if (null !== e && e < this._timeAxisViews.length) {
|
|
var t = this._timeAxisViews.slice(),
|
|
i = t[e];
|
|
return t.splice(e, 1), t.push(i), t
|
|
}
|
|
return this._timeAxisViews
|
|
}
|
|
return this._timeAxisViews
|
|
}
|
|
updateAllViews() {
|
|
if (!this._isActualSymbol || !this._isActualCurrency || !this._isActualUnit)
|
|
return null;
|
|
if (!this._properties.visible.value()) return null;
|
|
this._updateAllPaneViews();
|
|
for (var e = this._priceAxisViews, t = 0; t < e.length; t++) e[t].update();
|
|
for (e = this._timeAxisViews, t = 0; t < e.length; t++) e[t].update()
|
|
}
|
|
setLastFixedPoint(e) {
|
|
this._lastFixedPoint = e, this.updateAllViews()
|
|
}
|
|
title() {
|
|
return this.translatedType()
|
|
}
|
|
translatedType() {
|
|
return void 0 !== m[this.toolname] ? m[this.toolname] : "Line Tool"
|
|
}
|
|
name() {
|
|
return "Line Tool"
|
|
}
|
|
isBeingEdited() {
|
|
return this === this._model.lineBeingEdited() || this === this._model
|
|
.sourceBeingMoved
|
|
}
|
|
isFixed() {
|
|
return !1
|
|
}
|
|
isLocked() {
|
|
return this.properties().frozen && this.properties().frozen.value()
|
|
}
|
|
pointToScreenPoint(e) {
|
|
var t = this._model.timeScale(),
|
|
i = this.priceScale(),
|
|
r = this.ownerSource().firstValue();
|
|
if (!i || i.isEmpty() || t.isEmpty() || null == r) return [new s(0, 0), new s(0,
|
|
0)];
|
|
var n = t.indexToCoordinate(e.index, !0),
|
|
o = e.price,
|
|
a = i.priceToCoordinate(o, r),
|
|
l = new s(n, a);
|
|
n = t.indexToCoordinate(e.index, !1), a = i.priceToCoordinate(o, r);
|
|
return [l, new s(n, a)]
|
|
}
|
|
screenPointToPoint(e) {
|
|
var t = this._model.timeScale(),
|
|
i = this.priceScale(),
|
|
s = t.coordinateToIndex(e.x),
|
|
r = this.ownerSource().firstValue();
|
|
if (null !== r && isFinite(r)) return {
|
|
price: i.coordinateToPrice(e.y, r),
|
|
index: s
|
|
}
|
|
}
|
|
tags() {
|
|
return [this.toolname]
|
|
}
|
|
createPriceAxisView(e) {
|
|
return new n(this, {
|
|
pointIndex: e
|
|
})
|
|
}
|
|
alertId() {
|
|
return this._alertId
|
|
}
|
|
setAlert(e, t) {
|
|
throw new Error("not implemented")
|
|
}
|
|
removeAlert() {
|
|
delete this._alertId, delete this._alert, this.hasAlert.setValue(!1)
|
|
}
|
|
_processAlertHandlers(e) {
|
|
var t, i, s = this;
|
|
if ("unsubscribe" !== (e = "subscribe" === e ? "subscribe" : "unsubscribe") || s
|
|
._alertCallbacks) {
|
|
i = "subscribe" === e ? "on" : "off", t = s.properties();
|
|
var r = s._alertCallbacks || {
|
|
remove: s.removeAlert.bind(s),
|
|
hovered: function(e, t) {
|
|
var i = s._model.hoveredSource() === s;
|
|
t && !i ? s._model.setHoveredSource(s, null) : !t && i && s
|
|
._model.setHoveredSource(null, null)
|
|
},
|
|
selected: function(e, t) {
|
|
t && s._model.selectionMacro((function(e) {
|
|
e.addSourceToSelection(s)
|
|
}))
|
|
},
|
|
synchronizeSilently: function(e) {
|
|
s.synchronizeAlert(!1)
|
|
}
|
|
};
|
|
s._alertCallbacks || (s._alertCallbacks = r), s.getAlert().then((function(n) {
|
|
n && (n[i]("destroy", r.remove), n[i]("change:hovered", r
|
|
.hovered), n[i]("change:selected", r.selected), t
|
|
.extendLeft && t.extendLeft[e](s, r
|
|
.synchronizeSilently), t.extendRight && t
|
|
.extendRight[e]
|
|
(s, r.synchronizeSilently))
|
|
}))
|
|
}
|
|
}
|
|
editAlert(e) {}
|
|
getAlert() {
|
|
throw new Error("not implemented")
|
|
}
|
|
getAlertSync() {
|
|
return null
|
|
}
|
|
synchronizeAlert(e) {}
|
|
_getUndoHistory() {
|
|
return this._model._undoModel.undoHistory()
|
|
}
|
|
stateForAlert() {
|
|
if (!this.canHasAlert()) return null;
|
|
var e = this.state();
|
|
e.id = this.idForAlert(), e.uniqueId = this.idForAlert(), e.title = this.title(), e
|
|
.interval = this._model.mainSeries().interval();
|
|
var t = this._getAlertPlots();
|
|
return t && (e.plots = t), e
|
|
}
|
|
_getAlertPlots() {
|
|
return null
|
|
}
|
|
_linePointsToAlertPlot(e, t, i, s) {
|
|
if (2 !== e.length) return c.logError("[Drawing Alert] Wrong points"), null;
|
|
var r = this._model.timeScale();
|
|
return !r || r.isEmpty() ? null : {
|
|
type: "LinePlot",
|
|
title: t || this.title(),
|
|
timestamp: r.indexToTimePoint(0),
|
|
offset1: e[0].index,
|
|
offset2: e[1].index,
|
|
price1: e[0].price,
|
|
price2: e[1].price,
|
|
extendBackward: i || !1,
|
|
extendForward: s || !1
|
|
}
|
|
}
|
|
getAlertIsActive() {
|
|
return !1
|
|
}
|
|
geometry() {
|
|
var e = this;
|
|
return this.points().map((function(t) {
|
|
return function(t) {
|
|
var i = t.x / e._model.timeScale().width(),
|
|
r = t.y / e.priceScale().height();
|
|
return new s(i, r)
|
|
}(e.pointToScreenPoint(t)[0])
|
|
}))
|
|
}
|
|
model() {
|
|
return this._model
|
|
}
|
|
isForcedDrawPriceAxisLabel() {
|
|
return this.customization.forcePriceAxisLabel
|
|
}
|
|
_getPropertyDefinitionsViewModelClass() {
|
|
return Promise.resolve(null)
|
|
}
|
|
getPropertyDefinitionsViewModel() {
|
|
if (null === this._definitionsViewModel) {
|
|
var e = this;
|
|
return e._getPropertyDefinitionsViewModelClass().then((function(t) {
|
|
return null === t || e._isDestroyed ? null : (null === e
|
|
._definitionsViewModel && (e._definitionsViewModel =
|
|
new t(e._model.undoModel(), e)), e
|
|
._definitionsViewModel)
|
|
}))
|
|
}
|
|
return Promise.resolve(this._definitionsViewModel)
|
|
}
|
|
hasEditableCoordinates() {
|
|
return !0
|
|
}
|
|
getSourceIcon() {
|
|
return {
|
|
type: "loadSvg",
|
|
svgId: "linetool." + this.getType()
|
|
}
|
|
}
|
|
destroy() {
|
|
super.destroy(), this.stop(), null !== this._definitionsViewModel && (this
|
|
._definitionsViewModel.destroy(), this._definitionsViewModel = null),
|
|
null !== this._ownerSource && (this._ownerSource.currencyChanged()
|
|
.unsubscribeAll(this), this._ownerSource.unitChanged().unsubscribeAll(this)
|
|
), a.hideAllDrawings().unsubscribeAll(this), this._isDestroyed = !0
|
|
}
|
|
getOrderTemplate() {
|
|
return null
|
|
}
|
|
copiable() {
|
|
return f
|
|
}
|
|
cloneable() {
|
|
return null !== this._ownerSource && null !== this._ownerSource.firstValue()
|
|
}
|
|
movable() {
|
|
return !0
|
|
}
|
|
static _configureProperties(e) {
|
|
if (g._addCollectedProperties(e), e.hasChild("symbolStateVersion") || e.addChild(
|
|
"symbolStateVersion", new d(g._initialSymbolStateVersion())), e.hasChild(
|
|
"zOrderVersion") || e.addChild("zOrderVersion", new d(g
|
|
._initialZOrderVersion())), e.hasChild("visible") || e.addChild("visible",
|
|
new d(!0)), e.hasChild("frozen") || e.addChild("frozen", new d(!1)), e
|
|
.hasChild("symbol") || e.addChild("symbol", new d("")), e.hasChild(
|
|
"currencyId") || e.addChild("currencyId", new d(null)), e.hasChild(
|
|
"unitId") ||
|
|
e.addChild("unitId", new d(null)), e instanceof p && (e.addExclusion(
|
|
"symbolStateVersion"), e.addExclusion("zOrderVersion"), e.addExclusion(
|
|
"visible"), e.addExclusion("frozen"), e.addExclusion("symbol"), e
|
|
.addExclusion("currencyId"), e.addExclusion("unitId")), e.hasChild(
|
|
"intervalsVisibilities")) {
|
|
const t = e.childs().intervalsVisibilities,
|
|
i = t.state();
|
|
t.merge(b), t.merge(i)
|
|
} else e.addChild("intervalsVisibilities", new d(b));
|
|
e.hasChild("title") || e.addChild("title", new d("")), e instanceof p && (e
|
|
.addExclusion("symbolInfo"), e.addExclusion("points"), e.addExclusion(
|
|
"interval"), e.addExclusion("title")), e.hasChild("singleChartOnly") &&
|
|
e.removeProperty("singleChartOnly")
|
|
}
|
|
}
|
|
v.prototype.version = 1, t.LineToolPriceAxisView = n, t.LineDataSource = v
|
|
},
|
|
SwuQ: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "unitConvertibleGroups", (function() {
|
|
return n
|
|
})), i.d(t, "sourceNewUnitOnPinningToPriceScale", (function() {
|
|
return o
|
|
}));
|
|
var s = i("/tGj"),
|
|
r = i("n5al");
|
|
|
|
function n(e, t, i) {
|
|
const s = Object(r.symbolUnitConvertibleGroupsIfExist)(e);
|
|
if (null !== s) return s;
|
|
const n = i.unitGroupById(t);
|
|
return null === n ? [] : [n]
|
|
}
|
|
|
|
function o(e, t, i, r) {
|
|
let o = null;
|
|
if (i.unitConversionEnabled() && Object(s.isSymbolSource)(e)) {
|
|
const s = i.availableUnits(),
|
|
a = t.unit(s),
|
|
l = e.unit(),
|
|
c = null === l ? [] : n(e.symbolInfo(), l, s);
|
|
null !== a && null !== a.selectedUnit && !a.allUnitsAreOriginal && a.selectedUnit !==
|
|
l && (r && null === l || null !== l && s.convertible(l, c)) && (o = a.selectedUnit)
|
|
}
|
|
return o
|
|
}
|
|
},
|
|
SzKR: function(e, t, i) {},
|
|
T6Of: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LimitedPrecisionNumericFormatter", (function() {
|
|
return r
|
|
}));
|
|
var s = i("ogJP");
|
|
class r {
|
|
constructor(e = 1) {
|
|
this._precision = e
|
|
}
|
|
format(e) {
|
|
Object(s.isNumber)(e) || (e = parseFloat(e));
|
|
const t = e.toFixed(this._precision),
|
|
i = Math.pow(10, -this._precision);
|
|
return Math.max(parseFloat(t), i) + ""
|
|
}
|
|
parse(e) {
|
|
const t = parseFloat(e);
|
|
return isNaN(t) ? {
|
|
res: !1
|
|
} : {
|
|
res: !0,
|
|
value: t,
|
|
suggest: this.format(t)
|
|
}
|
|
}
|
|
}
|
|
},
|
|
TBaH: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineToolGannFixed", (function() {
|
|
return a
|
|
}));
|
|
var s = i("aO4+"),
|
|
r = i("Ss5c"),
|
|
n = i("j3hX"),
|
|
o = i("LAp3");
|
|
class a extends r.LineDataSource {
|
|
constructor(e, t) {
|
|
super(e, t || a.createProperties()), this._constructor = "LineToolGannFixed", i
|
|
.e("lt-pane-views").then(i.bind(null, "wdUH")).then(({
|
|
GannFixedPaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this.model())])
|
|
}), this.properties().childs().reverse.subscribe(this, this._reversePoints)
|
|
}
|
|
pointsCount() {
|
|
return 2
|
|
}
|
|
name() {
|
|
return "Gann Square Fixed"
|
|
}
|
|
properties() {
|
|
return super.properties()
|
|
}
|
|
axisPoints() {
|
|
const e = this.points(),
|
|
t = this.getScreenPoints();
|
|
return e.length < 2 || t.length < 2 ? [] : [e[0], this.screenPointToPoint(t[1])]
|
|
}
|
|
getScreenPoints() {
|
|
const e = this.points();
|
|
if (e.length < 2) return [];
|
|
const t = this._calcAngle();
|
|
if (null === t) return [];
|
|
const [i, r] = e, n = this.pointToScreenPoint(i)[0], o = this
|
|
.pointToScreenPoint(r)[0], a = Math.sqrt(Math.pow(n.x - o.x, 2) + Math.pow(n
|
|
.y - o.y, 2)), l = new s.Point(Math.cos(t), -Math.sin(t)), c = l
|
|
.normalized(), h = c.x < 0 ? -1 : 1, u = c.y < 0 ? -1 : 1;
|
|
return [n.addScaled(l, a), n.add(new s.Point(5 * a * h, 5 * a * u))]
|
|
}
|
|
levelsCount() {
|
|
return this.properties().childs().levels.childCount()
|
|
}
|
|
levels() {
|
|
const e = [],
|
|
t = this.properties().childs(),
|
|
i = t.levels.childCount();
|
|
for (let s = 0; s < i; s++) {
|
|
const i = t.levels.childs()[s].childs();
|
|
e.push({
|
|
index: s,
|
|
visible: i.visible.value(),
|
|
color: i.color.value(),
|
|
width: i.width.value()
|
|
})
|
|
}
|
|
return e
|
|
}
|
|
fanLinesCount() {
|
|
return this.properties().childs().fanlines.childCount()
|
|
}
|
|
fanLines() {
|
|
const e = [],
|
|
t = this.properties().childs(),
|
|
i = t.fanlines.childCount();
|
|
for (let s = 0; s < i; s++) {
|
|
const i = t.fanlines.childs()[s].childs();
|
|
e.push({
|
|
index: s,
|
|
visible: i.visible.value(),
|
|
x: i.x.value(),
|
|
y: i.y.value(),
|
|
color: i.color.value(),
|
|
width: i.width.value()
|
|
})
|
|
}
|
|
return e
|
|
}
|
|
arcsCount() {
|
|
return this.properties().childs().arcs.childCount()
|
|
}
|
|
arcs() {
|
|
const e = [],
|
|
t = this.properties().childs(),
|
|
i = t.arcs.childCount();
|
|
for (let s = 0; s < i; s++) {
|
|
const i = t.arcs.childs()[s].childs();
|
|
e.push({
|
|
index: s,
|
|
visible: i.visible.value(),
|
|
x: i.x.value(),
|
|
y: i.y.value(),
|
|
color: i.color.value(),
|
|
width: i.width.value()
|
|
})
|
|
}
|
|
return e
|
|
}
|
|
arcsBackgroundTransparency() {
|
|
return this.properties().childs().arcsBackground.childs().transparency.value()
|
|
}
|
|
isArcsBackgroundFilled() {
|
|
return this.properties().childs().arcsBackground.childs().fillBackground.value()
|
|
}
|
|
static createProperties(e) {
|
|
const t = Object(o.a)("linetoolgannfixed", e);
|
|
return a._configureProperties(t), t
|
|
}
|
|
_getPropertyDefinitionsViewModelClass() {
|
|
return Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "WfUZ")).then(
|
|
e => e.GannComplexAndFixedDefinitionsViewModel)
|
|
}
|
|
static _configureProperties(e) {
|
|
r.LineDataSource._configureProperties(e);
|
|
const t = [],
|
|
i = [],
|
|
s = e.childs(); {
|
|
const e = s.levels.childCount();
|
|
for (let r = 0; r < e; r++) {
|
|
const e = s.levels.childs()[r].childs();
|
|
t.push(e.width), i.push(e.color)
|
|
}
|
|
} {
|
|
const e = s.fanlines.childCount();
|
|
for (let r = 0; r < e; r++) {
|
|
const e = s.fanlines.childs()[r].childs();
|
|
t.push(e.width), i.push(e.color)
|
|
}
|
|
} {
|
|
const e = s.arcs.childCount();
|
|
for (let r = 0; r < e; r++) {
|
|
const e = s.arcs.childs()[r].childs();
|
|
t.push(e.width), i.push(e.color)
|
|
}
|
|
}
|
|
e.addChild("linesColors", new n.LineToolColorsProperty(i)), e.addChild(
|
|
"linesWidths", new n.LineToolWidthsProperty(t))
|
|
}
|
|
_calcAngle() {
|
|
const e = this.points();
|
|
if (e.length < 2) return null;
|
|
const [t, i] = e, s = this.pointToScreenPoint(t)[0];
|
|
let r = this.pointToScreenPoint(i)[0].subtract(s);
|
|
if (r.length() <= 0) return null;
|
|
r = r.normalized();
|
|
let n = Math.acos(r.x);
|
|
return r.y > 0 && (n = -n), n
|
|
}
|
|
_reversePoints() {
|
|
const [e, t] = this._points;
|
|
this._points[0] = t, this._points[1] = e, this.normalizePoints(), this.restart()
|
|
}
|
|
}
|
|
},
|
|
TCfT: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("sQaR");
|
|
i.d(t, "CompareDialogRenderer", (function() {
|
|
return r
|
|
}));
|
|
class r extends s.a {
|
|
constructor(e) {
|
|
super(), this._dialog = null, this._subscribe = e => {
|
|
this._setVisibility(e)
|
|
}, this._chartWidgetCollection = e
|
|
}
|
|
show() {
|
|
this._load().then(e => {
|
|
var t, i;
|
|
null === (t = this._dialog) || void 0 === t || t.hide(), null === (
|
|
i = this._dialog) || void 0 === i || i.visible()
|
|
.unsubscribe(this._subscribe), this._dialog = e, e.visible()
|
|
.subscribe(this._subscribe), e.show()
|
|
})
|
|
}
|
|
hide() {
|
|
var e;
|
|
null === (e = this._dialog) || void 0 === e || e.hide()
|
|
}
|
|
_load() {
|
|
return Promise.all([i.e("compare-model").then(i.bind(null, "cK0E")), Promise
|
|
.all([i.e("redux"), i.e("react"), i.e(1), i.e(3), i.e(4), i.e(8), i
|
|
.e(9), i.e(11), i.e(12), i.e(13), i.e(14), i.e(19), i.e(21),
|
|
i.e(26), i.e(69), i.e(82), i.e(0), i.e(2), i.e(7), i.e(10),
|
|
i.e(18), i.e(20), i.e(25), i.e("add-compare-dialog")
|
|
]).then(i.bind(null, "a+BI"))
|
|
]).then(([e, t]) => {
|
|
const i = new e.CompareModel(this._chartWidgetCollection);
|
|
return t.getCompareDialogRenderer(i)
|
|
})
|
|
}
|
|
}
|
|
},
|
|
TMWk: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Eyy1").assert,
|
|
r = i("ogJP").clone,
|
|
n = i("GVHu").Study,
|
|
o = i("k9/m").PlotList,
|
|
a = i("w4Ji").studyPlotFunctionMap,
|
|
l = i("w4Ji").studyEmptyPlotValuePredicate;
|
|
class c {
|
|
constructor(e, t, i) {
|
|
this._strategyPlotIndex = e, this._targetPlotIndex = t, this._startIndex = i
|
|
}
|
|
rebuildData(e) {
|
|
var t = this._targetPlotIndex + 1,
|
|
i = this._strategyPlotIndex + 1,
|
|
s = null,
|
|
r = null;
|
|
e.range(this._startIndex || e.firstIndex(), e.lastIndex()).each((function(n, o) {
|
|
var a = o[t],
|
|
l = o[i] ? Math.round(o[i]) : null;
|
|
if (o[t] = null, o[i] = null, !l || l > 0) return !1;
|
|
var c = n + l,
|
|
h = {
|
|
pointIndex: c,
|
|
value: a
|
|
};
|
|
if (r) {
|
|
if (r.pointIndex !== h.pointIndex) {
|
|
c >= 0 && (e.valueAt(c)[t] = a);
|
|
var u = !1;
|
|
s && (u = s.value <= r.value && r.value <= a || s.value >= r
|
|
.value && r.value >= a), u ? r.pointIndex >= 0 && (e
|
|
.valueAt(r.pointIndex)[t] = null) : s = r, r = h
|
|
}
|
|
} else r = h;
|
|
return !1
|
|
}))
|
|
}
|
|
}
|
|
t.study_ScriptWithDataOffset = class extends n {
|
|
constructor(e, t, i, s) {
|
|
super(e, t, i, s), this._underlyingData = new o(a(s), l)
|
|
}
|
|
clearData() {
|
|
super.clearData(), this._underlyingData.clear()
|
|
}
|
|
_mergeData(e) {
|
|
this._invalidateLastNonEmptyPlotRowCache();
|
|
var t = this._underlyingData.firstIndex();
|
|
this._underlyingData.merge(e), t !== this._underlyingData.firstIndex() && (this
|
|
.m_data = new o(a(this._metaInfo), l));
|
|
var i = this.m_data.lastIndex();
|
|
this._underlyingData.range(i, this._underlyingData.lastIndex()).each(function(e,
|
|
t) {
|
|
return this.m_data.add(e, r(t)), !1
|
|
}.bind(this)), this._plotsForStrategyProcessing().forEach((function(e) {
|
|
new c(e.strategyIndex, e.targetIndex, i).rebuildData(this
|
|
.m_data)
|
|
}), this)
|
|
}
|
|
_plotsForStrategyProcessing() {
|
|
var e = [];
|
|
return this._metaInfo.plots.forEach((function(t, i) {
|
|
if ("dataoffset" === t.type) {
|
|
var r = this._metaInfo.plots.findIndex((function(e) {
|
|
return e.id === t.target
|
|
}));
|
|
s(r >= 0, "target plot not found for strategy plot " + t
|
|
.id);
|
|
var n = {
|
|
strategyIndex: i,
|
|
targetIndex: r
|
|
};
|
|
e.push(n)
|
|
}
|
|
}), this), e
|
|
}
|
|
}
|
|
},
|
|
TTFo: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "fromPercent", (function() {
|
|
return n
|
|
})), i.d(t, "toPercent", (function() {
|
|
return o
|
|
})), i.d(t, "toPercentRange", (function() {
|
|
return a
|
|
})), i.d(t, "fromIndexedTo100", (function() {
|
|
return l
|
|
})), i.d(t, "toIndexedTo100", (function() {
|
|
return c
|
|
})), i.d(t, "toIndexedTo100Range", (function() {
|
|
return h
|
|
})), i.d(t, "toLog", (function() {
|
|
return u
|
|
})), i.d(t, "fromLog", (function() {
|
|
return d
|
|
}));
|
|
var s = i("Qb4w"),
|
|
r = i("Hr11");
|
|
|
|
function n(e, t) {
|
|
return t < 0 && (e = -e), e / 100 * t + t
|
|
}
|
|
|
|
function o(e, t) {
|
|
const i = 100 * (e - t) / t;
|
|
return t < 0 ? -i : i
|
|
}
|
|
|
|
function a(e, t) {
|
|
const i = o(e.minValue(), t),
|
|
r = o(e.maxValue(), t);
|
|
return new s.PriceRange(i, r)
|
|
}
|
|
|
|
function l(e, t) {
|
|
return t < 0 && (e = -e), (e -= 100) / 100 * t + t
|
|
}
|
|
|
|
function c(e, t) {
|
|
const i = 100 * (e - t) / t + 100;
|
|
return t < 0 ? -i : i
|
|
}
|
|
|
|
function h(e, t) {
|
|
const i = c(e.minValue(), t),
|
|
r = c(e.maxValue(), t);
|
|
return new s.PriceRange(i, r)
|
|
}
|
|
|
|
function u(e) {
|
|
const t = Math.abs(e);
|
|
if (t < 1e-8) return 0;
|
|
const i = Object(r.log10)(t + 1e-4) + 4;
|
|
return e < 0 ? -i : i
|
|
}
|
|
|
|
function d(e) {
|
|
const t = Math.abs(e);
|
|
if (t < 1e-8) return 0;
|
|
const i = Math.pow(10, t - 4) - 1e-4;
|
|
return e < 0 ? -i : i
|
|
}
|
|
},
|
|
TcSq: function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e) {
|
|
return e === r(e)
|
|
}
|
|
|
|
function r(e) {
|
|
const t = e.indexOf("$"),
|
|
i = e.indexOf("@");
|
|
return t < 0 && i >= 0 ? null : e.substring(Math.max(t + 1, 0), i >= 0 ? i : e.length)
|
|
}
|
|
|
|
function n(e) {
|
|
return e.startsWith("PUB;")
|
|
}
|
|
|
|
function o(e) {
|
|
return e.startsWith("USER;")
|
|
}
|
|
|
|
function a(e) {
|
|
return e.startsWith("STD;")
|
|
}
|
|
|
|
function l(e) {
|
|
return e.includes("Candlestick%1Pattern%1")
|
|
}
|
|
|
|
function c(e) {
|
|
return e.startsWith("EDGR_")
|
|
}
|
|
i.r(t), i.d(t, "isPineIdString", (function() {
|
|
return s
|
|
})), i.d(t, "extractPineId", (function() {
|
|
return r
|
|
})), i.d(t, "isPublishedPineId", (function() {
|
|
return n
|
|
})), i.d(t, "isCustomPineId", (function() {
|
|
return o
|
|
})), i.d(t, "isStandardPineId", (function() {
|
|
return a
|
|
})), i.d(t, "isCandleStickId", (function() {
|
|
return l
|
|
})), i.d(t, "isEdgrPineId", (function() {
|
|
return c
|
|
}))
|
|
},
|
|
TlGQ: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "visitObject", (function() {
|
|
return n
|
|
}));
|
|
var s = i("ogJP");
|
|
|
|
function r(e, t, i) {
|
|
return Object(s.isArray)(e) ? function(e, t, i) {
|
|
return e.map(e => {
|
|
const s = r(e, t, i),
|
|
n = t(s);
|
|
return void 0 !== n ? n : s
|
|
})
|
|
}(e, t, i) : Object(s.isObject)(e) && (Object(s.isHashObject)(e) || i && i
|
|
.visitInstances) ? function(e, t, i) {
|
|
const s = {};
|
|
return Object.keys(e).forEach(n => {
|
|
const o = r(e[n], t, i),
|
|
a = t(o);
|
|
s[n] = void 0 !== a ? a : o
|
|
}), s
|
|
}(e, t, i) : e
|
|
}
|
|
|
|
function n(e, t, i) {
|
|
const s = r(e, t, i),
|
|
n = t(s);
|
|
return void 0 !== n ? n : s
|
|
}
|
|
},
|
|
TmNs: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("KcY8"),
|
|
r = i("Eyy1"),
|
|
n = i("jFln"),
|
|
o = i("8Uy/"),
|
|
a = i("gAom");
|
|
class l {
|
|
constructor(e, t) {
|
|
this.setData(e, t)
|
|
}
|
|
setData(e, t) {
|
|
this._data = e, this._commonData = t
|
|
}
|
|
draw(e, t, i, s, l, c) {
|
|
if (!this._data.visible) return;
|
|
let h = this._commonData.coordinate;
|
|
void 0 !== this._commonData.fixedCoordinate && (h = this._commonData
|
|
.fixedCoordinate), e.lineWidth = Math.max(1, Math.floor(Object(r
|
|
.ensureDefined)(this._data.linewidth) * c)), e.lineCap = "butt", Object(n
|
|
.setLineStyle)(e, void 0 === this._data.linestyle ? o.LINESTYLE_DOTTED :
|
|
this._data.linestyle), e.strokeStyle = this._commonData.textColor, Object(a
|
|
.drawHorizontalLine)(e, Math.round(h * c), 0, Math.ceil(s * c))
|
|
}
|
|
height(e) {
|
|
return 0
|
|
}
|
|
}
|
|
i.d(t, "PriceLineAxisView", (function() {
|
|
return c
|
|
})), i.d(t, "SeriesPriceLineAxisView", (function() {
|
|
return h
|
|
})), i.d(t, "StudyPriceLineAxisView", (function() {
|
|
return u
|
|
}));
|
|
class c extends s.a {
|
|
constructor(e) {
|
|
super(e || l)
|
|
}
|
|
ignoreAlignment() {
|
|
return !0
|
|
}
|
|
_updateRendererData(e, t, i) {
|
|
if (t.visible = !1, e.visible = !1, !this._isVisible()) return;
|
|
const s = this._value();
|
|
s.noData || (i.background = "", i.textColor = this._priceLineColor(s.color), i
|
|
.coordinate = s.coordinate, i.floatCoordinate = s.floatCoordinate, e
|
|
.linewidth = this._lineWidth(), e.linestyle = this._lineStyle(), e
|
|
.backgroundAreaVisible = this._backgroundAreaVisible(), e
|
|
.backgroundAreaColor = this._backgroundAreaColor(), e
|
|
.backgroundAreaHeight = this._backgroundAreaHeight(), e.visible = !0)
|
|
}
|
|
_lineStyle() {
|
|
return o.LINESTYLE_DOTTED
|
|
}
|
|
_backgroundAreaVisible() {
|
|
return !1
|
|
}
|
|
_backgroundAreaColor() {
|
|
return ""
|
|
}
|
|
_backgroundAreaHeight() {
|
|
return 0
|
|
}
|
|
}
|
|
class h extends c {
|
|
constructor(e) {
|
|
super(), this._series = e
|
|
}
|
|
_value() {
|
|
return this._series.lastValueData(void 0, !0)
|
|
}
|
|
_priceLineColor(e) {
|
|
return this._series.priceLineColor(e)
|
|
}
|
|
_lineWidth() {
|
|
return this._series.properties().priceLineWidth.value()
|
|
}
|
|
_isVisible() {
|
|
const e = this._series.model().properties().scalesProperties.showSeriesLastValue
|
|
.value();
|
|
return this._series.properties().showPriceLine.value() && e
|
|
}
|
|
}
|
|
class u extends c {
|
|
constructor(e, t) {
|
|
super(), this._study = e, this._plotname = t
|
|
}
|
|
_value() {
|
|
return this._study.lastValueData(this._plotname, !0)
|
|
}
|
|
_lineWidth() {
|
|
return this._study.properties().styles[this._plotname].linewidth.value()
|
|
}
|
|
_lineStyle() {
|
|
return o.LINESTYLE_DOTTED
|
|
}
|
|
_priceLineColor(e) {
|
|
return e
|
|
}
|
|
_isVisible() {
|
|
const e = this._study.model().properties().scalesProperties.showStudyLastValue
|
|
.value();
|
|
return this._study.properties().styles[this._plotname].trackPrice.value() && e
|
|
}
|
|
}
|
|
},
|
|
Tmoa: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "generateColor", (function() {
|
|
return r
|
|
})), i.d(t, "alphaToTransparency", (function() {
|
|
return n
|
|
})), i.d(t, "transparencyToAlpha", (function() {
|
|
return o
|
|
})), i.d(t, "applyTransparency", (function() {
|
|
return a
|
|
})), i.d(t, "resetTransparency", (function() {
|
|
return l
|
|
})), i.d(t, "getLuminance", (function() {
|
|
return c
|
|
})), i.d(t, "isHexColor", (function() {
|
|
return h
|
|
})), i.d(t, "colorFromBackground", (function() {
|
|
return u
|
|
})), i.d(t, "gradientColorAtPercent", (function() {
|
|
return d
|
|
})), i.d(t, "isColorDark", (function() {
|
|
return p
|
|
})), i.d(t, "rgbaFromInteger", (function() {
|
|
return _
|
|
})), i.d(t, "rgbaToInteger", (function() {
|
|
return m
|
|
})), i.d(t, "colorToInteger", (function() {
|
|
return f
|
|
}));
|
|
var s = i("eJTA");
|
|
|
|
function r(e, t, i) {
|
|
if (t = t || 0, !h(e)) return i ? Object(s.rgbaToString)(Object(s.rgba)(Object(s.parseRgb)(
|
|
e), Object(s.normalizeAlphaComponent)(o(t)))) : e;
|
|
const [r, n, a] = Object(s.parseRgb)(e), l = Object(s.normalizeAlphaComponent)(o(t));
|
|
return Object(s.rgbaToString)([r, n, a, l])
|
|
}
|
|
|
|
function n(e) {
|
|
return 100 * (1 - e)
|
|
}
|
|
|
|
function o(e) {
|
|
if (e < 0 || e > 100) throw new Error("invalid transparency");
|
|
return 1 - e / 100
|
|
}
|
|
|
|
function a(e, t) {
|
|
if ("transparent" === e) return e;
|
|
const i = Object(s.parseRgba)(e),
|
|
r = i[3];
|
|
return Object(s.rgbaToString)(Object(s.rgba)(i[0], i[1], i[2], o(t) * r))
|
|
}
|
|
|
|
function l(e) {
|
|
return "transparent" === e || h(e) ? e : Object(s.rgbaToString)(Object(s.rgba)(Object(s
|
|
.parseRgb)(e), Object(s.normalizeAlphaComponent)(1)))
|
|
}
|
|
|
|
function c(e) {
|
|
const t = Object(s.parseRgb)(e).map(e => (e /= 255) <= .03928 ? e / 12.92 : Math.pow((e +
|
|
.055) / 1.055, 2.4));
|
|
return Number((.2126 * t[0] + .7152 * t[1] + .0722 * t[2]).toFixed(3))
|
|
}
|
|
|
|
function h(e) {
|
|
return 0 === e.indexOf("#")
|
|
}
|
|
|
|
function u(e) {
|
|
return "black" === Object(s.rgbToBlackWhiteString)(Object(s.parseRgb)(e), 150) ? "#ffffff" :
|
|
"#000000"
|
|
}
|
|
|
|
function d(e, t, i) {
|
|
const [r, n, o, a] = Object(s.parseRgba)(e), [l, c, h, u] = Object(s.parseRgba)(t), d =
|
|
Object(s.rgba)(Math.round(r + i * (l - r)), Math.round(n + i * (c - n)), Math.round(o +
|
|
i * (h - o)), a + i * (u - a));
|
|
return Object(s.rgbaToString)(d)
|
|
}
|
|
|
|
function p(e) {
|
|
return c(l(e)) < .5
|
|
}
|
|
|
|
function _(e) {
|
|
const t = (e = Math.round(e)) % 256;
|
|
e -= t;
|
|
const i = (e /= 256) % 256;
|
|
e -= i;
|
|
const s = (e /= 256) % 256;
|
|
e -= s;
|
|
return `rgba(${t},${i},${s},${(e /= 256) / 255})`
|
|
}
|
|
|
|
function m(e) {
|
|
const t = Math.round(255 * e[3]);
|
|
return e[0] + 256 * e[1] + 65536 * e[2] + 16777216 * t
|
|
}
|
|
|
|
function f(e) {
|
|
const t = Object(s.tryParseRgba)(e);
|
|
return null === t ? 0 : m(t)
|
|
}
|
|
},
|
|
TohL: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineToolArrowMark", (function() {
|
|
return l
|
|
})), i.d(t, "LineToolArrowMarkLeft", (function() {
|
|
return c
|
|
})), i.d(t, "LineToolArrowMarkUp", (function() {
|
|
return h
|
|
})), i.d(t, "LineToolArrowMarkRight", (function() {
|
|
return u
|
|
})), i.d(t, "LineToolArrowMarkDown", (function() {
|
|
return d
|
|
}));
|
|
var s = i("Ocx9"),
|
|
r = i("Ss5c"),
|
|
n = i("tc+8"),
|
|
o = i.n(n),
|
|
a = i("j3hX");
|
|
class l extends r.LineDataSource {
|
|
constructor(e, t, s) {
|
|
const r = t || l.createProperties(null, s);
|
|
super(e, r), this._textPaneView = null, i.e("lt-pane-views").then(i.bind(null,
|
|
"ct+2")).then(({
|
|
ArrowMarkPaneView: t
|
|
}) => {
|
|
const i = [new t(this, e)];
|
|
this._setPaneViews(i)
|
|
})
|
|
}
|
|
paneViews(e) {
|
|
const t = super.paneViews();
|
|
return null !== t && this._textPaneView && t.push(this._textPaneView), t
|
|
}
|
|
pointsCount() {
|
|
return 1
|
|
}
|
|
template() {
|
|
const e = super.template();
|
|
return e.text = this.properties().childs().text.value(), e
|
|
}
|
|
static createProperties(e, t) {
|
|
const i = new s.DefaultProperty(t, e);
|
|
return l._configureProperties(i), i
|
|
}
|
|
_getPropertyDefinitionsViewModelClass() {
|
|
return Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "5sLb")).then(
|
|
e => e.ArrowMarkDefinitionsViewModel)
|
|
}
|
|
_applyTemplateImpl(e) {
|
|
super._applyTemplateImpl(e), this.properties().childs().text.setValue(e.text)
|
|
}
|
|
static _configureProperties(e) {
|
|
r.LineDataSource._configureProperties(e), e.addChild("linesColors", new a
|
|
.LineToolColorsProperty([e.childs().arrowColor])), e.addChild(
|
|
"textsColors", new a.LineToolColorsProperty([e.childs().color])), e
|
|
.hasChild("text") || e.addChild("text", new o.a("")), e.addExclusion("text")
|
|
}
|
|
}
|
|
l.version = 2;
|
|
class c extends l {
|
|
constructor(e, t) {
|
|
super(e, t, "linetoolarrowmarkleft")
|
|
}
|
|
direction() {
|
|
return "left"
|
|
}
|
|
name() {
|
|
return "Arrow Mark Left"
|
|
}
|
|
textAlignParams() {
|
|
return {
|
|
horzAlign: "left",
|
|
vertAlign: "middle",
|
|
offsetX: 22,
|
|
offsetY: 3
|
|
}
|
|
}
|
|
static createProperties(e) {
|
|
return l.createProperties(e, "linetoolarrowmarkleft")
|
|
}
|
|
}
|
|
class h extends l {
|
|
constructor(e, t) {
|
|
super(e, t, "linetoolarrowmarkup")
|
|
}
|
|
direction() {
|
|
return "up"
|
|
}
|
|
name() {
|
|
return "Arrow Mark Up"
|
|
}
|
|
textAlignParams() {
|
|
return {
|
|
horzAlign: "center",
|
|
vertAlign: "top",
|
|
offsetX: 0,
|
|
offsetY: 20
|
|
}
|
|
}
|
|
static createProperties(e) {
|
|
return l.createProperties(e, "linetoolarrowmarkup")
|
|
}
|
|
}
|
|
class u extends l {
|
|
constructor(e, t) {
|
|
super(e, t, "linetoolarrowmarkright")
|
|
}
|
|
direction() {
|
|
return "right"
|
|
}
|
|
name() {
|
|
return "Arrow Mark Right"
|
|
}
|
|
textAlignParams() {
|
|
return {
|
|
horzAlign: "right",
|
|
vertAlign: "middle",
|
|
offsetX: 22,
|
|
offsetY: 3,
|
|
forceTextAlign: !0
|
|
}
|
|
}
|
|
static createProperties(e) {
|
|
return l.createProperties(e, "linetoolarrowmarkright")
|
|
}
|
|
}
|
|
class d extends l {
|
|
constructor(e, t) {
|
|
super(e, t, "linetoolarrowmarkdown")
|
|
}
|
|
direction() {
|
|
return "down"
|
|
}
|
|
name() {
|
|
return "Arrow Mark Down"
|
|
}
|
|
textAlignParams() {
|
|
return {
|
|
horzAlign: "center",
|
|
vertAlign: "bottom",
|
|
offsetX: 0,
|
|
offsetY: 20
|
|
}
|
|
}
|
|
static createProperties(e) {
|
|
return l.createProperties(e, "linetoolarrowmarkdown")
|
|
}
|
|
}
|
|
},
|
|
"U0+/": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "StudyMetaInfoRepository", (function() {
|
|
return h
|
|
}));
|
|
i("YFKU");
|
|
var s = i("Eyy1"),
|
|
r = i("0YCj"),
|
|
n = i.n(r),
|
|
o = i("Si3H"),
|
|
a = i("lCO3"),
|
|
l = i("txPx");
|
|
const c = Object(l.getLogger)("Chart.Studies.StudyMetaInfoRepository", {
|
|
color: "#606"
|
|
});
|
|
class h {
|
|
constructor(e) {
|
|
this._nextRequestNumber = 1, this._rawStudiesMetaInfo = [], this._isReady = !1, this
|
|
._metaInfoQueryQueue = [], this._javaMetaInfoQueryQueue = [], this
|
|
._javaStudiesMetaInfo = [], this._pineMetaInfoCache = [], this
|
|
._studiesMigrations = [], this._gateway = e
|
|
}
|
|
requestMetaInfo() {
|
|
this._requestStarted();
|
|
const e = this._makeNextRequestId();
|
|
return c.logNormal("Requesting metainfo #" + e), new Promise(t => {
|
|
c.logNormal("Requesting studies metadata #" + e), this._gateway
|
|
.requestMetadata(e, i => {
|
|
c.logNormal(`Requesting studies metadata #${e} finished`);
|
|
const s = i.params[1].metainfo.slice();
|
|
this._processLibraryMetaInfo(s), this._requestFinished(),
|
|
t()
|
|
})
|
|
})
|
|
}
|
|
findById(e) {
|
|
if (!this._isReady) return this._enqueueMetaInfoQuery(e);
|
|
const t = this._findStudyMetaInfo(e);
|
|
return null !== t ? Promise.resolve(t) : "pine" === e.type ? this._compilePine(e) :
|
|
Promise.reject(`unexpected study id=${e.studyId} with type=${e.type}`)
|
|
}
|
|
findByIdSync(e) {
|
|
return this._findStudyMetaInfo(e)
|
|
}
|
|
isReady() {
|
|
return this._isReady
|
|
}
|
|
findAllJavaStudies() {
|
|
return this._isReady ? Promise.resolve(this._javaStudiesMetaInfo) : this
|
|
._enqueueJavaMetaInfoQuery()
|
|
}
|
|
getInternalMetaInfoArray() {
|
|
return this._javaStudiesMetaInfo
|
|
}
|
|
getMigrations() {
|
|
return this._studiesMigrations
|
|
}
|
|
addPineMetaInfo(e) {
|
|
return d(this._pineMetaInfoCache, e)
|
|
}
|
|
_processMigrations(e) {
|
|
throw new Error("not implemented")
|
|
}
|
|
_processSiteMetaInfo(e, t) {
|
|
throw new Error("not implemented")
|
|
}
|
|
_processLibraryMetaInfo(e) {
|
|
for (const t of e) u(t), d(this._javaStudiesMetaInfo, t);
|
|
this._javaStudiesMetaInfo = this._javaStudiesMetaInfo.sort((e, t) => {
|
|
const i = e.description_localized || e.description,
|
|
s = t.description_localized || t.description;
|
|
return i > s ? 1 : i < s ? -1 : 0
|
|
}),
|
|
n.a.overrideDefaults(this._javaStudiesMetaInfo)
|
|
}
|
|
_requestStarted() {
|
|
this._isReady = !1, this._javaStudiesMetaInfo = [], this._pineMetaInfoCache = [],
|
|
this._studiesMigrations = [], this._rawStudiesMetaInfo = []
|
|
}
|
|
_requestFinished() {
|
|
this._isReady = !0, this._processPendingMetaInfoQueries(), this
|
|
._processPendingFullMetaInfoQueries()
|
|
}
|
|
_enqueueMetaInfoQuery(e) {
|
|
return new Promise(t => {
|
|
this._metaInfoQueryQueue.push({
|
|
studyDescriptor: e,
|
|
resolver: t
|
|
})
|
|
})
|
|
}
|
|
_enqueueJavaMetaInfoQuery() {
|
|
return new Promise(e => {
|
|
this._javaMetaInfoQueryQueue.push({
|
|
resolver: e
|
|
})
|
|
})
|
|
}
|
|
_processPendingMetaInfoQueries() {
|
|
for (; this._metaInfoQueryQueue.length;) {
|
|
const e = this._metaInfoQueryQueue.shift();
|
|
this.findById(e.studyDescriptor).then(e.resolver)
|
|
}
|
|
}
|
|
_processPendingFullMetaInfoQueries() {
|
|
for (; this._javaMetaInfoQueryQueue.length;) {
|
|
this._javaMetaInfoQueryQueue.shift().resolver(this._javaStudiesMetaInfo)
|
|
}
|
|
}
|
|
_findStudyMetaInfo(e) {
|
|
return "java" === e.type ? this._javaStudiesMetaInfo.find(t => t.id === e
|
|
.studyId) || null : this._pineMetaInfoCache.find(t => t.scriptIdPart === e
|
|
.pineId && (void 0 === e.pineVersion || Object(s.ensureDefined)(t.pine)
|
|
.version === e.pineVersion)) || null
|
|
}
|
|
_makeNextRequestId() {
|
|
return "metadata_" + this._nextRequestNumber++
|
|
}
|
|
_compilePine(e) {
|
|
throw new Error("unsupported")
|
|
}
|
|
}
|
|
|
|
function u(e) {
|
|
e.description_localized = window.t(e.description, {
|
|
context: "study"
|
|
})
|
|
}
|
|
|
|
function d(e, t) {
|
|
const i = new n.a(t);
|
|
Object(o.migrateMetaInfoAndPropState)(i);
|
|
let s = !0;
|
|
const r = e.findIndex(e => e.id === i.id);
|
|
if (-1 === r) e.push(i);
|
|
else {
|
|
const t = e[r],
|
|
n = void 0 !== t.pine ? a.Version.parse(t.pine.version) : null,
|
|
o = void 0 !== i.pine ? a.Version.parse(i.pine.version) : null;
|
|
null === o || null === n || o.isGreaterOrEqual(n) ? (t.removeDefaults(), e[r] = i) :
|
|
s = !1
|
|
}
|
|
return s && i.createDefaults(), i
|
|
}
|
|
},
|
|
UAFa: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("i6cO"),
|
|
r = i("23IT"),
|
|
n = i("Eyy1");
|
|
const o = new Map([
|
|
[s.ColorerType.Main, "color"],
|
|
[s.ColorerType.Text, "textColor"],
|
|
[s.ColorerType.Border, "borderColor"],
|
|
[s.ColorerType.Wick, "wickColor"],
|
|
[s.ColorerType.Up, "colorup"],
|
|
[s.ColorerType.Down, "colordown"]
|
|
]);
|
|
class a {
|
|
constructor(e) {
|
|
this._plotStyle = e
|
|
}
|
|
getPlotPointStyle(e, t) {
|
|
const i = t ? Object(s.clearStyle)(t) : Object(s.createEmptyStyle)();
|
|
return o.forEach((e, t) => {
|
|
this._plotStyle[e] && (i.colors[t] = this._plotStyle[e].value())
|
|
}), i.lineWidth = this._plotStyle.linewidth ? this._plotStyle.linewidth
|
|
.value() : void 0, i.lineStyle = this._plotStyle.linestyle ? this._plotStyle
|
|
.linestyle.value() : void 0, i
|
|
}
|
|
isColorDefined() {
|
|
return !0
|
|
}
|
|
singleColor() {
|
|
return !0
|
|
}
|
|
getDefaultPlotPointStyle() {
|
|
return null
|
|
}
|
|
}
|
|
class l {
|
|
constructor(e, t, i, s) {
|
|
this._palettes = new Map, this._metaInfo = e, this._properties = t, this._indexes =
|
|
s, this._plotStyle = t.styles[i];
|
|
const r = Object(n.ensureDefined)(this._metaInfo.palettes);
|
|
s.forEach((t, i) => {
|
|
const s = e.plots[t];
|
|
if (s && "palette" in s) {
|
|
const e = r[s.palette],
|
|
t = this._properties.palettes[s.palette];
|
|
e && t && this._palettes.set(i, {
|
|
palette: e,
|
|
props: t
|
|
})
|
|
}
|
|
})
|
|
}
|
|
getPlotPointStyle(e, t) {
|
|
const i = t ? Object(s.clearStyle)(t) : Object(s.createEmptyStyle)();
|
|
if (this._palettes.has(s.ColorerType.Main)) {
|
|
const t = Object(n.ensureDefined)(this._indexes.get(s.ColorerType.Main)),
|
|
r = e[t + 1];
|
|
if (null != r) {
|
|
const e = Object(n.ensureDefined)(this._palettes.get(s.ColorerType.Main)),
|
|
t = e.palette,
|
|
o = e.props,
|
|
a = Object(n.ensureDefined)(t.valToIndex ? t.valToIndex[r] : r),
|
|
l = o.colors[a];
|
|
i.lineWidth = l.width.value(), i.lineStyle = l.style.value()
|
|
}
|
|
}
|
|
return Object.keys(s.ColorerType).forEach(t => {
|
|
const s = parseInt(t);
|
|
if (this._palettes.has(s)) {
|
|
const t = Object(n.ensureDefined)(this._indexes.get(s)),
|
|
r = e[t + 1];
|
|
if (null != r) {
|
|
const e = Object(n.ensureDefined)(this._palettes.get(s)),
|
|
t = Object(n.ensureDefined)(e.palette.valToIndex ? e.palette
|
|
.valToIndex[r] : r),
|
|
o = e.props.colors[t];
|
|
i.colors[s] = o.color.value()
|
|
} else i.colors[s] = "transparent"
|
|
} else if (this._plotStyle) {
|
|
const e = o.get(s);
|
|
void 0 !== e && this._plotStyle[e] && (i.colors[s] = this
|
|
._plotStyle[e].value())
|
|
}
|
|
}), i
|
|
}
|
|
getDefaultPlotPointStyle() {
|
|
const e = Object(n.ensureDefined)(this._palettes.get(s.ColorerType.Main)).props
|
|
.colors[0];
|
|
if (null != e) {
|
|
return {
|
|
colors: [e.color.value(), void 0, void 0, void 0, void 0, void 0, void 0],
|
|
lineWidth: e.width.value()
|
|
}
|
|
}
|
|
return null
|
|
}
|
|
isColorDefined() {
|
|
return !!this._palettes.size
|
|
}
|
|
singleColor() {
|
|
return !1
|
|
}
|
|
}
|
|
var c = i("Tmoa");
|
|
class h {
|
|
constructor(e) {
|
|
this._indexes = e
|
|
}
|
|
getPlotPointStyle(e, t) {
|
|
const i = t ? Object(s.clearStyle)(t) : Object(s.createEmptyStyle)();
|
|
return this._indexes.forEach((t, s) => {
|
|
const r = e[t + 1];
|
|
if (null != r) {
|
|
const e = Object(c.rgbaFromInteger)(r);
|
|
i.colors[s] = e
|
|
} else i.colors[s] = "transparent"
|
|
}), i
|
|
}
|
|
isColorDefined() {
|
|
return !0
|
|
}
|
|
singleColor() {
|
|
return !1
|
|
}
|
|
getDefaultPlotPointStyle() {
|
|
return null
|
|
}
|
|
}
|
|
i.d(t, "createStudyPlotColorProvider", (function() {
|
|
return d
|
|
}));
|
|
const u = new Map([
|
|
[s.ColorerType.Main, function(e, t) {
|
|
const i = Object(r.isColorerPlot)(t) || Object(r.isOhlcColorerPlot)(t);
|
|
return "target" in t && t.target === e && i
|
|
}],
|
|
[s.ColorerType.Text, function(e, t) {
|
|
const i = Object(r.isTextColorerPlot)(t);
|
|
return "target" in t && t.target === e && i
|
|
}],
|
|
[s.ColorerType.Background, function(e, t) {
|
|
return Object(r.isBgColorerPlot)(t) && t.id === e
|
|
}],
|
|
[s.ColorerType.Border, function(e, t) {
|
|
const i = Object(r.isCandleBorderColorerPlot)(t);
|
|
return "target" in t && t.target === e && i
|
|
}],
|
|
[s.ColorerType.Wick, function(e, t) {
|
|
const i = Object(r.isCandleWickColorerPlot)(t);
|
|
return "target" in t && t.target === e && i
|
|
}],
|
|
[s.ColorerType.Up, function(e, t) {
|
|
const i = Object(r.isUpColorerPlot)(t);
|
|
return "target" in t && t.target === e && i
|
|
}],
|
|
[s.ColorerType.Down, function(e, t) {
|
|
const i = Object(r.isDownColorerPlot)(t);
|
|
return "target" in t && t.target === e && i
|
|
}]
|
|
]);
|
|
|
|
function d(e, t, i) {
|
|
const {
|
|
colorers: s
|
|
} = function(e, t) {
|
|
const i = e.plots,
|
|
s = i.findIndex(e => e.id === t),
|
|
r = new Map;
|
|
return i.forEach((e, i) => {
|
|
u.forEach((s, n) => {
|
|
s(t, e) && r.set(n, i)
|
|
})
|
|
}), {
|
|
plotIndex: -1 === s ? null : s,
|
|
colorers: r
|
|
}
|
|
}(e, i);
|
|
if (s.size) return e.isRGB ? new h(s) : new l(e, t, i, s); {
|
|
const e = t.ohlcPlots;
|
|
if (e && e[i]) return new a(e[i]);
|
|
const s = t.styles[i];
|
|
return new a(s)
|
|
}
|
|
}
|
|
},
|
|
UCMi: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineToolDateAndPriceRange", (function() {
|
|
return a
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("Ocx9"),
|
|
n = i("Ss5c"),
|
|
o = i("585y");
|
|
class a extends n.LineDataSource {
|
|
constructor(e, t) {
|
|
super(e, t || a.createProperties()), this._volumeCalculator = null, i.e(
|
|
"lt-pane-views").then(i.bind(null, "UcQu")).then(e => {
|
|
this._setPaneViews([new e.DateAndPriceRangePaneView(this, this
|
|
._model)])
|
|
})
|
|
}
|
|
destroy() {
|
|
super.destroy(),
|
|
null !== this._volumeCalculator && this._volumeCalculator.destroy()
|
|
}
|
|
pointsCount() {
|
|
return 2
|
|
}
|
|
properties() {
|
|
return super.properties()
|
|
}
|
|
name() {
|
|
return "Date and Price Range"
|
|
}
|
|
volume() {
|
|
if (null === this._volumeCalculator) return NaN;
|
|
const e = this.points();
|
|
return this._volumeCalculator.volume(e[0].index, e[1].index)
|
|
}
|
|
setOwnerSource(e) {
|
|
e === this._model.mainSeries() && (Object(s.assert)(null === this
|
|
._volumeCalculator), this._volumeCalculator = new o.a(this._model
|
|
.mainSeries())), super.setOwnerSource(e)
|
|
}
|
|
static createProperties(e) {
|
|
const t = new r.DefaultProperty("linetooldateandpricerange", e);
|
|
return a._configureProperties(t), t
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "Ax76")))
|
|
.GeneralDatePriceRangeDefinitionsViewModel
|
|
}
|
|
static _configureProperties(e) {
|
|
n.LineDataSource._configureProperties(e)
|
|
}
|
|
}
|
|
},
|
|
UCjq: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("YFKU"),
|
|
r = i("Eyy1"),
|
|
n = i("aO4+"),
|
|
o = i("qFKp"),
|
|
a = i("VaSN"),
|
|
l = i("FQhm"),
|
|
c = i("ogJP"),
|
|
h = i("FIi8"),
|
|
u = i("VdBB"),
|
|
d = i("vTIA"),
|
|
p = i("KnF9"),
|
|
_ = i("3ClC"),
|
|
m = i("GxN8"),
|
|
f = i("CW80"),
|
|
g = i("mMWL"),
|
|
b = i("bOGh"),
|
|
v = i("fTGZ"),
|
|
S = i("ikwP"),
|
|
y = i("gAom"),
|
|
w = i("mE5r"),
|
|
P = i("1IXQ");
|
|
|
|
function C(e, t) {
|
|
return e.position - t.position
|
|
}
|
|
|
|
function x(e, t, i) {
|
|
const s = (e.position - t.position) / (e.time - t.time);
|
|
return Math.sign(s) * Math.min(Math.abs(s), i)
|
|
}
|
|
class T {
|
|
constructor(e, t, i, s) {
|
|
this._position1 = null, this._position2 = null, this._position3 = null, this
|
|
._position4 = null, this._animationStartPosition = null, this._durationMsecs =
|
|
0, this._speedPxPerMsec = 0, this._terminated = !1, this._minSpeed = e, this
|
|
._maxSpeed = t, this._dumpingCoeff = i, this._minMove = s
|
|
}
|
|
addPosition(e, t) {
|
|
if (null !== this._position1) {
|
|
if (this._position1.time === t) return void(this._position1.position = e);
|
|
if (Math.abs(this._position1.position - e) < this._minMove) return
|
|
}
|
|
this._position4 = this._position3, this._position3 = this._position2, this
|
|
._position2 = this._position1, this._position1 = {
|
|
time: t,
|
|
position: e
|
|
}
|
|
}
|
|
start(e, t) {
|
|
if (null === this._position1 || null === this._position2) return;
|
|
if (t - this._position1.time > 50) return;
|
|
let i = 0;
|
|
const s = x(this._position1, this._position2, this._maxSpeed),
|
|
r = C(this._position1, this._position2),
|
|
n = [s],
|
|
o = [r];
|
|
if (i += r, null !== this._position3) {
|
|
const e = x(this._position2, this._position3, this._maxSpeed);
|
|
if (Math.sign(e) === Math.sign(s)) {
|
|
const t = C(this._position2, this._position3);
|
|
if (n.push(e), o.push(t), i += t, null !== this._position4) {
|
|
const e = x(this._position3, this._position4, this._maxSpeed);
|
|
if (Math.sign(e) === Math.sign(s)) {
|
|
const t = C(this._position3, this._position4);
|
|
n.push(e), o.push(t), i += t
|
|
}
|
|
}
|
|
}
|
|
}
|
|
let a = 0;
|
|
for (let e = 0; e < n.length; ++e) a += o[e] / i * n[e];
|
|
Math.abs(a) < this._minSpeed || (this._animationStartPosition = {
|
|
position: e,
|
|
time: t
|
|
}, this._speedPxPerMsec = a, this._durationMsecs = function(e, t) {
|
|
const i = Math.log(t);
|
|
return Math.log(1 * i / -e) / i
|
|
}(Math.abs(a), this._dumpingCoeff))
|
|
}
|
|
getPosition(e) {
|
|
const t = Object(r.ensureNotNull)(this._animationStartPosition),
|
|
i = e - t.time;
|
|
return t.position + this._speedPxPerMsec * (Math.pow(this._dumpingCoeff, i) - 1) /
|
|
Math.log(this._dumpingCoeff)
|
|
}
|
|
finished(e) {
|
|
return null === this._animationStartPosition || this._progressDuration(e) === this
|
|
._durationMsecs
|
|
}
|
|
terminated() {
|
|
return this._terminated
|
|
}
|
|
terminate() {
|
|
this._terminated = !0
|
|
}
|
|
_progressDuration(e) {
|
|
const t = e - Object(r.ensureNotNull)(this._animationStartPosition).time;
|
|
return Math.min(t, this._durationMsecs)
|
|
}
|
|
}
|
|
var I = i("hY0g"),
|
|
M = i.n(I),
|
|
O = i("1AAW"),
|
|
L = i("XcdR"),
|
|
A = i("7MWe"),
|
|
E = i("HZKX"),
|
|
k = i("5VQP"),
|
|
D = i("7ktv"),
|
|
V = i("Fixu"),
|
|
B = i("e92V"),
|
|
R = i("QloM"),
|
|
N = i("Kxc7"),
|
|
j = i("//lt"),
|
|
F = i("+6II"),
|
|
W = i("JWMC"),
|
|
H = i("7KDR"),
|
|
U = i("ZBiT"),
|
|
z = i("zL3Q"),
|
|
G = i("/3z9"),
|
|
q = i("H0vP"),
|
|
Y = i("m/3z");
|
|
|
|
function K(e) {
|
|
return "startMoving" in e && "move" in e && "endMoving" in e
|
|
}
|
|
i.d(t, "PaneWidgetBase", (function() {
|
|
return ce
|
|
}));
|
|
const J = parseInt(U["css-value-pane-controls-padding-left"]),
|
|
Z = parseInt(U["css-value-pane-controls-padding-right"]),
|
|
X = ["AlertLabel"];
|
|
|
|
function $(e) {
|
|
return !(null === e || !Object(_.isStudy)(e)) && "Volume@tv-basicstudies" === e.metaInfo()
|
|
.id
|
|
}
|
|
|
|
function Q(e, t, i) {
|
|
e.drawBackground && e.drawBackground(t, i)
|
|
}
|
|
|
|
function ee(e, t, i) {
|
|
e.draw(t, i)
|
|
}
|
|
|
|
function te(e, t) {
|
|
return e.paneViews(t)
|
|
}
|
|
|
|
function ie(e, t) {
|
|
return e.topPaneViews()
|
|
}
|
|
|
|
function se(e, t) {
|
|
return e.labelPaneViews(t)
|
|
}
|
|
|
|
function re(e, t) {
|
|
const i = e.strategyOrdersPaneView();
|
|
return null === i ? null : [i]
|
|
}
|
|
|
|
function ne(e, t) {
|
|
return null === e || null === e.hittest || e.source !== t ? null : e.hittest.data()
|
|
}
|
|
const oe = {
|
|
contextMenuEnabled: !0,
|
|
contextMenu: E.defaultContextMenuOptions,
|
|
priceScaleContextMenuEnabled: !0,
|
|
legendWidgetEnabled: !0,
|
|
controlsEnabled: !0,
|
|
propertyPagesEnabled: !0,
|
|
sourceSelectionEnabled: !0,
|
|
countdownEnabled: !0
|
|
},
|
|
ae = new Map([
|
|
[u.AreaName.Text, "Text"],
|
|
[u.AreaName.Style, "Style"]
|
|
]),
|
|
le = !N.enabled("display_legend_on_all_charts");
|
|
class ce {
|
|
constructor(e, t, i, s) {
|
|
this._legendWidget = null, this._paneControls = null, this._isDestroyed = !1, this
|
|
._trackCrosshairOnlyAfterLongTap = Object(a.lastEventIsTouch)(), this
|
|
._startTrackPoint = null, this._exitTrackingModeOnNextTry = !1, this
|
|
._startMoveSourceParams = null, this._startChangeLineToolParams = null, this
|
|
._preventSourceChange = !1, this._clonningAtMoveLineTools = null, this
|
|
._startCloningPoint = null, this._size = new S.Size(0, 0), this
|
|
._themedTopColor = null, this._themedBottomColor = null, this
|
|
._initCrossHairPosition = null, this._firstZoomPoint = null, this._editDialog =
|
|
null, this._processing = !1, this._touchMove = !1, this._startTouchPoint = null,
|
|
this._isSelecting = !1, this._prevHoveredHittest = null, this._contextMenuX = 0,
|
|
this._contextMenuY = 0, this._startScrollingPos = null, this._isScrolling = !1,
|
|
this._scrollPriceScale = null, this._scrollXAnimation = null, this
|
|
._scrollYAnimation = null, this._prevPinchScale = 1, this._pinching = !1, this
|
|
._wasPinched = !1, this._longTap = !1, this._contextMenuOpenedOnLastTap = !1,
|
|
this._paneControlsResizeObserver = null, this._hideNotMainSourcesInLegendSpawn =
|
|
null, this._hideWholeLegend = null, this._lastClickedSource = null, this
|
|
._customLegendWidgetsFactoryMap = new Map, this._prevMoveEventPosition = null,
|
|
this._onMagnetStateChangedListener = this._onMagnetStateChanged.bind(this), this
|
|
._onShiftKeyStateChangedListener = this._onShiftKeyStateChanged.bind(this), this
|
|
._currentCursorClassName = "", this._lastFinishedToolId = null, this
|
|
._needResetMeasureLater = !1, this._currentChangingLineToolHitTest = null, this
|
|
._lastCommonTooltipData = null,
|
|
this._canvasConfiguredHandler = () => this._state && this._chartModel()
|
|
.lightUpdate(), this._topCanvasConfiguredHandler = () => this._state && this
|
|
._chartModel().lightUpdate(), this._recalculateLegendVisibility = () => {
|
|
const e = Object(r.ensureNotNull)(this._hideWholeLegend),
|
|
t = this._chartModel().crossHairSource().measurePane();
|
|
null !== t ? e.setValue(t === this._state) : e.setValue(Object(g
|
|
.toolIsMeasure)(g.tool.value()))
|
|
}, this._chart = e, this._state = t, this._options = Object(c.merge)(Object(c
|
|
.clone)(oe), i), this._paneWidgetsSharedState = s, this._state && (this
|
|
._state.onDestroyed().subscribe(this, this._onStateDestroyed, !0), this
|
|
._state.dataSourcesCollectionChanged().subscribe(this, this
|
|
._onDataSourcesCollectionChanged));
|
|
const n = {
|
|
contextMenuEnabled: this._options.priceScaleContextMenuEnabled,
|
|
pressedMouseMoveScale: this._options.handleScale.axisPressedMouseMove.price,
|
|
mouseWheelScale: this._options.handleScale.mouseWheel,
|
|
currencyConversionEnabled: this._options.currencyConversionEnabled,
|
|
unitConversionEnabled: this._options.unitConversionEnabled,
|
|
countdownEnabled: this._options.countdownEnabled,
|
|
croppedTickMarks: this._options.croppedTickMarks
|
|
};
|
|
void 0 !== this._options.priceScaleContextMenu && (n.contextMenu = this._options
|
|
.priceScaleContextMenu);
|
|
const o = (e, t, i, s, r) => new P.PriceAxisWidget(this, this._chartUndoModel(), i,
|
|
t, e, n, s, r),
|
|
l = e.properties().childs().scalesProperties,
|
|
h = this._chartModel().rendererOptionsProvider(),
|
|
u = {
|
|
backgroundBasedTheme: e.backgroundBasedTheme(),
|
|
rendererOptionsProvider: h,
|
|
getBackgroundTopColor: () => this._chartModel().backgroundTopColor()
|
|
.value(),
|
|
getBackgroundBottomColor: () => this._chartModel().backgroundColor().value()
|
|
},
|
|
d = {
|
|
showLabels: !1
|
|
};
|
|
this._lhsPriceAxisesContainer = new w.a(l, "left", o, u, d), this
|
|
._rhsPriceAxisesContainer = new w.a(l, "right", o, u, d), this._paneCell =
|
|
document.createElement("td"), this._paneCell.classList.add("chart-markup-table",
|
|
"pane"), this._div = document.createElement("div"), this._div.classList.add(
|
|
"chart-gui-wrapper"), this._paneCell.appendChild(this._div), this
|
|
._canvasBinding = Object(S.createBoundCanvas)(this._div, new S.Size(16, 16)),
|
|
this._canvasBinding.subscribeCanvasConfigured(this._canvasConfiguredHandler);
|
|
const p = this._canvasBinding.canvas;
|
|
p.style.position = "absolute", p.style.left = "0", p.style.top = "0", this
|
|
._topCanvasBinding = Object(S.createBoundCanvas)(this._div, new S.Size(16, 16)),
|
|
this._topCanvasBinding.subscribeCanvasConfigured(this
|
|
._topCanvasConfiguredHandler);
|
|
const _ = this._topCanvasBinding.canvas;
|
|
_.style.position = "absolute", _.style.left = "0", _.style.top = "0", this
|
|
._rowElement = document.createElement("tr"), this._rowElement.appendChild(this
|
|
._lhsPriceAxisesContainer.getElement()), this._rowElement.appendChild(this
|
|
._paneCell), this._rowElement.appendChild(this._rhsPriceAxisesContainer
|
|
.getElement()), this._options.legendWidgetEnabled && (this._options
|
|
.customLegendWidgetFactories && (this._customLegendWidgetsFactoryMap = this
|
|
._options.customLegendWidgetFactories), this
|
|
._loadAndCreateLegendWidget()), this._state && !this._chart.readOnly() &&
|
|
this._options.controlsEnabled && this._loadAndCreatePaneControlsWidget(),
|
|
Object(z.a)().subscribe(this._onMagnetStateChangedListener),
|
|
Object(Y.d)().subscribe(this._onShiftKeyStateChangedListener), this._paneCell
|
|
.addEventListener("dragover", e => {
|
|
e.dataTransfer && Array.from(e.dataTransfer.files).some(
|
|
blobImageFilter) && e.preventDefault()
|
|
})
|
|
}
|
|
destroy() {
|
|
this._chart.onPaneWidgetDestroyed(this), this._customLegendWidgetsFactoryMap
|
|
.clear(), this._topCanvasBinding.unsubscribeCanvasConfigured(this
|
|
._topCanvasConfiguredHandler), this._topCanvasBinding.destroy(), this
|
|
._canvasBinding.unsubscribeCanvasConfigured(this._canvasConfiguredHandler), this
|
|
._canvasBinding.destroy(), null !== this._hideNotMainSourcesInLegendSpawn &&
|
|
this._hideNotMainSourcesInLegendSpawn.destroy(), this._legendWidget && (this
|
|
._legendWidget.destroy(), this._legendWidget = null), null !== this
|
|
._paneControlsResizeObserver && this._paneControlsResizeObserver.disconnect(),
|
|
null !== this._paneControls && (this._paneControls.destroy(), this
|
|
._paneControls = null), this._lhsPriceAxisesContainer.destroy(), this
|
|
._rhsPriceAxisesContainer.destroy(), this.hasState() && (this.state()
|
|
.onDestroyed().unsubscribeAll(this), this.state()
|
|
.dataSourcesCollectionChanged().unsubscribeAll(this)), Object(z.a)()
|
|
.unsubscribe(this._onMagnetStateChangedListener), Object(Y.d)().unsubscribe(this
|
|
._onShiftKeyStateChangedListener), this._paneWidgetsSharedState
|
|
.onPaneDestroyed(this), null !== this._hideWholeLegend && (g.tool.unsubscribe(
|
|
this._recalculateLegendVisibility), this._chartModel().crossHairSource()
|
|
.measuringEnabled().unsubscribeAll(this))
|
|
}
|
|
size() {
|
|
return this._size
|
|
}
|
|
setSize(e) {
|
|
Object(r.assert)(e.w >= 0 && e.h >= 0, "Try to set invalid size to PaneWidget " +
|
|
JSON.stringify(e)), this._size.equals(e) || (this._size = e, this
|
|
._canvasBinding.resizeCanvas({
|
|
width: e.w,
|
|
height: e.h
|
|
}), this._topCanvasBinding.resizeCanvas({
|
|
width: e.w,
|
|
height: e.h
|
|
}), this._paneCell.style.width = e.w + "px", this._paneCell.style.height = e
|
|
.h + "px", this._div.style.width = e.w + "px", this._div.style.height = e
|
|
.h + "px", this._rowElement.classList.toggle("js-hidden", 0 === e.h),
|
|
null !== this._legendWidget && this._legendWidget.updateWidgetModeBySize(e),
|
|
null !== this._paneControls && this._paneControls.updateWidgetModeByWidth(e
|
|
.w))
|
|
}
|
|
width() {
|
|
return this._size.w
|
|
}
|
|
height() {
|
|
return this._size.h
|
|
}
|
|
backgroundColor() {
|
|
return this._chartModel().backgroundColor().value()
|
|
}
|
|
processDoubleClickOnSource(e, t) {
|
|
e.id() !== this._lastFinishedToolId && this._showEditDialogForSource(e, t)
|
|
}
|
|
setCursorForTool(e, t, i) {
|
|
if (t && t.control() && e) return void this._setCursorClassName("pointer");
|
|
if (void 0 !== i) {
|
|
switch (i) {
|
|
case j.PaneCursorType.VerticalResize:
|
|
this._setCursorClassName("ns-resize");
|
|
break;
|
|
case j.PaneCursorType.HorizontalResize:
|
|
this._setCursorClassName("ew-resize");
|
|
break;
|
|
case j.PaneCursorType.DiagonalNeSwResize:
|
|
this._setCursorClassName("nesw-resize");
|
|
break;
|
|
case j.PaneCursorType.DiagonalNwSeResize:
|
|
this._setCursorClassName("nwse-resize");
|
|
break;
|
|
case j.PaneCursorType.Default:
|
|
this._setCursorClassName("default");
|
|
break;
|
|
case j.PaneCursorType.Pointer:
|
|
this._setCursorClassName("pointer");
|
|
break;
|
|
case j.PaneCursorType.Grabbing:
|
|
this._setCursorClassName("grabbing")
|
|
}
|
|
return
|
|
}
|
|
const s = g.tool.value();
|
|
if (Object(g.toolIsCursor)(s)) {
|
|
if (null !== this._paneWidgetsSharedState.draggingSource() || this
|
|
._isScrolling || this._chartUndoModel() && this._chartUndoModel().model()
|
|
.sourcesBeingMoved().length) return void this._setCursorClassName(
|
|
"grabbing");
|
|
if (e && this._options.sourceSelectionEnabled) return void this
|
|
._setCursorClassName("pointer")
|
|
}
|
|
if ("eraser" === s) return void this._setCursorClassName("eraser");
|
|
if ("zoom" === s) return void this._setCursorClassName("zoom-in");
|
|
const r = g.cursorTool.value();
|
|
"dot" !== r ? "arrow" !== r ? this._setCursorClassName("") : this
|
|
._setCursorClassName("default") : this._setCursorClassName("dot")
|
|
}
|
|
showContextMenuForSelection(e) {
|
|
const t = this._chartUndoModel().selection();
|
|
if (t.isEmpty()) return;
|
|
const i = t.dataSources().filter(e => e.hasContextMenu());
|
|
this.showContextMenuForSources(i, e)
|
|
}
|
|
async showContextMenuForSources(e, t, i) {
|
|
if (!e.length) return Promise.resolve(null);
|
|
const s = e[0],
|
|
r = Object(c.merge)(Object(c.clone)(this._options.contextMenu), i || {}),
|
|
n = new E.ActionsProvider(this._chart, r);
|
|
if (s === this._chartUndoModel().crossHairSource()) return s.handleContextMenuEvent(
|
|
t), Promise.resolve(null); {
|
|
const i = await n.contextMenuActionsForSources(e);
|
|
return 0 === i.length ? Promise.resolve(null) : k.ContextMenuManager.createMenu(
|
|
i).then(e => (e.show(t), e))
|
|
}
|
|
}
|
|
leftPriceAxisesContainer() {
|
|
return this._lhsPriceAxisesContainer
|
|
}
|
|
rightPriceAxisesContainer() {
|
|
return this._rhsPriceAxisesContainer
|
|
}
|
|
setPriceAxisSizes(e, t, i) {
|
|
this._priceAxisesContainer(e).setSizes(t, i)
|
|
}
|
|
state() {
|
|
return Object(r.ensureNotNull)(this._state)
|
|
}
|
|
hasState() {
|
|
return null !== this._state
|
|
}
|
|
setState(e) {
|
|
this._state !== e && (this.hasState() && (this.state().onDestroyed().unsubscribeAll(
|
|
this), this.state().dataSourcesCollectionChanged().unsubscribeAll(
|
|
this)), this._state = e, this.hasState() && (this.state().onDestroyed()
|
|
.subscribe(this, this._onStateDestroyed, !0), this.state()
|
|
.dataSourcesCollectionChanged().subscribe(this, this
|
|
._onDataSourcesCollectionChanged), this.updatePriceAxisWidgets()))
|
|
}
|
|
getScreenshotData(e) {
|
|
const t = [],
|
|
i = [];
|
|
let s, r = [];
|
|
const n = this.state().sourcesByGroup().allExceptSpecialSources().slice().reverse(),
|
|
o = this._chart.properties().childs().paneProperties.childs().legendProperties
|
|
.childs();
|
|
for (const a of n) {
|
|
const n = a.statusView();
|
|
Object(_.isStudy)(a) && (o.showLegend.value() || (null == e ? void 0 : e
|
|
.showCollapsedStudies)) ? a.properties().visible.value() && n && o
|
|
.showStudyTitles.value() && (t.push(a.statusProvider(null == e ? void 0 : e
|
|
.status).text()), i.push(a.valuesProvider().getValues(null))) : a ===
|
|
this._chartModel().mainSeries() && n && o.showSeriesTitle.value() && (s = a
|
|
.statusProvider((null == e ? void 0 : e.status) || {}).text(), r = a
|
|
.valuesProvider().getValues(null))
|
|
}
|
|
return {
|
|
type: "pane",
|
|
leftAxis: this._lhsPriceAxisesContainer.getScreenshotData(),
|
|
rightAxis: this._rhsPriceAxisesContainer.getScreenshotData(),
|
|
content: this._canvasBinding.canvas.toDataURL(),
|
|
canvas: this._canvasBinding.canvas,
|
|
contentWidth: this._size.w,
|
|
contentHeight: this._size.h,
|
|
studies: t,
|
|
studiesValues: i,
|
|
containsMainSeries: this.containsMainSeries(),
|
|
mainSeriesText: s,
|
|
mainSeriesValues: r
|
|
}
|
|
}
|
|
hardResetCanvas() {
|
|
this._size.equals(new S.Size(0, 0)) || (Object(S.hardResizeCanvas)(this
|
|
._canvasBinding, this._size),
|
|
Object(S.hardResizeCanvas)(this._topCanvasBinding, this._size), this
|
|
._lhsPriceAxisesContainer.hardResetCanvas(), this._rhsPriceAxisesContainer
|
|
.hardResetCanvas())
|
|
}
|
|
updatePriceAxisWidgets() {
|
|
if (!this.hasState()) return;
|
|
const e = this._chartModel(),
|
|
t = e.paneForSource(e.mainSeries());
|
|
if (!t) return;
|
|
const i = e.priceScaleSlotsCount(),
|
|
s = this.state(),
|
|
r = s.visibleLeftPriceScales(),
|
|
n = s.visibleRightPriceScales();
|
|
this._lhsPriceAxisesContainer.setScales(r, i.left, t.leftPriceScales().length, i
|
|
.left + i.right), this._rhsPriceAxisesContainer.setScales(n, i.right, t
|
|
.rightPriceScales().length, i.left + i.right)
|
|
}
|
|
update() {
|
|
this.hasState() && (this._lhsPriceAxisesContainer.update(), this
|
|
._rhsPriceAxisesContainer.update(), null !== this._legendWidget && this
|
|
._legendWidget.update(), this.updateControls())
|
|
}
|
|
updateStatusWidget(e = q.InvalidationLevel.None) {
|
|
this.hasState() && null !== this._legendWidget && (e === q.InvalidationLevel.Full ?
|
|
this._legendWidget.updateLayout() : this._legendWidget.update())
|
|
}
|
|
updateControls() {
|
|
this.hasState() && null !== this._paneControls && this._paneControls.update()
|
|
}
|
|
updateThemedColors(e, t) {
|
|
this._themedTopColor = e, this._themedBottomColor = t, this._updateByThemedColors()
|
|
}
|
|
statusWidget() {
|
|
return this._legendWidget
|
|
}
|
|
getElement() {
|
|
return this._rowElement
|
|
}
|
|
canvasElement() {
|
|
return this._canvasBinding.canvas
|
|
}
|
|
hasCanvas(e) {
|
|
return this._canvasBinding.canvas === e || this._topCanvasBinding.canvas === e
|
|
}
|
|
pinchStartEvent() {
|
|
null === this._paneWidgetsSharedState.scrollingPane() && null === this
|
|
._paneWidgetsSharedState.pinchingPane() && (this._onTouchEvent(), this._options
|
|
.handleScale.pinch && (this._terminateActiveAnimations(), this
|
|
._prevPinchScale = 1, this._pinching = !0, this._wasPinched = !0, this
|
|
._paneWidgetsSharedState.setPinchingPane(this)))
|
|
}
|
|
pinchEvent(e, t) {
|
|
if (null !== this._paneWidgetsSharedState.scrollingPane() || this
|
|
._paneWidgetsSharedState.pinchingPane() !== this) return;
|
|
if (this._onTouchEvent(), !this._options.handleScale.pinch) return;
|
|
const i = 10 * (t - this._prevPinchScale);
|
|
this._prevPinchScale = t, this._chartModel().zoomTime(e.x, i, !0), this
|
|
._prevPinchScale = t
|
|
}
|
|
pinchEndEvent() {
|
|
null === this._paneWidgetsSharedState.scrollingPane() && this
|
|
._paneWidgetsSharedState.pinchingPane() === this && (this._onTouchEvent(), this
|
|
._pinching = !1, this._paneWidgetsSharedState.setPinchingPane(null))
|
|
}
|
|
mouseClickEvent(e) {
|
|
this._onMouseEvent(), this._mouseClickOrTapEvent(e)
|
|
}
|
|
tapEvent(e) {
|
|
this._preventTouchEventsExceptPinch() || (this._onTouchEvent(), this
|
|
._mouseClickOrTapEvent(e))
|
|
}
|
|
mouseDownEvent(e) {
|
|
this._onMouseEvent(), this.hasState() && this._mouseDownOrTouchStartEvent(e, Object(
|
|
r.ensureNotNull)(this._dataSourceAtPoint(e.localX, e.localY)))
|
|
}
|
|
touchStartEvent(e) {
|
|
if (this._paneWidgetsSharedState.startTouch(this), this
|
|
._preventTouchEventsExceptPinch()) return;
|
|
const t = this._chartModel().crossHairSource(),
|
|
i = !this._trackCrosshairOnlyAfterLongTap && t.pane === this._state && Number
|
|
.isFinite(t.originX()) && Number.isFinite(t.originY()) && Math.abs(t.originX() -
|
|
e.localX) + Math.abs(t.originY() - e.localY) < 5;
|
|
this._onTouchEvent(), this._chart.setActivePaneWidget(this);
|
|
const s = Object(r.ensureNotNull)(this._dataSourceAtPoint(e.localX, e.localY));
|
|
i && (s.source === t || t.selectPointMode().value() ? this.startTrackingMode(new n
|
|
.Point(e.localX, e.localY), new n.Point(e.localX, e.localY)) : !this
|
|
._chart.readOnly() && Object(f.isLineTool)(s.source) && s.source
|
|
.userEditEnabled() && this._chartUndoModel().selectionMacro(e => {
|
|
var t;
|
|
e.clearSelection(), e.addSourceToSelection(s.source, null === (t = s
|
|
.hittest) || void 0 === t ? void 0 : t.data())
|
|
})), this._mouseDownOrTouchStartEvent(e, s), this._mouseOrTouchMoveEvent(e)
|
|
}
|
|
mouseUpEvent(e) {
|
|
this._onMouseEvent(), this._mouseUpOrTouchEndEvent(e)
|
|
}
|
|
touchEndEvent(e) {
|
|
this._paneWidgetsSharedState.endTouch(this), this
|
|
._preventTouchEventsExceptPinch() || (this._onTouchEvent(), this
|
|
._mouseOrTouchLeaveEvent(e), this._mouseUpOrTouchEndEvent(e))
|
|
}
|
|
mouseMoveEvent(e) {
|
|
this._onMouseEvent(), this._mouseOrTouchMoveEvent(e)
|
|
}
|
|
pressedMouseMoveEvent(e) {
|
|
this._onMouseEvent(), this._pressedMouseOrTouchMoveEvent(e)
|
|
}
|
|
touchMoveEvent(e) {
|
|
this._preventTouchEventsExceptPinch() || (this._onTouchEvent(), this
|
|
._pressedMouseOrTouchMoveEvent(e))
|
|
}
|
|
mouseLeaveEvent(e) {
|
|
this._onMouseEvent(), this._mouseOrTouchLeaveEvent(e)
|
|
}
|
|
mouseDoubleClickEvent(e) {
|
|
this._onMouseEvent(), this._mouseDoubleClickOrDoubleTapEvent(e)
|
|
}
|
|
wheelClickEvent(e) {
|
|
var t, i;
|
|
if (this._chart.readOnly()) return;
|
|
const s = this._dataSourceAtPoint(e.localX, e.localY);
|
|
if (null === s || s.isCustom || null === s.source) return;
|
|
if (((null === (t = s.hittest) || void 0 === t ? void 0 : t.result()) || 0) <= u
|
|
.HitTestResult.MOVEPOINT_BACKGROUND) return;
|
|
const n = new p.a(e),
|
|
o = null === (i = s.hittest) || void 0 === i ? void 0 : i.eraseMarker();
|
|
if (n.control() && void 0 !== o && s.source.processErase) return void s.source
|
|
.processErase(this._chartUndoModel(), o);
|
|
const a = this._chartUndoModel();
|
|
a.selection().isSelected(s.source) || a.selectionMacro(e => {
|
|
e.clearSelection();
|
|
const t = Object(r.ensureNotNull)(s.source);
|
|
e.addSourceToSelection(t, ne(s, t))
|
|
}), this._chart.removeSelectedSources()
|
|
}
|
|
doubleTapEvent(e) {
|
|
this._preventTouchEventsExceptPinch() || (this._onTouchEvent(), this
|
|
._mouseDoubleClickOrDoubleTapEvent(e))
|
|
}
|
|
longTapEvent(e) {
|
|
this._preventTouchEventsExceptPinch() || (this._onTouchEvent(), this._longTap = !0,
|
|
null === this._startTrackPoint && this._trackingModeShouldBeActive() && this
|
|
.startTrackingMode(new n.Point(e.localX, e.localY), new n.Point(e.localX, e
|
|
.localY), new p.a(e)))
|
|
}
|
|
mouseEnterEvent(e) {
|
|
this._onMouseEvent(), this.hasState() && (this._chart.setActivePaneWidget(this),
|
|
this._setCursorPosition(e.localX, e.localY, new p.a(e)))
|
|
}
|
|
contextMenuEvent(e) {
|
|
this._onMouseEvent(), this._contextMenuEvent(e)
|
|
}
|
|
touchContextMenuEvent(e) {
|
|
this._preventTouchEventsExceptPinch() || (this._onTouchEvent(), this
|
|
._contextMenuEvent(e))
|
|
}
|
|
mouseDownOutsideEvent() {
|
|
this._processOutsideClick({
|
|
hittest: null,
|
|
isCustom: !1,
|
|
renderer: null,
|
|
source: null
|
|
})
|
|
}
|
|
cancelZoom() {
|
|
this._chartModel().crossHairSource().clearSelection(), this._firstZoomPoint = null,
|
|
this._preventCrossHairMove() && this._clearCursorPosition()
|
|
}
|
|
startTrackingMode(e, t, i) {
|
|
this._startChangeLineToolParams = null, this._startMoveSourceParams = null, this
|
|
._currentChangingLineToolHitTest = null, this._chartUndoModel().selectionMacro(
|
|
e => e.clearSelection()), this._startTrackPoint = e, this
|
|
._exitTrackingModeOnNextTry = !1, this._setCursorPosition(t.x, t.y, i),
|
|
this._initCrossHairPosition = this._chartModel().crossHairSource()
|
|
.currentPoint()
|
|
}
|
|
setDragToAnotherPaneCursor() {
|
|
this._setCursorClassName("grabbing")
|
|
}
|
|
cloneLineTools(e, t) {
|
|
return this._chartUndoModel().cloneLineTools(e, t)
|
|
}
|
|
exitTrackingMode() {
|
|
null !== this._state && null !== this._startTrackPoint && (this
|
|
._exitTrackingModeOnNextTry = !0, this._tryExitTrackingMode())
|
|
}
|
|
trackingModeEnabled() {
|
|
return null !== this._state && null !== this._startTrackPoint
|
|
}
|
|
addCustomWidgetToLegend(e, t) {
|
|
this._options.legendWidgetEnabled && (this._customLegendWidgetsFactoryMap.set(e, t),
|
|
null !== this._legendWidget && this._legendWidget.addCustomWidgetToLegend(e,
|
|
t))
|
|
}
|
|
containsMainSeries() {
|
|
return !!this.hasState() && this.state().containsMainSeries()
|
|
}
|
|
paint(e, t) {
|
|
if (!this._chartUndoModel() || !this.hasState()) return;
|
|
this._state && (e.priceScaleSideMaxLevel("left") > q.InvalidationLevel.Cursor || e
|
|
.priceScaleSideMaxLevel("right") > q.InvalidationLevel.Cursor) && (this
|
|
._recalculatePriceScales(), this._chartModel()
|
|
.updateCrosshairPositionByOriginCoords());
|
|
const i = e.fullInvalidation();
|
|
if (i > q.InvalidationLevel.Cursor) {
|
|
const e = this._chartModel().crossHairSource(),
|
|
t = e.originX(),
|
|
i = e.originY();
|
|
if (e.pane === this._state && Number.isFinite(t) && Number.isFinite(i)) {
|
|
const e = this._dataSourceAtPoint(t, i);
|
|
null !== e && this._updateHoveredSource(e, Object(Y.b)())
|
|
}
|
|
}
|
|
if (this._lhsPriceAxisesContainer.paint(e
|
|
.getterForPriceScaleInvalidationLevelBySide("left")), this
|
|
._rhsPriceAxisesContainer.paint(e.getterForPriceScaleInvalidationLevelBySide(
|
|
"right")), i !== q.InvalidationLevel.None) {
|
|
if (i > q.InvalidationLevel.Cursor) {
|
|
const e = Object(r.ensureNotNull)(this._canvasBinding.canvas.getContext(
|
|
"2d"));
|
|
e.setTransform(1, 0, 0, 1, 0, 0);
|
|
const i = this._canvasRenderParams();
|
|
this._drawBackground(e, i), this._state && this._drawSources(e, i, t)
|
|
}
|
|
if (this._state) {
|
|
const e = Object(r.ensureNotNull)(this._topCanvasBinding.canvas.getContext(
|
|
"2d"));
|
|
e.setTransform(1, 0, 0, 1, 0, 0);
|
|
const t = this._topCanvasRenderParams();
|
|
e.clearRect(0, 0, Math.ceil(this._size.w * t.pixelRatio), Math.ceil(this
|
|
._size.h * t.pixelRatio)), this._drawSeriesTopViews(e, t), this
|
|
._drawCrossHair(e, t), this._drawActiveLineTools(e, t)
|
|
}
|
|
}
|
|
}
|
|
cancelCreatingLineTool() {
|
|
const e = this._chartUndoModel(),
|
|
t = this._chartUndoModel().lineBeingCreated();
|
|
if (t)
|
|
if (t.pointsCount() <= 0) {
|
|
const i = t.points();
|
|
if (i.length > 2) {
|
|
const s = i[i.length - 2];
|
|
e.continueCreatingLine(s), this._finishTool(t)
|
|
} else e.cancelCreatingLine()
|
|
} else e.cancelCreatingLine();
|
|
null !== this._firstZoomPoint && this.cancelZoom(), this.setCursorForTool()
|
|
}
|
|
cancelMeasuring() {
|
|
this._chartUndoModel().crossHairSource().clearMeasure(), Object(g.resetToCursor)(),
|
|
this.setCursorForTool()
|
|
}
|
|
_topCanvasRenderParams() {
|
|
return {
|
|
pixelRatio: this._topCanvasBinding.pixelRatio,
|
|
physicalWidth: this._topCanvasBinding.canvas.width,
|
|
physicalHeight: this._topCanvasBinding.canvas.height,
|
|
cssWidth: this._chartModel().timeScale().width(),
|
|
cssHeight: this.height()
|
|
}
|
|
}
|
|
_canvasRenderParams() {
|
|
return {
|
|
pixelRatio: this._canvasBinding.pixelRatio,
|
|
physicalWidth: this._canvasBinding.canvas.width,
|
|
physicalHeight: this._canvasBinding.canvas.height,
|
|
cssWidth: this._chartModel().timeScale().width(),
|
|
cssHeight: this.height()
|
|
}
|
|
}
|
|
_tryExitTrackingMode(e) {
|
|
this._exitTrackingModeOnNextTry && (this._startTrackPoint = null, e || this
|
|
._clearCursorPosition())
|
|
}
|
|
_tryStartMeasure(e, t, i, s, r) {
|
|
return !(!Object(g.toolIsMeasure)(g.tool.value()) || t.startMeasurePoint()) && (e
|
|
.isTouch || this._preventCrossHairMove() || this._setCursorPosition(e
|
|
.localX, e.localY, i), s = this._chartModel().magnet().align(s, r, this
|
|
.state()), t.startMeasuring({
|
|
price: s,
|
|
index: r
|
|
}, this.state()), !0)
|
|
}
|
|
_tryFinishMeasure(e, t) {
|
|
if (t.startMeasurePoint() && !t.endMeasurePoint()) {
|
|
let i = t.price;
|
|
const s = t.index;
|
|
return i = this._chartModel().magnet().align(i, s, this.state()), t
|
|
.finishMeasure({
|
|
price: i,
|
|
index: s
|
|
}), e.isTouch ? Object(g.resetToCursor)() : this._needResetMeasureLater = !
|
|
0, this._preventCrossHairMove() && this._clearCursorPosition(), !0
|
|
}
|
|
return !1
|
|
}
|
|
_tryStartZoom(e, t, i, s) {
|
|
const r = this._chart.model().model().zoomEnabled();
|
|
if ("zoom" === g.tool.value() && r) {
|
|
const r = this._chartUndoModel(),
|
|
n = r.timeScale().indexToCoordinate(i) - .5 * r.timeScale().barSpacing();
|
|
return this._firstZoomPoint = {
|
|
price: t,
|
|
index: i,
|
|
x: n,
|
|
y: e.localY
|
|
}, this._preventCrossHairMove() || this._setCursorPosition(e.localX, e
|
|
.localY, s), this._chartModel().crossHairSource().startSelection(this
|
|
.state()), !0
|
|
}
|
|
return !1
|
|
}
|
|
_finishZoom(e) {
|
|
const t = this.state(),
|
|
i = t.defaultPriceScale(),
|
|
s = Object(r.ensureNotNull)(t.mainDataSource()).firstValue(),
|
|
n = i.coordinateToPrice(e.localY, Object(r.ensureNotNull)(s)),
|
|
o = this._chartUndoModel(),
|
|
a = Math.round(o.timeScale().coordinateToIndex(e.localX)),
|
|
l = Object(r.ensureNotNull)(this._firstZoomPoint);
|
|
a !== l.index && o.zoomToViewport(l.index, a, l.price, n, t), this._chartModel()
|
|
.crossHairSource().clearSelection(), this._firstZoomPoint = null, Object(g
|
|
.resetToCursor)(), this._preventCrossHairMove() && this
|
|
._clearCursorPosition()
|
|
}
|
|
_tryFinishZoom(e) {
|
|
return null !== this._firstZoomPoint && (this._finishZoom(e), !0)
|
|
}
|
|
_tryHandleEraserMouseDown(e, t) {
|
|
if (e.source && "eraser" === g.tool.value() && !e.isCustom && (!(i = e.source) || !i
|
|
.customization || !i.customization.disableErasing)) {
|
|
const i = this._chartUndoModel();
|
|
if (null !== e.hittest && (Object(f.isLineTool)(e.source) || Object(_.isStudy)(e
|
|
.source))) {
|
|
const s = e.hittest.eraseMarker();
|
|
return t.control() && void 0 !== s && e.source.processErase ? e.source
|
|
.processErase(i, s) : i.removeSource(e.source, !1), !0
|
|
}
|
|
}
|
|
var i;
|
|
return !1
|
|
}
|
|
_tryStartChangingLineTool(e, t, i, s) {
|
|
var n, o;
|
|
if (e.isTouch && null !== this._startTrackPoint) return !1;
|
|
const a = t.hittest;
|
|
if ((!e.isTouch || !this._preventSourceChange) && a && Object(f.isLineTool)(t
|
|
.source) && a.result() === u.HitTestResult.CHANGEPOINT) {
|
|
const l = this._chartUndoModel(),
|
|
c = Object(r.ensure)(null === (n = this.state().mainDataSource()) ||
|
|
void 0 === n ? void 0 : n.firstValue()),
|
|
h = Object(r.ensureNotNull)(t.source.priceScale()).coordinateToPrice(e
|
|
.localY, c);
|
|
l.selectionMacro(e => {
|
|
e.clearSelection(), e.addSourceToSelection(t.source, a.data())
|
|
});
|
|
const u = l.model().magnet().align(h, s, this.state()),
|
|
d = null === (o = a.data()) || void 0 === o ? void 0 : o.pointIndex;
|
|
return this._startChangeLineToolParams = {
|
|
source: t.source,
|
|
startPoint: {
|
|
index: s,
|
|
price: u
|
|
},
|
|
screenPoint: {
|
|
x: e.localX,
|
|
y: e.localY
|
|
},
|
|
pointIndex: d,
|
|
envState: i
|
|
}, !0
|
|
}
|
|
return this._startChangeLineToolParams = null, !1
|
|
}
|
|
_tryStartCloning(e, t, i, s) {
|
|
if (i.control()) {
|
|
const t = this._chartUndoModel().selection().dataSources().filter(e => e
|
|
.cloneable());
|
|
if (s && s.cloneable() && t.push(s), t.length > 0) return this
|
|
._clonningAtMoveLineTools = t.map(e => e.id()), this
|
|
._startCloningPoint = new n.Point(e.localX, e.localY), !0
|
|
}
|
|
return !1
|
|
}
|
|
_tryFinishClonning(e, t, i) {
|
|
const s = this._chartUndoModel(),
|
|
o = this._chartModel();
|
|
if (t.control() && this._clonningAtMoveLineTools) {
|
|
const a = new n.Point(e.localX, e.localY),
|
|
l = Object(r.ensureNotNull)(this._startCloningPoint).subtract(a).length(),
|
|
c = [];
|
|
for (const e of this._clonningAtMoveLineTools) {
|
|
const t = o.dataSourceForId(e);
|
|
null !== t && c.push(t)
|
|
}
|
|
if (0 === c.length) return !1;
|
|
if (l > 8) {
|
|
const o = this.cloneLineTools(c, !0).map(e => Object(r.ensureNotNull)(s
|
|
.model().dataSourceForId(e)));
|
|
s.selectionMacro(e => {
|
|
e.clearSelection();
|
|
let t = null;
|
|
o.forEach(s => {
|
|
null === t && (t = ne(i, s)), e
|
|
.addSourceToSelection(s, t)
|
|
})
|
|
});
|
|
const a = new n.Point(e.localX, e.localY),
|
|
l = Object(r.ensureNotNull)(o[0].priceScale()),
|
|
h = Object(r.ensureNotNull)(this.state().mainDataSource()).firstValue(),
|
|
u = {
|
|
index: s.timeScale().coordinateToIndex(e.localX),
|
|
price: l.coordinateToPrice(e.localY, Object(r.ensureNotNull)(h))
|
|
};
|
|
s.startMovingSources(o, {
|
|
logical: u,
|
|
screen: a
|
|
}, null, t), this._clonningAtMoveLineTools = null, this
|
|
._startCloningPoint = null
|
|
}
|
|
return !0
|
|
}
|
|
return !1
|
|
}
|
|
_mouseDownEventForLineTool(e, t, i, s) {
|
|
var o, a;
|
|
const l = g.tool.value();
|
|
if (!this.hasState() || Object(B.isLineToolDrawWithoutPoints)(l)) return;
|
|
const c = this._chartUndoModel();
|
|
let h = !1,
|
|
u = null;
|
|
Object(g.hideAllDrawings)().value() && Object(g.hideAllIndicators)().setValue(!1),
|
|
Object(g.hideAllDrawings)().setValue(!1), Object(g.lockDrawings)().setValue(!1),
|
|
e.isTouch && (Object(f.isLineToolName)(l) && !Object(B
|
|
.isLineDrawnWithPressedButton)(l) || c.lineBeingCreated()) && this
|
|
._initToolCreationModeParams(e);
|
|
const d = c.lineBeingCreated();
|
|
if (d && !Object(B.isLineDrawnWithPressedButton)(d.toolname)) {
|
|
const l = Object(r.ensure)(null === (o = d.ownerSource()) || void 0 === o ?
|
|
void 0 : o.firstValue());
|
|
if (e.isTouch) {
|
|
if (!this._startTouchPoint) {
|
|
this._startTouchPoint = new n.Point(e.pageX, e.pageY);
|
|
const t = d.points(),
|
|
i = t[t.length - 1],
|
|
s = c.timeScale().indexToCoordinate(i.index),
|
|
o = Object(r.ensureNotNull)(d.priceScale()).priceToCoordinate(i
|
|
.price, l);
|
|
return void(this._initCrossHairPosition = new n.Point(s, o))
|
|
}
|
|
} else {
|
|
u = d;
|
|
const n = c.model().paneForSource(d);
|
|
if (n !== this._state && null !== n) {
|
|
const i = this._externalPaneXCoord(n, e.localX),
|
|
s = this._externalPaneYCoord(n, e.localY);
|
|
h = c.continueCreatingLine({
|
|
index: Math.round(c.timeScale().coordinateToIndex(i)),
|
|
price: Object(r.ensure)(null === (a = d.priceScale()) ||
|
|
void 0 === a ? void 0 : a.coordinateToPrice(s, l))
|
|
}, t)
|
|
} else {
|
|
const e = c.model().magnet().align(s, i, this.state());
|
|
h = c.continueCreatingLine({
|
|
index: i,
|
|
price: e
|
|
}, t)
|
|
}
|
|
}
|
|
} else if (!e.isTouch || Object(B.isLineDrawnWithPressedButton)(l)) {
|
|
const e = {
|
|
index: i,
|
|
price: c.model().magnet().align(s, i, this.state())
|
|
};
|
|
u = c.createLineTool(this.state(), e, l), c.lineBeingCreated() || (h = !0)
|
|
}
|
|
const p = Object(r.ensureNotNull)(this._dataSourceAtPoint(e.localX, e.localY));
|
|
u && c.selectionMacro(e => {
|
|
var t;
|
|
return e.addSourceToSelection(Object(r.ensureNotNull)(u), null === (t =
|
|
p.hittest) || void 0 === t ? void 0 : t.data())
|
|
}), h && u && (this._finishTool(u, p),
|
|
e.preventDefault())
|
|
}
|
|
_handleSelectionMouseDownAndGetJustDeselectedSource(e, t, i) {
|
|
const s = this._chartUndoModel();
|
|
let r = null;
|
|
if (null === t.source || t.source.isSelectionEnabled()) {
|
|
let n = e.isTouch ? Boolean(t.hittest && t.hittest.result() >= u.HitTestResult
|
|
.MOVEPOINT_BACKGROUND) : Boolean(t.hittest && t.hittest.result() > u
|
|
.HitTestResult.MOVEPOINT_BACKGROUND);
|
|
this._preventSourceChange && (n = !1), s.selectionMacro(e => {
|
|
var s;
|
|
n && t.source ? (i.control() || e.selection().isSelected(t
|
|
.source) || e.clearSelection(), i.control() && e
|
|
.selection()
|
|
.isSelected(t.source) ? (r = t.source, e
|
|
.removeSourceFromSelection(t.source)) : e
|
|
.addSourceToSelection(t.source, null === (s = t.hittest) ||
|
|
void 0 === s ? void 0 : s.data()), e.selection()
|
|
.allSources().length > 1 && Object(W.trackEvent)("GUI",
|
|
"Multiselect", "Click Select")) : i.control() || e
|
|
.clearSelection()
|
|
})
|
|
}
|
|
return r
|
|
}
|
|
_processMouseMoveWhileZoom(e, t) {
|
|
this._preventCrossHairMove() || this._setCursorPosition(e.localX, e.localY, t)
|
|
}
|
|
_updateCommonTooltip(e, t) {
|
|
let i = null;
|
|
if (null !== e && null !== e.hittest) {
|
|
const t = e.hittest.data();
|
|
t && (i = t.tooltip || null)
|
|
}
|
|
const s = this._lastCommonTooltipData;
|
|
if (null === s && null === i) return;
|
|
if (null === i || "" === i.text) return this._lastCommonTooltipData = null,
|
|
void Object(F.a)(t);
|
|
if (s && i.text === s.text && i.rect && s.rect && i.rect.x === s.rect.x && i.rect
|
|
.y === s.rect.y && i.rect.w === s.rect.w && i.rect.h === s.rect.h) return;
|
|
this._lastCommonTooltipData = i;
|
|
const r = Object(c.clone)(i);
|
|
if (void 0 !== r.rect) {
|
|
const e = this._paneCell.getBoundingClientRect();
|
|
r.rect.x += e.left, r.rect.y += e.top
|
|
}
|
|
Object(F.b)(r)
|
|
}
|
|
_setCursorPositionOnExternalPane(e, t, i, s) {
|
|
t = this._externalPaneXCoord(e, t), i = this._externalPaneYCoord(e, i);
|
|
this._chart.paneByState(e)._setCursorPosition(t, i, s)
|
|
}
|
|
_setCursorPosition(e, t, i) {
|
|
this._chartModel().setAndSaveCurrentPosition(this._correctXCoord(e), this
|
|
._correctYCoord(t), this.state(), i)
|
|
}
|
|
_setCursorClassName(e) {
|
|
let t = "";
|
|
e && (t = "pane--cursor-" + e), this._currentCursorClassName !== t && (this
|
|
._currentCursorClassName && this._paneCell.classList.remove(this
|
|
._currentCursorClassName), t && this._paneCell.classList.add(t), this
|
|
._currentCursorClassName = t, this._paneCell.style.cursor)
|
|
}
|
|
_processMouseUpOrTouchEndHandler(e) {
|
|
var t;
|
|
null === (t = Object(r.ensureNotNull)(this._dataSourceAtPoint(e.localX, e.localY))
|
|
.hittest) || void 0 === t || t.tryCallMouseUpOrTouchEndHandler(e)
|
|
}
|
|
_crossHairShouldBeVisible() {
|
|
const e = this._chartModel().crossHairSource();
|
|
return Object(f.isLineToolName)(g.tool.value()) || Object(g.toolIsMeasure)(g.tool
|
|
.value()) || e.startMeasurePoint() && !e.endMeasurePoint() || null !== this
|
|
._firstZoomPoint || null !== this._chartModel().lineBeingEdited() || null !==
|
|
this._chartModel().lineBeingCreated()
|
|
}
|
|
_clearCursorPosition() {
|
|
this._chartModel().clearCurrentPosition()
|
|
}
|
|
_dataSourceAtPoint(e, t) {
|
|
let i = null,
|
|
s = null,
|
|
r = null;
|
|
if (!this.hasState()) return null;
|
|
const o = this.state(),
|
|
a = o.height(),
|
|
l = o.width();
|
|
let c = !1;
|
|
if (this._currentChangingLineToolHitTest) return this
|
|
._currentChangingLineToolHitTest;
|
|
const h = (e, t, n, o) => {
|
|
const a = r ? r.result() : 0;
|
|
e.result() > a && (r = e, i = t, s = n, c = o)
|
|
},
|
|
u = this._canvasRenderParams(),
|
|
p = new n.Point(e, t),
|
|
_ = this._chartUndoModel();
|
|
this._hitTestChartSources(u, [_.crossHairSource()], p, h),
|
|
this._hitTestCustomSources(u, o.customSources(d.CustomSourceLayer.Topmost), p,
|
|
h);
|
|
const m = o.sourcesByGroup();
|
|
this._hitTestChartSources(u, m.tradingSources(), p, h), this._hitTestCustomSources(
|
|
u, o.customSources(d.CustomSourceLayer.Foreground), p, h);
|
|
const f = [...this._chartModel().multiPaneSources(o), ...m.hitTestSources()];
|
|
if (this._hitTestChartSources(u, f, p, h), this.containsMainSeries()) {
|
|
const e = _.barsMarksSources();
|
|
for (let t = 0; t < e.length; ++t) {
|
|
const i = e[t],
|
|
s = i.paneViews(o) || [];
|
|
let r, n;
|
|
for (let e = 0; e < s.length; e++) r = s[e].renderer(a, l), null !== r && (
|
|
n = r.hitTest(p, u), n && h(n, i, r, !1))
|
|
}
|
|
const t = _.activeStrategySource().value();
|
|
if (null !== t) {
|
|
const e = t.strategyOrdersPaneView();
|
|
if (null !== e) {
|
|
const i = e.renderer(a, l);
|
|
if (null !== i) {
|
|
const e = i.hitTest(p, u);
|
|
e && h(e, t, i, !1)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return null === i && this._hitTestCustomSources(u, o.customSources(d
|
|
.CustomSourceLayer.Background), p, h), {
|
|
source: i,
|
|
hittest: r,
|
|
renderer: s,
|
|
isCustom: c
|
|
}
|
|
}
|
|
_hitTestCustomSources(e, t, i, s) {
|
|
const n = Object(r.ensureNotNull)(this._state),
|
|
o = n.height(),
|
|
a = n.width();
|
|
for (let r = t.length - 1; r >= 0; --r) {
|
|
const l = t[r],
|
|
c = l.paneViews(n);
|
|
if (0 !== c.length)
|
|
for (let t = c.length - 1; t >= 0; --t) {
|
|
const r = c[t].renderer(o, a);
|
|
if (null !== r) {
|
|
const t = r.hitTest(i, e);
|
|
null !== t && s(t, l, r, !0)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
_hitTestChartSources(e, t, i, s) {
|
|
const n = Object(r.ensureNotNull)(this._state),
|
|
o = n.height(),
|
|
a = n.width();
|
|
for (let r = t.length; 0 < r--;) {
|
|
const l = t[r],
|
|
c = l.paneViews(n);
|
|
if (null !== c)
|
|
for (let t = c.length; 0 < t--;) {
|
|
const r = c[t].renderer(o, a);
|
|
if (r && r.hitTest) {
|
|
const t = r.hitTest(i, e);
|
|
null !== t && s(t, l, r, !1)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
_tryStartMovingLineTool(e, t, i, s) {
|
|
var o, a;
|
|
if (null === t.source || !t.source.movable() || null !== this._startTrackPoint)
|
|
return !1;
|
|
if (!this._preventSourceChange) {
|
|
const l = this._chartUndoModel(),
|
|
c = Object(r.ensureNotNull)(Object(r.ensureNotNull)(this._state)
|
|
.mainDataSource()).firstValue(),
|
|
h = Object(r.ensureNotNull)(t.source.priceScale()).coordinateToPrice(e
|
|
.localY, Object(r.ensureNotNull)(c)),
|
|
u = (t.source.isSelectionEnabled() ? l.selection().allSources() : [t
|
|
.source
|
|
]).filter(K),
|
|
d = new n.Point(e.localX, e.localY),
|
|
p = {
|
|
index: s,
|
|
price: h
|
|
},
|
|
_ = null === (a = null === (o = t.hittest) || void 0 === o ? void 0 : o
|
|
.data()) || void 0 === a ? void 0 : a.activeItem;
|
|
return this._startMoveSourceParams = {
|
|
source: u,
|
|
startPoint: {
|
|
logical: p,
|
|
screen: d
|
|
},
|
|
itemIndex: void 0 === _ ? null : _,
|
|
envState: i
|
|
}, !0
|
|
}
|
|
return this._startMoveSourceParams = null, !1
|
|
}
|
|
_chartModel() {
|
|
return this._chart.model().model()
|
|
}
|
|
_chartUndoModel() {
|
|
return this._chart.model()
|
|
}
|
|
_externalPaneXCoord(e, t) {
|
|
t += this._div.getBoundingClientRect().left + document.body.scrollLeft;
|
|
const i = Object(r.ensureNotNull)(this._chart.paneByState(e)),
|
|
s = i._div.getBoundingClientRect().left + document.body.scrollLeft;
|
|
return i._correctXCoord(t - s)
|
|
}
|
|
_externalPaneYCoord(e, t) {
|
|
t += this._div.getBoundingClientRect().top + document.body.scrollTop;
|
|
const i = Object(r.ensureNotNull)(this._chart.paneByState(e)),
|
|
s = i._div.getBoundingClientRect().top + document.body.scrollTop;
|
|
return i._correctYCoord(t - s)
|
|
}
|
|
_correctXCoord(e) {
|
|
return Math.max(0, Math.min(e, this._size.w - 1))
|
|
}
|
|
_correctYCoord(e) {
|
|
return Math.max(0, Math.min(e, this._size.h - 1))
|
|
}
|
|
_processScroll(e) {
|
|
if (!this._chart.model().model().scrollEnabled()) return;
|
|
const t = Date.now();
|
|
this._startScrollingPos || this._preventScroll() || (this._startScrollingPos = {
|
|
x: e.clientX,
|
|
y: e.clientY,
|
|
timestamp: t,
|
|
localX: e.localX,
|
|
localY: e.localY
|
|
}), null !== this._scrollXAnimation && this._scrollXAnimation.addPosition(e
|
|
.localX, t), null !== this._scrollYAnimation && this._scrollYAnimation
|
|
.addPosition(e.localY, t);
|
|
const i = this._chartUndoModel();
|
|
let s = this.state().defaultPriceScale();
|
|
if (this._startScrollingPos && !this._isScrolling && (this._startScrollingPos.x !==
|
|
e.clientX || this._startScrollingPos.y !== e.clientY)) return i
|
|
.beginUndoMacro("scroll").setCustomFlag("doesnt_affect_save", !0), null ===
|
|
this._scrollXAnimation && this._options.useKineticScroll && (this
|
|
._scrollXAnimation = new T(.2, 7, .997, 15), this._scrollXAnimation
|
|
.addPosition(this._startScrollingPos.localX, this._startScrollingPos
|
|
.timestamp), this._scrollXAnimation.addPosition(e.localX, t)), this
|
|
._scrollYAnimation, i.selection().isEmpty() || (s = i.selection()
|
|
.allSources()[0].priceScale()), null === s || s.isEmpty() || (this
|
|
._scrollPriceScale = s, i.startScrollPrice(this.state(), s, e.localY)),
|
|
i.startScrollTime(e.localX), this._isScrolling = !0, this
|
|
.setCursorForTool(), void this._paneWidgetsSharedState.setScrollingPane(
|
|
this);
|
|
this._isScrolling && (null !== this._scrollPriceScale && i.scrollPriceTo(this
|
|
.state(), this._scrollPriceScale, e.localY), i.scrollTimeTo(e.localX))
|
|
}
|
|
_finishScroll() {
|
|
const e = this._chartUndoModel();
|
|
e.endScrollTime(), null !== this._scrollPriceScale && e.endScrollPrice(this.state(),
|
|
this._scrollPriceScale), e.endUndoMacro(), this._isScrolling = !1, this
|
|
._startScrollingPos = null, this._scrollPriceScale = null, this
|
|
.setCursorForTool(), this._paneWidgetsSharedState.setScrollingPane(null)
|
|
}
|
|
_endScroll(e) {
|
|
if (!this._isScrolling) return !1;
|
|
const t = this._isScrolling && this._scrollUndoCommandInStack();
|
|
if (this._isScrolling) {
|
|
const i = Date.now();
|
|
null !== this._scrollXAnimation && this._scrollXAnimation.start(e.localX, i),
|
|
null !== this._scrollYAnimation && this._scrollYAnimation.start(e.localY,
|
|
i);
|
|
const s = this._chartUndoModel();
|
|
if ((null === this._scrollXAnimation || this._scrollXAnimation.finished(i)) && (
|
|
null === this._scrollYAnimation || this._scrollYAnimation.finished(i)))
|
|
return this._finishScroll(), t;
|
|
const r = s.timeScale(),
|
|
n = this._scrollXAnimation,
|
|
o = this._scrollYAnimation,
|
|
a = () => {
|
|
if ((null === n || n.terminated()) && (null === o || o.terminated()))
|
|
return;
|
|
const e = Date.now();
|
|
let t = null === n || n.finished(e);
|
|
const i = null === o || o.finished(e);
|
|
if (null !== n && !n.terminated()) {
|
|
const i = r.rightOffset();
|
|
s.scrollTimeTo(n.getPosition(e)), i === r.rightOffset() && (t = !0,
|
|
this._scrollXAnimation = null)
|
|
}
|
|
null === o || o.terminated() || null === this._scrollPriceScale || s
|
|
.scrollPriceTo(this.state(), this._scrollPriceScale, o.getPosition(
|
|
e)), t && i ? this._finishScroll() : requestAnimationFrame(a)
|
|
};
|
|
requestAnimationFrame(a)
|
|
}
|
|
return t
|
|
}
|
|
_terminateActiveAnimations() {
|
|
const e = Date.now(),
|
|
t = null === this._scrollXAnimation || this._scrollXAnimation.finished(e),
|
|
i = null === this._scrollYAnimation || this._scrollYAnimation.finished(e);
|
|
null === this._scrollXAnimation && null === this._scrollYAnimation || t && i || this
|
|
._finishScroll(), null !== this._scrollXAnimation && (this._scrollXAnimation
|
|
.terminate(), this._scrollXAnimation = null),
|
|
null !== this._scrollYAnimation && (this._scrollYAnimation.terminate(), this
|
|
._scrollYAnimation = null)
|
|
}
|
|
_preventScroll() {
|
|
return this._trackCrosshairOnlyAfterLongTap && this._longTap || this
|
|
._contextMenuOpenedOnLastTap || Object(f.isLineToolName)(g.tool.value()) ||
|
|
Boolean(this._chartUndoModel().lineBeingCreated()) || null !== this
|
|
._startTrackPoint
|
|
}
|
|
_isSelectPointModeEnabled() {
|
|
return this._chartUndoModel().crossHairSource().selectPointMode().value()
|
|
}
|
|
_preventCrossHairMove() {
|
|
return !!this._trackCrosshairOnlyAfterLongTap && (null === this._chart
|
|
.trackingModePaneWidget() && (!!this._contextMenuOpenedOnLastTap || !this
|
|
._crossHairShouldBeVisible() && null === this._startTrackPoint))
|
|
}
|
|
_finishTool(e, t = null) {
|
|
const i = this._chartUndoModel(),
|
|
s = g.tool.value();
|
|
if (Object(g.resetToCursor)(), this._preventCrossHairMove() && this
|
|
._clearCursorPosition(), i.selectionMacro(i => {
|
|
i.addSourceToSelection(e, ne(t, e))
|
|
}), Object(B.isTextToolName)(s)) {
|
|
const t = i.createUndoCheckpoint();
|
|
this._chart.showChartPropertiesForSource(e, R.TabNames.text, void 0, t)
|
|
}
|
|
this._lastFinishedToolId = e.id(), Object(V.c)(e)
|
|
}
|
|
_alignSourcesThatBeingMoved(e, t, i, s) {
|
|
const r = this._chartUndoModel(),
|
|
o = r.timeScale().coordinateToIndex(t);
|
|
r.model().sourcesBeingMoved().forEach(e => {
|
|
const a = e.convertYCoordinateToPriceForMoving(i, this.state()
|
|
.mainDataSource());
|
|
null !== a && (this.setCursorForTool(), r.moveSources({
|
|
screen: new n.Point(t, i),
|
|
logical: {
|
|
index: o,
|
|
price: a
|
|
}
|
|
}, s))
|
|
})
|
|
}
|
|
_resetMeasureIfRequired() {
|
|
this._needResetMeasureLater && (Object(g.resetToCursor)(), this
|
|
._needResetMeasureLater = !1)
|
|
}
|
|
_drawBackground(e, t) {
|
|
const i = Math.ceil(t.pixelRatio * this._size.w),
|
|
s = Math.ceil(t.pixelRatio * this._size.h),
|
|
r = this._chartModel(),
|
|
n = r.backgroundTopColor().value(),
|
|
o = r.backgroundColor().value();
|
|
n === o ? Object(S.clearRect)(e, 0, 0, i + 1, s + 1, o) : Object(y
|
|
.clearRectWithGradient)(e, 0, 0, i + 1, s + 1, n, o)
|
|
}
|
|
_drawWatermark(e, t) {
|
|
const i = this._chartModel().watermarkSource();
|
|
if (null === i) return;
|
|
const s = this.state();
|
|
if (!s.containsMainSeries()) return;
|
|
const r = i.paneViews(),
|
|
n = s.height(),
|
|
o = s.width();
|
|
for (const i of r) {
|
|
e.save();
|
|
const s = i.renderer(n, o);
|
|
s && s.draw(e, t), e.restore()
|
|
}
|
|
}
|
|
_drawCrossHair(e, t) {
|
|
const i = this._chartUndoModel().crossHairSource();
|
|
!i.visible && Object(g.lockTimeAxis)().value() && (i.setLockedPosition(Object(r
|
|
.ensureNotNull)(this._state)), i.updateAllViews()), this._drawSourceImpl(e,
|
|
t, te, ee, i)
|
|
}
|
|
_drawActiveLineTools(e, t) {
|
|
const i = this._chartModel(),
|
|
s = [i.lineBeingCreated(), i.lineBeingEdited(), ...i.sourcesBeingMoved(), i
|
|
.customSourceBeingMoved()
|
|
].filter(e => !!e);
|
|
for (const r of s) {
|
|
(i.paneForSource(r) === this.state() || Object(m.a)(r) && r
|
|
.isMultiPaneEnabled()) && this._drawSourceImpl(e, t, te, ee, r)
|
|
}
|
|
}
|
|
_drawSeriesTopViews(e, t) {
|
|
this.state().containsMainSeries() && this._drawSourceImpl(e, t, ie, ee, this
|
|
._chartUndoModel().mainSeries())
|
|
}
|
|
_drawSources(e, t, i) {
|
|
const s = this.state(),
|
|
r = s.model(),
|
|
n = s.sourcesByGroup(),
|
|
o = n.tradingSources(),
|
|
a = [...r.multiPaneSources(s), ...n.generalSources()],
|
|
l = n.phantomSources(),
|
|
h = s.customSources(d.CustomSourceLayer.Background).slice(),
|
|
u = s.customSources(d.CustomSourceLayer.Foreground).slice(),
|
|
p = s.customSources(d.CustomSourceLayer.Topmost).slice(); {
|
|
const e = r.panes();
|
|
for (let t = e.length - 1; t >= 0; t--) e[t].createDrawingsCaches()
|
|
}
|
|
this._drawSourceImpl(e, t, te, ee, r.gridSource()), this._drawWatermark(e, t);
|
|
for (const i of h) this._drawSourceImpl(e, t, te, Q, i);
|
|
for (const i of a) this._drawSourceImpl(e, t, te, Q, i);
|
|
for (const i of u) this._drawSourceImpl(e, t, te, Q, i);
|
|
for (const i of l) this._drawSourceImpl(e, t, te, Q, i);
|
|
const _ = new Set;
|
|
[r.lineBeingCreated(), r.lineBeingEdited(), ...r.sourcesBeingMoved(), r
|
|
.customSourceBeingMoved()
|
|
].filter(c.notNull).forEach(e => _.add(e.id()));
|
|
let f = r.hoveredSource();
|
|
null !== f && ($(f) || _.has(f.id()) || Object(m.a)(f) && !a.includes(f) ? f =
|
|
null : _.add(f.id()));
|
|
const g = r.selection().allSources().filter(e => !(Object(m.a)(e) && !a.includes(
|
|
e)) && (!_.has(e.id()) && !$(e)));
|
|
g.forEach(e => _.add(e.id())); {
|
|
for (const i of h) this._drawSourceImpl(e, t, te, ee, i, _);
|
|
for (const i of a) this._drawSourceImpl(e, t, te, ee, i, _);
|
|
for (const i of u) this._drawSourceImpl(e, t, te, ee, i, _);
|
|
const i = r.activeStrategySource().value();
|
|
i && this.containsMainSeries() && this._drawSourceImpl(e, t, re, ee, i)
|
|
}
|
|
for (const i of o) this._drawSourceImpl(e, t, te, Q, i);
|
|
for (const i of p) this._drawSourceImpl(e, t, te, Q, i);
|
|
for (const i of o) this._drawSourceImpl(e, t, te, Q, i);
|
|
for (const i of p) this._drawSourceImpl(e, t, te, Q, i);
|
|
for (const i of a) this._drawSourceImpl(e, t, se, ee, i, _);
|
|
for (const i of u) this._drawSourceImpl(e, t, se, ee, i, _);
|
|
this._drawBarsMarks(e, t, i);
|
|
for (const i of o) this._drawSourceImpl(e, t, te, ee, i, _);
|
|
for (const i of p) this._drawSourceImpl(e, t, te, ee, i, _);
|
|
for (const i of g) this._drawSourceImpl(e, t, te, ee, i);
|
|
for (const i of g) this._drawSourceImpl(e, t, se, ee, i);
|
|
f && (this._drawSourceImpl(e, t, te, ee, f), this._drawSourceImpl(e, t, se, ee, f));
|
|
for (const i of l) this._drawSourceImpl(e, t, te, ee, i, _); {
|
|
const e = r.panes();
|
|
for (let t = e.length - 1; t >= 0; t--) e[t].clearDrawingCaches()
|
|
}
|
|
}
|
|
_drawSourceImpl(e, t, i, s, r, n) {
|
|
if (n && n.has(r.id())) return;
|
|
const o = this.state(),
|
|
a = o.height(),
|
|
l = o.width(),
|
|
c = i(r, this.state());
|
|
if (c)
|
|
for (const i of c) {
|
|
const r = i.renderer(a, l);
|
|
r && (e.save(), s(r, e, t), e.restore())
|
|
}
|
|
}
|
|
_drawBarsMarks(e, t, i) {
|
|
if (this.containsMainSeries() && !i) {
|
|
const i = this._chartUndoModel().barsMarksSources();
|
|
for (const s of i) this._drawSourceImpl(e, t, te, ee, s)
|
|
}
|
|
}
|
|
_updateByThemedColors() {
|
|
null !== this._legendWidget && this._legendWidget.updateThemedColors(this
|
|
._themedTopColor), null !== this._paneControls && this._paneControls
|
|
.updateThemedColors(this._themedTopColor)
|
|
}
|
|
_scrollUndoCommandInStack() {
|
|
const e = this._chartUndoModel().undoHistory().undoStack();
|
|
if (e.isEmpty()) return !1;
|
|
const t = e.head();
|
|
if (!(t instanceof b.a)) return !1;
|
|
if (t.isEmpty()) return !1;
|
|
const i = t.commands()[0];
|
|
return i instanceof A.PriceScaleChangeUndoCommand || i instanceof L.a
|
|
}
|
|
_onStateDestroyed() {
|
|
this.setState(null)
|
|
}
|
|
_getHideNotMainSourcesValue() {
|
|
return le && !this._chart.isActive() && !this._chart.crossHairSyncEnabled()
|
|
}
|
|
_onDataSourcesCollectionChanged() {
|
|
this._startMoveSourceParams = null
|
|
}
|
|
_processMouseEnterLeaveMoveHandlers(e, t) {
|
|
var i, s, r, n;
|
|
null !== this._prevHoveredHittest && this._prevHoveredHittest.renderer !== e
|
|
.renderer && (Object(u.tryCallHandler)(t, null === (s = null === (i = this
|
|
._prevHoveredHittest.hittest) || void 0 === i ? void 0 : i
|
|
.data()) || void 0 === s ? void 0 : s.mouseLeaveHandler),
|
|
this._prevHoveredHittest = null), t.isTouch || (e.hittest && (null === (r =
|
|
this._prevHoveredHittest) || void 0 === r ? void 0 : r.renderer) !== e
|
|
.renderer && (e.hittest.tryCallMouseEnterHandler(t), this
|
|
._prevHoveredHittest = e), null === (n = e.hittest) || void 0 === n || n
|
|
.tryCallMouseMoveHandler(t))
|
|
}
|
|
_startChangeOrMoveLineToolIfNeeded() {
|
|
if (null !== this._startChangeLineToolParams) {
|
|
const e = this._startChangeLineToolParams;
|
|
this._chartUndoModel().startChangingLinetool(e.source, e.startPoint, e
|
|
.pointIndex, e.envState)
|
|
}
|
|
if (null !== this._startMoveSourceParams) {
|
|
const e = this._startMoveSourceParams;
|
|
this._chartUndoModel().startMovingSources(e.source, e.startPoint, e.itemIndex, e
|
|
.envState)
|
|
}
|
|
this._startMoveSourceParams = null, this._startChangeLineToolParams = null
|
|
}
|
|
_trackingModeShouldBeActive() {
|
|
return !(!this._trackCrosshairOnlyAfterLongTap || this
|
|
._contextMenuOpenedOnLastTap || this._crossHairShouldBeVisible()) && this
|
|
._longTap
|
|
}
|
|
_processOutsideClick(e) {
|
|
let t = null;
|
|
const i = this._chartModel();
|
|
if (e.source && (t = e.isCustom ? i.customSourceName(e.source) : e.source.id()),
|
|
null !== this._lastClickedSource && this._lastClickedSource.id !== t) {
|
|
const e = this._lastClickedSource.id;
|
|
let t = this._lastClickedSource.isCustom ? i.customSourceForName(e) : i
|
|
.dataSourceForId(e);
|
|
null !== t || this._lastClickedSource.isCustom || (t = this._chartUndoModel()
|
|
.barMarksSourceForId(e)), null !== t && t.onClickOutside && (t
|
|
.onClickOutside(), this._chartModel().updateSource(t))
|
|
}
|
|
this._lastClickedSource = null !== t ? {
|
|
id: t,
|
|
isCustom: e.isCustom
|
|
} : null
|
|
}
|
|
_mouseClickOrTapEvent(e) {
|
|
var t, i, s;
|
|
if (!this.hasState()) return;
|
|
const n = this._dataSourceAtPoint(e.localX, e.localY),
|
|
o = n && n.source,
|
|
a = this._chartUndoModel(),
|
|
c = Boolean(null === (i = null === (t = null == n ? void 0 : n.hittest) ||
|
|
void 0 === t ? void 0 : t.data()) || void 0 === i ? void 0 : i
|
|
.hideCrosshairLinesOnHover);
|
|
this._processOutsideClick(Object(r.ensureNotNull)(n)), !this
|
|
._isSelectPointModeEnabled() || c || e.isTouch && this.trackingModeEnabled() &&
|
|
!this._exitTrackingModeOnNextTry || a.crossHairSource().trySelectCurrentPoint(),
|
|
(null === (s = null == n ? void 0 : n.hittest) || void 0 === s ? void 0 : s
|
|
.tryCallClickOrTapHandler(e)) && a.model().updateSource(Object(r
|
|
.ensureNotNull)(o)), !e.isTouch || this._isSelectPointModeEnabled() || n &&
|
|
n.source === a.crossHairSource() || this._tryExitTrackingMode(), o instanceof v
|
|
.BarsMarksContainer && n && n.hittest && n.hittest.data() && o.onClicked(Object(
|
|
r.ensureNotNull)(n.hittest).data()), o && Object(f.isLineTool)(o) && Object(
|
|
l.emit)("drawing_event", o.id(), "click"), this._resetMeasureIfRequired()
|
|
}
|
|
_mouseDownOrTouchStartEvent(e, t) {
|
|
var i;
|
|
if (e.isTouch && (this._longTap = !1, this._exitTrackingModeOnNextTry = null !==
|
|
this._startTrackPoint, this._paneWidgetsSharedState.clearDraggingSource()),
|
|
this._contextMenuOpenedOnLastTap = !1, this._lastFinishedToolId = null, this
|
|
._terminateActiveAnimations(), e.isTouch && this
|
|
._switchTrackingModeFromAnotherPaneIfNeeded(e), document.activeElement !==
|
|
document.body && document.activeElement !== document.documentElement) document
|
|
.activeElement && document.activeElement.blur ? document.activeElement.blur() :
|
|
document.body.focus();
|
|
else {
|
|
const e = document.getSelection();
|
|
null !== e && e.removeAllRanges()
|
|
}
|
|
Object(l.emit)("mouse_down", {
|
|
clientX: e.clientX,
|
|
clientY: e.clientY,
|
|
pageX: e.pageX,
|
|
pageY: e.pageY,
|
|
screenX: e.screenX,
|
|
screenY: e.screenY
|
|
}), this._updateCommonTooltip(null);
|
|
const s = this._chartUndoModel(),
|
|
o = new p.a(e);
|
|
s.mainSeries().clearGotoDateResult(), this.hideInplaceEditor();
|
|
const c = this.state().defaultPriceScale();
|
|
if (c.isEmpty() || s.timeScale().isEmpty()) return;
|
|
const h = s.crossHairSource();
|
|
if (!e.isTouch && !Object(B.isLineDrawnWithPressedButton)(g.tool.value())) {
|
|
const t = s.lineBeingCreated(),
|
|
i = null !== t ? s.model().paneForSource(t) : null;
|
|
null !== i && i !== this._state ? this._setCursorPositionOnExternalPane(i, e
|
|
.localX, e.localY, o) : this._setCursorPosition(e.localX, e.localY, o)
|
|
}
|
|
e.isTouch && Object(f.isLineToolName)(g.tool.value()) && (Object(B
|
|
.isLineDrawnWithPressedButton)(g.tool.value()) || null !== h.pane ?
|
|
Object(B.isLineDrawnWithPressedButton)(g.tool.value()) && this
|
|
._clearCursorPosition() : this._chart.updateCrossHairPositionIfNeeded());
|
|
const d = Object(r.ensureNotNull)(this.state().mainDataSource()).firstValue();
|
|
if (null === d) return void(this._chart.readOnly() || (this
|
|
._handleSelectionMouseDownAndGetJustDeselectedSource(e, t, o), t
|
|
.source && t.source instanceof D.PriceDataSource && t.source
|
|
.isDraggable() && this._paneWidgetsSharedState.trySetDraggingSource(
|
|
t.source, this)));
|
|
const _ = c.coordinateToPrice(e.localY, d),
|
|
m = this._chartModel().timeScale().coordinateToIndex(e.localX);
|
|
if (h.startMeasurePoint() && h.endMeasurePoint() && h.clearMeasure(), o.shift() &&
|
|
Object(g.toolIsCursor)(g.tool.value()) && s.selection().isEmpty() && g.tool
|
|
.setValue("measure"), (e.isTouch || !this._tryStartMeasure(e, h, o, _, m)) && (e
|
|
.isTouch || !this._tryFinishMeasure(e, h)) && !this._tryFinishZoom(e) && !
|
|
this._tryStartZoom(e, _, m, o)) {
|
|
if (e.isTouch && (null !== this._startTrackPoint ? (this
|
|
._initCrossHairPosition = h.currentPoint(), this._startTrackPoint =
|
|
new n.Point(e.localX, e.localY)) : this
|
|
._isSelectPointModeEnabled() && null === this._chart
|
|
.trackingModePaneWidget() && this.startTrackingMode(new n.Point(e
|
|
.localX, e.localY), new n.Point(e.localX, e.localY), new p.a(e))), e
|
|
.isTouch && (this._preventSourceChange = null === t.source || !s.selection()
|
|
.isSelected(t.source)), !this._isSelectPointModeEnabled() && !this
|
|
._isScrolling) {
|
|
if (e.isTouch && (Object(g.toolIsMeasure)(g.tool.value()) || null !== h
|
|
.measurePane())) return void this._initToolCreationModeParams(e);
|
|
if (Object(f.isLineToolName)(g.tool.value()) || s.lineBeingCreated())
|
|
return o.shift() || s.selectionMacro(e => e.clearSelection()), void this
|
|
._mouseDownEventForLineTool(e, o, m, _)
|
|
}
|
|
if (null === (i = t.hittest) || void 0 === i || i
|
|
.tryCallMouseDownOrTouchStartHandler(e), !this._chart.readOnly()) {
|
|
const i = this._handleSelectionMouseDownAndGetJustDeselectedSource(e, t, o);
|
|
if (t.hittest && t.source) {
|
|
const i = t.hittest.data();
|
|
if (t.isCustom) {
|
|
if (t.hittest.hasPressedMoveHandler(e)) return void s.model()
|
|
.setMovingCustomSource(t.source, i)
|
|
} else if ((null == i ? void 0 : i.areaName) === u.AreaName
|
|
.SourceItemMove) {
|
|
const r = null == i ? void 0 : i.activeItem;
|
|
if (void 0 !== r) return void s.startCustomMoving(t.source, r, e)
|
|
}
|
|
}
|
|
if (this._tryHandleEraserMouseDown(t, o)) return;
|
|
const r = t.source && Object(f.isLineTool)(t.source) && t.source.isLocked &&
|
|
t.source.isLocked();
|
|
if (!(Object(g.lockDrawings)().value() || r) && !t.isCustom) {
|
|
if (t.source && !t.source.userEditEnabled()) return;
|
|
if (this._tryStartChangingLineTool(e, t, o, m)) return void(this
|
|
._currentChangingLineToolHitTest = t);
|
|
if (this._currentChangingLineToolHitTest = null, t.hittest && ((b = t
|
|
.hittest.result()) === u.HitTestResult.MOVEPOINT || b === u
|
|
.HitTestResult.MOVEPOINT_BACKGROUND && Object(a
|
|
.lastEventIsTouch)())) {
|
|
if (this._tryStartCloning(e, t, o, i)) return;
|
|
if (this._tryStartMovingLineTool(e, t, o, m)) return
|
|
}
|
|
}
|
|
if (t.source && t.source instanceof D.PriceDataSource && t.source
|
|
.isDraggable() && this._paneWidgetsSharedState.trySetDraggingSource(t
|
|
.source, this)) return
|
|
}
|
|
var b;
|
|
t && t.hittest && t.hittest.result() === u.HitTestResult.REGULAR || (this
|
|
._processing = !0)
|
|
}
|
|
}
|
|
_mouseUpOrTouchEndEvent(e) {
|
|
var t, i;
|
|
if (!this.hasState()) return;
|
|
const s = e.isTouch && null !== this._startTrackPoint,
|
|
n = e.isTouch && this._wasPinched;
|
|
e.isTouch && (this._wasPinched = !1, this._longTap = !1), this
|
|
._startMoveSourceParams = null, this._startChangeLineToolParams = null, this
|
|
._currentChangingLineToolHitTest = null;
|
|
const o = this._chartUndoModel(),
|
|
c = o.model().customSourceMovingHitTestData();
|
|
null !== c || o.customMoveBeingProcessed() || this._processMouseUpOrTouchEndHandler(
|
|
e), this._isSelecting = !1;
|
|
const h = o.model(),
|
|
d = h.crossHairSource(),
|
|
_ = this._dataSourceAtPoint(e.localX, e.localY),
|
|
m = null == _ ? void 0 : _.hittest;
|
|
if (d.selection() && null === this._firstZoomPoint) {
|
|
const e = this.state().lineToolsForArea(d.selection());
|
|
o.selectionMacro(t => {
|
|
let i = null;
|
|
e.forEach(e => {
|
|
null === i && (i = ne(_, e)), t.addSourceToSelection(e,
|
|
i)
|
|
})
|
|
}), d.clearSelection(), Object(W.trackEvent)("GUI", "Multiselect",
|
|
"Area Select")
|
|
}
|
|
Object(l.emit)("mouse_up", {
|
|
clientX: e.clientX,
|
|
clientY: e.clientY,
|
|
pageX: e.pageX,
|
|
pageY: e.pageY,
|
|
screenX: e.screenX,
|
|
screenY: e.screenY
|
|
});
|
|
const b = e.isTouch && this._touchMove;
|
|
e.isTouch && (this._touchMove = !1);
|
|
const v = new p.a(e),
|
|
S = g.tool.value();
|
|
if (e.isTouch && !b && (Object(g.toolIsMeasure)(S) || null !== d.measurePane())) {
|
|
if (null === d.measurePane() && d.pane !== this._state) return void this
|
|
._setCursorPosition(e.localX, e.localY);
|
|
if (this._tryStartMeasure(e, d, v, d.price, d.index)) return;
|
|
if (this._tryFinishMeasure(e, d)) return
|
|
}
|
|
if (e.isTouch && !b && !Object(B.isLineDrawnWithPressedButton)(S) && Object(f
|
|
.isLineToolName)(S) && !o.lineBeingCreated()) {
|
|
if (this._chart.justActivated()) return;
|
|
if (d.pane !== this._state) return void this._setCursorPosition(e.localX, e
|
|
.localY, v);
|
|
const i = d.currentPoint(),
|
|
s = this.state().defaultPriceScale(),
|
|
n = Object(r.ensure)(null === (t = this.state().mainDataSource()) ||
|
|
void 0 === t ? void 0 : t.firstValue()),
|
|
a = {
|
|
index: Math.round(o.timeScale().coordinateToIndex(i.x)),
|
|
price: s.coordinateToPrice(i.y, n)
|
|
},
|
|
l = Object(r.ensureNotNull)(o.createLineTool(this.state(), a, S));
|
|
return o.selectionMacro(e => {
|
|
e.addSourceToSelection(l)
|
|
}), o.lineBeingCreated() || (this._finishTool(l, _), e.preventDefault()),
|
|
void(this._startTouchPoint = null)
|
|
}
|
|
const y = o.lineBeingCreated();
|
|
if (y && !Object(B.isLineDrawnWithPressedButton)(y.toolname) && e.isTouch && this
|
|
._startTouchPoint) {
|
|
if (this._startTouchPoint = null, !b) {
|
|
const t = y.points()[y.points().length - 1],
|
|
i = o.continueCreatingLine({
|
|
index: t.index,
|
|
price: t.price
|
|
}, new p.a(e));
|
|
this._initCrossHairPosition = null, i && (this._finishTool(y, _), e
|
|
.preventDefault())
|
|
}
|
|
return
|
|
}
|
|
if (null !== this._firstZoomPoint && this._firstZoomPoint.draggingMode)
|
|
return void this._finishZoom(e);
|
|
if (this._processing = !1, o.customMoveBeingProcessed() && o.endCustomMoving(),
|
|
null !== c && (c.beingMoved && (Object(u.tryCallHandler)(e, c.mouseUpHandler, c
|
|
.touchEndHandler), this.setCursorForTool()), h.setMovingCustomSource(
|
|
null, null)), h.lineBeingEdited()) return o.endChangingLinetool(!1), void(
|
|
this._preventCrossHairMove() && this._clearCursorPosition());
|
|
if (Object(B.isLineDrawnWithPressedButton)(S) && !this
|
|
._isSelectPointModeEnabled()) {
|
|
const t = o.lineBeingCreated();
|
|
null !== t && (Object(V.c)(t), t.finish());
|
|
const s = this.state().defaultPriceScale();
|
|
if (s.isEmpty()) return;
|
|
if (!t) return;
|
|
const n = Object(r.ensure)(null === (i = t.ownerSource()) || void 0 === i ?
|
|
void 0 : i.firstValue()),
|
|
a = s.coordinateToPrice(e.localY, n),
|
|
l = {
|
|
index: Math.round(o.timeScale().coordinateToIndex(e.localX)),
|
|
price: a
|
|
};
|
|
return void o.continueCreatingLine(l)
|
|
}
|
|
if (h.sourcesBeingMoved().length) return o.endMovingSource(!1), h
|
|
.sourcesBeingMoved().filter(f.isLineTool).forEach(e => {
|
|
this.setCursorForTool(e)
|
|
}), void h.invalidate(q.InvalidationMask.cursor());
|
|
if (!this._chart.readOnly()) {
|
|
const t = e.localX >= 0 && e.localX < this._size.w;
|
|
if ((!_ || _.source !== d) && t) {
|
|
const t = o.timeScale().coordinateToIndex(e.localX);
|
|
h.onSyncScrollNeeded(t)
|
|
}
|
|
}
|
|
const w = this._isScrolling,
|
|
P = this._endScroll(e),
|
|
C = this._paneWidgetsSharedState.draggingSource();
|
|
if (null !== C) {
|
|
const t = e.target,
|
|
i = this._chart.paneByCanvas(t);
|
|
i && i !== this && (P && o.undoHistory().undo(), o.mergeToPane(C, i.state()));
|
|
if (this._chart.timeAxisByCanvas(t))
|
|
if (h.isUnmergeAvailableForSource(C)) P && o.undoHistory().undo(), o
|
|
.unmergeToNewBottomPane(C);
|
|
else {
|
|
const e = h.panes(),
|
|
t = Object(r.ensureNotNull)(h.paneForSource(C)),
|
|
i = e.indexOf(t);
|
|
i !== e.length - 1 && (P && o.undoHistory().undo(), t.isMaximized() &&
|
|
this._chart.toggleMaximizePane(), o.movePane(i, e.length - 1))
|
|
} this._paneWidgetsSharedState.clearDraggingSource();
|
|
const s = this._chart.getTimeScale();
|
|
s && s.restoreDefaultCursor();
|
|
const n = this._chart.paneWidgets();
|
|
for (let e = 0; e < n.length; e++) {
|
|
const t = n[e];
|
|
t === this && _ && !_.isCustom ? t.setCursorForTool(_.source || void 0) : t
|
|
.setCursorForTool(), t.leftPriceAxisesContainer()
|
|
.restoreDefaultCursor(), t.rightPriceAxisesContainer()
|
|
.restoreDefaultCursor()
|
|
}
|
|
}
|
|
this._chart.readOnly() || s || v.control() || w || n || _ && _.source && (m && m
|
|
.result() > u.HitTestResult.MOVEPOINT_BACKGROUND || Object(a
|
|
.lastEventIsTouch)()) && o.selectionMacro(e => {
|
|
e.clearSelection();
|
|
const t = Object(r.ensureNotNull)(_.source);
|
|
e.addSourceToSelection(t, ne(_, t))
|
|
}), e.isTouch && (this._touchMove = !1)
|
|
}
|
|
_mouseOrTouchMoveEvent(e) {
|
|
if (!this.hasState()) return;
|
|
this._resetMeasureIfRequired();
|
|
const t = Object(r.ensureNotNull)(this._dataSourceAtPoint(e.localX, e.localY));
|
|
this._processMouseEnterLeaveMoveHandlers(t, e);
|
|
const i = this._chartUndoModel();
|
|
if (!i) return;
|
|
const s = e.localX,
|
|
o = e.localY;
|
|
this._prevMoveEventPosition = new n.Point(s, o);
|
|
const a = new p.a(e);
|
|
if (null === this._firstZoomPoint) {
|
|
if (this._updateHoveredSource(t, a, e), !e.isTouch && i.lineBeingCreated()) {
|
|
const e = i.lineBeingCreated(),
|
|
t = null === e ? null : i.model().paneForSource(e);
|
|
if (null !== t && t !== this._state) return void this
|
|
._setCursorPositionOnExternalPane(t, s, o, a)
|
|
}
|
|
e.isTouch || this._setCursorPosition(s, o, a)
|
|
} else this._processMouseMoveWhileZoom(e, a)
|
|
}
|
|
_pressedMouseOrTouchMoveEvent(e) {
|
|
var t;
|
|
if (!this.hasState() || this._pinching) return;
|
|
this._resetMeasureIfRequired(), this._startChangeOrMoveLineToolIfNeeded(), e
|
|
.isTouch && (this._touchMove = !0, this._preventSourceChange = !1);
|
|
const i = new p.a(e),
|
|
s = this._chartUndoModel(),
|
|
o = s.crossHairSource(),
|
|
a = e.localX,
|
|
l = e.localY;
|
|
if (this._prevMoveEventPosition = new n.Point(a, l), null !== this._firstZoomPoint)
|
|
return this._processMouseMoveWhileZoom(e), void(this._firstZoomPoint
|
|
.draggingMode = !0);
|
|
const c = g.tool.value();
|
|
if (e.isTouch && this._startTouchPoint && Object(f.isLineToolName)(c) && !Object(B
|
|
.isLineDrawnWithPressedButton)(c) && !s.lineBeingCreated() && !this
|
|
._isSelectPointModeEnabled()) return void this
|
|
._updateCrosshairPositionInToolCreationMode(e, this.state());
|
|
const h = o.measurePane();
|
|
if (e.isTouch && this._startTouchPoint && (Object(g.toolIsMeasure)(c) || null !==
|
|
h)) return void this._updateCrosshairPositionInToolCreationMode(e, h || this
|
|
.state());
|
|
const d = s.lineBeingCreated();
|
|
if (e.isTouch && d && !Object(B.isLineDrawnWithPressedButton)(d.toolname)) {
|
|
if (this._startTouchPoint) {
|
|
const t = Object(r.ensureNotNull)(s.lineBeingCreated()),
|
|
i = Object(r.ensureNotNull)(s.model().paneForSource(t));
|
|
this._updateCrosshairPositionInToolCreationMode(e, i)
|
|
}
|
|
return
|
|
}
|
|
if (e.isTouch && null !== this._startTrackPoint) {
|
|
this._exitTrackingModeOnNextTry = !1;
|
|
const e = Object(r.ensureNotNull)(this._initCrossHairPosition),
|
|
t = new n.Point(a, l).subtract(this._startTrackPoint),
|
|
s = e.add(t);
|
|
this._setCursorPosition(s.x, s.y, i)
|
|
} else e.isTouch && this._preventCrossHairMove() || this._setCursorPosition(a, l,
|
|
i);
|
|
const _ = this._isSelectPointModeEnabled();
|
|
if (Object(f.isLineToolName)(c) && !Object(B.isLineDrawnWithPressedButton)(c) && !
|
|
_ && !i.control()) return;
|
|
if (Object(B.isLineDrawnWithPressedButton)(c) && !_) {
|
|
const i = this.state().defaultPriceScale();
|
|
if (i.isEmpty()) return;
|
|
const o = s.lineBeingCreated();
|
|
if (!o) return;
|
|
const a = new n.Point(e.localX, e.localY),
|
|
l = Object(r.ensure)(null === (t = o.ownerSource()) || void 0 === t ?
|
|
void 0 : t.firstValue());
|
|
return a.price = i.coordinateToPrice(e.localY, l), a.index = Math.round(s
|
|
.timeScale().coordinateToIndex(e.localX)), void s.continueCreatingLine(
|
|
a)
|
|
}
|
|
if (null !== this._paneWidgetsSharedState.draggingSource()) {
|
|
const t = e.target,
|
|
i = this._chart.paneByCanvas(t);
|
|
i && (i !== this ? i.setDragToAnotherPaneCursor() : i.setCursorForTool());
|
|
const s = this._chart.timeAxisByCanvas(t);
|
|
s && s.setCursor("grabbing")
|
|
}
|
|
if (s.timeScale().isEmpty()) return;
|
|
const m = this._options.handleScroll;
|
|
if ((!m.pressedMouseMove || e.isTouch) && (!m.horzTouchDrag && !m.vertTouchDrag || !
|
|
e.isTouch)) return;
|
|
if (s.customMoveBeingProcessed()) return void s.processCustomMove(e);
|
|
const b = s.model().customSourceMovingHitTestData();
|
|
if (null !== b && (this._updateCommonTooltip(null, !0), s.model()
|
|
.processingCustomSourceMove(), Object(u.tryCallHandler)(e, b
|
|
.pressedMouseMoveHandler, b.touchMoveHandler), !Object(u
|
|
.shouldDefaultActionBeExecuted)(e, b, "pressedMouseMoveHandler",
|
|
"touchMoveHandler"))) return;
|
|
if (s.model().lineBeingEdited()) return void this._setCursorPosition(a, l, i);
|
|
if (s.model().sourcesBeingMoved().length) return void this
|
|
._alignSourcesThatBeingMoved(s.model().sourcesBeingMoved(), e.localX, e
|
|
.localY, i);
|
|
const v = this._dataSourceAtPoint(e.localX, e.localY);
|
|
if (this._tryFinishClonning(e, new p.a(e), v)) return;
|
|
const S = Object(g.toolIsMeasure)(c) || o.startMeasurePoint() && o
|
|
.endMeasurePoint();
|
|
this._chart.readOnly() || !i.control() || Object(f.isLineToolName)(c) || S ? (this
|
|
._processScroll(e), this._preventScroll() && !this
|
|
._preventCrossHairMove() && null === this._startTrackPoint && this
|
|
._setCursorPosition(e.localX, e.localY, new p.a(e))) : this._isSelecting ||
|
|
(o.startSelection(this.state()), this._isSelecting = !0)
|
|
}
|
|
_mouseOrTouchLeaveEvent(e) {
|
|
var t, i;
|
|
if (!this.hasState()) return;
|
|
const s = this._chartUndoModel();
|
|
if (!s) return;
|
|
const r = s.crossHairSource();
|
|
e.isTouch || null !== r.measurePane() && null === r.endMeasurePoint() || this
|
|
._clearCursorPosition(), s.model().setHoveredSource(null, null), null !== this
|
|
._prevHoveredHittest && (Object(u.tryCallHandler)(e, null === (i = null === (t =
|
|
this._prevHoveredHittest.hittest) || void 0 === t ? void 0 : t
|
|
.data()) || void 0 === i ? void 0 : i.mouseLeaveHandler), this
|
|
._prevHoveredHittest = null), this._updateCommonTooltip(null), this._chart
|
|
.unsetActivePaneWidget()
|
|
}
|
|
_mouseDoubleClickOrDoubleTapEvent(e) {
|
|
var t;
|
|
if (!this.hasState()) return;
|
|
const i = !this._chart.readOnly() && !Object(f.isLineToolName)(g.tool.value()) &&
|
|
Object(r.ensureNotNull)(this._dataSourceAtPoint(e.localX, e.localY)) || null;
|
|
if (null === i) return;
|
|
if (i.isCustom) return void(null === (t = i.hittest) || void 0 === t || t
|
|
.tryCallDblClickOrDblTapHandler(e));
|
|
let s = i.hittest && i.source || null;
|
|
s && i.hittest && i.hittest.result() <= u.HitTestResult.MOVEPOINT_BACKGROUND && !e
|
|
.isTouch && (s = null), s && !s.isSelectionEnabled() && (s = null), s ? this
|
|
.processDoubleClickOnSource(s, i.hittest ? i.hittest : void 0) : this._chart
|
|
.readOnly() || Object(f.isLineToolName)(g.tool.value()) || this
|
|
._chartUndoModel().lineBeingCreated() || !this._chartUndoModel().selection()
|
|
.isEmpty() || this._chart.toggleMaximizePane(this)
|
|
}
|
|
_contextMenuEvent(e) {
|
|
var t;
|
|
const i = this._chartUndoModel();
|
|
if (i.crossHairSource().startMeasurePoint() && !this
|
|
._trackCrosshairOnlyAfterLongTap) return i.crossHairSource().clearMeasure(),
|
|
void Object(g.resetToCursor)(!0);
|
|
if (this._pinching) return;
|
|
if (null === this._firstZoomPoint || this._trackCrosshairOnlyAfterLongTap || this
|
|
.cancelZoom(), this.hideInplaceEditor()) return;
|
|
if (!Object(g.toolIsCursor)(g.tool.value()) || this._isSelectPointModeEnabled()) {
|
|
if (e.isTouch) return;
|
|
return Object(g.resetToCursor)(!0), this.setCursorForTool(), void(i
|
|
.lineBeingCreated() && i.cancelCreatingLine())
|
|
}
|
|
if (!this._options.contextMenuEnabled) return;
|
|
const s = this._dataSourceAtPoint(e.localX, e.localY),
|
|
r = s ? s.source : null;
|
|
if (e.isTouch && null !== this._startTrackPoint) {
|
|
if (this._preventSourceChange) return;
|
|
this._clearCursorPosition()
|
|
}
|
|
e.isTouch && (this._contextMenuOpenedOnLastTap = !0, this._startTrackPoint = null),
|
|
this._contextMenuX = e.localX, this._contextMenuY = e.localY;
|
|
const n = s && s.hittest ? s.hittest.result() : 0,
|
|
o = n >= u.HitTestResult.REGULAR || n >= u.HitTestResult.MOVEPOINT_BACKGROUND &&
|
|
e.isTouch;
|
|
this._chart.updateActions(),
|
|
i.selectionMacro(t => {
|
|
null !== r && o ? t.selection().isSelected(r) || (t.clearSelection(), t
|
|
.addSourceToSelection(r, ne(s, r))) : (this._options.contextMenu
|
|
.general && this._contextMenu(e).then(t => {
|
|
null !== t && t.show(e)
|
|
}), t.clearSelection())
|
|
}), s && o && null !== r && (Object(m.a)(r) && r.hasContextMenu() ? r
|
|
.isSelectionEnabled() ? this.showContextMenuForSelection(e) : this
|
|
.showContextMenuForSources([r], e) : null === (t = s.hittest) || void 0 ===
|
|
t || t.tryCallContextMenuHandler(e))
|
|
}
|
|
_onMouseEvent() {
|
|
this._preventSourceChange = !1, this._startTrackPoint = null, this
|
|
._trackCrosshairOnlyAfterLongTap = !1
|
|
}
|
|
_onTouchEvent() {
|
|
this._trackCrosshairOnlyAfterLongTap = !0
|
|
}
|
|
_switchTrackingModeFromAnotherPaneIfNeeded(e) {
|
|
const t = this._chart.trackingModePaneWidget();
|
|
if (null !== t && t !== this) {
|
|
const i = this._chartModel().crossHairSource().currentPoint();
|
|
t._exitTrackingModeOnNextTry = !0, t._tryExitTrackingMode(!0), this
|
|
.startTrackingMode(new n.Point(e.localX, e.localY), new n.Point(i.x, e
|
|
.localY), new p.a(e))
|
|
}
|
|
}
|
|
_contextMenu(e) {
|
|
const t = e => e instanceof H.Separator,
|
|
i = this._customActions();
|
|
if (N.enabled("disable_no_source_context_menu")) return Promise.resolve(null);
|
|
const s = this._initActions(e).filter(e => null !== e);
|
|
i.remove.forEach(e => {
|
|
for (let t = 0; t < s.length; t++) {
|
|
const i = s[t];
|
|
if (i instanceof H.Action && i.getLabel() === e) {
|
|
s.splice(t, 1);
|
|
break
|
|
}
|
|
}
|
|
});
|
|
const r = i.top.concat(s).concat(i.bottom);
|
|
for (let e = r.length - 1; e > 0; e--) t(r[e]) && t(r[e - 1]) && r.splice(e, 1);
|
|
return r.length && t(r[0]) && r.splice(0, 1), r.length && t(r[r.length - 1]) && r
|
|
.splice(r.length - 1, 1), k.ContextMenuManager.createMenu(r, {
|
|
statName: "ChartContextMenu"
|
|
})
|
|
}
|
|
_initActions(e) {
|
|
var t;
|
|
const i = this._chart.actions(),
|
|
r = [];
|
|
r.push(i.chartReset), r.push(new H.Separator), N.enabled("datasource_copypaste") &&
|
|
!this.state().isEmpty() && (r.push(new H.Action({
|
|
label: Object(s.t)("Paste %s").replace("%s", "").trim(),
|
|
shortcutHint: Object(G.humanReadableHash)(G.Modifiers.Mod + 86),
|
|
statName: "Paste",
|
|
onExecute: () => this._chart.chartWidgetCollection().clipboard
|
|
.uiRequestPaste(this.state())
|
|
})), r.push(new H.Separator)), r[r.length - 1] instanceof H.Separator || r.push(
|
|
new H.Separator);
|
|
return window.widgetbar && (!window.widgetbar._customization || window.widgetbar
|
|
._customization.watchlist) && i.addToWatchlist && r.push(i.addToWatchlist),
|
|
N.enabled("text_notes") && r.push(i.addToTextNotes), r[r.length -
|
|
1] instanceof H.Separator || r.push(new H.Separator), r.push(this
|
|
._createLockTimeAxisAction(e)), r.push(new H.Separator), r.push(Object(E
|
|
.createLinesAction)(this._chart)), N.enabled("charting_library_base") || r
|
|
.push(i.applyColorTheme), r[r.length - 1] instanceof H.Separator || r.push(new H
|
|
.Separator), this._chart.applyIndicatorsToAllChartsAvailable() && (r.push(i
|
|
.applyStudiesToAllCharts), r.push(new H.Separator)), r.push(i
|
|
.paneRemoveAllDrawingTools), r.push(i.paneRemoveAllStudies), r.push(new H
|
|
.Separator), (null === (t = window.pro) || void 0 === t ? void 0 : t
|
|
.hasPackage("mtp-mtpredictor")) && this.state().containsMainSeries() && r
|
|
.push(Object(E.createMTPredictorActions)(this._chart, this.state(), this
|
|
._contextMenuX, this._contextMenuY), new H.Separator), r.push(i
|
|
.hideAllMarks), r.push(new H.Separator), N.enabled(
|
|
"show_chart_property_page") && r.push(i.chartProperties),
|
|
r[r.length - 1] instanceof H.Separator && r.pop(), r
|
|
}
|
|
_loadAndCreateLegendWidget() {
|
|
Promise.all([i.e("react"), i.e(72), i.e(7), i.e("chart-widget-gui")]).then(i.bind(
|
|
null, "sAH5")).then(e => {
|
|
if (this._isDestroyed) return;
|
|
const t = e.LegendWidget,
|
|
i = Object(h.deepExtend)({}, this._options.legendWidget);
|
|
i.canShowSourceCode = !this._chart.onWidget() && !o.CheckMobile.any(), i
|
|
.readOnlyMode = i.readOnlyMode || this._chart.readOnly(), i
|
|
.statusesWidgets = {
|
|
sourceStatusesEnabled: this._options
|
|
.sourceStatusesWidgetEnabled,
|
|
sourceStatuses: this._options.sourceStatusesWidget || {},
|
|
marketStatusEnabled: this._options.marketStatusWidgetEnabled,
|
|
marketStatus: this._options.marketStatusWidget || {},
|
|
dataUpdateModeEnabled: this._options.chartWarningWidgetEnabled,
|
|
dataUpdateMode: this._options.chartWarningWidget || {},
|
|
dataProblemEnabled: this._options.dataProblemWidgetEnabled
|
|
};
|
|
const s = new M.a(this._getHideNotMainSourcesValue());
|
|
this._hideNotMainSourcesInLegendSpawn = Object(O.a)(() => ({}), this
|
|
._chart.chartWidgetCollection().activeChartWidget, this._chart
|
|
.chartWidgetCollection().lock.crosshair), this
|
|
._hideNotMainSourcesInLegendSpawn.subscribe(() => {
|
|
s.setValue(this._getHideNotMainSourcesValue())
|
|
}), this._hideWholeLegend = new M.a(!1), g.tool.subscribe(this
|
|
._recalculateLegendVisibility), this._chartModel()
|
|
.crossHairSource().measuringEnabled().subscribe(this, this
|
|
._recalculateLegendVisibility), this._legendWidget = new t(this
|
|
._chartUndoModel(), this, this._chart.backgroundTopTheme(), s,
|
|
this._hideWholeLegend, i, {
|
|
showContextMenuForSelection: this
|
|
.showContextMenuForSelection.bind(this),
|
|
showContextMenuForSources: this.showContextMenuForSources
|
|
.bind(this),
|
|
updateActions: this._chart.updateActions.bind(this._chart),
|
|
showChartPropertiesForSource: this._chart
|
|
.showChartPropertiesForSource.bind(this._chart),
|
|
showGeneralChartProperties: this._chart
|
|
.showGeneralChartProperties.bind(this._chart),
|
|
showObjectsTreeDialog: this._chart.showObjectsTreeDialog
|
|
.bind(this._chart)
|
|
}), this._div.appendChild(this._legendWidget.getElement()), this
|
|
._legendWidget.updateLayout(), this._legendWidget
|
|
.updateWidgetModeBySize(this._size), this._legendWidget
|
|
.updateThemedColors(this._themedTopColor);
|
|
for (const e of Array.from(this._customLegendWidgetsFactoryMap.keys()))
|
|
this._legendWidget.addCustomWidgetToLegend(e, Object(r
|
|
.ensureDefined)(this._customLegendWidgetsFactoryMap.get(e)))
|
|
})
|
|
}
|
|
_loadAndCreatePaneControlsWidget() {
|
|
Promise.all([Promise.all([i.e("react"), i.e(72), i.e(7), i.e("chart-widget-gui")])
|
|
.then(i.bind(null, "lvAK")), Promise.all([i.e("react"), i.e(72), i.e(7),
|
|
i.e("chart-widget-gui")
|
|
]).then(i.bind(null, "MjAr"))
|
|
]).then(([e, t]) => {
|
|
if (this._isDestroyed) return;
|
|
const i = e.PaneControlsWidget;
|
|
this._paneControls = new i(this._chartUndoModel(), this, {
|
|
backgroundThemeName: this._chart.backgroundTopTheme()
|
|
}, {
|
|
toggleMaximizePane: this._chart.toggleMaximizePane.bind(this
|
|
._chart)
|
|
}, this._div), this._paneControls.updateWidgetModeByWidth(this._size
|
|
.w), this._paneControls.updateThemedColors(this
|
|
._themedTopColor), this._paneControlsResizeObserver = new t
|
|
.default(
|
|
this._handleRestrictLegendWidth.bind(this)), this
|
|
._paneControlsResizeObserver.observe(this._paneControls
|
|
.getElement())
|
|
})
|
|
}
|
|
_handleRestrictLegendWidth(e) {
|
|
if (null === this._legendWidget || null === this._paneControls) return;
|
|
const t = e[e.length - 1].contentRect.width,
|
|
i = 0 === t ? 0 : t + J + Z;
|
|
this._legendWidget.addMargin(i)
|
|
}
|
|
_onMagnetStateChanged() {
|
|
this._chart.isActive() && this._isToolActionActiveOnPane(!0) && this._chartModel()
|
|
.crossHairSource().visible && this._updateLineToolUsingMagnetOrShift()
|
|
}
|
|
_onShiftKeyStateChanged() {
|
|
this._chart.isActive() && this._isToolActionActiveOnPane(!1) && this._chartModel()
|
|
.crossHairSource().visible && this._updateLineToolUsingMagnetOrShift(p.a.create(
|
|
Object(Y.d)().value()))
|
|
}
|
|
_isToolActionActiveOnPane(e) {
|
|
const t = this._chartModel(),
|
|
i = t.lineBeingCreated() || t.lineBeingEdited() || t.sourcesBeingMoved()
|
|
.length > 0 && t.sourcesBeingMoved()[0];
|
|
return i ? t.paneForSource(i) === this._state : e && Object(f.isLineToolName)(g.tool
|
|
.value()) && t.crossHairSource().pane === this._state
|
|
}
|
|
_updateLineToolUsingMagnetOrShift(e) {
|
|
if (null === this._prevMoveEventPosition) return;
|
|
const {
|
|
x: t,
|
|
y: i
|
|
} = this._prevMoveEventPosition, s = this._chartModel().sourcesBeingMoved();
|
|
s.length > 0 ? this._alignSourcesThatBeingMoved(s, t, i, e) : this
|
|
._setCursorPosition(t, i, e)
|
|
}
|
|
_showEditDialogForSource(e, t) {
|
|
if (this._options.propertyPagesEnabled && e.userEditEnabled())
|
|
if (e === this._chartUndoModel().mainSeries()) this._chart
|
|
.showGeneralChartProperties(R.TabNames.symbol);
|
|
else if (Object(f.isLineTool)(e) || Object(_.isStudy)(e)) {
|
|
let i;
|
|
const s = null == t ? void 0 : t.data();
|
|
if (null != s) {
|
|
const e = s.areaName;
|
|
void 0 !== e && (i = ae.get(e))
|
|
}
|
|
this._chart.showChartPropertiesForSource(e, i).then(e => {
|
|
this._editDialog = e
|
|
})
|
|
}
|
|
}
|
|
_initToolCreationModeParams(e) {
|
|
this._startTouchPoint = new n.Point(e.pageX, e.pageY), this._initCrossHairPosition =
|
|
this._chartModel().crossHairSource().currentPoint()
|
|
}
|
|
_updateCrosshairPositionInToolCreationMode(e, t) {
|
|
if (t !== this._state) {
|
|
const i = this._chart.paneByState(t);
|
|
return i._startTouchPoint = this._startTouchPoint, i._initCrossHairPosition =
|
|
this._initCrossHairPosition, void i
|
|
._updateCrosshairPositionInToolCreationMode(e, t)
|
|
}
|
|
const i = this._chartModel().crossHairSource();
|
|
this._chart.justActivated() && (this._initCrossHairPosition = i.currentPoint());
|
|
const s = e.pageX,
|
|
o = e.pageY,
|
|
a = Object(r.ensureNotNull)(this._initCrossHairPosition),
|
|
l = new n.Point(s, o).subtract(Object(r.ensureNotNull)(this._startTouchPoint)),
|
|
c = a.add(l);
|
|
this._setCursorPosition(c.x, c.y, new p.a(e))
|
|
}
|
|
_priceAxisesContainer(e) {
|
|
return "left" === e ? this._lhsPriceAxisesContainer : this._rhsPriceAxisesContainer
|
|
}
|
|
_recalculatePriceScales() {
|
|
const e = this.state();
|
|
for (const t of e.leftPriceScales()) e.recalculatePriceScale(t);
|
|
for (const t of e.rightPriceScales()) e.recalculatePriceScale(t);
|
|
for (const t of e.sourcesByGroup().overlayPriceScaleSources()) Object(f.isLineTool)(
|
|
t) || e.recalculatePriceScale(t.priceScale())
|
|
}
|
|
_createLockTimeAxisAction(e) {
|
|
const t = Object(g.lockTimeAxis)().value();
|
|
return new H.Action({
|
|
label: Object(s.t)("Lock Vertical Line On Time Axis"),
|
|
statName: "LockCursorInTime",
|
|
checkable: !0,
|
|
checked: t,
|
|
onExecute: () => this._toggleLockTimeAxis(e.localX, !t)
|
|
})
|
|
}
|
|
_toggleLockTimeAxis(e, t) {
|
|
if (t) {
|
|
const t = this._chartUndoModel().timeScale(),
|
|
i = t.coordinateToIndex(e),
|
|
s = t.points().roughTime(i);
|
|
null !== s && g.lockTimeAxisTime.setValue(s)
|
|
}
|
|
Object(g.lockTimeAxis)().setValue(t)
|
|
}
|
|
_preventTouchEventsExceptPinch() {
|
|
return this._paneWidgetsSharedState.hasTouchesOnOtherPanes(this) || null !== this
|
|
._paneWidgetsSharedState.pinchingPane()
|
|
}
|
|
_updateHoveredSource(e, t, i) {
|
|
var s, r, n;
|
|
const o = this._chartUndoModel(),
|
|
a = o.model();
|
|
let l = !1;
|
|
const c = e && e.source,
|
|
h = this._chart.readOnly();
|
|
if (h && !Object(f.isLineTool)(e.source) || this._editDialog && this._editDialog
|
|
.visible().value()) h && (a.setHoveredSource(null, null), this
|
|
.setCursorForTool());
|
|
else {
|
|
const d = g.tool.value();
|
|
let p = null;
|
|
if (!this._processing && (Object(g.toolIsCursor)(d) || "eraser" === d && !h || t
|
|
.control() || !o.lineBeingCreated())) {
|
|
const {
|
|
hittest: t
|
|
} = e;
|
|
l = Boolean(null === (s = null == t ? void 0 : t.data()) || void 0 === s ?
|
|
void 0 : s.hideCrosshairLinesOnHover) || !!c && Object(f.isLineTool)
|
|
(c) && -1 !== X.indexOf(c.toolname), t && t.result() > u.HitTestResult
|
|
.MOVEPOINT_BACKGROUND ? (p = c, !(null == c ? void 0 : c
|
|
.isHoveredEnabled()) || "eraser" === d && c === o.mainSeries() ?
|
|
a.setHoveredSource(null, null) : a.setHoveredSource(c, null == t ?
|
|
void 0 : t.data())) : a.setHoveredSource(null, null)
|
|
}
|
|
h ? this.setCursorForTool(p, t, j.PaneCursorType.Default) : this._options
|
|
.sourceSelectionEnabled && (this._isSelectPointModeEnabled() ? this
|
|
._setCursorClassName("pointer") : this.setCursorForTool(p, t, null === (
|
|
n = null === (r = null == e ? void 0 : e.hittest) || void 0 ===
|
|
r ? void 0 : r.data()) || void 0 === n ? void 0 : n.cursorType));
|
|
const _ = o.model().customSourceBeingMoved(),
|
|
m = null !== _ ? [_] : o.model().sourcesBeingMoved(),
|
|
b = e.source;
|
|
if ((!m.length || null !== b && -1 === m.indexOf(b)) && this
|
|
._updateCommonTooltip(e), !h && null !== e.hittest && i && e.hittest
|
|
.hasPressedMoveHandler(i)) {
|
|
switch ((e.hittest.data() || {}).cursorType) {
|
|
case j.PaneCursorType.VerticalResize:
|
|
this._setCursorClassName("ns-resize");
|
|
break;
|
|
case j.PaneCursorType.HorizontalResize:
|
|
this._setCursorClassName("we-resize");
|
|
break;
|
|
case j.PaneCursorType.DiagonalNeSwResize:
|
|
this._setCursorClassName("nesw-resize");
|
|
break;
|
|
case j.PaneCursorType.DiagonalNwSeResize:
|
|
this._setCursorClassName("nwse-resize")
|
|
}
|
|
}
|
|
}
|
|
this._preventCrossHairMove() && this._clearCursorPosition(), this._chartModel()
|
|
.crossHairSource().setLinesShouldBeHidden(l)
|
|
}
|
|
}
|
|
},
|
|
UHyS: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "StandardPivotPointsPriceAxisView", (function() {
|
|
return n
|
|
}));
|
|
var s = i("KcY8");
|
|
const r = ["P", "S1", "R1", "S2", "R2", "S3", "R3", "S4", "R4", "S5", "R5"];
|
|
class n extends s.a {
|
|
constructor(e, t) {
|
|
super(), this._source = e, this._data = t;
|
|
const i = t.name;
|
|
this._completeName = "P" === i.toUpperCase() ? "P" : `S${i[1]}/R${i[1]}`
|
|
}
|
|
_updateRendererData(e, t, i) {
|
|
e.visible = !1, t.visible = !1;
|
|
const s = this._source.properties();
|
|
if (!s.visible.value()) return;
|
|
const n = this._completeName,
|
|
o = s.levelsStyle.visibility;
|
|
if (!o[n] || !o[n].value()) return;
|
|
const a = this._source.model().timeScale(),
|
|
l = this._source.priceScale();
|
|
if (a.isEmpty() || null === a.visibleBarsStrictRange() || null !== l && l
|
|
.isEmpty()) return;
|
|
const c = this._source.customData();
|
|
if (!c || !c.pivots) return;
|
|
const h = this._source.pricesView().prices()[r.indexOf(this._data.name
|
|
.toUpperCase())];
|
|
if (!h) return;
|
|
i.background = h.color, i.textColor = this.generateTextColor(h.color), i
|
|
.coordinate = h.coordinate, i.floatCoordinate = h.floatCoordinate;
|
|
const u = this._source.model().properties().scalesProperties;
|
|
u.showStudyLastValue.value() && (e.text = h.formatted, e.visible = !0), u
|
|
.showStudyPlotLabels.value() && (t.text = this._source.priceLabelText(this
|
|
._data.name), t.visible = !0)
|
|
}
|
|
}
|
|
},
|
|
USzt: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return c
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("cBZt"),
|
|
n = i("MSvv"),
|
|
o = i("jenN"),
|
|
a = i("wYrq");
|
|
const l = Object(r.studyIdString)("VbPFixed", "tv-volumebyprice");
|
|
class c extends n.StudyLineDataSource {
|
|
constructor(e, t, i, s) {
|
|
const r = i || e.studyMetaInfoRepository().findByIdSync({
|
|
type: "java",
|
|
studyId: l
|
|
}),
|
|
n = t || c._createPropertiesFromStudyMetaInfo(r, e.studyVersioning());
|
|
super(e, r, "vbpfixed_", n), Object(o.createGraphicsPaneViews)(this, e).then(
|
|
t => {
|
|
if (s = e.mainSeries(), r.plots.length > 0) {
|
|
const i = new a.a(this, s, e, r.plots[0].id);
|
|
t.push(i)
|
|
}
|
|
if (r.plots.length > 1) {
|
|
const i = new a.a(this, s, e, r.plots[1].id);
|
|
t.push(i)
|
|
}
|
|
if (r.plots.length > 2) {
|
|
const i = new a.a(this, s, e, r.plots[2].id);
|
|
t.push(i)
|
|
}
|
|
this._setPaneViews(t)
|
|
}), this.clearData()
|
|
}
|
|
pointsCount() {
|
|
return 2
|
|
}
|
|
boundToSymbol() {
|
|
return !1
|
|
}
|
|
offset(e) {
|
|
return 0
|
|
}
|
|
getMinFirstBarIndexForPlot() {
|
|
return -1 / 0
|
|
}
|
|
calcIsActualSymbol() {
|
|
this._isActualSymbol = !0, this._isActualCurrency = !0, this._isActualUnit = !0,
|
|
this.calcIsActualInterval()
|
|
}
|
|
cloneable() {
|
|
return !1
|
|
}
|
|
isSynchronizable() {
|
|
return !1
|
|
}
|
|
static createProperties(e) {
|
|
const t = super._createPropertiesFromStudyIdAndState(l, e);
|
|
return c._configureProperties(t), t
|
|
}
|
|
static studyId() {
|
|
return l
|
|
}
|
|
_studyInputs(e) {
|
|
Object(s.assert)(2 === e.length, "all the line tool points should be defined");
|
|
const [t, i] = e, r = Math.max(t.index, i.index), n = this._model.mainSeries()
|
|
.bars().lastIndex(), o = this._getPointTime(t.index <= i.index ? t : i, !0),
|
|
a = this._getPointTime(i.index >= t.index ? i : t, !0);
|
|
return null === o || null === a ? (this
|
|
._subscribeApplyInputsOnSeriesCompleted(), null) : {
|
|
rowsLayout: this.properties().inputs.rowsLayout.value(),
|
|
rows: this.properties().inputs.rows.value(),
|
|
volume: this.properties().inputs.volume.value(),
|
|
vaVolume: this.properties().inputs.vaVolume.value(),
|
|
first_bar_time: 1e3 * o,
|
|
last_bar_time: 1e3 * a,
|
|
subscribeRealtime: n === r
|
|
}
|
|
}
|
|
_isReady() {
|
|
return !Object(o.isStudyGraphicsEmpty)(this.graphics())
|
|
}
|
|
_getPropertyDefinitionsViewModelClass() {
|
|
return Promise.all([i.e(27), i.e(61), i.e(62), i.e(
|
|
"study-property-pages-with-definitions")]).then(i.bind(null, "cKLu"))
|
|
.then(e => e.StudyLineDataSourceDefinitionsViewModel)
|
|
}
|
|
_updateAnchorsPrice() {
|
|
let e = null,
|
|
t = null;
|
|
this.graphics().hhists().forEach(i => {
|
|
i.forEach(i => {
|
|
const s = i.priceLow,
|
|
r = i.priceHigh;
|
|
(!e || s < e) && (e = s), (!t || r > t) && (t = r)
|
|
})
|
|
}), null !== e && null !== t && (this._timePoint.length && (this._timePoint[
|
|
0].price = t, this._timePoint[1].price = e), this._points.length &&
|
|
(this._points[0].price = t, this._points[1].price = e))
|
|
}
|
|
}
|
|
},
|
|
UlDV: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "RestrictedToolsetBootloader", (function() {
|
|
return r
|
|
}));
|
|
var s = i("cZRT");
|
|
class r extends s.a {
|
|
_startLoading() {
|
|
return Promise.all([i.e("react"), i.e(1), i.e(4), i.e(6), i.e(11), i.e(12), i.e(
|
|
13), i.e(14), i.e(22), i.e(24), i.e(28), i.e(29), i.e(41), i.e(
|
|
51), i.e(52), i.e(64), i.e(66), i.e(69), i.e(70), i.e(71), i.e(
|
|
0), i.e(5), i.e(7), i.e(10), i.e(38), i.e(57), i.e(
|
|
"restricted-toolset")]).then(i.bind(null, "miV2")).then(e => e
|
|
.getRestrictedToolSet())
|
|
}
|
|
}
|
|
},
|
|
Ulff: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return s
|
|
}));
|
|
const s = {
|
|
common: i("HGP3").colorsPalette["color-tv-blue-500"],
|
|
active: "#143EB3"
|
|
}
|
|
},
|
|
UqOQ: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return l
|
|
}));
|
|
var s = i("aIyQ"),
|
|
r = i.n(s),
|
|
n = i("e3/o");
|
|
|
|
function o(e) {
|
|
return e.properties().visible.value()
|
|
}
|
|
|
|
function a(e) {
|
|
return !o(e)
|
|
}
|
|
class l {
|
|
constructor(e, t, i) {
|
|
this._onChanged = new r.a, this._lineToolsSet = new Set, this._lineTools = [...e],
|
|
this._lineToolsSet = new Set(this._lineTools), this._name = t, this.id = i ||
|
|
Object(n.randomHashN)(6), this.instanceId = Object(n.randomHashN)(6)
|
|
}
|
|
lineTools() {
|
|
return this._lineTools
|
|
}
|
|
name() {
|
|
return this._name
|
|
}
|
|
setName(e) {
|
|
this._doAndFireOnChange(() => {
|
|
this._name = e
|
|
})
|
|
}
|
|
isActualSymbol() {
|
|
return this._lineTools.length > 0 && this._lineTools[0].isActualSymbol() && this
|
|
._lineTools[0].isActualCurrency() && this._lineTools[0].isActualUnit()
|
|
}
|
|
symbol() {
|
|
return this._lineTools[0].symbol()
|
|
}
|
|
currencyId() {
|
|
var e;
|
|
return null !== (e = this._lineTools[0].properties().childs().currencyId.value()) &&
|
|
void 0 !== e ? e : null
|
|
}
|
|
unitId() {
|
|
var e;
|
|
return null !== (e = this._lineTools[0].properties().childs().unitId.value()) &&
|
|
void 0 !== e ? e : null
|
|
}
|
|
containsLineTool(e) {
|
|
return this._lineToolsSet.has(e)
|
|
}
|
|
addLineTools(e) {
|
|
this._doAndFireOnChange(t => {
|
|
e.forEach(i => {
|
|
this._lineToolsSet.add(i), t.push(...e.map(e => e.id()))
|
|
}), this._lineTools.push(...e)
|
|
})
|
|
}
|
|
excludeLineTool(e) {
|
|
this._doAndFireOnChange(t => {
|
|
this._lineToolsSet.delete(e);
|
|
const i = this._lineTools.indexOf(e);
|
|
this._lineTools.splice(i, 1), t.push(e.id())
|
|
})
|
|
}
|
|
excludeLineTools(e) {
|
|
this._doAndFireOnChange(t => {
|
|
const i = new Set(e);
|
|
e.forEach(e => this._lineToolsSet.delete(e)), this._lineTools = this
|
|
._lineTools.filter(e => !i.has(e)), t.push(...e.map(e => e.id()))
|
|
})
|
|
}
|
|
state() {
|
|
return {
|
|
id: this.id,
|
|
name: this._name,
|
|
tools: this._lineTools.map(e => e.id())
|
|
}
|
|
}
|
|
visibility() {
|
|
const e = this._lineTools.some(o),
|
|
t = this._lineTools.some(a);
|
|
return e && !t ? "Visible" : t && !e ? "Invisible" : "Partial"
|
|
}
|
|
locked() {
|
|
const e = this._lineTools.some(e => e.properties().frozen.value()),
|
|
t = this._lineTools.some(e => !e.properties().frozen.value());
|
|
return e && !t ? "Locked" : t && !e ? "Unlocked" : "Partial"
|
|
}
|
|
isActualInterval() {
|
|
const e = this._lineTools.some(e => e.isActualInterval()),
|
|
t = this._lineTools.some(e => !e.isActualInterval());
|
|
return e && !t ? "IsActualInterval" : t && !e ? "IsNotActualInterval" : "Partial"
|
|
}
|
|
onChanged() {
|
|
return this._onChanged
|
|
}
|
|
static fromState(e, t) {
|
|
const i = [];
|
|
for (const s of t.tools) {
|
|
const t = e.dataSourceForId(s);
|
|
null !== t && i.push(t)
|
|
}
|
|
return i.length > 0 ? new l(i, t.name, t.id) : null
|
|
}
|
|
_doAndFireOnChange(e) {
|
|
const t = [],
|
|
i = this.visibility(),
|
|
s = this.locked(),
|
|
r = this.name(),
|
|
n = this.isActualInterval();
|
|
e(t);
|
|
const o = {
|
|
affectedLineTools: t,
|
|
visibilityChanged: this.visibility() !== i,
|
|
lockedChanged: s !== this.locked(),
|
|
titleChanged: r !== this.name(),
|
|
isActualIntervalChanged: n !== this.isActualInterval()
|
|
};
|
|
this._onChanged.fire(o)
|
|
}
|
|
}
|
|
},
|
|
V086: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("aO4+").Point,
|
|
r = i("GEp6").distanceToLine,
|
|
n = i("Ss5c").LineDataSource,
|
|
o = i("Ocx9").DefaultProperty,
|
|
a = i("j3hX").LineToolColorsProperty;
|
|
class l extends n {
|
|
constructor(e, t) {
|
|
super(e, t || l.createProperties()), this.version = l.version, i.e("lt-pane-views")
|
|
.then(i.t.bind(null, "obU/", 7)).then(({
|
|
EllipsePaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
startChanging(e, t) {
|
|
if (super.startChanging(e, t), 0 === e || 1 === e) {
|
|
var i = this.pointToScreenPoint(this._points[0])[0],
|
|
s = this.pointToScreenPoint(this._points[1])[0],
|
|
n = this.pointToScreenPoint(this._points[2])[0];
|
|
this._dist = r(i, s, n).distance || 0
|
|
}
|
|
}
|
|
_preparePoint(e, t) {
|
|
var i = this._preparePointInternal(e, t, !1);
|
|
return t && t.shift() && this._points[0].index === this._points[1].index && this
|
|
._fixVerticalDiameterPoints(this._points[1], this._points[0], i), i
|
|
}
|
|
_preparePointInternal(e, t, i) {
|
|
var r = Object.assign({}, e);
|
|
if (t && t.shift()) {
|
|
var n = this.points().length;
|
|
if (!this._fakePointAdded && 3 === n && !i) return r;
|
|
if (this._fakePointAdded || 2 === n || i) {
|
|
this._snapPoint45Degree(e, this._points[0]), this._fakePointAdded ? this
|
|
._points[1] = e : i || (this._fakePointAdded = !0, super
|
|
._addPointIntenal(e));
|
|
var o = this.pointToScreenPoint(this._points[0])[0],
|
|
a = this.pointToScreenPoint(this._points[1])[0],
|
|
l = a.x - o.x,
|
|
c = a.y - o.y,
|
|
h = Math.sqrt(l * l + c * c) / 2,
|
|
u = a.subtract(o),
|
|
d = o.add(a).scaled(.5),
|
|
p = new s(-u.y, u.x);
|
|
p = p.normalized();
|
|
var _ = d.add(p.scaled(h));
|
|
r = this.screenPointToPoint(_), (TradingView.isNaN(r.price) || TradingView
|
|
.isNaN(r.index)) && (r = this.screenPointToPoint(d))
|
|
}
|
|
} else this._fakePointAdded && (this._points.splice(1, 1), this._fakePointAdded = !
|
|
1);
|
|
return r
|
|
}
|
|
_fixVerticalDiameterPoints(e, t, i) {
|
|
var s = this.pointToScreenPoint(e)[0],
|
|
r = this.pointToScreenPoint(t)[0],
|
|
n = this._model.timeScale(),
|
|
o = n.indexToCoordinate(e.index),
|
|
a = n.indexToCoordinate(i.index),
|
|
l = 2 * Math.abs(o - a);
|
|
l *= t.price > e.price ? 1 : -1, e.price = this.screenPointToPoint({
|
|
x: s.x,
|
|
y: r.y + l
|
|
}).price
|
|
}
|
|
addPoint(e, t, i) {
|
|
var s = n.prototype.addPoint.call(this, e, t, i);
|
|
return s && (this._fakePointAdded = !1), s
|
|
}
|
|
setPoint(e, t, i) {
|
|
var n = Object.assign({}, t),
|
|
o = this.pointToScreenPoint(this._points[0])[0],
|
|
a = this.pointToScreenPoint(this._points[1])[0],
|
|
l = this.pointToScreenPoint(this._points[2])[0];
|
|
switch (e) {
|
|
case 0:
|
|
if (i && i.shift()) {
|
|
this._snapPoint45Degree(n, this._points[1]), this._points[0] = n, this
|
|
._points[2] = this._preparePointInternal(this._points[2], i, !0),
|
|
this._points[0].index === this._points[1].index && this
|
|
._fixVerticalDiameterPoints(this._points[0], this._points[1], this
|
|
._points[2]);
|
|
break
|
|
}
|
|
o = this.pointToScreenPoint(n)[0];
|
|
var c = a.subtract(o),
|
|
h = o.add(a).scaled(.5);
|
|
d = (d = new s(-c.y, c.x)).normalized(), l = h.add(d.scaled(this._dist)),
|
|
l = this.screenPointToPoint(l), this._points[0] = n, this._points[2] =
|
|
l;
|
|
break;
|
|
case 1:
|
|
if (i && i.shift()) {
|
|
this._snapPoint45Degree(n, this._points[0]), this._points[1] = n, this
|
|
._points[2] = this._preparePointInternal(this._points[2], i, !0),
|
|
this._points[0].index === this._points[1].index && this
|
|
._fixVerticalDiameterPoints(this._points[1], this._points[0], this
|
|
._points[2]);
|
|
break
|
|
}
|
|
c = (a = this.pointToScreenPoint(n)[0]).subtract(o), h = o.add(a).scaled(
|
|
.5);
|
|
d = (d = new s(-c.y, c.x)).normalized(), l = h.add(d.scaled(this._dist)),
|
|
l = this.screenPointToPoint(l), this._points[1] = n, this._points[2] =
|
|
l;
|
|
break;
|
|
case 2:
|
|
n = this.pointToScreenPoint(n)[0];
|
|
var u = r(o, a, n).distance;
|
|
c = a.subtract(o), h = o.add(a).scaled(.5);
|
|
d = (d = new s(-c.y, c.x)).normalized(), l = h.add(d.scaled(u)), l = this
|
|
.screenPointToPoint(l), this._points[2] = l;
|
|
break;
|
|
case 3:
|
|
n = this.pointToScreenPoint(n)[0];
|
|
var d;
|
|
u = r(o, a, n).distance, c = a.subtract(o), h = o.add(a).scaled(.5);
|
|
d = (d = new s(-c.y, c.x)).normalized(), l = h.add(d.scaled(u)), l = this
|
|
.screenPointToPoint(l), this._points[2] = l
|
|
}
|
|
this.normalizePoints()
|
|
}
|
|
pointsCount() {
|
|
return 3
|
|
}
|
|
name() {
|
|
return "Ellipse"
|
|
}
|
|
hasEditableCoordinates() {
|
|
return !1
|
|
}
|
|
migrateVersion(e, t, i) {
|
|
if (1 === e && 2 === this._points.length) {
|
|
var s = this._points[0].price,
|
|
r = .5 * (this._points[0].price + this._points[1].price);
|
|
this._points[0] = {
|
|
price: r,
|
|
index: this._points[0].index
|
|
}, this._points[1] = {
|
|
price: r,
|
|
index: this._points[1].index
|
|
}, this._points.push({
|
|
price: s,
|
|
index: this._points[0].index
|
|
})
|
|
}
|
|
if (1 === e && 2 === this._timePoint.length) {
|
|
s = this._timePoint[0].price, r = .5 * (this._timePoint[0].price + this
|
|
._timePoint[1].price);
|
|
this._timePoint[0].price = r, this._timePoint[1].price = r;
|
|
var n = {
|
|
price: s,
|
|
offset: this._timePoint[0].offset,
|
|
time_t: this._timePoint[0].time_t
|
|
};
|
|
this._timePoint.push(n)
|
|
}
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "Zd1D")))
|
|
.GeneralFiguresDefinitionsViewModel
|
|
}
|
|
static createProperties(e) {
|
|
var t = new o("linetoolellipse", e);
|
|
return l._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
n._configureProperties(e), e.addChild("linesColors", new a([e.childs().color]))
|
|
}
|
|
}
|
|
l.version = 2, t.LineToolEllipse = l
|
|
},
|
|
V3Oj: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineToolText", (function() {
|
|
return h
|
|
})), i.d(t, "LineToolTextAbsolute", (function() {
|
|
return u
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("aO4+"),
|
|
n = i("Ss5c"),
|
|
o = i("tc+8"),
|
|
a = i.n(o),
|
|
l = i("Ocx9"),
|
|
c = i("j3hX");
|
|
class h extends n.LineDataSource {
|
|
constructor(e, t) {
|
|
const s = t || h.createProperties();
|
|
super(e, s), this._barSpacing = e.timeScale().barSpacing(), this
|
|
._recalculatePointsOnCenter = !1, i.e("lt-pane-views").then(i.bind(null,
|
|
"mr3a")).then(({
|
|
TextPaneView: t
|
|
}) => {
|
|
const i = this._recalculatePointsOnCenter ? (e, t) => {
|
|
this._recalculatePointsOnCenter && this
|
|
._recalculateCenterPosition(e, t)
|
|
} : void 0;
|
|
this._setPaneViews([new t(this, e, void 0, void 0, void 0, void 0,
|
|
void 0, i)])
|
|
})
|
|
}
|
|
centerPosition() {
|
|
this._recalculatePointsOnCenter = !0
|
|
}
|
|
setPoint(e, t, i) {
|
|
const s = this.properties().childs();
|
|
let r;
|
|
if (0 === e && s.wordWrapWidth.value()) {
|
|
const e = this.model().timeScale();
|
|
r = this.isFixed() ? this.fixedPoints()[0].x : e.indexToCoordinate(this
|
|
.points()[0].index);
|
|
const i = e.indexToCoordinate(t.index) - r - ~~(s.fontsize.value() / 6);
|
|
if (!isFinite(i)) return;
|
|
s.wordWrapWidth.setValue(Math.max(100, i))
|
|
}
|
|
}
|
|
pointsCount() {
|
|
return 1
|
|
}
|
|
name() {
|
|
return "Text"
|
|
}
|
|
setPriceScale(e) {
|
|
super.setPriceScale(e), e && e.priceRange() && (this._priceDencity = e
|
|
.height() / Object(s.ensureNotNull)(e.priceRange()).length(), this
|
|
._isPriceDencityLog = e.isLog())
|
|
}
|
|
restoreSize() {
|
|
const e = Object(s.ensureNotNull)(this.priceScale());
|
|
this._barSpacing = this.model().timeScale().barSpacing(),
|
|
this._priceDencity = e.height() / Object(s.ensureNotNull)(e.priceRange())
|
|
.length(), this.redraw()
|
|
}
|
|
redraw() {
|
|
this.updateAllViews(), this._model.updateSource(this)
|
|
}
|
|
properties() {
|
|
return super.properties()
|
|
}
|
|
template() {
|
|
const e = super.template();
|
|
return e.text = this.properties().childs().text.value(), e
|
|
}
|
|
state(e) {
|
|
const t = super.state(e);
|
|
return e && (t.state.fixedSize = !1), t
|
|
}
|
|
barSpacing() {
|
|
return this._barSpacing
|
|
}
|
|
priceDencity() {
|
|
return this._priceDencity
|
|
}
|
|
isPriceDencityLog() {
|
|
return this._isPriceDencityLog
|
|
}
|
|
hasEditableCoordinates() {
|
|
return !1
|
|
}
|
|
static createProperties(e) {
|
|
const t = new l.DefaultProperty("linetooltext", e);
|
|
return h._configureProperties(t), t
|
|
}
|
|
_applyTemplateImpl(e) {
|
|
super._applyTemplateImpl(e), this.properties().childs().text.setValue(e.text)
|
|
}
|
|
_getPropertyDefinitionsViewModelClass() {
|
|
return Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "QWxu")).then(
|
|
e => e.TextDefinitionsViewModel)
|
|
}
|
|
static _configureProperties(e) {
|
|
n.LineDataSource._configureProperties(e), e.hasChild("text") || e.addChild(
|
|
"text", new a.a(window.t("Text"))), e.addExclusion("text"), e.addChild(
|
|
"linesColors", new c.LineToolColorsProperty([e.childs().borderColor])),
|
|
e.addChild("textsColors", new c.LineToolColorsProperty([e.childs().color])),
|
|
e.addExclusion("linesColors"), e.addExclusion("textsColors")
|
|
}
|
|
_recalculateCenterPosition(e, t) {
|
|
const i = (this.isFixed() ? this.fixedPoints() : this.pointToScreenPoint(this
|
|
._points[0]))[0],
|
|
s = new r.Point(i.x - e / 2, i.y - t / 2),
|
|
n = this.screenPointToPoint(s);
|
|
this.setPoints([n]), this.normalizePoints(), this.createServerPoints(), this
|
|
.redraw()
|
|
}
|
|
}
|
|
class u extends h {
|
|
constructor(e, t) {
|
|
super(e, t || u.createProperties())
|
|
}
|
|
name() {
|
|
return "Anchored Text"
|
|
}
|
|
hasEditableCoordinates() {
|
|
return !1
|
|
}
|
|
isFixed() {
|
|
return !0
|
|
}
|
|
static createProperties(e) {
|
|
const t = new l.DefaultProperty("linetooltextabsolute", e);
|
|
return u._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
h._configureProperties(e)
|
|
}
|
|
}
|
|
},
|
|
VNzU: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
i("Dq3s");
|
|
i.d(t, "layouts", (function() {
|
|
return r
|
|
})), i.d(t, "isSingleLayout", (function() {
|
|
return n
|
|
})), i.d(t, "isMultipleLayout", (function() {
|
|
return o
|
|
}));
|
|
let s;
|
|
s = {};
|
|
const r = {
|
|
...{
|
|
s: {
|
|
title: "1 chart",
|
|
count: 1,
|
|
sizer: (e, t) => {
|
|
if (0 !== t) throw new RangeError("invalid index");
|
|
return e
|
|
}
|
|
}
|
|
},
|
|
...s
|
|
};
|
|
|
|
function n(e) {
|
|
return "s" === e
|
|
}
|
|
|
|
function o(e) {
|
|
return !n(e)
|
|
}
|
|
},
|
|
VVxS: function(e, t, i) {
|
|
"use strict";
|
|
const {
|
|
getLogger: s
|
|
} = i("txPx"), r = s("TVLocalStorage");
|
|
var n = function() {
|
|
try {
|
|
this.isAvailable = !0, this.localStorage = window.localStorage, this.localStorage
|
|
.setItem("tvlocalstorage.available", "true")
|
|
} catch (e) {
|
|
delete this.isAvailable, delete this.localStorage
|
|
}
|
|
this._updateLength();
|
|
try {
|
|
this._report()
|
|
} catch (e) {}
|
|
};
|
|
n.prototype._report = function() {
|
|
if (this.isAvailable) {
|
|
const e = 10,
|
|
t = [];
|
|
for (let e = 0; e < this.localStorage.length; e++) {
|
|
const i = this.key(e);
|
|
t.push({
|
|
key: i,
|
|
length: String(this.getItem(i)).length
|
|
})
|
|
}
|
|
t.sort((e, t) => t.length - e.length);
|
|
const i = t.slice(0, e);
|
|
t.sort((e, t) => t.key.length - e.key.length);
|
|
const s = t.slice(0, e);
|
|
r.logNormal("Total amount of keys in Local Storage: " + this.length), r.logNormal(
|
|
`Top ${e} keys with longest values: ${JSON.stringify(i)}`),
|
|
r.logNormal(`Top ${e} longest key names: ${JSON.stringify(s)}`);
|
|
try {
|
|
navigator.storage.estimate().then(e => {
|
|
r.logNormal("Storage estimate: " + JSON.stringify(e))
|
|
})
|
|
} catch (e) {}
|
|
}
|
|
}, n.prototype.length = 0, n.prototype.isAvailable = !1, n.prototype.localStorage = {
|
|
"tvlocalstorage.available": "false"
|
|
}, n.prototype._updateLength = function() {
|
|
if (this.isAvailable) this.length = this.localStorage.length;
|
|
else {
|
|
var e, t = 0;
|
|
for (e in this.localStorage) this.localStorage.hasOwnProperty(e) && t++;
|
|
this.length = t
|
|
}
|
|
}, n.prototype.key = function(e) {
|
|
return this.isAvailable ? this.localStorage.key(e) : Object.keys(this.localStorage)[e]
|
|
}, n.prototype.getItem = function(e) {
|
|
return this.isAvailable ? this.localStorage.getItem(e) : void 0 === this.localStorage[
|
|
e] ? null : this.localStorage[e]
|
|
}, n.prototype.setItem = function(e, t) {
|
|
this.isAvailable ? this.localStorage.setItem(e, t) : this.localStorage[e] = t, this
|
|
._updateLength()
|
|
}, n.prototype.removeItem = function(e) {
|
|
this.isAvailable ? this.localStorage.removeItem(e) : delete this.localStorage[e], this
|
|
._updateLength()
|
|
}, n.prototype.clear = function() {
|
|
this.isAvailable ? this.localStorage.clear() : this.localStorage = {}, this
|
|
._updateLength()
|
|
};
|
|
var o = function(e) {
|
|
this.storage = e
|
|
};
|
|
o.prototype.getItem = function(e) {
|
|
return Promise.resolve(this.storage.getItem(e))
|
|
}, o.prototype.setItem = function(e, t) {
|
|
return Promise.resolve(this.storage.setItem(e, t))
|
|
}, window.TVLocalStorage = new n, window.TVLocalStorageAsync = new o(window.TVLocalStorage),
|
|
e.exports = {
|
|
TVLocalStorage: window.TVLocalStorage,
|
|
TVLocalStorageAsync: window.TVLocalStorageAsync
|
|
}
|
|
},
|
|
VaSN: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "lastEventIsTouch", (function() {
|
|
return n
|
|
})), i.d(t, "lastEventIsMouse", (function() {
|
|
return o
|
|
})), i.d(t, "setLastEventIsTouch", (function() {
|
|
return a
|
|
}));
|
|
var s = i("qFKp");
|
|
let r = Object(s.supportTouch)();
|
|
|
|
function n() {
|
|
return r
|
|
}
|
|
|
|
function o() {
|
|
return r
|
|
}
|
|
|
|
function a(e) {
|
|
r = e
|
|
}
|
|
},
|
|
VdBB: function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e, t, i) {
|
|
if (e.isTouch) {
|
|
if (void 0 !== i) return !0
|
|
} else if (void 0 !== t) return !0;
|
|
return !1
|
|
}
|
|
|
|
function r(e, t, i) {
|
|
if (e.isTouch) {
|
|
if (void 0 !== i) return i(e), !0
|
|
} else if (void 0 !== t) return t(e), !0;
|
|
return !1
|
|
}
|
|
|
|
function n(e, t, i, s) {
|
|
return void 0 !== t.executeDefaultAction && (e.isTouch ? Boolean(t.executeDefaultAction[
|
|
s]) : Boolean(t.executeDefaultAction[i]))
|
|
}
|
|
var o;
|
|
i.r(t), i.d(t, "hasMouseOrTouchHandler", (function() {
|
|
return s
|
|
})), i.d(t, "tryCallHandler", (function() {
|
|
return r
|
|
})), i.d(t, "shouldDefaultActionBeExecuted", (function() {
|
|
return n
|
|
})), i.d(t, "AreaName", (function() {
|
|
return o
|
|
})), i.d(t, "HitTestResult", (function() {
|
|
return a
|
|
})),
|
|
function(e) {
|
|
e.Style = "Style", e.Text = "Text", e.SourceItemMove = "SourceItemMove"
|
|
}(o || (o = {}));
|
|
class a {
|
|
constructor(e, t, i) {
|
|
this._result = e, this._data = t || null, this._eraseMarker = i
|
|
}
|
|
result() {
|
|
return this._result
|
|
}
|
|
data() {
|
|
return this._data
|
|
}
|
|
hasPressedMoveHandler(e) {
|
|
return null !== this._data && s(e, this._data.pressedMouseMoveHandler, this._data
|
|
.touchMoveHandler)
|
|
}
|
|
tryCallMouseDownOrTouchStartHandler(e) {
|
|
return null !== this._data && r(e, this._data.mouseDownHandler, this._data
|
|
.touchStartHandler)
|
|
}
|
|
tryCallMouseUpOrTouchEndHandler(e) {
|
|
return null !== this._data && r(e, this._data.mouseUpHandler, this._data
|
|
.touchEndHandler)
|
|
}
|
|
tryCallMouseEnterHandler(e) {
|
|
return null !== this._data && r(e, this._data.mouseEnterHandler)
|
|
}
|
|
tryCallMouseLeaveHandler(e) {
|
|
return null !== this._data && r(e, this._data.mouseLeaveHandler)
|
|
}
|
|
tryCallMouseMoveHandler(e) {
|
|
return null !== this._data && r(e, this._data.mouseMoveHandler)
|
|
}
|
|
tryCallClickOrTapHandler(e) {
|
|
return null !== this._data && r(e, this._data.clickHandler, this._data.tapHandler)
|
|
}
|
|
tryCallDblClickOrDblTapHandler(e) {
|
|
return null !== this._data && r(e, this._data.doubleClickHandler, this._data
|
|
.doubleTapHandler)
|
|
}
|
|
tryCallContextMenuHandler(e) {
|
|
return null !== this._data && r(e, this._data.contextMenuHandler, this._data
|
|
.touchContextMenuHandler)
|
|
}
|
|
eraseMarker() {
|
|
return this._eraseMarker
|
|
}
|
|
}
|
|
a.MOVEPOINT_BACKGROUND = 1, a.REGULAR = 2, a.MOVEPOINT = 3, a.CHANGEPOINT = 4, a.CUSTOM = 5
|
|
},
|
|
Vdly: function(e, t, i) {
|
|
"use strict";
|
|
(function(e) {
|
|
i("qFKp");
|
|
i("wVAQ").fetch;
|
|
var t = i("dTSQ").regExpEscape,
|
|
s = i("FBuY").TVXWindowEvents,
|
|
r = i("VVxS").TVLocalStorage,
|
|
n = i("aIyQ"),
|
|
o = i("Kxc7"),
|
|
a = ["s.tradingview.com", "betacdn.tradingview.com"],
|
|
l = o.enabled("use_localstorage_for_settings"),
|
|
c = window.TVSettings = function() {
|
|
var e = !1,
|
|
i = null;
|
|
|
|
function h() {
|
|
return !i && l
|
|
}
|
|
try {
|
|
e = !TradingView.onWidget() && parent && parent !== window && !!parent
|
|
.IS_DEMO_PAGE
|
|
} catch (e) {}
|
|
if (e) {
|
|
var u = {
|
|
"widgetbar.layout-settings": {
|
|
widgets: {},
|
|
settings: {
|
|
minimized: !0
|
|
}
|
|
},
|
|
notShowMainWizard: !0
|
|
},
|
|
d = function(e, t, i) {
|
|
var s = u[e];
|
|
return null == s ? t : s
|
|
},
|
|
p = function() {};
|
|
return {
|
|
loaded: !1,
|
|
loadedModel: !1,
|
|
getValue: d,
|
|
getJSON: d,
|
|
getBool: d,
|
|
getFloat: d,
|
|
getInt: d,
|
|
setValue: p,
|
|
setJSON: p,
|
|
remove: p,
|
|
keys: function() {
|
|
return Object.keys(u)
|
|
},
|
|
keysMask: function() {
|
|
return []
|
|
},
|
|
sync: p,
|
|
onSync: {
|
|
subscribe: function() {}
|
|
}
|
|
}
|
|
}
|
|
window.environment;
|
|
var _, m = TradingView.onWidget() ? "tradingview-widget" : "tradingview",
|
|
f = m + ".",
|
|
g = {},
|
|
b = [/^widgetbar\.widget\.watchlist.+/, /.+quicks$/,
|
|
/^widgetbar\.layout-settings$/, /^ChartSideToolbarWidget\.visible$/,
|
|
/^onwidget\.watchlist$/, /^domepanel.visible$/, /^orderpanel.visible$/,
|
|
/^chart\.favoriteDrawings$/, /^chart\.favoriteDrawingsPosition$/,
|
|
/^loadChartDialog.favorites$/,
|
|
/^ChartFavoriteDrawingToolbarWidget\.visible/,
|
|
/^trading\.chart\.proterty$/, /^trading_floating_toolbar\.position$/,
|
|
/^trading\.orderWidgetMode\./, /^symbolWatermark$/,
|
|
/^pinereference\.size$/, /^pinereference\.position$/, /^hint\.+/,
|
|
/^ChartDrawingToolbarWidget\.visible/
|
|
];
|
|
const v = ["current_theme.name"];
|
|
|
|
function S(e) {
|
|
return f + e
|
|
}
|
|
|
|
function y(e) {
|
|
return e.substring(f.length)
|
|
}
|
|
|
|
function w(e, t) {
|
|
var i = g[e];
|
|
return null == i ? t : i
|
|
}
|
|
|
|
function P(e, t, i) {
|
|
i = i || {};
|
|
var s = "" + t;
|
|
return g[e] !== s && (g[e] = s, x(e)), i.forceFlush && !_ && (_ =
|
|
setTimeout((function() {
|
|
_ = void 0, T()
|
|
}), 10)), c
|
|
}
|
|
|
|
function C(e, t) {
|
|
return t = t || {}, null != g[e] && (delete g[e], x(e)), t.forceFlush &&
|
|
T(), c
|
|
}
|
|
|
|
function x(e) {
|
|
if (i) null == g[e] ? i.removeValue(e) : i.setValue(e, g[e]);
|
|
else if (h()) try {
|
|
null == g[e] ? r.removeItem(S(e)) : r.setItem(S(e), g[e])
|
|
} catch (e) {} else 0;
|
|
s.emit("settings", JSON.stringify({
|
|
key: e,
|
|
value: g[e]
|
|
}))
|
|
}
|
|
|
|
function T(e) {}
|
|
|
|
function I() {
|
|
return Object.keys(g)
|
|
}
|
|
|
|
function M(e) {
|
|
for (var t = 0; t < b.length; ++t)
|
|
if (b[t].exec(e)) return !0;
|
|
return !1
|
|
}
|
|
|
|
function O(e) {
|
|
return e.substring(0, f.length) === f
|
|
}
|
|
|
|
function L(e) {
|
|
g = {};
|
|
const t = 0 === Object.keys(e).length;
|
|
t || function(e) {
|
|
Object.keys(e).forEach((function(t) {
|
|
g[t] = e[t] + ""
|
|
}))
|
|
}(e),
|
|
function(e) {
|
|
for (var t = r.length; t--;) {
|
|
var i = r.key(t);
|
|
i && O(i) && ((e || v.includes(y(i))) && P(y(i), r.getItem(i)),
|
|
r.removeItem(i))
|
|
}
|
|
}(t)
|
|
}
|
|
s.on("settings", (function(e) {
|
|
var t = JSON.parse(e);
|
|
null == t.value ? delete g[t.key] : g[t.key] = t.value
|
|
}));
|
|
var A = new n;
|
|
return document.addEventListener("visibilitychange", (function() {
|
|
"hidden" === document.visibilityState || document.hidden
|
|
})), window.addEventListener("beforeunload", (function() {})), {
|
|
loaded: !1,
|
|
loadedModel: !1,
|
|
getValue: w,
|
|
getJSON: function(e, t) {
|
|
var i = w(e, void 0);
|
|
if (null == i) return t;
|
|
try {
|
|
return JSON.parse(i)
|
|
} catch (i) {
|
|
return C(e), t
|
|
}
|
|
},
|
|
getBool: function(e, t) {
|
|
var i = w(e);
|
|
return null == i ? t : !(!i || "false" === i || 0 == +i)
|
|
},
|
|
getFloat: function(e, t, i) {
|
|
var s = w(e, void 0);
|
|
if (null == s) return t;
|
|
var r = parseFloat(s);
|
|
if (!isFinite(r)) throw new TypeError('"' + s +
|
|
'" is not float (key: "' + e + '")');
|
|
return r
|
|
},
|
|
getInt: function(e, t, i) {
|
|
var s = w(e, void 0);
|
|
if (null == s) return t;
|
|
var r = parseInt(s, 10);
|
|
if (!isFinite(r)) throw new TypeError('"' + s +
|
|
'" is not int (key: "' + e + '")');
|
|
return r
|
|
},
|
|
setValue: P,
|
|
setJSON: function(e, t, i) {
|
|
return P(e, JSON.stringify(t), i), c
|
|
},
|
|
remove: C,
|
|
keys: I,
|
|
keysMask: function(e, i) {
|
|
for (var s = I(), r = [], n = (e = new RegExp("^" + t(e)
|
|
.replace(/\\\*\\\*/gi, ".+").replace(/\\\*/gi,
|
|
"[^.]+") + "$", "gi"), s.length - 1); n >= 0; n--) e
|
|
.test(s[n]) && r.push(s[n]), e.lastIndex = 0;
|
|
return r
|
|
},
|
|
sync: function(e) {
|
|
null !== e ? (i ? L(i.initialSettings || {}) : h() ? (
|
|
function() {
|
|
if (TradingView.onWidget() && a.includes(window
|
|
.location.host))
|
|
for (var e = r.length; e--;) {
|
|
var t = r.key(e);
|
|
if (0 === t.indexOf("tradingview.")) {
|
|
var i = t.replace("tradingview.",
|
|
m + ".");
|
|
r.setItem(i, r.getItem(t)), r
|
|
.removeItem(t)
|
|
}
|
|
}
|
|
}(),
|
|
function() {
|
|
for (const e of v) g[e] && !r.getItem(S(e)) && r
|
|
.setItem(S(e), g[e])
|
|
}(),
|
|
function() {
|
|
g = {};
|
|
for (var e = !o.enabled(
|
|
"save_chart_properties_to_local_storage"
|
|
), t = r.length; t--;) {
|
|
var i = r.key(t);
|
|
if (i && O(i)) {
|
|
var s = i.substring(f.length);
|
|
e && !M(s) || (g[s] = r.getItem(i))
|
|
}
|
|
}
|
|
}()) : L(e || {}), A.fire()) : !0
|
|
},
|
|
onSync: A,
|
|
setSettingsAdapter: function(e) {
|
|
i = e
|
|
}
|
|
}
|
|
}();
|
|
e && e.exports && (e.exports = c)
|
|
}).call(this, i("YuTi")(e))
|
|
},
|
|
VgjZ: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "PriceAxisRendererOptionsProvider", (function() {
|
|
return n
|
|
}));
|
|
var s = i("XlJ7"),
|
|
r = i("zDbI");
|
|
class n {
|
|
constructor(e) {
|
|
this._rendererOptions = {
|
|
borderSize: 1,
|
|
offsetSize: 5,
|
|
fontSize: NaN,
|
|
font: "",
|
|
color: "",
|
|
paneBackgroundColor: "",
|
|
paddingBottom: 0,
|
|
paddingInner: 0,
|
|
paddingOuter: 0,
|
|
paddingTop: 0,
|
|
lineSpacing: 0
|
|
}, this._chartModel = e
|
|
}
|
|
options() {
|
|
const e = this._rendererOptions,
|
|
t = this._chartModel.properties(),
|
|
i = t.scalesProperties.fontSize.value();
|
|
return e.fontSize !== i && (e.fontSize = i, e.font = Object(s.makeFont)(i, r
|
|
.CHART_FONT_FAMILY, ""), e.paddingTop = 2.5 / 12 * i, e.paddingBottom =
|
|
e.paddingTop, e.paddingInner = i / 12 * e.offsetSize, e.paddingOuter = i /
|
|
12 * e.offsetSize, e.lineSpacing = 2 / 12 * i), e.color = t.scalesProperties
|
|
.textColor.value(), e.paneBackgroundColor = t.paneProperties.background.value(),
|
|
this._rendererOptions
|
|
}
|
|
}
|
|
},
|
|
ViuT: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("Eyy1"),
|
|
r = i("Kxc7"),
|
|
n = i("jCNj"),
|
|
o = i("Y7w9"),
|
|
a = i("OLhd"),
|
|
l = i("tqok"),
|
|
c = i("/bs+");
|
|
|
|
function h(e) {
|
|
return 60 * e * 60 * 1e3
|
|
}
|
|
|
|
function u(e) {
|
|
return 60 * e * 1e3
|
|
}
|
|
const d = [{
|
|
divisor: 1,
|
|
weight: 18
|
|
}, {
|
|
divisor: (p = 1, 1e3 * p),
|
|
weight: 19
|
|
}, {
|
|
divisor: u(1),
|
|
weight: 20
|
|
}, {
|
|
divisor: u(5),
|
|
weight: 21
|
|
}, {
|
|
divisor: u(30),
|
|
weight: 22
|
|
}, {
|
|
divisor: h(1),
|
|
weight: 30
|
|
}, {
|
|
divisor: h(3),
|
|
weight: 31
|
|
}, {
|
|
divisor: h(6),
|
|
weight: 32
|
|
}, {
|
|
divisor: h(12),
|
|
weight: 33
|
|
}];
|
|
var p;
|
|
|
|
function _(e, t) {
|
|
if (null !== t) {
|
|
if (e.getUTCFullYear() !== t.getUTCFullYear()) return 70;
|
|
if (e.getUTCMonth() !== t.getUTCMonth()) return 60;
|
|
if (e.getUTCDate() !== t.getUTCDate()) return 50;
|
|
const i = t.getTime(),
|
|
s = e.getTime();
|
|
for (let e = d.length - 1; e >= 0; --e)
|
|
if (Math.floor(i / d[e].divisor) !== Math.floor(s / d[e].divisor)) return d[e]
|
|
.weight
|
|
}
|
|
return 18
|
|
}
|
|
|
|
function m(e, t, i = 0) {
|
|
if (0 === e.length) return [];
|
|
let s = i,
|
|
r = i;
|
|
const n = [];
|
|
for (; s < e.length;) r >= t.length ? (n.push({
|
|
old: s,
|
|
new: l.INVALID_TIME_POINT_INDEX
|
|
}), s++) : e[s].timeMs === t[r].timeMs ? (s !== r && n.push({
|
|
old: s,
|
|
new: r
|
|
}), s++, r++) : e[s].timeMs < t[r].timeMs ? (n.push({
|
|
old: s,
|
|
new: l.INVALID_TIME_POINT_INDEX
|
|
}), s++) : r++;
|
|
return n.sort((e, t) => {
|
|
if (e.new === t.new && e.new === l.INVALID_TIME_POINT_INDEX) return e.old - t
|
|
.old;
|
|
if (e.new === l.INVALID_TIME_POINT_INDEX) return -1;
|
|
if (t.new === l.INVALID_TIME_POINT_INDEX) return 1;
|
|
const i = e.old - e.new,
|
|
s = t.old - t.new;
|
|
return i > 0 ? s > 0 ? e.old - t.old : -1 : s < 0 ? t.new - e.new : 1
|
|
})
|
|
}
|
|
|
|
function f(e, t) {
|
|
return {
|
|
span: e.markWeight,
|
|
time: e.displayTime,
|
|
index: t
|
|
}
|
|
}
|
|
i.d(t, "SessionTimeScale", (function() {
|
|
return b
|
|
}));
|
|
const g = r.enabled("end_of_period_timescale_marks");
|
|
class b {
|
|
constructor() {
|
|
this._completed = !0, this._mainSymbolExtrapolator = null, this
|
|
._pointDataByTimePoint = new Map, this._seriesIds = new Set, this
|
|
._displayTimezone = null, this._minFutureBarsCount = 0, this
|
|
._sortedTimePoints = []
|
|
}
|
|
destroy() {
|
|
this.clearTimeScale()
|
|
}
|
|
setCompleted(e) {
|
|
this._completed = e
|
|
}
|
|
isCompleted() {
|
|
return this._completed
|
|
}
|
|
clearTimeScale() {
|
|
return this._pointDataByTimePoint.clear(), this._seriesIds.clear(), this
|
|
._sortedTimePoints = [], {
|
|
baseIndex: 0,
|
|
pointsIndex: 0,
|
|
indexChange: [],
|
|
marks: [],
|
|
points: []
|
|
}
|
|
}
|
|
indexOfTime(e) {
|
|
if (0 === this._sortedTimePoints.length) return null === this
|
|
._mainSymbolExtrapolator ? null : this._mainSymbolExtrapolator.indexOfTime(
|
|
e);
|
|
if (e < this._sortedTimePoints[0].timeMs) {
|
|
if (null === this._mainSymbolExtrapolator) return null;
|
|
const t = this._mainSymbolExtrapolator.indexOfTime(e),
|
|
i = this._mainSymbolExtrapolator.indexOfTime(this._sortedTimePoints[0]
|
|
.timeMs);
|
|
if (null === t || null === i) return null;
|
|
let s = t.index - i.index;
|
|
return i.timeMs !== this._sortedTimePoints[0].timeMs && (s -= 1), {
|
|
index: s,
|
|
timeMs: t.timeMs
|
|
}
|
|
}
|
|
if (e > this._sortedTimePoints[this._sortedTimePoints.length - 1].timeMs) {
|
|
if (null === this._mainSymbolExtrapolator) return null;
|
|
const t = this._mainSymbolExtrapolator.indexOfTime(e),
|
|
i = this._mainSymbolExtrapolator.indexOfTime(this._sortedTimePoints[this
|
|
._sortedTimePoints.length - 1].timeMs);
|
|
if (null === t || null === i) return null;
|
|
const s = t.index - i.index - 1;
|
|
return {
|
|
index: this._sortedTimePoints.length + s,
|
|
timeMs: t.timeMs
|
|
}
|
|
}
|
|
let t = Object(o.lowerbound)(this._sortedTimePoints, e, (e, t) => e.timeMs < t);
|
|
return this._sortedTimePoints[t].timeMs !== e && (t -= 1), {
|
|
index: t,
|
|
timeMs: this._sortedTimePoints[t].timeMs
|
|
}
|
|
}
|
|
setMainSymbolExtrapolator(e) {
|
|
this._mainSymbolExtrapolator = e, this._updateFutureBars(), this._fillPointsData(
|
|
this._sortedTimePoints, 0)
|
|
}
|
|
setMinFutureBarsCount(e) {
|
|
this._minFutureBarsCount = e, this._updateFutureBars()
|
|
}
|
|
minFutureBarsCount() {
|
|
return this._minFutureBarsCount
|
|
}
|
|
firstFutureBarIndex() {
|
|
return this._sortedTimePoints.length
|
|
}
|
|
firstSessionBarIndex() {
|
|
return 0 === this._sortedTimePoints.length ? null : 0
|
|
}
|
|
lastSessionBarIndex() {
|
|
return 0 === this._sortedTimePoints.length ? null : this._sortedTimePoints.length -
|
|
1
|
|
}
|
|
tickMarks(e = 0) {
|
|
const t = this.firstFutureBarIndex();
|
|
Object(s.assert)(e <= t, "tickmarks cannot be filtered in the future");
|
|
const i = this._futureBars().map((e, t) => ({
|
|
timeMs: e,
|
|
markWeight: 0,
|
|
displayTime: NaN
|
|
}));
|
|
this._fillPointsData(i, 0, 0 !== this._sortedTimePoints.length ? this
|
|
._sortedTimePoints[this._sortedTimePoints.length - 1].displayTime : null);
|
|
const r = [];
|
|
for (let t = e; t < this._sortedTimePoints.length; ++t) r.push(f(this
|
|
._sortedTimePoints[t], t));
|
|
const n = i.map((e, i) => f(e, i + t));
|
|
return r.concat(n)
|
|
}
|
|
setTimezone(e) {
|
|
this._displayTimezone = "exchange" === e ? null : Object(n.get_timezone)(e), this
|
|
._fillPointsData(this._sortedTimePoints, 0)
|
|
}
|
|
fillIndexesInRows(e) {
|
|
if (0 === e.length) return;
|
|
let t = -1,
|
|
i = Object(o.lowerbound)(this._sortedTimePoints, Math.round(1e3 * e[0].value[
|
|
0]), (e, t) => e.timeMs < t);
|
|
for (const r of e) {
|
|
const e = Math.round(1e3 * r.value[0]);
|
|
for (; i < this._sortedTimePoints.length && this._sortedTimePoints[i].timeMs <
|
|
e;) i += 1;
|
|
i !== this._sortedTimePoints.length && this._sortedTimePoints[i].timeMs === e ||
|
|
(i -= 1), Object(s.assert)(i !== t, "data must have unique times"), t = i, r
|
|
.index = i
|
|
}
|
|
Object(s.assert)(i < this._sortedTimePoints.length,
|
|
"data must be within a data range")
|
|
}
|
|
convertTimesToIndexes(e) {
|
|
if (0 === e.length) return [];
|
|
let t = -1,
|
|
i = Object(o.lowerbound)(this._sortedTimePoints, e[0], (e, t) => e.timeMs < t);
|
|
return e.map(e => {
|
|
for (; i < this._sortedTimePoints.length && this._sortedTimePoints[i]
|
|
.timeMs < e;) i += 1;
|
|
if (0 === i && e < this._sortedTimePoints[0].timeMs) return l
|
|
.INVALID_TIME_POINT_INDEX;
|
|
if (i >= this._sortedTimePoints.length) {
|
|
const t = this.indexOfTime(e);
|
|
if (null === t) return l.INVALID_TIME_POINT_INDEX;
|
|
i = t.timeMs !== e ? t.index + 1 : t.index
|
|
}
|
|
return Object(s.assert)(i > t, "data must have unique sorted times"),
|
|
t = i, i
|
|
})
|
|
}
|
|
firstSeriesBarTime() {
|
|
return 0 === this._sortedTimePoints.length ? null : this._sortedTimePoints[0].timeMs
|
|
}
|
|
replaceSeriesBarsTimesTail(e, t) {
|
|
if (0 === t.length) return null;
|
|
if (!this._seriesIds.has(e)) return this.setSeriesBarsTimes(e, t);
|
|
const i = [],
|
|
s = Object(o.lowerbound)(this._sortedTimePoints, t[0], (e, t) => e.timeMs < t);
|
|
for (let t = s; t < this._sortedTimePoints.length; ++t) {
|
|
const s = this._sortedTimePoints[t];
|
|
s.pointData.series.delete(e) && 0 === s.pointData.series.size && i.push(s)
|
|
}
|
|
const r = this._addBarsTimesToSeries(e, t, !0);
|
|
this._cleanupPointsData(i);
|
|
const n = r.map(e => ({
|
|
timeMs: e.timeMs,
|
|
pointData: e.pointData,
|
|
markWeight: 0,
|
|
displayTime: NaN
|
|
}));
|
|
for (let e = s; e < this._sortedTimePoints.length; ++e) {
|
|
const t = this._sortedTimePoints[e];
|
|
0 !== t.pointData.series.size && n.push(t)
|
|
}
|
|
n.sort((e, t) => e.timeMs - t.timeMs);
|
|
const a = this._updateTimeScalePointsTail(n);
|
|
return this._applyTimeScaleChanges(a, !1)
|
|
}
|
|
setSeriesBarsTimes(e, t) {
|
|
let i = 0 !== this._pointDataByTimePoint.size;
|
|
if (this._seriesIds.has(e))
|
|
if (1 === this._seriesIds.size) i = !1, this._pointDataByTimePoint.clear();
|
|
else
|
|
for (const t of this._sortedTimePoints) t.pointData.series.delete(e);
|
|
this._addBarsTimesToSeries(e, t, !1);
|
|
const s = this._seriesIds.size;
|
|
0 === t.length ? this._seriesIds.delete(e) : this._seriesIds.add(e), i && this
|
|
._cleanupPointsData(this._sortedTimePoints);
|
|
const r = s < this._seriesIds.size,
|
|
n = s > this._seriesIds.size,
|
|
o = r && 2 === this._seriesIds.size || n && 1 === this._seriesIds.size,
|
|
a = [];
|
|
this._pointDataByTimePoint.forEach((e, t) => {
|
|
a.push({
|
|
markWeight: 0,
|
|
timeMs: t,
|
|
displayTime: NaN,
|
|
pointData: e
|
|
})
|
|
}), a.sort((e, t) => e.timeMs - t.timeMs);
|
|
const l = this._updateTimeScalePoints(a);
|
|
return this._applyTimeScaleChanges(l, o)
|
|
}
|
|
_updateFutureBars() {
|
|
if (0 === this._minFutureBarsCount || null === this._mainSymbolExtrapolator) return;
|
|
if (0 !== this._sortedTimePoints.length) {
|
|
const e = this._sortedTimePoints[this._sortedTimePoints.length - 1].timeMs;
|
|
this._mainSymbolExtrapolator.ensureExtrapolatedToFutureTime(e)
|
|
}
|
|
const e = this._futureBarsFirstPointIndex();
|
|
this._mainSymbolExtrapolator.setMinFutureBarsCount(e + this._minFutureBarsCount)
|
|
}
|
|
_addBarsTimesToSeries(e, t, i) {
|
|
const s = i ? [] : null;
|
|
for (const i of t) {
|
|
const t = this._pointDataByTimePoint.get(i);
|
|
if (void 0 === t) {
|
|
const t = new Set;
|
|
t.add(e);
|
|
const r = {
|
|
index: 0,
|
|
series: t
|
|
};
|
|
this._pointDataByTimePoint.set(i, r), null !== s && s.push({
|
|
timeMs: i,
|
|
pointData: r
|
|
})
|
|
} else t.series.add(e)
|
|
}
|
|
return s
|
|
}
|
|
_futureBarsFirstPointIndex() {
|
|
if (null === this._mainSymbolExtrapolator || 0 === this._sortedTimePoints.length)
|
|
return 0;
|
|
const e = this._mainSymbolExtrapolator.futureBars();
|
|
return Object(o.upperbound_int)(e, this._sortedTimePoints[this._sortedTimePoints
|
|
.length - 1].timeMs)
|
|
}
|
|
_futureBars() {
|
|
return null === this._mainSymbolExtrapolator ? [] : this._mainSymbolExtrapolator
|
|
.futureBars().slice(this._futureBarsFirstPointIndex(), this
|
|
._futureBarsFirstPointIndex() + 1e3)
|
|
}
|
|
_cleanupPointsData(e) {
|
|
for (const t of e) 0 === t.pointData.series.size && this._pointDataByTimePoint
|
|
.delete(t.timeMs)
|
|
}
|
|
_updateTimeScalePoints(e) {
|
|
let t = -1;
|
|
for (let i = 0; i < this._sortedTimePoints.length && i < e.length; ++i) {
|
|
const s = this._sortedTimePoints[i],
|
|
r = e[i];
|
|
if (s.timeMs !== r.timeMs) {
|
|
t = i;
|
|
break
|
|
}
|
|
r.markWeight = s.markWeight, r.displayTime = s.displayTime
|
|
}
|
|
if (t = v(t, this._sortedTimePoints.length, e.length), -1 === t) return null;
|
|
for (let i = t; i < e.length; ++i) {
|
|
e[i].pointData.index = i
|
|
}
|
|
this._fillPointsData(e, t);
|
|
const i = m(this._sortedTimePoints, e, t);
|
|
return this._sortedTimePoints = e, this._updateFutureBars(), {
|
|
pointsIndex: t,
|
|
indexChange: i
|
|
}
|
|
}
|
|
_updateTimeScalePointsTail(e) {
|
|
if (0 === e.length) return null;
|
|
const t = Object(o.lowerbound)(this._sortedTimePoints, e[0].timeMs, (e, t) => e
|
|
.timeMs < t);
|
|
let i = -1;
|
|
for (let s = 0; s < e.length; ++s) {
|
|
const r = e[s],
|
|
n = t + s;
|
|
if (r.pointData.index = n, n >= this._sortedTimePoints.length) continue;
|
|
this._sortedTimePoints[n].timeMs !== r.timeMs && -1 === i && (i = n)
|
|
}
|
|
const s = t + e.length;
|
|
if (i = v(i, this._sortedTimePoints.length, s), -1 === i) return null;
|
|
this._fillPointsData(e, 0, 0 === t || 0 === this._sortedTimePoints.length ? null :
|
|
this._sortedTimePoints[t - 1].displayTime);
|
|
const r = m(this._sortedTimePoints.slice(t), e).map(e => ({
|
|
old: e.old + t,
|
|
new: e.new === l.INVALID_TIME_POINT_INDEX ? e.new : e.new + t
|
|
})); {
|
|
const i = this._sortedTimePoints;
|
|
let r = 0;
|
|
for (; t + r < i.length && r < e.length;) i[t + r] = e[r], r += 1;
|
|
for (; r < e.length; ++r) i.push(e[r]);
|
|
i.length = s
|
|
}
|
|
return this._updateFutureBars(), {
|
|
pointsIndex: i,
|
|
indexChange: r
|
|
}
|
|
}
|
|
_getBaseIndex() {
|
|
return Math.max(0, this._sortedTimePoints.length - 1)
|
|
}
|
|
_fillPointsData(e, t, i = null) {
|
|
this._fillDiplayTimeForPoints(e, t),
|
|
function(e, t = 0, i = null) {
|
|
let s = 0 === t || 0 === e.length ? i : e[t - 1].displayTime,
|
|
r = null !== s ? new Date(1e3 * s) : null,
|
|
n = 0;
|
|
for (let i = t; i < e.length; ++i) {
|
|
const t = e[i],
|
|
o = new Date(1e3 * t.displayTime);
|
|
t.markWeight = _(o, r), n += t.displayTime - (s || t.displayTime), r =
|
|
o, s = t.displayTime
|
|
}
|
|
if (0 === t && e.length > 1 && null === i) {
|
|
const t = Math.ceil(n / (e.length - 1)),
|
|
i = new Date(1e3 * (e[0].displayTime - t));
|
|
e[0].markWeight = _(new Date(1e3 * e[0].displayTime), i)
|
|
}
|
|
}(e, t, i)
|
|
}
|
|
_applyTimeScaleChanges(e, t) {
|
|
if (null === e) return t ? (this._fillPointsData(this._sortedTimePoints, 0), {
|
|
points: [],
|
|
pointsIndex: 0,
|
|
baseIndex: this._getBaseIndex(),
|
|
indexChange: [],
|
|
marks: this.tickMarks(0)
|
|
}) : null;
|
|
let i = e.pointsIndex;
|
|
if (0 !== i && t && (this._fillPointsData(this._sortedTimePoints, 0), i = 0), 0 ===
|
|
this._sortedTimePoints.length) return {
|
|
baseIndex: 0,
|
|
pointsIndex: 0,
|
|
indexChange: [],
|
|
marks: [],
|
|
points: []
|
|
};
|
|
const s = [];
|
|
for (let t = e.pointsIndex; t < this._sortedTimePoints.length; ++t) s.push(this
|
|
._sortedTimePoints[t].timeMs / 1e3);
|
|
return {
|
|
...e,
|
|
points: s,
|
|
baseIndex: this._getBaseIndex(),
|
|
marks: this.tickMarks(i)
|
|
}
|
|
}
|
|
_fillDiplayTimeForPoints(e, t = 0) {
|
|
if (null === this._mainSymbolExtrapolator) return;
|
|
const i = this._mainSymbolExtrapolator.interval(),
|
|
s = this._mainSymbolExtrapolator.barBuilder(),
|
|
r = this._mainSymbolExtrapolator.symbolInfo(),
|
|
o = null === this._displayTimezone ? Object(n.get_timezone)(r.timezone) : this
|
|
._displayTimezone,
|
|
l = 1 === this._seriesIds.size,
|
|
h = i.isDWM(),
|
|
u = h ? Object(a.createDwmAligner)(i.value(), {
|
|
timezone: r.timezone,
|
|
corrections: l ? r.corrections : void 0,
|
|
session_holidays: l ? r.session_holidays : void 0,
|
|
session: l ? r.session : "24x7"
|
|
}) : null,
|
|
d = !h;
|
|
for (let r = t; r < e.length; ++r) {
|
|
let t = e[r].timeMs / 1e3;
|
|
g && (t = Object(c.a)(s, t, i)), null !== u && (t = Math.floor(u
|
|
.timeToExchangeTradingDay(1e3 * t) / 1e3)), d && (t = Math.floor(Object(
|
|
n.utc_to_cal_ts)(o, 1e3 * t) / 1e3)), e[r].displayTime = t
|
|
}
|
|
}
|
|
}
|
|
|
|
function v(e, t, i) {
|
|
return -1 === e && t !== i && (e = i < t ? Math.max(0, i - 1) : t), e
|
|
}
|
|
},
|
|
Vs8b: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "isMainSeriesState", (function() {
|
|
return r
|
|
})), i.d(t, "isStudyState", (function() {
|
|
return n
|
|
})), i.d(t, "isLineToolState", (function() {
|
|
return o
|
|
})), i.d(t, "isZOrderedSourceState", (function() {
|
|
return a
|
|
}));
|
|
var s = i("CW80");
|
|
|
|
function r(e) {
|
|
return "MainSeries" === e.type
|
|
}
|
|
|
|
function n(e) {
|
|
return Boolean(e.type) && e.type.toLowerCase().startsWith("study")
|
|
}
|
|
|
|
function o(e) {
|
|
return Boolean(e.type) && Object(s.isLineToolName)(e.type)
|
|
}
|
|
|
|
function a(e) {
|
|
return r(e) || n(e) || o(e)
|
|
}
|
|
},
|
|
"W+6j": function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return r
|
|
}));
|
|
i("bmVy");
|
|
var s = i("ww0J");
|
|
window.t("Fundamental studies are no longer available on charts");
|
|
class r extends s.a {
|
|
constructor(e, t) {
|
|
super(e, t), this._study = e
|
|
}
|
|
color() {
|
|
return this._study.isFailed() || this._study.metaInfo && this._study.metaInfo()
|
|
.isTVScriptStub ? "#ff0000" : super.color()
|
|
}
|
|
sourceStatusText() {
|
|
this._study.status();
|
|
return super.sourceStatusText()
|
|
}
|
|
}
|
|
},
|
|
WIS0: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "DatafeedRequestsCachedProcessor", (function() {
|
|
return _
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("LxhU"),
|
|
n = i("Y7w9"),
|
|
o = i("ocLq"),
|
|
a = i("Kxc7"),
|
|
l = i("IiTo"),
|
|
c = i("OLhd"),
|
|
h = i("5mo2");
|
|
i("HbRj");
|
|
|
|
function u(e, t) {
|
|
return e.ticker + (e.currency_code ? "_#_" + e.currency_code : "") + (e.unit_id ? "_#_" + e
|
|
.unit_id : "") + "_#_" + t
|
|
}
|
|
|
|
function d(e) {
|
|
return new Date(e).toISOString()
|
|
}
|
|
class p {
|
|
constructor(e, t, i, s, n, o) {
|
|
this._cache = {
|
|
bars: []
|
|
}, this._nextSubscriptionId = 0, this._pendingSubscribers = [], this
|
|
._subscribers = [], this._requesting = !1, this._leftDate = null, this
|
|
._nextTime = null, this._realtimeOn = !1, this._endOfData = !1, this
|
|
._resetCacheTimeout = null, this._errorMessage = null, this._destroyed = !1,
|
|
this._emptyResponsesCount = 0, this._datafeed = e, this._symbolInfo = t, this
|
|
._interval = r.Interval.parse(i), this._resolution = this._interval.value(),
|
|
this._dwmAligner = n, this._serverTimeOffsetGetter = s, this
|
|
._resetCacheTimePeriod = void 0 === o ? 1e4 : o, this._sessionSpec = new h
|
|
.SessionSpec(t.timezone, t.session, t.session_holidays, t.corrections), this
|
|
._updateDatesFromExpirationDate()
|
|
}
|
|
destroy() {
|
|
0 !== this._subscribers.length && console.warn("Destroying with not-empty state"),
|
|
this._clearResetCacheTimeout(), this._unsubscribeRealtime(), this._purgeCache(),
|
|
delete this._datafeed, this._destroyed = !0
|
|
}
|
|
addSubscription(e, t, i) {
|
|
const s = this._getNextSubscriptionId();
|
|
this._pendingSubscribers.push({
|
|
key: s,
|
|
range: e,
|
|
onHistoryCallback: t,
|
|
onErrorCallback: i
|
|
}), r.Interval.isDWM(this._resolution) && void 0 !== e.to && null !== this
|
|
._dwmAligner && e.to % 864e5 && console.warn(
|
|
`Internal error: invalid date for DWM resolution ${d(e.to)}, expected time without a time part`
|
|
), this._clearResetCacheTimeout();
|
|
return setTimeout(() => {
|
|
this._destroyed || this._processPendingSubscribers()
|
|
}, 0), s
|
|
}
|
|
removeSubscription(e) {
|
|
const t = this._pendingSubscribers.find(t => t.key === e);
|
|
if (t) return void this._pendingSubscribers.splice(this._pendingSubscribers.indexOf(
|
|
t), 1);
|
|
const i = this._subscribers.find(t => t.key === e);
|
|
if (i) return this._subscribers.splice(this._subscribers.indexOf(i), 1), void(this
|
|
._subscribers.length || (this._resetCacheTimeout = setTimeout(() => {
|
|
this._resetCacheTimeout = null, this._purgeCache(), this
|
|
._unsubscribeRealtime()
|
|
}, this._resetCacheTimePeriod)));
|
|
console.warn("Unknown subscription symbol={0}, resolution={1}, key={2}".format(this
|
|
._symbolInfo.name, this._resolution, e))
|
|
}
|
|
_logMessage(e, t) {
|
|
if (a.enabled("charting_library_debug_mode") || t) {
|
|
const t = this._symbolInfo.currency_code,
|
|
i = this._symbolInfo.unit_id;
|
|
console.log(
|
|
`FEED [${this._symbolInfo.name}|${this._resolution}${t ? "|" + t : ""}${i ? "|" + i : ""}]: ${e}`
|
|
)
|
|
}
|
|
}
|
|
_clearResetCacheTimeout() {
|
|
null !== this._resetCacheTimeout && (clearTimeout(this._resetCacheTimeout), this
|
|
._resetCacheTimeout = null)
|
|
}
|
|
_purgeCache() {
|
|
this._logMessage("Reset cache"), this._cache = {
|
|
bars: []
|
|
}, this._errorMessage = null, this._leftDate = null, this._endOfData = !1, this
|
|
._updateDatesFromExpirationDate()
|
|
}
|
|
_updateDatesFromExpirationDate() {
|
|
void 0 !== this._symbolInfo.expiration_date && (this._nextTime = 1e3 * this
|
|
._symbolInfo.expiration_date, this._leftDate = 1e3 * (this._symbolInfo
|
|
.expiration_date + 1))
|
|
}
|
|
_dealignTime(e) {
|
|
return null === this._dwmAligner ? e : this._dwmAligner.timeToExchangeTradingDay(e)
|
|
}
|
|
_normalizeRange(e) {
|
|
const t = void 0 !== e.to ? e.to : this._dealignTime(this._now());
|
|
if (0 === this._cache.bars.length || void 0 !== e.to && t <= Object(s.ensureNotNull)
|
|
(this._leftDate)) return {
|
|
countBack: e.countBack,
|
|
to: t
|
|
};
|
|
const i = null !== this._dwmAligner ? this._dwmAligner.timeToSessionStart(t) : t,
|
|
r = Object(n.lowerbound)(this._cache.bars, i, (e, t) => e.time < t);
|
|
return e.countBack < r ? {
|
|
countBack: 0,
|
|
to: 0 !== e.countBack && r <= this._cache.bars.length ? this._dealignTime(
|
|
this._cache.bars[r - e.countBack].time) : t
|
|
} : {
|
|
countBack: e.countBack - r,
|
|
to: this._dealignTime(this._cache.bars[0].time)
|
|
}
|
|
}
|
|
_processPendingSubscribers() {
|
|
const e = this._pendingSubscribers;
|
|
if (!e.length) return;
|
|
if (this._requesting) return void this._logMessage(
|
|
"Processing is skipped due active request");
|
|
if (this._logMessage("Processing pending subscribers, count=" + e.length), this
|
|
._errorMessage) {
|
|
const t = this._errorMessage;
|
|
return this._logMessage("Return error: " + t), this._pendingSubscribers = [],
|
|
void e.forEach(e => {
|
|
e.onErrorCallback(t)
|
|
})
|
|
}
|
|
let t = this._normalizeRange(e[0].range);
|
|
for (const i of e.map(e => this._normalizeRange(e.range)))(i.to < t.to || i.to === t
|
|
.to && i.countBack > t.countBack) && (t = i);
|
|
this._logMessage(
|
|
`Leftmost subscriber requires ${t.countBack} bars prior ${d(t.to)}`);
|
|
!(null === this._leftDate || t.to < this._leftDate && (null === this._nextTime || t
|
|
.to < this._nextTime) || 0 !== t.countBack) || this._endOfData ? (this
|
|
._pendingSubscribers = [], e.forEach(e => {
|
|
const t = this._moveSubscriberToRealtime(e);
|
|
this._returnHistoryDataToSubscriber(e, t)
|
|
}), this._subscribeRealtimeIfNeeded()) : this._ensureRequestedTo(t)
|
|
}
|
|
_moveSubscriberToRealtime(e) {
|
|
const t = {
|
|
key: e.key,
|
|
onHistoryCallback: e.onHistoryCallback,
|
|
barset: null
|
|
};
|
|
return this._subscribers.push(t), t
|
|
}
|
|
_isSymbolExpired() {
|
|
return this._symbolInfo.expired || void 0 !== this._symbolInfo.expiration_date
|
|
}
|
|
_subscribeRealtimeIfNeeded() {
|
|
!this._subscribers.length || this._realtimeOn || this._isSymbolExpired() || this
|
|
._subscribeRealtime()
|
|
}
|
|
_subscribeRealtime() {
|
|
if (this._symbolInfo.expired || this._realtimeOn) return;
|
|
this._realtimeOn = !0, this._datafeed.subscribeBars(this._symbolInfo, this
|
|
._resolution, e => {
|
|
null !== this._dwmAligner && (e.time = this._dwmAligner
|
|
.timeToSessionStart(e.time)), this._putToCacheNewBar(e), this
|
|
._subscribers.forEach(t => {
|
|
const i = t.barset;
|
|
if (null === i) throw new Error(
|
|
"subscriber.barset is null");
|
|
i.add(e), t.onHistoryCallback(i)
|
|
})
|
|
}, u(this._symbolInfo, this._resolution), () => {
|
|
this._unsubscribeRealtime();
|
|
const e = this._leftDate;
|
|
this._purgeCache(), null !== e && this._ensureRequestedTo({
|
|
to: e,
|
|
countBack: 0
|
|
})
|
|
}), this._logMessage("Subscribed to realtime")
|
|
}
|
|
_unsubscribeRealtime() {
|
|
!this._isSymbolExpired() && this._realtimeOn && (this._datafeed.unsubscribeBars(u(
|
|
this._symbolInfo, this._resolution)), this._logMessage(
|
|
"Unsubscribed from realtime"), this._realtimeOn = !1)
|
|
}
|
|
_returnHistoryDataToSubscriber(e, t) {
|
|
const i = this._normalizeRange(e.range),
|
|
s = this._createBarsetForRange(i);
|
|
s.count() > 0 ? this._logMessage(
|
|
"Bars to return for request {0}: total {1} bars in [{2} ... {3}] ".format(e
|
|
.key, s.count(), d(s.bars[0].time), d(s.bars[s.count() - 1].time))) :
|
|
this._logMessage("Request {0}. Nothing to return.".format(e.key)), t.barset = s,
|
|
this._endOfData && null !== this._leftDate && i.to <= this._leftDate && (s
|
|
.endOfData = !0), e.onHistoryCallback(s)
|
|
}
|
|
_createBarsetForRange(e) {
|
|
const t = null !== this._dwmAligner ? this._dwmAligner.timeToSessionStart(e.to) : e
|
|
.to,
|
|
i = Object(n.lowerbound)(this._cache.bars, t, (e, t) => e.time < t),
|
|
r = new o.BarSet(this._symbolInfo, this._cache.bars.slice(Math.max(0, i - e
|
|
.countBack)));
|
|
return 0 !== r.bars.length ? r.firstLoadedTimeMs = this._dealignTime(r.bars[0]
|
|
.time) : 0 !== this._cache.bars.length ? r.firstLoadedTimeMs = this
|
|
._dealignTime(this._cache.bars[this._cache.bars.length - 1].time) : r
|
|
.firstLoadedTimeMs = this._dealignTime(Object(s.ensureNotNull)(this._leftDate)),
|
|
r
|
|
}
|
|
_ensureRequestedTo(e) {
|
|
var t;
|
|
let i;
|
|
if (this._requesting && this._logMessage(
|
|
"Internal error: trying to call getBars while the previous request is active",
|
|
!0), null !== this._leftDate) i = this._leftDate;
|
|
else {
|
|
const e = this._now();
|
|
if (null === this._dwmAligner) i = e;
|
|
else {
|
|
let t = this._sessionSpec.alignToNearestSessionStart(new Date(e), 1)
|
|
.getTime();
|
|
if (t < e) {
|
|
const e = this._sessionSpec.alignToNearestSessionEnd(new Date(t), 1)
|
|
.getTime();
|
|
t = this._sessionSpec.alignToNearestSessionStart(new Date(e + 1e3), 1)
|
|
.getTime()
|
|
}
|
|
i = this._dealignTime(t)
|
|
}
|
|
}
|
|
const s = Object(l.alignPeriodsBackForDataRequest)(this._symbolInfo.session, this
|
|
._symbolInfo.session_holidays, this._symbolInfo.corrections, this._interval
|
|
.letter(), this._interval.multiplier(), e.countBack, Math.min(e.to, i,
|
|
null !== (t = this._nextTime) && void 0 !== t ? t : 1 / 0));
|
|
let r = e.countBack;
|
|
if (e.to < i && (r += Object(l.getPeriodsBetweenDates)(this._symbolInfo.session,
|
|
this._symbolInfo.session_holidays, this._symbolInfo.corrections, this
|
|
._interval.letter(), this._interval.multiplier(), e.to, i)), null !== this
|
|
._leftDate && this._leftDate < s) return void this._processPendingSubscribers();
|
|
const n = this._isSymbolExpired() ? 0 === this._cache.bars.length : null === this
|
|
._leftDate;
|
|
this._requesting = !0, this._nextTime = null, this._leftDate = s;
|
|
const o = `[${d(s)} ... ${d(i)}, ${r} bars]`;
|
|
this._logMessage("Requesting data: " + o);
|
|
let a = !1;
|
|
const c = s / 1e3,
|
|
h = i / 1e3;
|
|
this._datafeed.getBars(this._symbolInfo, this._resolution, {
|
|
from: this._interval.isTicks() ? c : Math.floor(c),
|
|
to: this._interval.isTicks() ? h : Math.floor(h),
|
|
countBack: r,
|
|
firstDataRequest: n
|
|
}, (e, t) => {
|
|
if (!this._destroyed)
|
|
if (a) this._logMessage("getBars callback is already called before",
|
|
!0);
|
|
else {
|
|
if (a = !0, e.length > 0) {
|
|
const t =
|
|
` [${d(e[0].time)} ... ${d(e[e.length - 1].time)}]`;
|
|
this._logMessage(
|
|
`Receiving bars: total ${e.length} bars in ${t}, requested range: ${o}`
|
|
)
|
|
} else this._logMessage(
|
|
"Receiving bars: barset is empty, requested range: " + o
|
|
);
|
|
this._requesting = !1, this._processBars(e, t)
|
|
}
|
|
}, e => {
|
|
this._destroyed || (a ? this._logMessage(
|
|
"getBars callback is already called before", !0) : (a = !0,
|
|
this._requesting = !1, this._errorMessage = e || null, this
|
|
._processPendingSubscribers()))
|
|
})
|
|
}
|
|
_processBars(e, t) {
|
|
this._checkBars(e), this._alignBarsTime(e), e.length > 0 ? (this
|
|
._emptyResponsesCount = 0, this._processFullBarset(e, t)) : (this
|
|
._emptyResponsesCount += 1, this._processEmptyBarset(t)), this
|
|
._processPendingSubscribers()
|
|
}
|
|
_processEmptyBarset(e) {
|
|
e && e.nextTime ? (this._logMessage("Next time received: `{0}`".format(d(1e3 * e
|
|
.nextTime))), this._nextTime = 1e3 * e.nextTime) : e && e.noData ? (this
|
|
._logMessage("EOD received"), this._setEndOfData()) : this._logMessage(
|
|
"nextTime or noData should present in metainfo when empty barset is returned"
|
|
), 50 === this._emptyResponsesCount && (this._logMessage(
|
|
"EOD detected due 50 empty responses in a row"), this._setEndOfData())
|
|
}
|
|
_setEndOfData() {
|
|
this._endOfData = !0,
|
|
this._cache.bars.length && (this._leftDate = this._dealignTime(this._cache.bars[
|
|
0].time))
|
|
}
|
|
_processFullBarset(e, t) {
|
|
this._putToCache(e) ? null !== this._leftDate && 0 !== this._cache.bars.length && (
|
|
this._interval.isTicks() ? this._leftDate = this._dealignTime(this._cache
|
|
.bars[0].time) : this._leftDate = Math.min(this._leftDate, this
|
|
._dealignTime(this._cache.bars[0].time))) : this._logMessage(
|
|
"Incremental update failed. Starting full update. Returned data should be in the requested range.",
|
|
!0), t && t.nextTime ? console.warn(
|
|
"nextTime should be set when there is no data in the requested period only"
|
|
) : t && t.noData && console.warn(
|
|
"noData should be set when there is no data in the requested period and earlier only"
|
|
)
|
|
}
|
|
_getNextSubscriptionId() {
|
|
return this._nextSubscriptionId++
|
|
}
|
|
_checkBars(e, t = !1) {
|
|
if (a.enabled("charting_library_debug_mode"))
|
|
for (let i = 1; i < e.length; i++) {
|
|
if (e[i].time <= e[i - 1].time) {
|
|
let s =
|
|
"Wrong bars time: time {0} of bar {1} should be more than time {2} of bar {3}"
|
|
.format(e[i].time, i, e[i - 1].time, i - 1);
|
|
t && null !== this._dwmAligner && (s +=
|
|
"\nCheck that you provide DWM bars without time part, i.e. 00:00 GMT"
|
|
), console.error(s)
|
|
} ["high", "low", "open", "close", "time"].some(t => "number" != typeof e[i]
|
|
[t] || !isFinite(e[i][t])) && console.error(
|
|
"Wrong bars values: all OHLC values should be numbers")
|
|
}
|
|
}
|
|
_putToCache(e) {
|
|
if (0 === e.length) return !0;
|
|
if (this._cache.bars.length === e.length && this._cache.bars[0].time === e[0]
|
|
.time && this._cache.bars[this._cache.bars.length - 1].time === e[e.length - 1]
|
|
.time) return this._logMessage(
|
|
"Time range of received data is the same as cached one. Skip the update."
|
|
), !0;
|
|
if (0 !== this._cache.bars.length && e[e.length - 1].time === this._cache.bars[0]
|
|
.time && this._cache.bars.splice(0, 1), 0 !== this._cache.bars.length && e[e
|
|
.length - 1].time >= this._cache.bars[0].time) {
|
|
const t = this._cache.bars[this._cache.bars.length - 1].time === e[e.length - 1]
|
|
.time;
|
|
if (this._cache.bars = [], !t) return this._leftDate = null, !1;
|
|
this._logMessage(
|
|
"Received history up to now instead of incremental update. Return exactly what is requested."
|
|
)
|
|
}
|
|
return this._cache.bars = [...e, ...this._cache.bars], this._checkBars(this._cache
|
|
.bars, !0), !0
|
|
}
|
|
_putToCacheNewBar(e) {
|
|
const t = this._cache.bars.length,
|
|
i = e.time,
|
|
s = 0 === t ? NaN : this._cache.bars[t - 1].time;
|
|
0 === t || s < i ? this._cache.bars.push(e) : s === i ? (this._interval.isTicks() &&
|
|
this._logMessage("Received update for the last tick bar"), this._cache.bars[
|
|
t - 1] = e) : console.error(
|
|
"putToCacheNewBar: time violation, previous bar time: " + d(s) +
|
|
" should be less or equal to new time: " + d(i))
|
|
}
|
|
_alignBarsTime(e) {
|
|
if (this._dwmAligner)
|
|
for (const t of e) t.time = this._dwmAligner.timeToSessionStart(t.time)
|
|
}
|
|
_now() {
|
|
return Date.now() + 1e3 * this._serverTimeOffsetGetter() + 6e4
|
|
}
|
|
}
|
|
class _ {
|
|
constructor(e, t, i) {
|
|
this._threads = {}, this._datafeed = e, this._serverTimeOffsetGetter = t, this
|
|
._resetCacheTimePeriod = i
|
|
}
|
|
destroy() {
|
|
this._forEachThread((e, t) => t.destroy()), this._threads = {}, delete this
|
|
._datafeed
|
|
}
|
|
purgeCache() {
|
|
this._forEachThread((e, t) => t.destroy()), this._threads = {}
|
|
}
|
|
subscribe(e, t, i, s, r) {
|
|
const n = u(e, t);
|
|
this._threads[n] || (this._threads[n] = this._createThread(e, t));
|
|
return n + '"' + this._threads[n].addSubscription(i, s, r)
|
|
}
|
|
unsubscribe(e) {
|
|
const t = e.split('"');
|
|
if (2 !== t.length) return void console.warn("Wrong guid format");
|
|
const i = t[0],
|
|
s = parseInt(t[1]);
|
|
this._threads.hasOwnProperty(i) ? this._threads[i].removeSubscription(s) : console
|
|
.warn("Data thread doesnt exist: " + e)
|
|
}
|
|
_createThread(e, t) {
|
|
return new p(this._datafeed, e, t, this._serverTimeOffsetGetter, Object(c
|
|
.createDwmAligner)(t, e), this._resetCacheTimePeriod)
|
|
}
|
|
_forEachThread(e) {
|
|
Object.keys(this._threads).forEach(t => e(t, this._threads[t]))
|
|
}
|
|
}
|
|
},
|
|
WPQD: function(e, t, i) {
|
|
"use strict";
|
|
(function(e) {
|
|
var s = i("Ss5c").LineDataSource,
|
|
r = i("Ocx9").DefaultProperty;
|
|
class n extends s {
|
|
constructor(e, t) {
|
|
super(e, t || n.createProperties()), this._trendLinePaneView = null, i.e(
|
|
"lt-pane-views").then(i.t.bind(null, "ocVb", 7)).then(({
|
|
TrendLinePaneView: e
|
|
}) => {
|
|
this._trendLinePaneView = new e(this, this._model), this
|
|
._setPaneViews([this._trendLinePaneView])
|
|
})
|
|
}
|
|
dataAndViewsReady() {
|
|
return s.prototype.dataAndViewsReady.call(this) && this
|
|
._trendLinePaneView && this._trendLinePaneView.iconsReady()
|
|
}
|
|
stop() {
|
|
super.stop()
|
|
}
|
|
pointsCount() {
|
|
return 2
|
|
}
|
|
name() {
|
|
return "Trend Line"
|
|
}
|
|
canHasAlert() {
|
|
return !0
|
|
}
|
|
_getAlertPlots() {
|
|
return [this._linePointsToAlertPlot(this._points, null, this.properties()
|
|
.extendLeft.value(), this.properties().extendRight.value())]
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null,
|
|
"auWl"))).TrendLineDefinitionsViewModel
|
|
}
|
|
template() {
|
|
var e = s.prototype.template.call(this);
|
|
return e.text = this.properties().childs().text.value(), e.showLabel = this
|
|
.properties().childs().showLabel.value(), e
|
|
}
|
|
_applyTemplateImpl(e) {
|
|
super._applyTemplateImpl(e), this.properties().childs().text.setValue(e
|
|
.text || ""), this.properties().childs().showLabel.setValue(Boolean(
|
|
e.showLabel))
|
|
}
|
|
_snapTo45DegreesAvailable() {
|
|
return !0
|
|
}
|
|
static createProperties(e) {
|
|
var t = new r("linetooltrendline", e);
|
|
return n._configureProperties(t), t
|
|
}
|
|
static _configureProperties(t) {
|
|
s._configureProperties(t), t.hasChild("text") || t.addChild("text", new e(
|
|
"")), t.addExclusion("text"), t.addExclusion("showLabel")
|
|
}
|
|
}
|
|
t.LineToolTrendLine = n
|
|
}).call(this, i("tc+8"))
|
|
},
|
|
WTyR: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return r
|
|
}));
|
|
var s = i("ocLq");
|
|
class r {
|
|
constructor(e) {
|
|
this._haveAnyVolume = !1, this._isDisabled = !1, this._seriesGetter = e
|
|
}
|
|
update(e, t) {
|
|
if (this._haveAnyVolume || this._isDisabled) return;
|
|
const i = this._seriesGetter.volume().get(e);
|
|
0 !== i && Number.isFinite(i) && (this._haveAnyVolume = !0), t && (this
|
|
._haveAnyVolume || s.Std.error(
|
|
"The data vendor doesn't provide volume data for this symbol."), this
|
|
._isDisabled = !0)
|
|
}
|
|
}
|
|
},
|
|
WYmP: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return n
|
|
}));
|
|
var s = i("oamr"),
|
|
r = i("dhFz");
|
|
class n {
|
|
constructor() {
|
|
this._items = [], this._owner = null
|
|
}
|
|
primitivesData(e) {
|
|
const t = [];
|
|
for (const i of this._items) e.isIgnoredObj(i) || t.push(i.primitiveData());
|
|
return t
|
|
}
|
|
get(e) {
|
|
return this._items[e]
|
|
}
|
|
set(e, t) {
|
|
return this.dirty(), t.setOwner(this), this._items[e] = t, t
|
|
}
|
|
addAtIndex(e, t) {
|
|
this.dirty(), t.setOwner(this), this._items[e] = t
|
|
}
|
|
clear() {
|
|
this._unsetOwner(this._items), this._items = [], this.dirty()
|
|
}
|
|
addAllFromNumber(e, t) {
|
|
this.setOwner(t), this._items.splice(e, 0, ...t._items);
|
|
return this._setCachedDataValid(!1), !0
|
|
}
|
|
addAll(e) {
|
|
this.setOwner(e), this._items.push(...e._items);
|
|
return this._setCachedDataValid(!1), !0
|
|
}
|
|
remove(e) {
|
|
const t = this._items[e];
|
|
return this._items.splice(e, 1), t.unsetOwner(this), this.dirty(), t
|
|
}
|
|
getItems() {
|
|
return this._items
|
|
}
|
|
size() {
|
|
return this._items.length
|
|
}
|
|
add(e) {
|
|
e.setOwner(this), this._items.push(e);
|
|
return this._setCachedDataValid(!1), !0
|
|
}
|
|
deleteErasedItems() {
|
|
this._items = this._items.filter(e => !e.isErased())
|
|
}
|
|
markPostedItems() {
|
|
for (const e of this._items) e.markAsPosted()
|
|
}
|
|
isNaN() {
|
|
if (0 === this._items.length) return !0;
|
|
for (const e of this._items) {
|
|
if (!Object(r.a)(e)) return !1;
|
|
if (!e.isNaN()) return !1
|
|
}
|
|
return !0
|
|
}
|
|
setOwner(e) {
|
|
this._owner = e
|
|
}
|
|
dirty() {
|
|
null !== this._owner && this._owner.dirty()
|
|
}
|
|
_unsetOwner(e) {
|
|
for (const t of e) t instanceof s.a && t.unsetOwner(this)
|
|
}
|
|
_setCachedDataValid(e) {
|
|
e || this.dirty()
|
|
}
|
|
}
|
|
},
|
|
"Wh/T": function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Kxc7");
|
|
window.onload = function() {
|
|
location.hostname.indexOf(".") >= 0 && ! function() {
|
|
try {
|
|
return /^(192|172|10)\.[0-9][0-9][0-9]\.[0-9][0-9][0-9]\.[0-9][0-9][0-9]/
|
|
.test(location.hostname) || /^.*((?:\.local)|localhost)$/.test(location
|
|
.hostname)
|
|
} catch (e) {
|
|
return !1
|
|
}
|
|
}() && setTimeout((function() {
|
|
try {
|
|
var e = function() {
|
|
var e = 0;
|
|
return JSON.parse(urlParams.logo).image && (e = "C", s
|
|
.enabled("link_to_tradingview") || (e = "D")), e
|
|
}();
|
|
window.ga && (0 !== e && window.ga("send", "event", "s", e),
|
|
urlParams.utm || window.ga("send", "event", "l"))
|
|
} catch (e) {}
|
|
}), 3e4)
|
|
}
|
|
},
|
|
Wh6B: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Eyy1").ensureNotNull,
|
|
r = i("Ss5c").LineDataSource,
|
|
n = i("Ocx9").DefaultProperty,
|
|
o = i("08i5");
|
|
class a extends r {
|
|
constructor(e, t) {
|
|
super(e, t || a.createProperties()), this._predictionPaneView = null, i.e(
|
|
"lt-pane-views").then(i.t.bind(null, "Ay2m", 7)).then(({
|
|
PredictionPaneView: e
|
|
}) => {
|
|
this._predictionPaneView = new e(this, this._model), this._setPaneViews(
|
|
[this._predictionPaneView])
|
|
})
|
|
}
|
|
dataAndViewsReady() {
|
|
return r.prototype.dataAndViewsReady.call(this) && this._predictionPaneView && this
|
|
._predictionPaneView.iconsReady()
|
|
}
|
|
isSynchronizable() {
|
|
return !1
|
|
}
|
|
status() {
|
|
return this._properties.status.value()
|
|
}
|
|
setStatus(e) {
|
|
return this._properties.status.setValue(e)
|
|
}
|
|
pointsCount() {
|
|
return 2
|
|
}
|
|
name() {
|
|
return "Forecast"
|
|
}
|
|
restorePoints(e, t, i) {
|
|
super.restorePoints(e, t, i), this.checkAlert()
|
|
}
|
|
checkAlert() {
|
|
if (!(this._points.length < 2 || this._model.mainSeries().bars().isEmpty())) {
|
|
var e = this._points[1];
|
|
if (this.status()) e.index > this._model.timeScale().baseIndex() && this
|
|
.setStatus(o.AlertStatus.Waiting);
|
|
else {
|
|
var t = this._model.mainSeries().bars().valueAt(e.index);
|
|
if (null !== t) {
|
|
var i = this.direction();
|
|
if (i === o.Direction.Up && t[TradingView.HIGH_PLOT] >= e.price) this
|
|
.setStatus(o.AlertStatus.Success);
|
|
else if (i === o.Direction.Down && t[TradingView.LOW_PLOT] <= e.price)
|
|
this.setStatus(o.AlertStatus.Success);
|
|
else {
|
|
var r = s(this._model.mainSeries().bars().lastIndex());
|
|
e.index !== r && this.setStatus(o.AlertStatus.Failure)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
addPoint(e) {
|
|
var t = r.prototype.addPoint.call(this, e);
|
|
return t && this.checkAlert(), t
|
|
}
|
|
endChanging() {
|
|
super.endChanging(), this.setStatus(o.AlertStatus.Waiting), this.checkAlert()
|
|
}
|
|
onData(e) {
|
|
super.onData(e), this.checkAlert()
|
|
}
|
|
endMoving() {
|
|
super.endMoving(),
|
|
this.setStatus(o.AlertStatus.Waiting), this.checkAlert()
|
|
}
|
|
direction() {
|
|
if (this.points().length < 2) return o.Direction.Up;
|
|
var e = this.points()[0];
|
|
return this.points()[1].price > e.price ? o.Direction.Up : o.Direction.Down
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "Pwwq")))
|
|
.PredictionDefinitionsViewModel
|
|
}
|
|
cloneable() {
|
|
return !1
|
|
}
|
|
static createProperties(e) {
|
|
var t = new n("linetoolprediction", e);
|
|
return a._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
r._configureProperties(e), e.merge({
|
|
status: o.AlertStatus.Waiting
|
|
})
|
|
}
|
|
}
|
|
t.LineToolPrediction = a
|
|
},
|
|
WkOR: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return n
|
|
})), i.d(t, "b", (function() {
|
|
return a
|
|
}));
|
|
var s = i("Kxc7");
|
|
const r = s.enabled("uppercase_instrument_names");
|
|
|
|
function n(e, t) {
|
|
return void 0 === e ? void 0 === t : void 0 !== t && (r ? e.toUpperCase() === t
|
|
.toUpperCase() : e === t)
|
|
}
|
|
|
|
function o(e, t) {
|
|
return e.some(e => n(t, e))
|
|
}
|
|
|
|
function a(e, t, i) {
|
|
if (n(t, e)) return !0;
|
|
if (i) {
|
|
if (n(i.full_name, e) || n(i.pro_name, e)) return !0;
|
|
if (n(i.ticker, e)) return !0;
|
|
if (i.aliases && o(i.aliases, e)) return !0;
|
|
if (i.alternatives && o(i.alternatives, e)) return !0;
|
|
if (0 === e.indexOf("FRA:") && n(i.pro_name, e.replace("FRA:", "FWB:"))) return !0
|
|
}
|
|
return !1
|
|
}
|
|
},
|
|
WkYF: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineToolDateRange", (function() {
|
|
return a
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("Ocx9"),
|
|
n = i("Ss5c"),
|
|
o = i("585y");
|
|
class a extends n.LineDataSource {
|
|
constructor(e, t) {
|
|
super(e, t || a.createProperties()), this._volumeCalculator = null, i.e(
|
|
"lt-pane-views").then(i.bind(null, "3xLB")).then(e => {
|
|
this._setPaneViews([new e.DateRangePaneView(this, this._model)])
|
|
})
|
|
}
|
|
destroy() {
|
|
super.destroy(), null !== this._volumeCalculator && this._volumeCalculator
|
|
.destroy()
|
|
}
|
|
pointsCount() {
|
|
return 2
|
|
}
|
|
properties() {
|
|
return super.properties()
|
|
}
|
|
name() {
|
|
return "Date Range"
|
|
}
|
|
volume() {
|
|
if (null === this._volumeCalculator) return NaN;
|
|
const e = this.points();
|
|
return this._volumeCalculator.volume(e[0].index, e[1].index)
|
|
}
|
|
setOwnerSource(e) {
|
|
e === this._model.mainSeries() && (Object(s.assert)(null === this
|
|
._volumeCalculator), this._volumeCalculator = new o.a(this._model
|
|
.mainSeries())), super.setOwnerSource(e)
|
|
}
|
|
static createProperties(e) {
|
|
const t = new r.DefaultProperty("linetooldaterange", e);
|
|
return a._configureProperties(t), t
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "Ax76")))
|
|
.GeneralDatePriceRangeDefinitionsViewModel
|
|
}
|
|
static _configureProperties(e) {
|
|
n.LineDataSource._configureProperties(e)
|
|
}
|
|
}
|
|
},
|
|
WmDe: function(e, t, i) {
|
|
"use strict";
|
|
TradingView.Pro = function() {
|
|
this.hasPackage = function() {
|
|
return !1
|
|
}
|
|
}, window.user = {
|
|
is_pro: !1,
|
|
settings: {}
|
|
}, TradingView.Pro.prototype.isPaidPro = function() {
|
|
return !1
|
|
}, TradingView.Pro.prototype.isSupportAvailable = function() {
|
|
return !1
|
|
}, TradingView.Pro.prototype.getStudies = function() {
|
|
return []
|
|
}, TradingView.Pro.prototype.getProduct = function() {
|
|
return {}
|
|
}, TradingView.Pro.prototype.getStudiesOrder = function() {
|
|
return []
|
|
}
|
|
},
|
|
Wo0S: function(e, t, i) {
|
|
e.exports = {
|
|
"common-tooltip": "common-tooltip-36YLR71G",
|
|
"common-tooltip--hidden": "common-tooltip--hidden-36YLR71G",
|
|
"common-tooltip--horizontal": "common-tooltip--horizontal-36YLR71G",
|
|
"common-tooltip--farther": "common-tooltip--farther-36YLR71G",
|
|
"common-tooltip--vertical": "common-tooltip--vertical-36YLR71G",
|
|
"common-tooltip-farther": "common-tooltip-farther-36YLR71G",
|
|
"common-tooltip--direction_normal": "common-tooltip--direction_normal-36YLR71G",
|
|
"common-tooltip__body": "common-tooltip__body-36YLR71G",
|
|
"common-tooltip__button-container": "common-tooltip__button-container-36YLR71G",
|
|
"common-tooltip__body--no-buttons": "common-tooltip__body--no-buttons-36YLR71G",
|
|
"common-tooltip__button": "common-tooltip__button-36YLR71G",
|
|
"common-tooltip--direction_reversed": "common-tooltip--direction_reversed-36YLR71G",
|
|
"common-tooltip__ear-holder": "common-tooltip__ear-holder-36YLR71G",
|
|
"common-tooltip__ear-holder--below": "common-tooltip__ear-holder--below-36YLR71G",
|
|
"common-tooltip__ear-holder--above": "common-tooltip__ear-holder--above-36YLR71G",
|
|
"common-tooltip__ear-holder--before": "common-tooltip__ear-holder--before-36YLR71G",
|
|
"common-tooltip__ear-holder--after": "common-tooltip__ear-holder--after-36YLR71G",
|
|
"common-tooltip__body--with-hotkey": "common-tooltip__body--with-hotkey-36YLR71G",
|
|
"common-tooltip__body--width_wide": "common-tooltip__body--width_wide-36YLR71G",
|
|
"common-tooltip__body--width_narrow": "common-tooltip__body--width_narrow-36YLR71G",
|
|
"common-tooltip__body--no-padding": "common-tooltip__body--no-padding-36YLR71G",
|
|
"common-tooltip__hotkey-block": "common-tooltip__hotkey-block-36YLR71G",
|
|
"common-tooltip__hotkey-block--divider": "common-tooltip__hotkey-block--divider-36YLR71G",
|
|
"common-tooltip__hotkey-text": "common-tooltip__hotkey-text-36YLR71G",
|
|
"common-tooltip__hotkey-button": "common-tooltip__hotkey-button-36YLR71G",
|
|
"common-tooltip__plus-sign": "common-tooltip__plus-sign-36YLR71G"
|
|
}
|
|
},
|
|
Wt0y: function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e = location.host) {
|
|
return -1 !== ["i18n.tradingview.com", "partial.tradingview.com", "www.tradingview.com",
|
|
"wwwcn.tradingview.com"
|
|
].indexOf(e) || -1 !== ["d33t3vvu2t2yu5.cloudfront.net", "dwq4do82y8xi7.cloudfront.net",
|
|
"s.tradingview.com", "s3.tradingview.com"
|
|
].indexOf(e) || e.match(/^[a-z]{2}\.tradingview\.com/) || e.match(
|
|
/prod-[^.]+.tradingview.com/) ? "battle" : e.includes("tradingview.com") || e
|
|
.includes("staging") ? "staging" : e.match(/webcharts/) ? "staging_local" : (e.match(
|
|
/^localhost(:\d+)?$/), "local")
|
|
}
|
|
|
|
function r() {
|
|
return "local" === s()
|
|
}
|
|
|
|
function n() {
|
|
return "battle" === s()
|
|
}
|
|
|
|
function o() {
|
|
return !n()
|
|
}
|
|
i.r(t), i.d(t, "environment", (function() {
|
|
return s
|
|
})), i.d(t, "isLocal", (function() {
|
|
return r
|
|
})), i.d(t, "isProd", (function() {
|
|
return n
|
|
})), i.d(t, "isDebug", (function() {
|
|
return o
|
|
}))
|
|
},
|
|
X0WL: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return s
|
|
}));
|
|
class s {
|
|
constructor(e) {
|
|
this._colorProperty = e
|
|
}
|
|
size() {
|
|
return "13px"
|
|
}
|
|
bold() {
|
|
return !1
|
|
}
|
|
color() {
|
|
return this._colorProperty.value()
|
|
}
|
|
}
|
|
},
|
|
XAms: function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e) {
|
|
e.preventDefault()
|
|
}
|
|
i.d(t, "a", (function() {
|
|
return s
|
|
})), i.d(t, "b", (function() {
|
|
return n
|
|
}));
|
|
const r = ["input:not([type])", 'input[type="text"]', 'input[type="email"]',
|
|
'input[type="password"]', 'input[type="search"]', 'input[type="number"]',
|
|
'input[type="url"]', "textarea", "a[href]", '*[contenteditable="true"]',
|
|
"[data-allow-context-menu]"
|
|
];
|
|
|
|
function n(e) {
|
|
const t = e.target;
|
|
t && !t.closest(r.join(", ")) && e.preventDefault()
|
|
}
|
|
},
|
|
XFad: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("5rJj"),
|
|
r = i("aDyP").LineToolPitchfork;
|
|
class n extends r {
|
|
constructor(e, t) {
|
|
super(e, t || n.createProperties())
|
|
}
|
|
name() {
|
|
return "Schiff Pitchfork"
|
|
}
|
|
static createProperties(e) {
|
|
var t = new s("linetoolschiffpitchfork2", e, !1, {
|
|
range: [0, 8]
|
|
});
|
|
return n._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
r._configureProperties(e)
|
|
}
|
|
}
|
|
t.LineToolSchiffPitchfork2 = n
|
|
},
|
|
XPit: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "TimePointIndexSearchMode", (function() {
|
|
return s
|
|
})), i.d(t, "seriesPlotFunctionMap", (function() {
|
|
return l
|
|
})), i.d(t, "barFunction", (function() {
|
|
return c
|
|
})), i.d(t, "SeriesData", (function() {
|
|
return u
|
|
}));
|
|
var s, r = i("Eyy1"),
|
|
n = i("k9/m");
|
|
! function(e) {
|
|
e[e.FromLeft = -1] = "FromLeft", e[e.FromRight = 1] = "FromRight"
|
|
}(s || (s = {}));
|
|
const o = {
|
|
open: e => e[1],
|
|
high: e => e[2],
|
|
low: e => e[3],
|
|
close: e => e[4],
|
|
hl2: e => (e[2] + e[3]) / 2,
|
|
hlc3: e => (e[2] + e[3] + e[4]) / 3,
|
|
ohlc4: e => (e[1] + e[2] + e[3] + e[4]) / 4
|
|
},
|
|
a = ["open", "high", "low", "close", "hl2", "hlc3", "ohlc4"];
|
|
|
|
function l() {
|
|
const e = new Map;
|
|
return a.forEach((t, i) => {
|
|
e.set(t, c(t))
|
|
}), e
|
|
}
|
|
|
|
function c(e) {
|
|
return o[e]
|
|
}
|
|
|
|
function h(e, t) {
|
|
return null == e[t]
|
|
}
|
|
class u {
|
|
constructor() {
|
|
this.m_bars = new n.PlotList(l(), h), this.m_nsBars = new n.PlotList(l(), h)
|
|
}
|
|
bars() {
|
|
return this.m_bars
|
|
}
|
|
nsBars() {
|
|
return this.m_nsBars
|
|
}
|
|
size() {
|
|
return this.m_bars.size() + this.m_nsBars.size()
|
|
}
|
|
each(e) {
|
|
this.m_bars.each(e), this.m_nsBars.each(e)
|
|
}
|
|
clear() {
|
|
this.m_bars.clear(), this.m_nsBars.clear(), this.lastProjectionPrice = void 0
|
|
}
|
|
isEmpty() {
|
|
return this.m_bars.isEmpty() && this.m_nsBars.isEmpty()
|
|
}
|
|
first() {
|
|
return this.m_bars.isEmpty() ? this.m_nsBars.first() : this.m_bars.first()
|
|
}
|
|
last() {
|
|
return this.m_nsBars.isEmpty() ? this.m_bars.last() : this.m_nsBars.last()
|
|
}
|
|
search(e, t) {
|
|
return this.nsBars().isEmpty() ? this.bars().search(e, t) : this.bars().isEmpty() ||
|
|
Object(r.ensureNotNull)(this.nsBars().firstIndex()) <= e ? this.nsBars().search(
|
|
e, t) : this.bars().search(e, t)
|
|
}
|
|
valueAt(e) {
|
|
const t = this.search(e);
|
|
return null !== t ? t.value : null
|
|
}
|
|
plotValueToTimePointIndex(e, t, i) {
|
|
if (i === s.FromRight) {
|
|
const i = (i, s) => {
|
|
const r = s[t];
|
|
return null != r && e >= r
|
|
},
|
|
s = this.m_bars.findLast(i);
|
|
if (null !== s) return s.index;
|
|
const r = this.m_nsBars.findLast(i);
|
|
return null !== r ? r.index : this.m_bars.firstIndex()
|
|
}
|
|
if (i === s.FromLeft) {
|
|
const i = (i, s) => {
|
|
const r = s[t];
|
|
return null != r && e <= r
|
|
},
|
|
s = this.m_bars.findFirst(i);
|
|
if (null !== s) return s.index;
|
|
const r = this.m_nsBars.findFirst(i);
|
|
return null !== r ? r.index : this.m_bars.lastIndex()
|
|
}
|
|
throw new Error("plotValueToTimePointIndex: unsupported search mode")
|
|
}
|
|
moveData(e) {
|
|
this.m_bars.move(e), this.m_nsBars.move(e)
|
|
}
|
|
}
|
|
},
|
|
XRI5: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "SymbolExtrapolator", (function() {
|
|
return c
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("Y7w9"),
|
|
n = i("IiTo"),
|
|
o = i("IDnv"),
|
|
a = i("LxhU");
|
|
|
|
function l(e, t) {
|
|
return e.length > t
|
|
}
|
|
class c {
|
|
constructor(e, t, i = 2e5) {
|
|
this._firstRealBarTimeMs = null, this._historyBarsCache = [],
|
|
this._projectionFirstIndex = 1 / 0, this._barsTimes = [], this
|
|
._minFutureBarsCount = 0, this._lastRealBarTimeMs = null, this
|
|
._futureBarsCache = [], this._symbolInfo = e, this._interval = a.Interval.parse(
|
|
t), this._extrapolateLimit = i, this._barBuilder = Object(n.newBarBuilder)(
|
|
t, new n.SessionInfo(e.timezone, e.session, e.session_holidays, e
|
|
.corrections), null)
|
|
}
|
|
destroy() {
|
|
this.clear()
|
|
}
|
|
interval() {
|
|
return this._interval
|
|
}
|
|
barBuilder() {
|
|
return this._barBuilder
|
|
}
|
|
symbolInfo() {
|
|
return this._symbolInfo
|
|
}
|
|
clear() {
|
|
this._firstRealBarTimeMs = null, this._historyBarsCache = [], this._barsTimes = [],
|
|
this._lastRealBarTimeMs = null, this._futureBarsCache = [], this
|
|
._minFutureBarsCount = 0, this._projectionFirstIndex = 1 / 0
|
|
}
|
|
firstFutureBarIndex() {
|
|
return this._barsTimes.length
|
|
}
|
|
futureBars() {
|
|
return this._futureBarsCache
|
|
}
|
|
replaceBarsTimesTail(e, t = e.length) {
|
|
if (0 === e.length) return;
|
|
if (0 === this._barsTimes.length) return void this.setBarsTimes(e, t);
|
|
const i = e[0],
|
|
n = this._barsTimes[this._barsTimes.length - 1],
|
|
o = i > n ? this._barsTimes.length : Object(r.lowerbound_int)(this._barsTimes,
|
|
i);
|
|
0 !== o ? (this._barsTimes.splice(o, this._barsTimes.length, ...e), this
|
|
._projectionFirstIndex = t === e.length ? this._barsTimes.length : this
|
|
._barsTimes.indexOf(e[t]), Object(s.assert)(-1 !== this
|
|
._projectionFirstIndex, "something went wrong"), n !== e[e.length -
|
|
1] && this._setLastRealBarTime(e[e.length - 1])) : this.setBarsTimes(e,
|
|
t)
|
|
}
|
|
setBarsTimes(e, t = e.length) {
|
|
const i = this._barsTimes;
|
|
if (this._barsTimes = e.slice(), this._projectionFirstIndex = 0 === this._barsTimes
|
|
.length ? 1 / 0 : t, 0 === e.length) return this._historyBarsCache = [], this
|
|
._futureBarsCache = [], this._firstRealBarTimeMs = null, void(this
|
|
._lastRealBarTimeMs = null);
|
|
0 !== i.length && i[i.length - 1] === e[e.length - 1] || this._setLastRealBarTime(e[
|
|
e.length - 1]), 0 !== i.length && i[0] === e[0] || (this
|
|
._historyBarsCache = [], this._firstRealBarTimeMs = e[0])
|
|
}
|
|
extrapolateTimeWithOffsetToTime(e, t) {
|
|
if (0 === t) return {
|
|
timeMs: e,
|
|
exact: !0
|
|
};
|
|
0 === this._barsTimes.length && (t < 0 ? null === this._firstRealBarTimeMs ? this
|
|
._firstRealBarTimeMs = e : (this._extendHistoryCacheToTimeFromRight(Math
|
|
.min(e, null !== this._lastRealBarTimeMs ? this._lastRealBarTimeMs :
|
|
1 / 0)), this._ensureExtrapolatedToHistoryTime(e)) : null === this
|
|
._lastRealBarTimeMs ? this._lastRealBarTimeMs = e : (this
|
|
._extendFutureCacheToTimeFromLeft(Math.max(e, null !== this
|
|
._firstRealBarTimeMs ? this._firstRealBarTimeMs : 1 / 0)), this
|
|
._ensureExtrapolatedToFutureTime(e)));
|
|
const i = this.indexOfTime(e);
|
|
if (null === i) return null;
|
|
const s = this._timeOfBarIndex(i.index + t);
|
|
return null === s ? null : ((i.index < 0 || this._projectionFirstIndex <= i
|
|
.index) && (s.exact = !1), s)
|
|
}
|
|
indexOfTime(e) {
|
|
if (null !== this._firstRealBarTimeMs && e < this._firstRealBarTimeMs) {
|
|
this._ensureExtrapolatedToHistoryTime(e);
|
|
let t = Object(r.lowerbound_int)(this._historyBarsCache, e);
|
|
if (0 !== this._historyBarsCache.length && 0 === t && e < this
|
|
._historyBarsCache[0]) return null;
|
|
t !== this._historyBarsCache.length && this._historyBarsCache[t] === e || (t -=
|
|
1);
|
|
return {
|
|
index: t - this._historyBarsCache.length,
|
|
timeMs: this._historyBarsCache[t]
|
|
}
|
|
}
|
|
if (null !== this._lastRealBarTimeMs && e > this._lastRealBarTimeMs) {
|
|
this._ensureExtrapolatedToFutureTime(e);
|
|
let t = Object(r.lowerbound_int)(this._futureBarsCache, e);
|
|
if (0 !== this._futureBarsCache.length && t === this._futureBarsCache.length &&
|
|
e > this._futureBarsCache[this._futureBarsCache.length - 1]) return null;
|
|
this._futureBarsCache[t] !== e && (t -= 1);
|
|
const i = Math.max(1, this._barsTimes.length) + t;
|
|
return {
|
|
index: i,
|
|
timeMs: i === this._barsTimes.length - 1 ? Object(s.ensureNotNull)(this
|
|
._lastRealBarTimeMs) : this._futureBarsCache[t]
|
|
}
|
|
}
|
|
if (0 === this._barsTimes.length) return null !== this._firstRealBarTimeMs && this
|
|
._firstRealBarTimeMs <= e || null !== this._lastRealBarTimeMs && e <= this
|
|
._lastRealBarTimeMs ? {
|
|
index: 0,
|
|
timeMs: Object(s.ensureNotNull)(this._timeOfBarIndex(0)).timeMs
|
|
} : null;
|
|
let t = Object(r.lowerbound_int)(this._barsTimes, e);
|
|
return this._barsTimes[t] !== e && (t -= 1), {
|
|
index: t,
|
|
timeMs: this._barsTimes[t]
|
|
}
|
|
}
|
|
setMinFutureBarsCount(e) {
|
|
this._minFutureBarsCount = e, 0 !== this._barsTimes.length && this
|
|
._ensureExtrapolatedToFutureBar(e)
|
|
}
|
|
ensureExtrapolatedToFutureTime(e) {
|
|
this._ensureExtrapolatedToFutureTime(e)
|
|
}
|
|
_setLastRealBarTime(e) {
|
|
const t = this._futureBarsCache.length,
|
|
i = Object(r.upperbound_int)(this._futureBarsCache, e);
|
|
0 === i ? this._extendFutureCacheToTimeFromLeft(e) : (this._lastRealBarTimeMs = e,
|
|
this._futureBarsCache = this._futureBarsCache.slice(i)), this
|
|
._ensureExtrapolatedToFutureBar(Math.max(t, this._minFutureBarsCount))
|
|
}
|
|
_timeOfBarIndex(e) {
|
|
var t;
|
|
if (e < 0) {
|
|
const t = Math.abs(e);
|
|
this._ensureExtrapolatedToHistoryBar(t);
|
|
const i = this._historyBarsCache.length - t;
|
|
return i < 0 ? null : {
|
|
timeMs: this._historyBarsCache[i],
|
|
exact: !1
|
|
}
|
|
}
|
|
if (0 === e && 0 === this._barsTimes.length) return {
|
|
timeMs: Object(s.ensureNotNull)(null !== (t = this._firstRealBarTimeMs) &&
|
|
void 0 !== t ? t : this._lastRealBarTimeMs),
|
|
exact: !1
|
|
};
|
|
if (e >= this._barsTimes.length) {
|
|
const t = e - Math.max(1, this._barsTimes.length);
|
|
return this._ensureExtrapolatedToFutureBar(t + 1), t >= this._futureBarsCache
|
|
.length ? null : {
|
|
timeMs: this._futureBarsCache[t],
|
|
exact: !1
|
|
}
|
|
}
|
|
return {
|
|
timeMs: this._barsTimes[e],
|
|
exact: e < this._projectionFirstIndex
|
|
}
|
|
}
|
|
_extendFutureCacheFromRight(e) {
|
|
const t = 0 !== this._futureBarsCache.length ? this._futureBarsCache[this
|
|
._futureBarsCache.length - 1] : this._lastRealBarTimeMs;
|
|
if (null === t) return !1;
|
|
const i = e(t, this._futureBarsCache.length);
|
|
return 0 !== i.length && (this._futureBarsCache = this._futureBarsCache.concat(i), !
|
|
0)
|
|
}
|
|
_extendHistoryCacheFromLeft(e) {
|
|
const t = 0 !== this._historyBarsCache.length ? this._historyBarsCache[0] : this
|
|
._firstRealBarTimeMs;
|
|
if (null === t) return;
|
|
const i = e(t, this._historyBarsCache.length);
|
|
this._historyBarsCache = i.concat(this._historyBarsCache)
|
|
}
|
|
_extendFutureCacheToTimeFromLeft(e) {
|
|
if (null !== this._lastRealBarTimeMs && this._lastRealBarTimeMs <= e) return;
|
|
if (Object(s.assert)(0 === this._barsTimes.length || e === this._barsTimes[this
|
|
._barsTimes.length - 1], "invalid argument"), this._lastRealBarTimeMs = e,
|
|
0 === this._futureBarsCache.length) return;
|
|
const t = Object(o.extrapolateBarsFrontToTime)(this._barBuilder, e, this
|
|
._futureBarsCache[0] - 1, this._extrapolateLimit, !0).times;
|
|
this._futureBarsCache = t.concat(this._futureBarsCache)
|
|
}
|
|
_extendHistoryCacheToTimeFromRight(e) {
|
|
if (null !== this._firstRealBarTimeMs && this._firstRealBarTimeMs >= e) return;
|
|
if (Object(s.assert)(0 === this._barsTimes.length, "bars should be empty"), this
|
|
._firstRealBarTimeMs = e,
|
|
0 === this._historyBarsCache.length) return;
|
|
const t = Object(o.extrapolateBarsFrontToTime)(this._barBuilder, this
|
|
._historyBarsCache[this._historyBarsCache.length - 1], e - 1, this
|
|
._extrapolateLimit, !0).times;
|
|
this._historyBarsCache = this._historyBarsCache.concat(t)
|
|
}
|
|
_ensureExtrapolatedToFutureBar(e) {
|
|
return !(this._futureBarsCache.length >= e || l(this._futureBarsCache, this
|
|
._extrapolateLimit)) && this._extendFutureCacheFromRight((t, i) => Object(o
|
|
.extrapolateBarsFrontByCount)(this._barBuilder, t, e - i, !0).times)
|
|
}
|
|
_ensureExtrapolatedToFutureTime(e) {
|
|
null !== this._lastRealBarTimeMs && this._lastRealBarTimeMs >= e || l(this
|
|
._futureBarsCache, this._extrapolateLimit) || 0 !== this._futureBarsCache
|
|
.length && this._futureBarsCache[this._futureBarsCache.length - 1] >= e || (this
|
|
._extendFutureCacheFromRight((t, i) => Object(o.extrapolateBarsFrontToTime)(
|
|
this._barBuilder, t, e, this._extrapolateLimit, !0).times), this
|
|
._futureBarsCache[this._futureBarsCache.length - 1] < e && this
|
|
._ensureExtrapolatedToFutureBar(this._futureBarsCache.length + 1))
|
|
}
|
|
_ensureExtrapolatedToHistoryBar(e) {
|
|
this._historyBarsCache.length >= e || l(this._historyBarsCache, this
|
|
._extrapolateLimit) || this._extendHistoryCacheFromLeft((t, i) => Object(o
|
|
.extrapolateBarsFrontByCount)(this._barBuilder, t, -(e - i), !0).times
|
|
.reverse())
|
|
}
|
|
_ensureExtrapolatedToHistoryTime(e) {
|
|
null !== this._firstRealBarTimeMs && this._firstRealBarTimeMs <= e || l(this
|
|
._historyBarsCache, this._extrapolateLimit) || 0 !== this._historyBarsCache
|
|
.length && this._historyBarsCache[0] <= e || (this._extendHistoryCacheFromLeft((
|
|
t, i) => {
|
|
const s = Object(o.extrapolateBarsFrontToTime)(this._barBuilder, t -
|
|
1, e - 1, this._extrapolateLimit, !0).times;
|
|
return s[s.length - 1] === t ? s.slice(0, -1) : s
|
|
}), (0 === this._historyBarsCache.length || this._historyBarsCache[0] >
|
|
e) && this._ensureExtrapolatedToHistoryBar(this._historyBarsCache
|
|
.length +
|
|
1))
|
|
}
|
|
}
|
|
},
|
|
XUCF: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Hr11").sign,
|
|
r = i("Ss5c").LineDataSource,
|
|
n = i("Ocx9").DefaultProperty;
|
|
class o {
|
|
constructor(e, t, i) {
|
|
this._source = e, this._index = t, this._bars = i || []
|
|
}
|
|
setBars(e) {
|
|
this._bars = e || []
|
|
}
|
|
clone(e) {
|
|
return new o(e, this._index, TradingView.clone(this._bars))
|
|
}
|
|
createBar() {
|
|
var e = this._source.properties().averageHL.value(),
|
|
t = this._source.properties().variance.value() / 100,
|
|
i = this._source._model.mainSeries().base(),
|
|
s = Math.random(),
|
|
r = e * (1 - 2 * s) * t,
|
|
n = e * (1 + (.5 - (s = Math.random())) * t),
|
|
o = r - n / 2,
|
|
a = o + n;
|
|
return {
|
|
o: (o + Math.random() * n) / i,
|
|
h: a / i,
|
|
l: o / i,
|
|
c: (o + Math.random() * n) / i
|
|
}
|
|
}
|
|
generate() {
|
|
this._bars = [];
|
|
var e = this._source.points(),
|
|
t = e[this._index],
|
|
i = e[this._index + 1];
|
|
if (t && i && t.index !== i.index) {
|
|
this._avgHL = this._source.properties().averageHL.value(), this._variance = this
|
|
._source.properties().variance.value() / 100;
|
|
for (var r = this._index ? t.index + 1 : t.index, n = s(i.index - t.index), o =
|
|
r; o !== i.index; o += n) this._bars.push(this.createBar())
|
|
}
|
|
}
|
|
bars() {
|
|
return this._bars
|
|
}
|
|
setSize(e) {
|
|
if (e < this._bars.length) this._bars.splice(e, this._bars.length - e);
|
|
else
|
|
for (; this._bars.length < e;) this._bars.push(this.createBar())
|
|
}
|
|
}
|
|
class a extends r {
|
|
constructor(e, t, s) {
|
|
var r = t || a.createProperties();
|
|
if (super(e, r), this._segments = [], !s) {
|
|
var n = Math.round(this.calculateATR(e));
|
|
r.averageHL.setValue(n)
|
|
}
|
|
r.averageHL.listeners().subscribe(this, a.prototype.regenerate), r.variance
|
|
.listeners().subscribe(this, a.prototype.regenerate), r.points || r.addProperty(
|
|
"points"), this._currentAverageHL = this._properties.averageHL.value(), this
|
|
._currentVariance = this._properties.variance.value(), this._currentInterval = e
|
|
.mainSeries().interval(), this.properties().onRestoreFactoryDefaults()
|
|
.subscribe(this, this._handleRestoringFactoryDefaults), i.e("lt-pane-views")
|
|
.then(i.t.bind(null, "dMkl", 7)).then(({
|
|
GhostFeedPaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
isSynchronizable() {
|
|
return !1
|
|
}
|
|
_handleRestoringFactoryDefaults() {
|
|
var e = Math.round(this.calculateATR());
|
|
this.properties().averageHL.setValue(e)
|
|
}
|
|
destroy() {
|
|
this.properties().onRestoreFactoryDefaults().unsubscribe(this, this
|
|
._handleRestoringFactoryDefaults), super.destroy()
|
|
}
|
|
regenerate() {
|
|
this._currentAverageHL = this._properties.averageHL.value(), this._currentVariance =
|
|
this._properties.variance.value(), this._segments.forEach((function(e) {
|
|
e.generate()
|
|
})), this.updateAllViews(), this._model.updateSource(this)
|
|
}
|
|
propertiesChanged() {
|
|
super.propertiesChanged(), this._currentAverageHL === this._properties.averageHL
|
|
.value() && this._currentVariance === this._properties.variance.value() || this
|
|
.regenerate()
|
|
}
|
|
pointsCount() {
|
|
return -1
|
|
}
|
|
name() {
|
|
return "Ghost Feed"
|
|
}
|
|
segmentBars(e) {
|
|
return this._segments[e].bars()
|
|
}
|
|
segments() {
|
|
return this._segments
|
|
}
|
|
generateBars(e) {
|
|
this._segments.length <= e && this._segments.push(new o(this, e)), this._segments[e]
|
|
.generate()
|
|
}
|
|
addPoint(e) {
|
|
if (this._points.length > 0 && this._points[this._points.length - 1].index === e
|
|
.index) {
|
|
this._lastPoint = null, this.normalizePoints(), this.createServerPoints();
|
|
for (var t = 0; t < this._points.length; t++) this._createPointProperty(t);
|
|
return !0
|
|
}
|
|
var i = r.prototype.addPoint.call(this, e);
|
|
return this._finished && (this._lastPoint = null), this._points.length > 1 && this
|
|
.generateBars(this._points.length - 2), i || this._finished
|
|
}
|
|
finish() {
|
|
this._finished = !0, this._lastPoint = null, this.normalizePoints(), this
|
|
.createServerPoints()
|
|
}
|
|
setPoint(e, t, i) {
|
|
if (super.setPoint(e, t, i), e > 0) {
|
|
var s = this.points()[e - 1],
|
|
r = t.index - s.index;
|
|
this._segments[e - 1].setSize(Math.abs(r))
|
|
}
|
|
if (e < this.points().length - 1) {
|
|
r = this.points()[e + 1].index - t.index;
|
|
this._segments[e].setSize(Math.abs(r))
|
|
}
|
|
}
|
|
state(e) {
|
|
var t = r.prototype.state.call(this, e);
|
|
return t.segments = this._segments.map((function(e) {
|
|
return {
|
|
bars: e.bars()
|
|
}
|
|
})), t
|
|
}
|
|
restoreData(e) {
|
|
var t = this;
|
|
e.segments && (this._segments = e.segments.map((function(e, i) {
|
|
return new o(t, i, [].concat(e.bars))
|
|
}))), this._currentAverageHL = this._properties.averageHL.value(), this
|
|
._currentVariance = this._properties.variance.value()
|
|
}
|
|
onData(e) {
|
|
if (super.onData(e), 0 === this.pointsProperty().childs().points._childs.length)
|
|
for (var t = 0; t < this._points.length; t++) this._createPointProperty(t);
|
|
this._currentInterval !== this._model.mainSeries().interval() && (this.regenerate(),
|
|
this._currentInterval = this._model.mainSeries().interval())
|
|
}
|
|
cloneData(e) {
|
|
var t = this;
|
|
this._segments = e._segments.map((function(e) {
|
|
return e.clone(t)
|
|
}))
|
|
}
|
|
calculateATR(e) {
|
|
var t = (void 0 !== e ? e : this._model).mainSeries(),
|
|
i = [];
|
|
t.bars().each((function(e, t) {
|
|
i.push(t[TradingView.HIGH_PLOT] - t[TradingView.LOW_PLOT])
|
|
}));
|
|
var s = 0 === i.length ? 0 : i.reduce((function(e, t) {
|
|
return e + t
|
|
}), 0) / i.length;
|
|
return s *= t.base()
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "fIc+")))
|
|
.GhostFeedDefinitionsViewModel
|
|
}
|
|
static createProperties(e) {
|
|
var t = new n("linetoolghostfeed", e);
|
|
return a._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
r._configureProperties(e)
|
|
}
|
|
}
|
|
t.LineToolGhostFeed = a
|
|
},
|
|
XXdw: function(e, t, i) {
|
|
"use strict";
|
|
var s;
|
|
i.r(t), i.d(t, "StoriesTimeLineItemType", (function() {
|
|
return s
|
|
})),
|
|
function(e) {
|
|
e[e.Image = 0] = "Image", e[e.Emoji = 1] = "Emoji"
|
|
}(s || (s = {}))
|
|
},
|
|
XcdR: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return o
|
|
}));
|
|
var s = i("txPx"),
|
|
r = i("RDU5");
|
|
const n = Object(s.getLogger)("Chart.ChartUndoModel");
|
|
class o extends r.UndoCommand {
|
|
constructor(e, t, i) {
|
|
super(i, !1), this._newRightOffsetAndBarSpacing = null, this.setCustomFlag(
|
|
"doesnt_affect_save", !0), this._model = e, this
|
|
._rightOffsetAndBarSpacing = t
|
|
}
|
|
undo() {
|
|
if (null !== this._newRightOffsetAndBarSpacing) return void n.logDebug(
|
|
"TimeScaleChangeUndoCommand.undo: Command is already undone");
|
|
const e = this._model.timeScale();
|
|
this._newRightOffsetAndBarSpacing = {
|
|
barSpacing: e.barSpacing(),
|
|
rightOffset: e.rightOffset()
|
|
}, e.setBarSpacing(this._rightOffsetAndBarSpacing.barSpacing), e
|
|
.setRightOffset(this._rightOffsetAndBarSpacing.rightOffset), this._model
|
|
.lightUpdate()
|
|
}
|
|
redo() {
|
|
if (null === this._newRightOffsetAndBarSpacing) return void n.logDebug(
|
|
"TimeScaleChangeUndoCommand.redo: Command is not undone");
|
|
const e = this._model.timeScale();
|
|
e.setBarSpacing(this._newRightOffsetAndBarSpacing.barSpacing), e.setRightOffset(
|
|
this._newRightOffsetAndBarSpacing.rightOffset), this._model
|
|
.lightUpdate(), this._newRightOffsetAndBarSpacing = null
|
|
}
|
|
}
|
|
},
|
|
XlJ7: function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e, t, i, s) {
|
|
return `${s ? s + " " : ""}${i ? i + " " : ""}${e}px ${t}`
|
|
}
|
|
i.r(t), i.d(t, "makeFont", (function() {
|
|
return s
|
|
})), i.d(t, "parseFont", (function() {
|
|
return n
|
|
}));
|
|
const r = /(bold )?(italic )?(\d+)(px|pt) (.*)$/;
|
|
|
|
function n(e) {
|
|
const t = r.exec(e);
|
|
return null === t ? null : {
|
|
family: t[5],
|
|
size: parseInt(t[3]) * ("pt" === t[4] ? .75 : 1),
|
|
bold: Boolean(t[1]),
|
|
italic: Boolean(t[2])
|
|
}
|
|
}
|
|
},
|
|
Xyly: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineToolBezierQuadro", (function() {
|
|
return n
|
|
}));
|
|
var s = i("Ocx9"),
|
|
r = i("Ss5c");
|
|
class n extends r.LineDataSource {
|
|
constructor(e, t) {
|
|
const s = t || n.createProperties();
|
|
super(e, s), this._controlPoint = null, i.e("lt-pane-views").then(i.bind(null,
|
|
"4Ptp")).then(t => {
|
|
this._setPaneViews([new t.BezierQuadroPaneView(this, e)])
|
|
})
|
|
}
|
|
pointsCount() {
|
|
return 2
|
|
}
|
|
properties() {
|
|
return super.properties()
|
|
}
|
|
name() {
|
|
return "Curve"
|
|
}
|
|
setLastPoint(e, t) {
|
|
super.setLastPoint(e, t), this._controlPoint = this._calculateControlPoint()
|
|
}
|
|
addPoint(e, t, i) {
|
|
const s = super.addPoint(e, t, i);
|
|
if (s) {
|
|
const e = this._calculateControlPoint();
|
|
this._points.push(e), this._controlPoint = null, i || (this
|
|
.normalizePoints(), this.createServerPoints()), this
|
|
._createPointProperty(2)
|
|
}
|
|
return s
|
|
}
|
|
restorePoints(e, t, i) {
|
|
super.restorePoints(e, t, i), this._createPointProperty(2)
|
|
}
|
|
controlPoint() {
|
|
return this._controlPoint
|
|
}
|
|
static createProperties(e) {
|
|
const t = new s.DefaultProperty("linetoolbezierquadro", e);
|
|
return n._configureProperties(t), t
|
|
}
|
|
_getPropertyDefinitionsViewModelClass() {
|
|
return Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "b4fl")).then(
|
|
e => e.GeneralBezierDefinitionsViewModel)
|
|
}
|
|
static _configureProperties(e) {
|
|
r.LineDataSource._configureProperties(e)
|
|
}
|
|
_calculateControlPoint() {
|
|
const e = this.pointToScreenPoint(this.points()[0])[0],
|
|
t = this.pointToScreenPoint(this.points()[1])[0],
|
|
i = t.subtract(e).scaled(.5).transposed().scaled(.3),
|
|
s = e.add(t).scaled(.5).add(i);
|
|
return this.screenPointToPoint(s)
|
|
}
|
|
}
|
|
},
|
|
XzZr: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("ogJP").declareClassAsPureInterface;
|
|
|
|
function r() {}
|
|
TradingView.WEB_SOCKET_WAS_CONNECTED = !1, r.REBIND_STUDY_STANDALONE_TO_CHILD = 1, r
|
|
.REBIND_STUDY_CHILD_TO_STANDALONE = 2, r.prototype.defaultWatchlistSymbols = function() {},
|
|
r.prototype.defaultResolutions = function() {}, r.prototype.availableCurrencies =
|
|
function() {}, r.prototype.availableUnits = function() {}, r.prototype
|
|
.supportedSymbolsTypes =
|
|
function() {}, r.prototype.supportedExchangesList = function() {}, r.prototype
|
|
.symbolsGrouping = function() {}, r.prototype.quoteCreateSession = function(e) {}, r
|
|
.prototype.quoteDeleteSession = function(e) {}, r.prototype.quoteSetFields = function(e,
|
|
t) {}, r.prototype.quoteAddSymbols = function(e, t) {}, r.prototype.quoteRemoveSymbols =
|
|
function(e, t) {}, r.prototype.quoteFastSymbols = function(e, t) {}, r.prototype
|
|
.depthCreateSession = function(e, t, i) {}, r.prototype.depthDeleteSession = function(e) {},
|
|
r.prototype.depthSetSymbol = function(e, t) {}, r.prototype.depthClearSymbol = function(
|
|
e) {}, r.prototype.depthSetScale = function(e, t) {}, r.prototype.chartCreateSession =
|
|
function(e, t) {}, r.prototype.chartDeleteSession = function(e) {}, r.prototype
|
|
.createSession = function(e, t) {}, r.prototype.removeSession = function(e) {}, r.prototype
|
|
.connected = function() {}, r.prototype.connect = function() {}, r.prototype.disconnect =
|
|
function() {}, r.prototype.switchTimezone = function(e, t) {}, r.prototype.resolveSymbol =
|
|
function(e, t, i, s, r) {}, r.prototype.createSeries = function(e, t, i, s, r, n, o, a) {},
|
|
r.prototype.removeSeries = function(e, t, i) {}, r.prototype.modifySeries = function(e, t,
|
|
i, s, r, n, o) {}, r.prototype.requestMoreData = function(e, t, i, s) {}, r.prototype
|
|
.requestMetadata = function(e, t, i) {}, r.prototype.isCanCreateStudy = function(e, t) {}, r
|
|
.prototype.createStudy = function(e, t, i, s, r, n, o) {}, r.prototype.rebindStudy =
|
|
function(e, t, i, s, r, n, o, a) {}, r.prototype.removeStudy = function(e, t, i) {}, r
|
|
.prototype.modifyStudy = function(e, t, i, s, r) {}, r.prototype.createPointset = function(
|
|
e, t, i, s, r, n, o) {}, r.prototype.modifyPointset = function(e, t, i, s, r) {}, r
|
|
.prototype.removePointset = function(e, t, i) {}, r.prototype.requestMoreTickmarks =
|
|
function(e, t, i, s) {}, r.prototype.requestFirstBarTime = function(e, t, i, s) {}, r
|
|
.prototype._invokeHandler = function(e, t) {}, r.prototype._sendRequest = function(e, t) {},
|
|
r.prototype._onMessage = function(e) {}, r.prototype._dispathNotification = function(e) {},
|
|
r.prototype._invokeNotificationHandler = function(e, t, i) {}, r.prototype._notifySessions =
|
|
function(e) {}, r.prototype.unpack = function(e) {},
|
|
r.prototype.searchSymbols = function(e, t, i, s, r, n, o, a, l, c) {}, r.prototype
|
|
.serverTimeOffset = function() {}, r.prototype.getMarks = function(e, t, i, s, r) {}, r
|
|
.prototype.getTimescaleMarks = function(e, t, i, s, r) {}, s(r, "ChartApiInterface"), e
|
|
.exports.HandlerInfo = function(e, t) {
|
|
this.handler = e, this.customId = t
|
|
}, e.exports.ChartApiInterface = r
|
|
},
|
|
Y5iK: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "MainSeriesScaleRatioProperty", (function() {
|
|
return n
|
|
}));
|
|
var s = i("aIyQ"),
|
|
r = i.n(s);
|
|
class n {
|
|
constructor(e) {
|
|
this._changed = new r.a, this._model = e
|
|
}
|
|
getStepChangeValue() {
|
|
return .1
|
|
}
|
|
getMinValue() {
|
|
return 1e-7
|
|
}
|
|
getMaxValue() {
|
|
return 99999999
|
|
}
|
|
value() {
|
|
return this._model.mainSeriesScaleRatio()
|
|
}
|
|
setValue(e, t) {
|
|
(e !== this.value() || t) && (this._model.setMainSeriesScaleRatio(e), this
|
|
._onChanged())
|
|
}
|
|
state() {
|
|
return null
|
|
}
|
|
clone() {
|
|
return new n(this._model)
|
|
}
|
|
listeners() {
|
|
return this._changed
|
|
}
|
|
subscribe(e, t) {
|
|
this._changed.subscribe(e, t)
|
|
}
|
|
unsubscribe(e, t) {
|
|
this._changed.unsubscribe(e, t)
|
|
}
|
|
unsubscribeAll(e) {
|
|
this._changed.unsubscribeAll(e)
|
|
}
|
|
_onChanged() {
|
|
this._changed.fire(this)
|
|
}
|
|
}
|
|
},
|
|
Y7w9: function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e, t) {
|
|
return e < t
|
|
}
|
|
|
|
function r(e, t, i, s = 0, r = e.length) {
|
|
let n = r - s;
|
|
for (; 0 < n;) {
|
|
const r = n >> 1,
|
|
o = s + r;
|
|
i(e[o], t) ? (s = o + 1, n -= r + 1) : n = r
|
|
}
|
|
return s
|
|
}
|
|
|
|
function n(e, t, i = 0, n = e.length) {
|
|
return r(e, t, s, i, n)
|
|
}
|
|
|
|
function o(e, t, i, s = 0, r = e.length) {
|
|
let n = r - s;
|
|
for (; 0 < n;) {
|
|
const r = n >> 1,
|
|
o = s + r;
|
|
i(t, e[o]) ? n = r : (s = o + 1, n -= r + 1)
|
|
}
|
|
return s
|
|
}
|
|
|
|
function a(e, t, i = 0, r = e.length) {
|
|
return o(e, t, s, i, r)
|
|
}
|
|
|
|
function l(e, t) {
|
|
return e.filter(e => !t.includes(e))
|
|
}
|
|
|
|
function c(e, t) {
|
|
const i = e.indexOf(t);
|
|
return i < 0 ? e.slice() : [t].concat(e.slice(0, i)).concat(e.slice(i + 1))
|
|
}
|
|
|
|
function h(e, t, i) {
|
|
const s = new Set(t),
|
|
r = [],
|
|
o = [],
|
|
a = [];
|
|
return e.forEach((e, t) => {
|
|
s.has(e) ? o.push(e) : (r.push(e), a.push(t))
|
|
}), i = i < e.length - 1 ? n(a, i + 1) : r.length, r.splice(i, 0, ...o), {
|
|
newItems: r,
|
|
movedItemsStartIndex: i
|
|
}
|
|
}
|
|
|
|
function u(e, t, i) {
|
|
const s = new Set(t),
|
|
r = [],
|
|
o = [],
|
|
a = [];
|
|
return e.forEach((e, t) => {
|
|
s.has(e) ? o.push(e) : (r.push(e), a.push(t))
|
|
}), i = i <= e.length - 1 ? n(a, i) : r.length, r.splice(i, 0, ...o), {
|
|
newItems: r,
|
|
movedItemsStartIndex: i
|
|
}
|
|
}
|
|
|
|
function d(e, t) {
|
|
const i = new Set;
|
|
return e.forEach(e => {
|
|
t.has(e) && i.add(e)
|
|
}), i
|
|
}
|
|
i.r(t), i.d(t, "lowerbound", (function() {
|
|
return r
|
|
})), i.d(t, "lowerbound_int", (function() {
|
|
return n
|
|
})), i.d(t, "upperbound", (function() {
|
|
return o
|
|
})), i.d(t, "upperbound_int", (function() {
|
|
return a
|
|
})), i.d(t, "subtract", (function() {
|
|
return l
|
|
})), i.d(t, "moveToHead", (function() {
|
|
return c
|
|
})), i.d(t, "moveAfter", (function() {
|
|
return h
|
|
})), i.d(t, "moveBefore", (function() {
|
|
return u
|
|
})), i.d(t, "intersect", (function() {
|
|
return d
|
|
}))
|
|
},
|
|
YCFM: function(e, t, i) {},
|
|
YWnQ: function(e, t, i) {
|
|
"use strict";
|
|
var s;
|
|
i.r(t), i.d(t, "SymbolErrorPermissionDeniedReason", (function() {
|
|
return s
|
|
})), i.d(t, "permissionDenied", (function() {
|
|
return r
|
|
})),
|
|
function(e) {
|
|
e.Symbol = "symbol", e.GroupPermission = "group"
|
|
}(s || (s = {}));
|
|
const r = "permission denied"
|
|
},
|
|
YdVo: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineToolPath", (function() {
|
|
return c
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("aO4+"),
|
|
n = i("Ocx9"),
|
|
o = i("Zp/P"),
|
|
a = i("Ss5c"),
|
|
l = i("j3hX");
|
|
class c extends a.LineDataSource {
|
|
constructor(e, t) {
|
|
const s = t || c.createProperties();
|
|
super(e, s), i.e("lt-pane-views").then(i.bind(null, "JeuX")).then(t => {
|
|
this._setPaneViews([new t.PathPaneView(this, e)])
|
|
})
|
|
}
|
|
pointsCount() {
|
|
return -1
|
|
}
|
|
properties() {
|
|
return super.properties()
|
|
}
|
|
name() {
|
|
return "Path"
|
|
}
|
|
hasEditableCoordinates() {
|
|
return !1
|
|
}
|
|
addPoint(e, t, i) {
|
|
var n;
|
|
const a = Object(s.ensureNotNull)(this.priceScale()),
|
|
l = this._model.timeScale().indexToCoordinate(e.index),
|
|
c = e.price,
|
|
h = Object(s.ensure)(null === (n = this.ownerSource()) || void 0 === n ?
|
|
void 0 : n.firstValue()),
|
|
u = a.priceToCoordinate(c, h);
|
|
if (this._points.length > 0) {
|
|
const e = this._points[this._points.length - 1],
|
|
t = this._model.timeScale().indexToCoordinate(e.index),
|
|
i = e.price,
|
|
s = a.priceToCoordinate(i, h);
|
|
if (new r.Point(l, u).subtract(new r.Point(t, s)).length() < Object(o
|
|
.interactionTolerance)().minDistanceBetweenPoints) return this
|
|
._lastPoint = null, this.normalizePoints(), this
|
|
.createServerPoints(), !0
|
|
}
|
|
return super.addPoint(e, t, i)
|
|
}
|
|
static createProperties(e) {
|
|
const t = new n.DefaultProperty("linetoolpath", e);
|
|
return c._configureProperties(t), t
|
|
}
|
|
_getPropertyDefinitionsViewModelClass() {
|
|
return Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "WW+G")).then(
|
|
e => e.PathDefinitionsViewModel)
|
|
}
|
|
static _configureProperties(e) {
|
|
a.LineDataSource._configureProperties(e), e.addChild("linesColors", new l
|
|
.LineToolColorsProperty([e.childs().lineColor]))
|
|
}
|
|
}
|
|
},
|
|
"Ye2/": function(e, t, i) {
|
|
"use strict";
|
|
var s;
|
|
i.r(t), i.d(t, "LineToolBarsPatternMode", (function() {
|
|
return s
|
|
})),
|
|
function(e) {
|
|
e[e.Bars = 0] = "Bars", e[e.Line = 1] = "Line", e[e.OpenClose = 2] = "OpenClose", e[e
|
|
.LineOpen = 3] = "LineOpen", e[e.LineHigh = 4] = "LineHigh", e[e.LineLow = 5] =
|
|
"LineLow", e[e.LineHL2 = 6] = "LineHL2"
|
|
}(s || (s = {}))
|
|
},
|
|
Yj6H: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("Eyy1"),
|
|
r = i("ogJP"),
|
|
n = i("aIyQ"),
|
|
o = i.n(n),
|
|
a = i("Y7w9"),
|
|
l = i("Qb4w"),
|
|
c = i("TTFo"),
|
|
h = i("qJq3"),
|
|
u = i("7ktv"),
|
|
d = i("tc+8"),
|
|
p = i.n(d),
|
|
_ = i("3ClC"),
|
|
m = i("/tGj"),
|
|
f = i("n5al"),
|
|
g = i("SwuQ"),
|
|
b = i("s1Gx"),
|
|
v = i("Hr11");
|
|
class S {
|
|
constructor(e, t) {
|
|
if (this._base = e, this._integralDividers = t, Object(v.isBaseDecimal)(this._base))
|
|
this._fractionalDividers = [2, 2.5, 2];
|
|
else {
|
|
this._fractionalDividers = [];
|
|
for (let e = this._base; 1 !== e;) {
|
|
if (e % 2 == 0) this._fractionalDividers.push(2), e /= 2;
|
|
else {
|
|
if (e % 5 != 0) throw new Error("unexpected base");
|
|
this._fractionalDividers.push(2), this._fractionalDividers.push(2.5),
|
|
e /= 5
|
|
}
|
|
if (this._fractionalDividers.length > 100) throw new Error(
|
|
"something wrong with base")
|
|
}
|
|
}
|
|
}
|
|
tickSpan(e, t, i) {
|
|
const s = 0 === this._base ? 0 : 1 / this._base;
|
|
let r = Math.pow(10, Math.max(0, Math.ceil(Object(v.log10)(e - t)))),
|
|
n = 0,
|
|
o = this._integralDividers[0];
|
|
for (;;) {
|
|
const e = Object(v.greaterOrEqual)(r, s, 1e-14) && r > s + 1e-14,
|
|
t = Object(v.greaterOrEqual)(r, i * o, 1e-14),
|
|
a = Object(v.greaterOrEqual)(r, 1, 1e-14);
|
|
if (!(e && t && a)) break;
|
|
r /= o, o = this._integralDividers[++n % this._integralDividers.length]
|
|
}
|
|
if (r <= s + 1e-14 && (r = s), r = Math.max(1, r), this._fractionalDividers.length >
|
|
0 && Object(v.equal)(r, 1, 1e-14))
|
|
for (n = 0, o = this._fractionalDividers[0]; Object(v.greaterOrEqual)(r, i * o,
|
|
1e-14) && r > s + 1e-14;) r /= o, o = this._fractionalDividers[++n %
|
|
this._fractionalDividers.length];
|
|
return r
|
|
}
|
|
}
|
|
class y {
|
|
constructor(e, t, i, s) {
|
|
this._marks = null, this._priceScale = e, this._base = t, this
|
|
._coordinateToLogicalFunc = i, this._logicalToCoordinateFunc = s
|
|
}
|
|
base() {
|
|
return this._base
|
|
}
|
|
setBase(e) {
|
|
if (e < 0) throw new Error("base < 0");
|
|
this._base = e
|
|
}
|
|
tickSpan(e, t, i = 0) {
|
|
if (e < t) throw new Error("high < low");
|
|
const s = this._priceScale.height(),
|
|
r = (e - t) * this._tickMarkHeight() / s,
|
|
n = new S(this._base, [2, 2.5, 2]),
|
|
o = new S(this._base, [2, 2, 2.5]),
|
|
a = new S(this._base, [2.5, 2, 2]);
|
|
let l = 0;
|
|
const c = n.tickSpan(e, t, r);
|
|
c > i && (l = c);
|
|
const h = o.tickSpan(e, t, r);
|
|
h > i && (l = Math.min(l, h));
|
|
const u = a.tickSpan(e, t, r);
|
|
return u > i && (l = Math.min(l, u)), l > 0 ? l : e - t
|
|
}
|
|
rebuildTickMarks() {
|
|
this._marks = null
|
|
}
|
|
marks() {
|
|
return null === this._marks && (this._marks = this._rebuildTickMarksImpl()), this
|
|
._marks
|
|
}
|
|
_fontHeight() {
|
|
return this._priceScale.fontSize()
|
|
}
|
|
_tickMarkHeight() {
|
|
return Math.ceil(2.5 * this._fontHeight())
|
|
}
|
|
_rebuildTickMarksImpl() {
|
|
const e = this._priceScale,
|
|
t = [],
|
|
i = e.mainSource();
|
|
if (e.isEmpty() || null === i) return t;
|
|
let s = i.firstValue();
|
|
null === s && (s = 0);
|
|
const r = e.height(),
|
|
n = this._coordinateToLogicalFunc(r - 1, s),
|
|
o = this._coordinateToLogicalFunc(0, s),
|
|
a = Math.max(n, o),
|
|
l = Math.min(n, o);
|
|
if (a === l) return t;
|
|
let c = this.tickSpan(a, l),
|
|
h = a % c;
|
|
h += h < 0 ? c : 0;
|
|
const u = a >= l ? 1 : -1;
|
|
let d = null;
|
|
const p = e.formatter();
|
|
let _ = NaN;
|
|
for (let i = a - h; i > l; i -= c) {
|
|
i === _ && (c = this.tickSpan(a, l, c)), _ = i;
|
|
const r = this._logicalToCoordinateFunc(i, s);
|
|
null !== d && Math.abs(r - d) < this._tickMarkHeight() || (t.push({
|
|
coord: r,
|
|
label: p.format(i)
|
|
}), d = r, e.isLog() && (c = this.tickSpan(i * u, l)))
|
|
}
|
|
return t
|
|
}
|
|
}
|
|
var w = i("CW80"),
|
|
P = i("mMWL"),
|
|
C = i("GH0z"),
|
|
x = i("kcTO");
|
|
i.d(t, "PriceScaleBase", (function() {
|
|
return O
|
|
}));
|
|
const T = new C.PercentageFormatter,
|
|
I = new x.PriceFormatter(100, 1),
|
|
M = {
|
|
autoScale: !0,
|
|
autoScaleDisabled: !1,
|
|
lockScale: !1,
|
|
percentage: !1,
|
|
percentageDisabled: !1,
|
|
log: !1,
|
|
logDisabled: !1,
|
|
alignLabels: !0,
|
|
isInverted: !1,
|
|
indexedTo100: !1
|
|
};
|
|
class O {
|
|
constructor(e) {
|
|
this._marksCache = null, this._onMarksChanged = new o.a, this.m_dataSources = [],
|
|
this._sourcesForAutoscale = null, this._hasSeries = !1, this._studiesCount = 0,
|
|
this._drawingCount = 0, this._seriesLikeSources = [], this
|
|
._seriesLikeSourcesSet = new Set, this._priceDataSources = [], this
|
|
._mainSource = null, this._lastSourceRemoved = new o.a, this
|
|
._scaleSeriesOnly = !1, this._invalidatedForRange = {
|
|
isValid: !0,
|
|
visibleBars: null
|
|
}, this.m_priceRange = null, this.m_height = 0, this._margins = {
|
|
top: 0,
|
|
bottom: 0
|
|
}, this._correctedMarginsCache = null, this._topPixelMargin = 0, this
|
|
._bottomPixelMargin = 0, this._internalHeightCache = null, this
|
|
._internalHeightChanged = new o.a, this._priceRangeSnapshot = null, this
|
|
._currencyCache = null, this._unitCache = null, this
|
|
._recalculatePriceRangeOnce = !1, this._cachedOrderedSoruces = null, this
|
|
._scaleStartPoint = null, this._maxPriceRange = null, this._minPriceRange =
|
|
null, this._priceRangeChanged = new o.a, this._sourcesToUpdateViews = null, this
|
|
._markBuilder = new y(this, 100, this._coordinateToLogical.bind(this), this
|
|
._logicalToCoordinate.bind(this)), this._formatter = null, this._id = "",
|
|
e = Object.assign({}, M, e), this._properties = new p.a(e)
|
|
}
|
|
id() {
|
|
return this._id
|
|
}
|
|
setId(e) {
|
|
this._id = e
|
|
}
|
|
isLog() {
|
|
return this._properties.childs().log.value()
|
|
}
|
|
isPercentage() {
|
|
return this._properties.childs().percentage.value()
|
|
}
|
|
isInverted() {
|
|
return this._properties.childs().isInverted.value()
|
|
}
|
|
isIndexedTo100() {
|
|
return this._properties.childs().indexedTo100.value()
|
|
}
|
|
isAutoScale() {
|
|
return this._properties.childs().autoScale.value() && !this.isLockScale()
|
|
}
|
|
isLockScale() {
|
|
return this._properties.childs().lockScale.value()
|
|
}
|
|
isRegular() {
|
|
return !this.isPercentage() && !this.isLog() && !this.isIndexedTo100()
|
|
}
|
|
properties() {
|
|
return this._properties
|
|
}
|
|
height() {
|
|
return this.m_height
|
|
}
|
|
setHeight(e) {
|
|
this.m_height !== e && (this.m_height = e, this._invalidateInternalHeightCache(),
|
|
this._marksCache = null)
|
|
}
|
|
internalHeight() {
|
|
if (this._internalHeightCache) return this._internalHeightCache;
|
|
const e = this.height() - this.topPixelMargin() - this.bottomPixelMargin();
|
|
return this._internalHeightCache = e, e
|
|
}
|
|
priceRange() {
|
|
return this._makeSureItIsValid(), this.m_priceRange
|
|
}
|
|
setPriceRange(e, t, i) {
|
|
if (!(e instanceof l.PriceRange)) throw new TypeError("incorrect price range");
|
|
const s = this.m_priceRange;
|
|
if (!t && l.PriceRange.compare(s, e)) return;
|
|
const r = null !== this._maxPriceRange && this._maxPriceRange.containsStrictly(e),
|
|
n = null !== this._minPriceRange && e.containsStrictly(this._minPriceRange);
|
|
this.isLockScale() && !t && (r || n) || (this._marksCache = null, this
|
|
.m_priceRange = e, i || this._priceRangeChanged.fire(s, e))
|
|
}
|
|
setMinPriceRange(e) {
|
|
this._minPriceRange = e
|
|
}
|
|
setMaxPriceRange(e) {
|
|
this._maxPriceRange = e
|
|
}
|
|
recalculatePriceRangeOnce() {
|
|
this._recalculatePriceRangeOnce = !0
|
|
}
|
|
priceRangeShouldBeRecalculatedOnce() {
|
|
if (!this._recalculatePriceRangeOnce || this.isLockScale()) return !1;
|
|
const e = this.mainSource();
|
|
return null !== e && e.priceRangeReady()
|
|
}
|
|
priceRangeChanged() {
|
|
return this._priceRangeChanged
|
|
}
|
|
updateAllViews() {
|
|
const e = this._getSourcesToUpdateViews();
|
|
for (const t of e) t.updateAllViews()
|
|
}
|
|
state() {
|
|
var e;
|
|
const t = this._properties.childs();
|
|
return {
|
|
id: this._id,
|
|
m_priceRange: (null === (e = this.priceRange()) || void 0 === e ? void 0 : e
|
|
.serialize()) || null,
|
|
m_isAutoScale: this.isAutoScale(),
|
|
m_isPercentage: t.percentage.value(),
|
|
m_isIndexedTo100: t.indexedTo100.value(),
|
|
m_isLog: t.log.value(),
|
|
m_isLockScale: this.isLockScale(),
|
|
m_isInverted: this.isInverted(),
|
|
m_height: this.m_height,
|
|
m_topMargin: this._margins.top,
|
|
m_bottomMargin: this._margins.bottom,
|
|
alignLabels: t.alignLabels.value()
|
|
}
|
|
}
|
|
restoreState(e) {
|
|
let t = e.m_priceRange;
|
|
if (void 0 === t) throw new TypeError("invalid state");
|
|
if (void 0 === e.m_isAutoScale) throw new TypeError("invalid state");
|
|
void 0 !== e.id && (this._id = e.id);
|
|
const i = {
|
|
autoScale: e.m_isAutoScale
|
|
};
|
|
void 0 !== e.m_isPercentage && (i.percentage = e.m_isPercentage), void 0 !== e
|
|
.m_isIndexedTo100 && (i.indexedTo100 = e.m_isIndexedTo100), void 0 !== e
|
|
.m_isLog && (i.log = e.m_isLog), void 0 !== e.m_isLockScale && (i.lockScale = e
|
|
.m_isLockScale), void 0 !== e.m_isInverted && this._properties.childs()
|
|
.isInverted.setValue(e.m_isInverted), void 0 !== e.m_height && this.setHeight(
|
|
Math.max(0, e.m_height)), this.setMode(i), t ? (t instanceof l.PriceRange ||
|
|
(t = new l.PriceRange(t)), this.setPriceRange(t, !0)) : this.m_priceRange =
|
|
null, void 0 !== e.m_topMargin && (this._margins.top = e.m_topMargin),
|
|
void 0 !== e.m_bottomMargin && (this._margins.bottom = e.m_bottomMargin),
|
|
void 0 !== e.alignLabels && this._properties.childs().alignLabels.setValue(e
|
|
.alignLabels), this._mainSource = null, this._scaleSeriesOnly = !1
|
|
}
|
|
priceToLogical(e) {
|
|
return this.isLog() && e ? Object(c.toLog)(e) : e
|
|
}
|
|
logicalToPrice(e) {
|
|
return this.isLog() ? Object(c.fromLog)(e) : e
|
|
}
|
|
priceToCoordinate(e, t) {
|
|
const i = this._priceToPercentOrIndexedTo100IfNeeded(e, t);
|
|
return this._logicalToCoordinate(i)
|
|
}
|
|
coordinateToPrice(e, t) {
|
|
let i = this._coordinateToLogical(e);
|
|
return this.isPercentage() ? i = Object(c.fromPercent)(i, t) : this
|
|
.isIndexedTo100() && (i = Object(c.fromIndexedTo100)(i, t)), i
|
|
}
|
|
mainSource() {
|
|
if (null !== this._mainSource) return this._mainSource;
|
|
let e;
|
|
for (const t of this.m_dataSources) {
|
|
if (t instanceof h.Series) {
|
|
e = t;
|
|
break
|
|
}!e && t instanceof u.PriceDataSource && (e = t)
|
|
}
|
|
return this._mainSource = e || null, this._correctedMarginsCache = null, this
|
|
._mainSource
|
|
}
|
|
pricesArrayToCoordinates(e, t, i) {
|
|
this._makeSureItIsValid();
|
|
const r = this.bottomPixelMargin(),
|
|
n = Object(s.ensureNotNull)(this.priceRange()),
|
|
o = n.minValue(),
|
|
a = n.maxValue(),
|
|
l = this.internalHeight() - 1,
|
|
h = this.isInverted(),
|
|
u = l / (a - o);
|
|
void 0 === i && (i = e.length);
|
|
const d = this.isPercentage(),
|
|
p = this.isIndexedTo100(),
|
|
_ = this.isLog(),
|
|
m = this.m_height;
|
|
let f, g;
|
|
for (let s = 0; s < i; s++) f = e[s], Number.isFinite(f) && (d ? f = Object(c
|
|
.toPercent)(f, t) : p ? f = Object(c.toIndexedTo100)(f, t) : _ && (f =
|
|
Object(c.toLog)(f)), g = r + u * (f - o), e[s] = h ? g : m - 1 - g)
|
|
}
|
|
pointsArrayToCoordinates(e, t) {
|
|
this._makeSureItIsValid();
|
|
const i = Object(s.ensureNotNull)(this.priceRange()),
|
|
r = this.bottomPixelMargin(),
|
|
n = i.minValue(),
|
|
o = i.maxValue(),
|
|
a = this.internalHeight() - 1,
|
|
l = this.isInverted(),
|
|
h = a / (o - n),
|
|
u = e;
|
|
if (this.isPercentage())
|
|
for (let e = 0; e < u.length; e++) u[e].y = Object(c.toPercent)(u[e].y, t);
|
|
if (this.isIndexedTo100())
|
|
for (let e = 0; e < u.length; e++) u[e].y = Object(c.toIndexedTo100)(u[e].y, t);
|
|
if (this.isLog())
|
|
for (let e = 0; e < u.length; e++) u[e].y = this.priceToLogical(u[e].y);
|
|
for (let e = 0; e < u.length; e++) {
|
|
const t = u[e].y;
|
|
if (isNaN(t) || null == t) continue;
|
|
const i = r + h * (t - n),
|
|
s = l ? i : this.m_height - 1 - i;
|
|
u[e].y = s
|
|
}
|
|
}
|
|
barPricesToCoordinates(e, t) {
|
|
this._makeSureItIsValid();
|
|
const i = Object(s.ensureNotNull)(this.priceRange()),
|
|
r = e,
|
|
n = this.bottomPixelMargin(),
|
|
o = i.minValue(),
|
|
a = i.maxValue(),
|
|
l = this.internalHeight() - 1;
|
|
let h = null;
|
|
if (this.isPercentage() ? h = c.toPercent : this.isIndexedTo100() ? h = c
|
|
.toIndexedTo100 : this.isLog() && (h = (e, t) => e ? Object(c.toLog)(e) : e),
|
|
null !== h)
|
|
for (let e = 0; e < r.length; e++) r[e] && (r[e].open = h(r[e].open, t), r[e]
|
|
.high = h(r[e].high, t), r[e].low = h(r[e].low, t), r[e].close = h(r[e]
|
|
.close, t), void 0 !== r[e].additionalPrice && (r[e]
|
|
.additionalPrice = h(r[e].additionalPrice, t)));
|
|
const u = l / (a - o),
|
|
d = this.isInverted();
|
|
for (let e = 0; e < r.length; e++) {
|
|
const t = r[e];
|
|
if (!t) continue;
|
|
const i = n + u * (t.open - o),
|
|
s = d ? i : this.m_height - 1 - i;
|
|
t.open = s;
|
|
const a = n + u * (t.high - o),
|
|
l = d ? a : this.m_height - 1 - a;
|
|
t.high = l;
|
|
const c = n + u * (t.low - o),
|
|
h = d ? c : this.m_height - 1 - c;
|
|
t.low = h;
|
|
const p = n + u * (t.close - o),
|
|
_ = d ? p : this.m_height - 1 - p;
|
|
if (t.close = _, void 0 !== t.additionalPrice) {
|
|
const e = n + u * (t.additionalPrice - o);
|
|
t.additionalPrice = d ? e : this.m_height - 1 - e
|
|
}
|
|
}
|
|
}
|
|
formatter() {
|
|
return null === this._formatter && this.updateFormatter(), Object(s.ensureNotNull)(
|
|
this._formatter)
|
|
}
|
|
updateFormatter() {
|
|
this._marksCache = null;
|
|
const e = this.mainSource();
|
|
let t = 100;
|
|
e && (t = e.base()), this._formatter = null, this.isPercentage() ? (this
|
|
._formatter = T, t = 100) : this.isIndexedTo100() ? (this._formatter = new x
|
|
.PriceFormatter(100, 1), t = 100) : this._formatter = e ? e.formatter() : I,
|
|
this._markBuilder = new y(this, t, this._coordinateToLogical.bind(this), this
|
|
._logicalToCoordinate.bind(this)), this._markBuilder.rebuildTickMarks()
|
|
}
|
|
formatPrice(e, t) {
|
|
const i = this._priceToPercentOrIndexedTo100IfNeeded(e, t);
|
|
return this.formatter().format(i)
|
|
}
|
|
formatPriceAbsolute(e) {
|
|
return this._mainSourceFormatter().format(e)
|
|
}
|
|
formatPricePercentage(e, t, i) {
|
|
return e = Object(c.toPercent)(e, t), T.format(e, i)
|
|
}
|
|
dataSources() {
|
|
return this.m_dataSources
|
|
}
|
|
seriesLikeSources() {
|
|
return this._seriesLikeSources
|
|
}
|
|
addDataSource(e, t) {
|
|
if (t || -1 === this.m_dataSources.indexOf(e)) {
|
|
if (e instanceof u.PriceDataSource && (this._priceDataSources.push(e), e
|
|
.currencyChanged().subscribe(this, () => this._currencyCache = null), e
|
|
.unitChanged().subscribe(this, () => this._unitCache = null), Object(m
|
|
.isSymbolSource)(e) && (this._seriesLikeSources.push(e), this
|
|
._seriesLikeSourcesSet.add(e), e.symbolResolved().subscribe(this,
|
|
() => {
|
|
this._currencyCache = null, this._unitCache = null
|
|
}), e instanceof h.Series))) {
|
|
const t = e.properties();
|
|
this._hasSeries || (t.childs().lockScale && (this.setMode({
|
|
lockScale: t.childs().lockScale.value()
|
|
}), t.removeProperty("lockScale")), t.childs().pnfStyle.childs()
|
|
.lockScale && t.childs().pnfStyle.removeProperty("lockScale")), this
|
|
._hasSeries = !0
|
|
}
|
|
e.properties().visible.listeners().subscribe(this, this._dropScaleCache),
|
|
Object(_.isStudy)(e) && (e.onIsActualIntervalChange().subscribe(this, this
|
|
._dropScaleCache), 0 === this._studiesCount && Object(P
|
|
.hideAllIndicators)().subscribe(this, this._dropScaleCache), this
|
|
._studiesCount++), Object(w.isLineTool)(e) && (0 === this
|
|
._drawingCount && Object(P.hideAllDrawings)().subscribe(this, this
|
|
._dropScaleCache), this._drawingCount++), this.m_dataSources.push(
|
|
e), this._mainSource = null, this._correctedMarginsCache = null, this
|
|
._sourcesToUpdateViews = null, this._dropScaleCache(), this
|
|
.updateFormatter(), this._initScaleProperties(), this
|
|
.invalidateSourcesCache()
|
|
}
|
|
}
|
|
removeDataSource(e) {
|
|
const t = this.m_dataSources.indexOf(e);
|
|
if (Object(s.assert)(-1 !== t, "Source is not attached to scale"), e.properties()
|
|
.visible.listeners().unsubscribe(this, this._dropScaleCache), this.m_dataSources
|
|
.splice(t, 1), e instanceof u.PriceDataSource) {
|
|
const t = this._priceDataSources.indexOf(e);
|
|
if (Object(s.assert)(-1 !== t, "Source is not found"), this._priceDataSources
|
|
.splice(t, 1), Object(m.isSymbolSource)(e)) {
|
|
const t = this._seriesLikeSources.indexOf(e);
|
|
Object(s.assert)(-1 !== t, "Source is not found"), this._seriesLikeSources
|
|
.splice(t, 1), this._seriesLikeSourcesSet.delete(e), e.symbolResolved()
|
|
.unsubscribeAll(this), e instanceof h.Series && (this._hasSeries = !1)
|
|
}
|
|
e.currencyChanged().unsubscribeAll(this), e.unitChanged().unsubscribeAll(this)
|
|
}
|
|
this.mainSource() || this.setMode({
|
|
autoScale: !0
|
|
}), Object(_.isStudy)(e) && (e.onIsActualIntervalChange().unsubscribe(this, this
|
|
._dropScaleCache), this._studiesCount--, 0 === this._studiesCount &&
|
|
Object(P.hideAllIndicators)().unsubscribe(this, this._dropScaleCache)),
|
|
Object(w.isLineTool)(e) && (this._drawingCount--, 0 === this._drawingCount &&
|
|
Object(P.hideAllDrawings)().unsubscribe(this, this._dropScaleCache)), this
|
|
._mainSource = null, this._correctedMarginsCache = null, this
|
|
._sourcesForAutoscale = null,
|
|
this._sourcesToUpdateViews = null, this.updateFormatter(), this
|
|
.invalidateSourcesCache(), 0 === this.m_dataSources.length && this
|
|
._lastSourceRemoved.fire(), this._currencyCache = null, this._unitCache = null
|
|
}
|
|
currency(e) {
|
|
if (null !== this._currencyCache && e.size() === this._currencyCache
|
|
.availableCurrenciesCount) return this._currencyCache.value;
|
|
let t;
|
|
const i = new Set,
|
|
r = new Set,
|
|
n = new Set,
|
|
o = new Map;
|
|
let a, l = 0 === this._seriesLikeSources.length,
|
|
c = !0,
|
|
h = 0,
|
|
u = 0;
|
|
for (const u of this._seriesLikeSources) {
|
|
if (!u.isVisible()) continue;
|
|
const d = u.symbolInfo();
|
|
if (null === d) {
|
|
t = null;
|
|
break
|
|
}
|
|
const p = Object(f.symbolOriginalCurrency)(d);
|
|
if (null === p) {
|
|
t = null;
|
|
break
|
|
}
|
|
o.set(p, Object(s.ensureNotNull)(Object(f.symbolOriginalCurrency)(d, !0)));
|
|
const _ = u.currency();
|
|
if (null === _) {
|
|
t = null;
|
|
break
|
|
}
|
|
o.set(_, Object(s.ensureNotNull)(Object(f.symbolCurrency)(d, !0)));
|
|
const m = Object(f.symbolBaseCurrency)(d);
|
|
null !== m && r.add(m), c = c && p === _, n.add(_), i.add(p), void 0 === a ? a =
|
|
_ : null !== a && a !== _ && (a = null), l || e.convertible(_) && Object(f
|
|
.symbolCurrencyConvertible)(d) || (l = !0), h += 1
|
|
}
|
|
if (null !== t)
|
|
for (const i of this._priceDataSources) {
|
|
if (this._seriesLikeSourcesSet.has(i)) continue;
|
|
const r = i;
|
|
if (!r.isCurrencySource() || !r.isVisible()) continue;
|
|
const c = r.currency();
|
|
if (null === c) {
|
|
t = null;
|
|
break
|
|
}
|
|
n.add(c), u += 1;
|
|
const d = Object(s.ensureNotNull)(r.symbolSource()),
|
|
p = d.symbolInfo();
|
|
if (null === p) {
|
|
t = null;
|
|
break
|
|
}
|
|
if (l || e.convertible(c) && Object(f.symbolCurrencyConvertible)(p) || (
|
|
l = !0), o.set(c, Object(s.ensureNotNull)(Object(f.symbolCurrency)(
|
|
p, !0))), !this._seriesLikeSourcesSet.has(d) || !d.isVisible()) {
|
|
if (h > 0) a = null;
|
|
else if (void 0 === a) a = c;
|
|
else if (null !== a && a !== c) {
|
|
a = null;
|
|
break
|
|
}
|
|
l = !0;
|
|
break
|
|
}
|
|
}
|
|
return void 0 === t && (t = 0 === h && 0 === u ? null : {
|
|
readOnly: l,
|
|
selectedCurrency: a || null,
|
|
currencies: n,
|
|
originalCurrencies: i,
|
|
baseCurrencies: r,
|
|
symbolSourceCount: h,
|
|
allCurrenciesAreOriginal: c,
|
|
displayedValues: o
|
|
}), this._currencyCache = {
|
|
value: t,
|
|
availableCurrenciesCount: e.size()
|
|
}, t
|
|
}
|
|
unit(e) {
|
|
if (null !== this._unitCache && e.size() === this._unitCache.availableUnitsCount)
|
|
return this._unitCache.value;
|
|
let t;
|
|
const i = new Set,
|
|
r = new Set,
|
|
n = new Map,
|
|
o = new Map;
|
|
let l, c = 0 === this._seriesLikeSources.length ? new Set : e.allGroups(),
|
|
h = !0,
|
|
u = 0,
|
|
d = 0;
|
|
for (const s of this._seriesLikeSources) {
|
|
if (!s.isVisible()) continue;
|
|
const d = s.symbolInfo();
|
|
if (null === d) {
|
|
t = null;
|
|
break
|
|
}
|
|
const p = Object(f.symbolOriginalUnit)(d);
|
|
if (null === p) {
|
|
t = null;
|
|
break
|
|
}
|
|
n.set(p, e.name(p)), o.set(p, e.description(p));
|
|
const _ = s.unit();
|
|
if (null === _) {
|
|
t = null;
|
|
break
|
|
}
|
|
if (n.set(_, e.name(_)), o.set(_, e.description(_)), h = h && p === _, r.add(_),
|
|
i.add(p), void 0 === l ? l = _ : null !== l && l !== _ && (l = null), c
|
|
.size > 0) {
|
|
const t = Object(g.unitConvertibleGroups)(d, _, e);
|
|
c = Object(a.intersect)(c, new Set(t))
|
|
}
|
|
u += 1
|
|
}
|
|
if (null !== t)
|
|
for (const i of this._priceDataSources) {
|
|
if (this._seriesLikeSourcesSet.has(i)) continue;
|
|
const h = i;
|
|
if (!h.isUnitSource() || !h.isVisible()) continue;
|
|
const p = h.unit();
|
|
if (null === p) {
|
|
t = null;
|
|
break
|
|
}
|
|
r.add(p), d += 1;
|
|
const _ = Object(s.ensureNotNull)(h.symbolSource()),
|
|
m = _.symbolInfo();
|
|
if (null === m) {
|
|
t = null;
|
|
break
|
|
}
|
|
if (c.size > 0) {
|
|
const t = Object(g.unitConvertibleGroups)(m, p, e);
|
|
c = Object(a.intersect)(c, new Set(t))
|
|
}
|
|
if (n.set(p, e.name(p)), o.set(p, e.description(p)),
|
|
!this._seriesLikeSourcesSet.has(_) || !_.isVisible()) {
|
|
if (u > 0) l = null;
|
|
else if (void 0 === l) l = p;
|
|
else if (null !== l && l !== p) {
|
|
l = null;
|
|
break
|
|
}
|
|
c = new Set;
|
|
break
|
|
}
|
|
}
|
|
if (void 0 === t)
|
|
if (0 === u && 0 === d) t = null;
|
|
else {
|
|
const e = l || null;
|
|
t = {
|
|
availableGroups: c,
|
|
selectedUnit: e,
|
|
units: r,
|
|
originalUnits: i,
|
|
symbolSourceCount: u,
|
|
allUnitsAreOriginal: h,
|
|
names: n,
|
|
descriptions: o
|
|
}
|
|
} return this._unitCache = {
|
|
value: t,
|
|
availableUnitsCount: e.size()
|
|
}, t
|
|
}
|
|
setMargins(e) {
|
|
if (!Object(r.isNumber)(e.top) || !Object(r.isNumber)(e.bottom))
|
|
throw new TypeError("invalid margin");
|
|
if (e.top < 0 || e.top > 30 || e.bottom < 0 || e.bottom > 30) throw new RangeError(
|
|
"invalid margin");
|
|
this._margins.top === e.top && this._margins.bottom === e.bottom || (this._margins =
|
|
e, this._correctedMarginsCache = null, this
|
|
._invalidateInternalHeightCache(), this._marksCache = null)
|
|
}
|
|
topMargin() {
|
|
return this._correctedMargins().top
|
|
}
|
|
bottomMargin() {
|
|
return this._correctedMargins().bottom
|
|
}
|
|
invalidateMargins() {
|
|
this._correctedMarginsCache = null
|
|
}
|
|
topPixelMargin() {
|
|
return this.isInverted() ? this.bottomMargin() * this.height() + this
|
|
._bottomPixelMargin : this.topMargin() * this.height() + this._topPixelMargin
|
|
}
|
|
bottomPixelMargin() {
|
|
return this.isInverted() ? this.topMargin() * this.height() + this._topPixelMargin :
|
|
this.bottomMargin() * this.height() + this._bottomPixelMargin
|
|
}
|
|
marks() {
|
|
return this._makeSureItIsValid(), null === this._marksCache && (this._markBuilder
|
|
.rebuildTickMarks(), this._marksCache = this._markBuilder.marks(), this
|
|
._onMarksChanged.fire()), this._marksCache
|
|
}
|
|
onMarksChanged() {
|
|
return this._onMarksChanged
|
|
}
|
|
priceRangeInPrice() {
|
|
if (this.isEmpty()) return null;
|
|
const e = this.mainSource();
|
|
if (null === e) return null;
|
|
const t = Object(s.ensureNotNull)(e.firstValue()),
|
|
i = this.height();
|
|
return {
|
|
from: this.coordinateToPrice(i - 1, t),
|
|
to: this.coordinateToPrice(0, t)
|
|
}
|
|
}
|
|
setPriceRangeInPrice(e) {
|
|
if (this.isPercentage() || this.isIndexedTo100()) return;
|
|
const t = this.isInverted(),
|
|
i = t ? this.bottomMargin() : this.topMargin(),
|
|
s = t ? this.topMargin() : this.bottomMargin(),
|
|
r = this.isLog();
|
|
let n = r ? Object(c.toLog)(e.from) : e.from,
|
|
o = r ? Object(c.toLog)(e.to) : e.to;
|
|
const a = o - n;
|
|
n += s * a, o -= i * a, this.setMode({
|
|
autoScale: !1
|
|
}), this.setPriceRange(new l.PriceRange(n, o)), this._marksCache = null, this
|
|
._onMarksChanged.fire()
|
|
}
|
|
hasMainSeries() {
|
|
return this._hasSeries
|
|
}
|
|
getStudies() {
|
|
return this.dataSources().filter(_.isStudy)
|
|
}
|
|
lastSourceRemoved() {
|
|
return this._lastSourceRemoved
|
|
}
|
|
sourcesForAutoscale() {
|
|
return this._mainSource && this._scaleSeriesOnly !== this._scalesProperties.childs()
|
|
.scaleSeriesOnly.value() && (this._sourcesForAutoscale = null), this
|
|
._sourcesForAutoscale || (this._sourcesForAutoscale = this
|
|
._recalculateSourcesForAutoscale()), this._sourcesForAutoscale
|
|
}
|
|
recalculatePriceRange(e) {
|
|
this._invalidatedForRange = {
|
|
visibleBars: e,
|
|
isValid: !1
|
|
}
|
|
}
|
|
internalHeightChanged() {
|
|
return this._internalHeightChanged
|
|
}
|
|
orderedSources() {
|
|
if (this._cachedOrderedSoruces) return this._cachedOrderedSoruces;
|
|
let e = this.m_dataSources.slice();
|
|
return e = Object(b.sortSources)(e), this._cachedOrderedSoruces = e, this
|
|
._cachedOrderedSoruces
|
|
}
|
|
invalidateSourcesCache() {
|
|
this._cachedOrderedSoruces = null, this._sourcesToUpdateViews = null
|
|
}
|
|
startScale(e) {
|
|
if (this.isPercentage() || this.isIndexedTo100()) return;
|
|
if (null !== this._scaleStartPoint || null !== this._priceRangeSnapshot) return;
|
|
if (this.isEmpty()) return;
|
|
this._scaleStartPoint = this.m_height - e;
|
|
const t = this.priceRange();
|
|
this._priceRangeSnapshot = t && t.clone()
|
|
}
|
|
scaleTo(e) {
|
|
if (this.isPercentage() || this.isIndexedTo100()) return;
|
|
if (null === this._scaleStartPoint) return;
|
|
this.setMode({
|
|
autoScale: !1
|
|
}), (e = this.m_height - e) < 0 && (e = 0);
|
|
let t = (this._scaleStartPoint + .2 * (this.m_height - 1)) / (e + .2 * (this
|
|
.m_height - 1));
|
|
const i = Object(s.ensureNotNull)(this._priceRangeSnapshot).clone();
|
|
t = Math.max(t, .1), i.scaleAroundCenter(t), this.setPriceRange(i)
|
|
}
|
|
endScale() {
|
|
this.isPercentage() || this.isIndexedTo100() || null !== this._scaleStartPoint && (
|
|
this._scaleStartPoint = null, this._priceRangeSnapshot = null)
|
|
}
|
|
_recalculateSourcesForAutoscale() {
|
|
this._mainSource && (this._scaleSeriesOnly = this._scalesProperties.childs()
|
|
.scaleSeriesOnly.value());
|
|
const e = this._scaleSeriesOnly && this._hasSeries;
|
|
return this.m_dataSources.filter(t => !!(t.properties().visible.value() ||
|
|
t instanceof h.Series) && (e ? t instanceof h.Series : Object(_.isStudy)
|
|
(t) ? !t.isSourceHidden() && t.isIncludedInAutoScale() : t
|
|
.isIncludedInAutoScale()))
|
|
}
|
|
_updateAutoScaleDisabledProperty(e) {
|
|
const t = this._properties.childs(),
|
|
i = t.indexedTo100.value() || t.percentage.value() || t.lockScale.value();
|
|
e ? t.autoScaleDisabled.setValueSilently(i) : t.autoScaleDisabled.setValue(i)
|
|
}
|
|
_setAutoScaleValueWithDependentProperties(e) {
|
|
const t = this._properties.childs();
|
|
t.autoScale.setValueSilently(e), e && (t.percentage.setValueSilently(!1), t
|
|
.indexedTo100.setValueSilently(!1), t.lockScale.setValueSilently(!1), t
|
|
.logDisabled.setValueSilently(!1)), this._updateAutoScaleDisabledProperty(!
|
|
0)
|
|
}
|
|
_setLockScaleValueWithDependentProperties(e) {
|
|
const t = this._properties.childs();
|
|
t.lockScale.setValueSilently(e), e && (t.autoScale.setValueSilently(!1), t
|
|
.percentage.setValueSilently(!1), t.indexedTo100.setValueSilently(!1), t.log
|
|
.setValueSilently(!1)), t.percentageDisabled.setValueSilently(e), t
|
|
.logDisabled.setValueSilently(e), this._updateAutoScaleDisabledProperty(!0)
|
|
}
|
|
_setPercentageValueWithDependentProperties(e) {
|
|
const t = this._properties.childs();
|
|
t.percentage.setValueSilently(e), e && (t.autoScale.setValueSilently(!0), t.log
|
|
.setValueSilently(!1), t.lockScale.setValueSilently(!1), t.indexedTo100
|
|
.setValueSilently(!1)), this._updateAutoScaleDisabledProperty(!0)
|
|
}
|
|
_setIndexedTo100ValueWithDependentProperties(e) {
|
|
const t = this._properties.childs();
|
|
t.indexedTo100.setValueSilently(e), e && (t.autoScale.setValueSilently(!0), t.log
|
|
.setValueSilently(!1), t.lockScale.setValueSilently(!1), t.percentage
|
|
.setValueSilently(!1)), this._updateAutoScaleDisabledProperty(!0)
|
|
}
|
|
_setLogValueWithDependentProperties(e) {
|
|
const t = this._properties.childs();
|
|
t.log.setValueSilently(e), e && (t.lockScale.setValueSilently(!1), t.percentage
|
|
.setValueSilently(!1), t.indexedTo100.setValueSilently(!1)), this
|
|
._updateAutoScaleDisabledProperty(!0)
|
|
}
|
|
_recalculatePriceRangeImpl() {
|
|
const e = this._invalidatedForRange.visibleBars;
|
|
if (null === e) return;
|
|
let t = null;
|
|
const i = this.sourcesForAutoscale(),
|
|
s = this.isPercentage(),
|
|
r = this.isIndexedTo100();
|
|
let n = 0,
|
|
o = 0;
|
|
for (const a of i) {
|
|
if (!a.properties().visible.value()) continue;
|
|
const i = a.firstValue();
|
|
if (null === i) continue;
|
|
const l = e.firstBar(),
|
|
h = e.lastBar(),
|
|
u = a.autoScaleInfo(l, h);
|
|
let d = u.range;
|
|
d && (s ? d = Object(c.toPercentRange)(d, i) : r && (d = Object(c
|
|
.toIndexedTo100Range)(d, i)), t = null === t ? d : t.merge(d)),
|
|
void 0 !== u.topPixelMargin && (n = Math.max(n, u.topPixelMargin)),
|
|
void 0 !== u.bottomPixelMargin && (o = Math.max(o, u.bottomPixelMargin))
|
|
}(Math.abs(n - this._topPixelMargin) > 0 || Math.abs(o - this._bottomPixelMargin) >
|
|
0) && (this._bottomPixelMargin = o, this._topPixelMargin = n, this._marksCache =
|
|
null, this._invalidateInternalHeightCache()), t ? (t.minValue() === t
|
|
.maxValue() && (t = new l.PriceRange(t.minValue() - .5, t.maxValue() + .5)),
|
|
this.setPriceRange(t)) : this.m_priceRange || this.setPriceRange(new l
|
|
.PriceRange(-.5, .5)), this._invalidatedForRange.isValid = !0;
|
|
const a = this.mainSource();
|
|
null !== a && this._recalculatePriceRangeOnce && (this
|
|
._recalculatePriceRangeOnce = !a.priceRangeReady())
|
|
}
|
|
_makeSureItIsValid() {
|
|
this._invalidatedForRange.isValid || (this._invalidatedForRange.isValid = !0, this
|
|
._recalculatePriceRangeImpl())
|
|
}
|
|
_invalidateInternalHeightCache() {
|
|
this._internalHeightCache = null, this._internalHeightChanged.fire()
|
|
}
|
|
_coordinateToLogical(e) {
|
|
if (this._makeSureItIsValid(), this.isEmpty()) return 0;
|
|
const t = this._invertedCoordinate(e),
|
|
i = Object(s.ensureNotNull)(this.priceRange()),
|
|
r = i.minValue() + (i.maxValue() - i.minValue()) * ((t - this
|
|
.bottomPixelMargin()) / (this.internalHeight() - 1));
|
|
return this.logicalToPrice(r)
|
|
}
|
|
_logicalToCoordinate(e) {
|
|
if (this._makeSureItIsValid(), this.isEmpty()) return 0;
|
|
e = this.priceToLogical(e);
|
|
const t = Object(s.ensureNotNull)(this.priceRange()),
|
|
i = this.bottomPixelMargin() + (this.internalHeight() - 1) * (e - t
|
|
.minValue()) / (t.maxValue() - t.minValue());
|
|
return this._invertedCoordinate(i)
|
|
}
|
|
_dropScaleCache() {
|
|
this._sourcesForAutoscale = null, this._currencyCache = null, this._unitCache = null
|
|
}
|
|
_invertedCoordinate(e) {
|
|
return this.isInverted() ? e : this.height() - 1 - e
|
|
}
|
|
_initScaleProperties() {
|
|
const e = this.isLockScale(),
|
|
t = this.properties().childs();
|
|
e && (t.percentage.setValue(!1), t.indexedTo100.setValue(!1), t.log.setValue(!1), t
|
|
.autoScale.setValue(!1)), t.percentageDisabled.setValue(e), t.logDisabled
|
|
.setValue(e), this._updateAutoScaleDisabledProperty(!1), t.percentage.value() &&
|
|
(t.log.setValue(!1), t.indexedTo100.setValue(!1)), t.indexedTo100.value() && (t
|
|
.log.setValue(!1), t.percentage.setValue(!1))
|
|
}
|
|
_correctedMargins() {
|
|
if (null === this._correctedMarginsCache) {
|
|
const e = this.mainSource();
|
|
this._correctedMarginsCache = null !== e ? e.correctScaleMargins(this
|
|
._margins) : this._margins
|
|
}
|
|
return this._correctedMarginsCache
|
|
}
|
|
_getSourcesToUpdateViews() {
|
|
return this._sourcesToUpdateViews || (this._sourcesToUpdateViews = this
|
|
.m_dataSources.filter(e => !Object(w.isLineTool)(e) || e.isActualSymbol() &&
|
|
e.isActualCurrency())), this._sourcesToUpdateViews
|
|
}
|
|
_mainSourceFormatter() {
|
|
const e = this.mainSource();
|
|
return (null == e ? void 0 : e.formatter()) || I
|
|
}
|
|
_priceToPercentOrIndexedTo100IfNeeded(e, t) {
|
|
return this.isPercentage() ? Object(c.toPercent)(e, t) : this.isIndexedTo100() ?
|
|
Object(c.toIndexedTo100)(e, t) : e
|
|
}
|
|
}
|
|
},
|
|
Yjuu: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Ss5c").LineDataSource,
|
|
r = i("5rJj"),
|
|
n = i("j3hX"),
|
|
o = n.LineToolWidthsProperty,
|
|
a = n.LineToolColorsProperty;
|
|
class l extends s {
|
|
constructor(e, t) {
|
|
super(e, t || l.createProperties()), i.e("lt-pane-views").then(i.t.bind(null,
|
|
"bcXK", 7)).then(({
|
|
FibSpeedResistanceArcsPaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
levelsCount() {
|
|
return l.LevelsCount
|
|
}
|
|
pointsCount() {
|
|
return 2
|
|
}
|
|
name() {
|
|
return "Fib Speed Resistance Arcs"
|
|
}
|
|
processErase(e, t) {
|
|
var i = "level" + t,
|
|
s = this.properties()[i].visible;
|
|
e.setProperty(s, !1, "Erase level line")
|
|
}
|
|
static createProperties(e) {
|
|
var t = new r("linetoolfibspeedresistancearcs", e, !1, {
|
|
range: [1, 11]
|
|
});
|
|
return l._configureProperties(t), t
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "pdv6")))
|
|
.FibSpeedResistanceArcsDefinitionsViewModel
|
|
}
|
|
static _configureProperties(e) {
|
|
s._configureProperties(e);
|
|
for (var t = [e.child("trendline").child("linewidth")], i = [e.child("trendline")
|
|
.child("color")
|
|
], r = 1; r <= l.LevelsCount; r++) t.push(e.child("level" + r).child(
|
|
"linewidth")), i.push(e.child("level" + r).child("color"));
|
|
e.addChild("linesColors", new a(i)), e.addChild("linesWidths", new o(t))
|
|
}
|
|
}
|
|
l.LevelsCount = 11, t.LineToolFibSpeedResistanceArcs = l
|
|
},
|
|
YlKu: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "ApplyLineToolTemplateUndoCommand", (function() {
|
|
return r
|
|
}));
|
|
var s = i("RDU5");
|
|
class r extends s.UndoCommand {
|
|
constructor(e, t, i) {
|
|
super(i), this._source = e, this._newState = t, this._oldState = e.properties()
|
|
.state()
|
|
}
|
|
redo() {
|
|
this._source.applyTemplate(this._newState)
|
|
}
|
|
undo() {
|
|
this._source.applyTemplate(this._oldState)
|
|
}
|
|
}
|
|
},
|
|
YmeR: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "ActionBinder", (function() {
|
|
return s
|
|
}));
|
|
class s {
|
|
constructor(e, t, i, s, r = null) {
|
|
this._property = t, this._undoModel = i, this._undoText = s, this._action = e, this
|
|
.setValue(t.value()), t.subscribe(this, this._propertyChanged), null !== r ? e
|
|
.update({
|
|
onExecute: r.bind(this)
|
|
}) : e.update({
|
|
onExecute: this._onActionCallback.bind(this)
|
|
})
|
|
}
|
|
destroy() {
|
|
this._property.unsubscribe(this, this._propertyChanged)
|
|
}
|
|
value() {
|
|
return this._action.isChecked()
|
|
}
|
|
setValue(e) {
|
|
this._action.update({
|
|
checked: Boolean(e)
|
|
})
|
|
}
|
|
_onActionCallback() {
|
|
this._undoModel.setProperty(this._property, this.value(), this._undoText)
|
|
}
|
|
_propertyChanged(e) {
|
|
this.setValue(e.value())
|
|
}
|
|
}
|
|
},
|
|
"Yt+L": function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return o
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("RDU5"),
|
|
n = i("n5al");
|
|
class o extends r.UndoCommand {
|
|
constructor(e, t, i, r) {
|
|
super(r), this._newSourcesUnits = new Map, this._oldSourcesUnits = new Map, this
|
|
._showFade = !1, this._chartWidget = i;
|
|
const o = i.model().mainSeries();
|
|
for (const i of e.seriesLikeSources()) {
|
|
if (!i.isVisible()) continue;
|
|
const e = t || Object(n.symbolOriginalUnit)(Object(s.ensureNotNull)(i
|
|
.symbolInfo()));
|
|
this._newSourcesUnits.set(i.id(), e), this._oldSourcesUnits.set(i.id(), i
|
|
.unit()), this._showFade = this._showFade || i === o && i.unit() !==
|
|
e
|
|
}
|
|
}
|
|
redo() {
|
|
this._applyUnits(this._newSourcesUnits)
|
|
}
|
|
undo() {
|
|
this._applyUnits(this._oldSourcesUnits)
|
|
}
|
|
_applyUnits(e) {
|
|
this._showFade && this._chartWidget.screen.show();
|
|
const t = this._chartWidget.model().model();
|
|
e.forEach((e, i) => {
|
|
Object(s.ensureNotNull)(t.dataSourceForId(i)).setUnit(e)
|
|
}), this._chartWidget.model().selectionMacro(e => {
|
|
e.clearSelection()
|
|
})
|
|
}
|
|
}
|
|
},
|
|
YuHv: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return r
|
|
}));
|
|
var s = i("AWC/");
|
|
|
|
function r(e = [], t = []) {
|
|
const i = document.createElement("div"),
|
|
r = document.createElement("div");
|
|
return i.appendChild(r), i.classList.add(s.container), r.classList.add(s.inner), e.forEach(
|
|
e => {
|
|
i.classList.add(s[e])
|
|
}), t.forEach(e => {
|
|
i.classList.add(s[e])
|
|
}), i
|
|
}
|
|
},
|
|
YzC7: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Eyy1"),
|
|
r = i("GVHu"),
|
|
n = i("n5al"),
|
|
o = i("tc+8"),
|
|
a = i.n(o),
|
|
l = i("Kxc7"),
|
|
c = i("oXaB"),
|
|
h = i("KcY8");
|
|
const u = l.enabled("force_exchange_as_title");
|
|
class d extends h.a {
|
|
constructor(e, t) {
|
|
super(), this._studyCompare = e, this._data = t
|
|
}
|
|
_updateRendererData(e, t, i) {
|
|
e.visible = !1, t.visible = !1;
|
|
const s = this._studyCompare.priceScale(),
|
|
r = this._studyCompare.lastValueData(this._data.plotIndex, !1);
|
|
if (r.noData || null === s || s.isEmpty()) return;
|
|
i.background = r.color, i.textColor = this.generateTextColor(r.color), i
|
|
.coordinate = r.coordinate, i.floatCoordinate = r.floatCoordinate;
|
|
const n = this._studyCompare.model().properties().scalesProperties;
|
|
if (n.showSeriesLastValue.value()) {
|
|
const t = s.isPercentage();
|
|
e.text = t ? r.formattedPricePercentage : r.formattedPriceAbsolute, n
|
|
.seriesLastValueMode.value() !== c.PriceAxisLastValueMode
|
|
.LastPriceAndPercentageValue ? e.secondLine = "" : e.secondLine = t ? r
|
|
.formattedPriceAbsolute : r.formattedPricePercentage, e.visible = !0
|
|
}
|
|
t.text = "", n.showSymbolLabels.value() && (t.text = this._paneText(), t
|
|
.visible = t.text.length > 0)
|
|
}
|
|
_paneText() {
|
|
let e = "";
|
|
const t = this._studyCompare.symbolInfo();
|
|
return u ? e = Object(n.displayedSymbolExchange)(t) : this._studyCompare.model()
|
|
.properties().scalesProperties.showSymbolLabels.value() && (e = Object(n
|
|
.displayedSymbolName)(t)), e
|
|
}
|
|
}
|
|
var p = i("it7y"),
|
|
_ = i("e92V"),
|
|
m = i("mMWL"),
|
|
f = i("qFKp"),
|
|
g = i("ogJP"),
|
|
b = i("EYFt");
|
|
class v extends b.a {
|
|
constructor(e, t) {
|
|
super(e, t), this._emptyValues[0].title = e.guiPlotName("")
|
|
}
|
|
_hideValues() {
|
|
return !1
|
|
}
|
|
}
|
|
const S = f.CheckMobile.any();
|
|
class y extends p.StudyDataWindowView {
|
|
constructor(e, t) {
|
|
super(e, t), this._studyCompare = e
|
|
}
|
|
_hideValues() {
|
|
return !1
|
|
}
|
|
_createValuesProvider(e, t) {
|
|
return new v(e, t)
|
|
}
|
|
_currentIndex() {
|
|
const e = this._model.crossHairSource().lockedIndex;
|
|
let t;
|
|
return S && (null === this._model.crossHairSource().pane && void 0 === e ||
|
|
Object(_.isLineToolName)(m.tool.value()) || null !== this._model
|
|
.lineBeingEdited()) ? t = this._study.data().lastIndex() : (t = this
|
|
._model.crossHairSource().appliedIndex(), Object(g.isNumber)(t) || (t =
|
|
this._study.data().lastIndex())), t
|
|
}
|
|
}
|
|
class w extends y {
|
|
constructor(e, t) {
|
|
super(e, t), this._additional = null, this._showSeriesOHLC = t.properties()
|
|
.paneProperties.legendProperties.showSeriesOHLC, this._showSeriesOHLC.subscribe(
|
|
this, this.update)
|
|
}
|
|
isValuesVisible() {
|
|
return this._showSeriesOHLC.value()
|
|
}
|
|
destroy() {
|
|
this._showSeriesOHLC.unsubscribeAll(this)
|
|
}
|
|
additional() {
|
|
return this._additional
|
|
}
|
|
_updateImpl() {
|
|
super._updateImpl()
|
|
}
|
|
}
|
|
var P = i("2kV1"),
|
|
C = i("W+6j");
|
|
class x extends C.a {
|
|
getSplitTitle() {
|
|
return this._source.titleInParts(!0, void 0, !1, !1)
|
|
}
|
|
text() {
|
|
return this._source.isActualInterval() ? this._source.isFailed() ?
|
|
`${this._source.title(!0, void 0, !1, !1)}: ${this.sourceStatusText()}` :
|
|
`${this._source.title(!0, void 0, !1, !1)} ${this.sourceStatusText()}` :
|
|
this._source.title(!0, void 0, !1, !1)
|
|
}
|
|
}
|
|
var T = i("WkOR");
|
|
i.d(t, "a", (function() {
|
|
return E
|
|
}));
|
|
const I = l.enabled("study_overlay_compare_legend_option"),
|
|
M = l.enabled("force_exchange_as_title"),
|
|
O = l.enabled("uppercase_instrument_names"),
|
|
L = !l.enabled("hide_study_compare_legend_item"),
|
|
A = l.enabled("hide_unresolved_symbols_in_legend");
|
|
class E extends r.Study {
|
|
constructor(e, t, i, s) {
|
|
t.hasChild("currencyId") || t.addChild("currencyId", new a.a(null)), t.hasChild(
|
|
"unitId") || t.addChild("unitId", new a.a(null)), t.addExclusion(
|
|
"currencyId"), t.addExclusion("unitId"), super(e, t, i, s), this
|
|
.properties().childs().minTick.subscribe(null, () => this
|
|
._recreatePriceFormattingDependencies()), this.properties().childs()
|
|
.minTick.subscribe(null, () => this._model.fullUpdate()), this.properties()
|
|
.childs().currencyId.subscribe(this, this._onCurrencyChanged), this
|
|
.properties().childs().unitId.subscribe(this, this._onUnitChanged), this
|
|
.properties().merge({
|
|
skipHistogramBaseOnAutoScale: !0
|
|
})
|
|
}
|
|
properties() {
|
|
return super.properties()
|
|
}
|
|
createPriceAxisView(e) {
|
|
return new d(this, {
|
|
plotIndex: "compare"
|
|
})
|
|
}
|
|
setSymbolCurrencyUnit(e, t, i) {
|
|
this._setSymbolCurrencyUnitInternal(e, t, i)
|
|
}
|
|
symbol() {
|
|
return this._properties.inputs.symbol.value()
|
|
}
|
|
setSymbol(e) {
|
|
this.setSymbolCurrencyUnit(e)
|
|
}
|
|
symbolInfo() {
|
|
if (!this._resolvedSymbols) return null;
|
|
const e = this._properties.inputs.symbol.value();
|
|
if (!e) return null;
|
|
let t;
|
|
return t = this._resolvedSymbols[this._getSymbolForResolve(e)] || null, t
|
|
}
|
|
symbolResolved() {
|
|
return this.symbolsResolved()
|
|
}
|
|
symbolSameAsCurrent(e) {
|
|
return Object(T.b)(e, this.symbol(), this.symbolInfo())
|
|
}
|
|
currency() {
|
|
return this._properties.currencyId.value() || null
|
|
}
|
|
setCurrency(e) {
|
|
this.setSymbolCurrencyUnit(void 0, e)
|
|
}
|
|
isConvertedToOtherCurrency() {
|
|
return Object(n.isConvertedToOtherCurrency)(this.symbolInfo())
|
|
}
|
|
unit() {
|
|
return this._properties.unitId.value() || null
|
|
}
|
|
setUnit(e) {
|
|
this._properties.unitId.setValue(e)
|
|
}
|
|
isConvertedToOtherUnit() {
|
|
return Object(n.isConvertedToOtherUnit)(this.symbolInfo())
|
|
}
|
|
style() {
|
|
return 2
|
|
}
|
|
symbolSource() {
|
|
return this
|
|
}
|
|
state(e, t) {
|
|
const i = super.state(e, t);
|
|
return e && (Object(s.ensureDefined)(i.data).symbols = {
|
|
___snapshot: this.symbolInfo() || void 0
|
|
}), i
|
|
}
|
|
symbolTitle(e, t) {
|
|
return this.title(!0, {}, !1, e)
|
|
}
|
|
titleInParts(e, t, i, s) {
|
|
const r = this._titleInParts(e, t, i, s).join(", ");
|
|
return [O ? r.toUpperCase() : r]
|
|
}
|
|
tags() {
|
|
const e = this.symbol();
|
|
return e ? [e] : []
|
|
}
|
|
statusView() {
|
|
return L ? super.statusView() : null
|
|
}
|
|
guiPlotName(e) {
|
|
return this.properties().childs().inputs.childs().symbol.value()
|
|
}
|
|
canOverrideMinTick() {
|
|
return !0
|
|
}
|
|
canBeHiddenByGlobalFlag() {
|
|
return !1
|
|
}
|
|
valuesProvider() {
|
|
return new v(this, this.model())
|
|
}
|
|
statusProvider(e) {
|
|
return new x(this, this._model.properties().scalesProperties.textColor)
|
|
}
|
|
_createViews() {
|
|
this._legendView || (this._legendView = new w(this, this._model)), this
|
|
._dataWindowView || (this._dataWindowView = new y(this, this._model)), this
|
|
._statusView || (this._statusView = new P.StudyStatusView(this)), super
|
|
._createViews()
|
|
}
|
|
_showLastValueOnPriceScale() {
|
|
return this._model.properties().scalesProperties.showSeriesLastValue.value()
|
|
}
|
|
_onCurrencyChanged() {
|
|
this.isStarted() && this._tryChangeInputs(), this._currencyChanged.fire()
|
|
}
|
|
_onUnitChanged() {
|
|
this.isStarted() && this._tryChangeInputs(),
|
|
this._unitChanged.fire()
|
|
}
|
|
_getSymbolObject(e) {
|
|
const t = super._getSymbolObject(e),
|
|
i = this.currency();
|
|
null !== i && (t["currency-id"] = i);
|
|
const s = this.unit();
|
|
return null !== s && (t["unit-id"] = s), t
|
|
}
|
|
_getSymbolForApi(e) {
|
|
return Object(n.symbolForApi)(this._resolvedSymbolsByInput[e] || null, e)
|
|
}
|
|
_onSymbolResolved(e, t, i) {
|
|
super._onSymbolResolved(e, t, i), this._recreatePriceFormattingDependencies();
|
|
const s = t === this.symbol() ? Object(n.extractSymbolNameFromSymbolInfo)(i,
|
|
this.symbol()) : null,
|
|
r = Object(n.symbolCurrency)(i),
|
|
o = Object(n.symbolUnit)(i);
|
|
this._setSymbolCurrencyUnitInternal(s || void 0, r, o, i), this.model()
|
|
.realignLineTools()
|
|
}
|
|
_changeInputsImpl(e, t) {
|
|
super._changeInputsImpl(e, t), e.symbol !== t.symbol && this._model
|
|
.realignLineTools()
|
|
}
|
|
_createStudyOnServer() {
|
|
super._createStudyOnServer(), this._model.realignLineTools()
|
|
}
|
|
_tryCreateFormatter() {
|
|
const e = this.symbolInfo();
|
|
return Object(n.createSeriesFormatter)(e, this.properties().childs().minTick
|
|
.value())
|
|
}
|
|
_titleInParts(e, t, i, s) {
|
|
const r = this.properties().childs().inputs.childs().symbol.value(),
|
|
n = this.symbolInfo(),
|
|
o = n && n.exchange && 0 !== n.exchange.length;
|
|
let a;
|
|
if (M && o && n) a = n.exchange;
|
|
else if (n) {
|
|
if (a = n.name, I) switch (this._model.mainSeries().properties()
|
|
.statusViewStyle.symbolTextSource.value()) {
|
|
case "description":
|
|
a = n.description;
|
|
break;
|
|
case "ticker-and-description":
|
|
a = `${n.name}, ${n.description}`
|
|
} else if (o && !s) return [a, [n.exchange]]
|
|
} else a = A ? "" : r;
|
|
return [a]
|
|
}
|
|
_setSymbolCurrencyUnitInternal(e, t, i, s) {
|
|
const r = this.properties().childs(),
|
|
o = r.inputs.childs().symbol.value(),
|
|
a = r.currencyId.value(),
|
|
l = r.unitId.value();
|
|
if (void 0 !== e && e !== o && r.inputs.childs().symbol.setValueSilently(e),
|
|
void 0 !== t && t !== a && r.currencyId.setValueSilently(t), void 0 !== i &&
|
|
i !== l && r.unitId.setValueSilently(i), s) this._resolvedSymbolsByInput[
|
|
this.symbol()] = s, this._resolvedSymbols[this._getSymbolForResolve(this
|
|
.symbol())] = s;
|
|
else {
|
|
const e = this.symbolInfo();
|
|
null !== e && (r.currencyId.setValueSilently(Object(n.symbolCurrency)(e)), r
|
|
.unitId.setValueSilently(Object(n.symbolUnit)(e)))
|
|
}
|
|
r.inputs.childs().symbol.value() !== o && r.inputs.childs().symbol.listeners()
|
|
.fire(r.inputs.childs().symbol), r.currencyId.value() !== a && r.currencyId
|
|
.listeners().fire(r.currencyId), r.unitId.value() !== l && r.unitId
|
|
.listeners().fire(r.unitId)
|
|
}
|
|
}
|
|
},
|
|
Z0Sh: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Ss5c").LineDataSource,
|
|
r = i("5rJj"),
|
|
n = i("j3hX").LineToolColorsProperty,
|
|
o = [4.5, 9, 11.25, 18, 22.5, 36, 45],
|
|
a = function() {
|
|
for (var e = [], t = o.length - 1, i = 1, s = 0, r = 0; r < 1e10;) r = o[s] * i, e.push(
|
|
Math.round(r)), e.push(Math.ceil(-r)), s === t - 1 && (i *= 10), s = (s + 1) % t;
|
|
return e.sort((function(e, t) {
|
|
return e < t ? -1 : e > t ? 1 : 0
|
|
})), e
|
|
}();
|
|
class l extends s {
|
|
constructor(e, t) {
|
|
super(e, t || l.createProperties()), i.e("lt-pane-views").then(i.t.bind(null,
|
|
"eg8N", 7)).then(({
|
|
GannSquarePaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
hLevelsCount() {
|
|
return l.HLevelsCount
|
|
}
|
|
vLevelsCount() {
|
|
return l.VLevelsCount
|
|
}
|
|
pointsCount() {
|
|
return 2
|
|
}
|
|
name() {
|
|
return "Gann Box"
|
|
}
|
|
_alignPriceOnPattern(e, t) {
|
|
var i = Math.round(1e6 * (e.price - t.price)) / 1e6;
|
|
if (0 === i) return t.price;
|
|
for (var s = o[0], r = o[o.length - 1], n = 1, a = Math.abs(i); a < s * n || r * n <
|
|
a;) a < s * n ? n *= .1 : r * n < a && (n *= 10);
|
|
for (var l = r * n, c = o.length - 2; c >= 0 && !(o[c] * n < a); --c) l = o[c] * n;
|
|
return e.price = t.price + (i >= 0 ? l : -l), e
|
|
}
|
|
_alignTimeOnPattern(e, t) {
|
|
var i = e.index - t.index;
|
|
if (0 === i) return 0;
|
|
for (var s = a.length - 2; s >= 0 && !(a[s] < i); --s);
|
|
return s += i > 0 ? 1 : 0, e.index = t.index + a[s], e
|
|
}
|
|
_alignPointsFixedIncrement(e, t) {
|
|
return this._alignTimeOnPattern(e, t), this._alignPriceOnPattern(e, t), e
|
|
}
|
|
_preparePoint(e, t) {
|
|
return t && t.shift() && 0 !== this._points.length && this
|
|
._alignPointsFixedIncrement(e, this._points[0]), s.prototype._preparePoint.call(
|
|
this, e, t)
|
|
}
|
|
setPoint(e, t, i) {
|
|
if (i && i.shift()) {
|
|
var s = 0 === e ? this._points[1] : this._points[0];
|
|
this._alignPointsFixedIncrement(t, s)
|
|
}
|
|
super.setPoint(e, t, i)
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "2liL")))
|
|
.GannSquareDefinitionsViewModel
|
|
}
|
|
static createProperties(e) {
|
|
var t = new r("linetoolgannsquare", e, !1, {
|
|
range: [1, 7],
|
|
prefixes: ["h", "v"],
|
|
names: ["coeff", "color", "visible"]
|
|
});
|
|
return l._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
s._configureProperties(e);
|
|
for (var t = [e.child("color"), e.child("fans").child("color")], i = 1; i <= l
|
|
.HLevelsCount; i++) t.push(e.child("hlevel" + i).child("color"));
|
|
for (i = 1; i <= l.VLevelsCount; i++) t.push(e.child("vlevel" + i).child("color"));
|
|
e.addChild("linesColors", new n(t)), e.addExclusion("linesColors")
|
|
}
|
|
}
|
|
l.HLevelsCount = 7, l.VLevelsCount = 7, t.LineToolGannSquare = l
|
|
},
|
|
Z8aO: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "SeriesPriceLinePaneView", (function() {
|
|
return n
|
|
}));
|
|
var s = i("k4w6"),
|
|
r = i("8Uy/");
|
|
class n extends s.a {
|
|
constructor(e) {
|
|
super(e), this._lineRendererData.linestyle = r.LINESTYLE_DOTTED
|
|
}
|
|
_updateImpl() {
|
|
if (this._lineRendererData.visible = !1, !this._series.properties()
|
|
.showPriceLine.value()) return;
|
|
if (12 === this._series.properties().style.value()) return;
|
|
const e = this._series.lastValueData(void 0, !0);
|
|
e.noData || (this._lineRendererData.visible = !0, this._lineRendererData.y = e
|
|
.coordinate, this._lineRendererData.color = this._series.priceLineColor(
|
|
e.color), this._lineRendererData.linewidth = this._series
|
|
.properties().priceLineWidth.value())
|
|
}
|
|
}
|
|
},
|
|
ZAxB: function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e) {
|
|
return ["text", "integer", "float", "price", "session", "resolution"].includes(e.type) && e
|
|
.hasOwnProperty("options")
|
|
}
|
|
|
|
function r(e, t, i) {
|
|
for (const s of e)
|
|
if (t[s.id] !== i[s.id]) return !1;
|
|
return !0
|
|
}
|
|
i.d(t, "b", (function() {
|
|
return s
|
|
})), i.d(t, "a", (function() {
|
|
return r
|
|
}))
|
|
},
|
|
ZBiT: function(e, t, i) {
|
|
e.exports = {
|
|
"css-value-pane-controls-padding-left": "1px",
|
|
"css-value-pane-controls-padding-right": "5px"
|
|
}
|
|
},
|
|
ZJKN: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "BarsRange", (function() {
|
|
return r
|
|
}));
|
|
var s = i("Eyy1");
|
|
class r {
|
|
constructor(e, t) {
|
|
Object(s.assert)(e <= t,
|
|
"The last bar in the bars range should be greater than or equal to the first bar"
|
|
), this._firstBar = e, this._lastBar = t
|
|
}
|
|
firstBar() {
|
|
return this._firstBar
|
|
}
|
|
lastBar() {
|
|
return this._lastBar
|
|
}
|
|
count() {
|
|
return this._lastBar - this._firstBar + 1
|
|
}
|
|
contains(e) {
|
|
return this._firstBar <= e && e <= this._lastBar
|
|
}
|
|
equals(e) {
|
|
return this._firstBar === e.firstBar() && this._lastBar === e.lastBar()
|
|
}
|
|
static compare(e, t) {
|
|
return null === e || null === t ? e === t : e.equals(t)
|
|
}
|
|
}
|
|
},
|
|
ZjKI: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "CLOSE_POPUPS_AND_DIALOGS_COMMAND", (function() {
|
|
return s
|
|
}));
|
|
const s = "CLOSE_POPUPS_AND_DIALOGS_COMMAND"
|
|
},
|
|
Zl0W: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineToolPriceNote", (function() {
|
|
return l
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("Ocx9"),
|
|
n = i("tc+8"),
|
|
o = i.n(n),
|
|
a = i("Ss5c");
|
|
class l extends a.LineDataSource {
|
|
constructor(e, t) {
|
|
super(e, t || l.createProperties()), this._labelMovingDelta = null, i.e(
|
|
"lt-pane-views").then(i.bind(null, "0s1X")).then(t => {
|
|
this._setPaneViews([new t.PriceNotePaneView(this, e)])
|
|
})
|
|
}
|
|
pointsCount() {
|
|
return 2
|
|
}
|
|
properties() {
|
|
return super.properties()
|
|
}
|
|
name() {
|
|
return "Price Note"
|
|
}
|
|
template() {
|
|
const e = super.template();
|
|
return e.text = this.properties().childs().text.value(), e
|
|
}
|
|
startMoving(e, t, i) {
|
|
if (1 === t) {
|
|
if (this.isSourceHidden()) return;
|
|
const i = Object(s.ensureDefined)(e.logical),
|
|
r = this.points()[1];
|
|
this._labelMovingDelta = {
|
|
index: r.index - i.index,
|
|
price: r.price - i.price
|
|
}, this.startChanging(t, i)
|
|
} else this._labelMovingDelta = null, super.startMoving(e, t, i)
|
|
}
|
|
move(e, t, i) {
|
|
if (null !== this._labelMovingDelta) {
|
|
const t = Object(s.ensureDefined)(e.logical),
|
|
r = {
|
|
index: t.index + this._labelMovingDelta.index,
|
|
price: t.price + this._labelMovingDelta.price
|
|
};
|
|
this.setPoint(1, r, i), this.updateAllViews()
|
|
} else super.move(e, t, i)
|
|
}
|
|
endMoving(e, t) {
|
|
return null !== this._labelMovingDelta ? (this._labelMovingDelta = null, this
|
|
.endChanging(!1, e)) : super.endMoving(e)
|
|
}
|
|
static createProperties(e) {
|
|
const t = new r.DefaultProperty("linetoolpricenote", e);
|
|
return l._configureProperties(t), t
|
|
}
|
|
_applyTemplateImpl(e) {
|
|
super._applyTemplateImpl(e), this.properties().childs().text.setValue(e.text)
|
|
}
|
|
_getPropertyDefinitionsViewModelClass() {
|
|
return Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "ernH")).then(
|
|
e => e.PriceNoteDefinitionsViewModel)
|
|
}
|
|
_snapTo45DegreesAvailable() {
|
|
return !0
|
|
}
|
|
static _configureProperties(e) {
|
|
a.LineDataSource._configureProperties(e), e.hasChild("text") || e.addChild(
|
|
"text", new o.a("")), e.addExclusion("text"), e.hasChild(
|
|
"backgroundsColors") && e.removeProperty("backgroundsColors"), e
|
|
.hasChild("textsColors") && e.removeProperty("textsColors")
|
|
}
|
|
}
|
|
},
|
|
ZmuQ: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "b", (function() {
|
|
return o
|
|
})), i.d(t, "a", (function() {
|
|
return a
|
|
}));
|
|
var s = i("jCNj"),
|
|
r = i("E6p6"),
|
|
n = i("5mo2");
|
|
class o {
|
|
constructor(e, t, i, s) {
|
|
this.init(e, t, i, s)
|
|
}
|
|
init(e, t, i, r) {
|
|
this.timezone = s.get_timezone(e), this.spec = new n.SessionSpec(e, t, i, r)
|
|
}
|
|
}
|
|
class a {
|
|
alignTime(e) {
|
|
if (isNaN(e)) return NaN;
|
|
let t = this.indexOfBar(e);
|
|
return t === r.SessionStage.POST_SESSION && (this.moveTo(e), t = this.indexOfBar(
|
|
e)), t < 0 ? NaN : this.startOfBar(t)
|
|
}
|
|
}
|
|
},
|
|
"Zo2/": function(e, t, i) {
|
|
"use strict";
|
|
(function(t) {
|
|
i("YCFM");
|
|
var s = i("YFKU").t,
|
|
r = i("Eyy1"),
|
|
n = r.assert,
|
|
o = r.ensureDefined,
|
|
a = i("Y7w9").moveToHead,
|
|
l = i("iPBr").TimeAxisWidget,
|
|
c = i("qJq3").Series,
|
|
h = i("Kxc7"),
|
|
u = i("YmeR").ActionBinder,
|
|
d = i("mKT+").resolveAndShowEditObjectDialog,
|
|
p = i("Vdly"),
|
|
_ = p.getValue,
|
|
m = p.setValue,
|
|
f = i("QloM").TabNames,
|
|
g = i("cdbK").showGoToDateDialog,
|
|
b = i("/3z9"),
|
|
v = i("lxNp"),
|
|
S = i("7nsU").showConfirmInputsDialog,
|
|
y = i("ikwP").disableSelection,
|
|
w = i("GVHu").Study,
|
|
P = i("8sOK").StudyStub,
|
|
C = i("3ClC").isStudy,
|
|
x = i("Ss5c").LineDataSource,
|
|
T = i("CW80"),
|
|
I = T.isLineTool,
|
|
M = T.isStudyLineTool,
|
|
O = i("fTGZ").BarsMarksContainer,
|
|
L = i("7KDR"),
|
|
A = L.Action,
|
|
E = L.Separator,
|
|
k = (i("L/Ed").ToolboxType, i("mMWL")),
|
|
D = i("LxhU").Interval,
|
|
V = i("n5al"),
|
|
B = V.getDefaultStyle,
|
|
R = i("pvsv").showSymbolInfoDialog,
|
|
N = i("H0vP").InvalidationMask,
|
|
j = i("H0vP").InvalidationLevel,
|
|
F = i("PT1i").linking,
|
|
W = i("JpbW").showChangeIntervalDialogAsync,
|
|
H = i("wptU"),
|
|
U = H.activateKeyPressHandler,
|
|
z = H.showDialog,
|
|
G = i("Ocx9").DefaultProperty,
|
|
q = i("+6ja"),
|
|
Y = q.availableTimezones,
|
|
K = q.timezoneIsAvailable,
|
|
J = i("0F0w").ChartSession,
|
|
Z = i("0YCj"),
|
|
X = i("c2JX").Spinner,
|
|
$ = i("JWMC").trackEvent,
|
|
Q = i("VaSN").lastEventIsTouch,
|
|
ee = i("vaqD").LoadingScreen,
|
|
te = i("wZIs"),
|
|
ie = i("txPx").getLogger("ChartWidget", {
|
|
color: "#606"
|
|
}),
|
|
se = i("2uTr").appendEllipsis,
|
|
re = i("U0+/").StudyMetaInfoRepository,
|
|
ne = i("VNzU").isMultipleLayout,
|
|
oe = i("b1GK").addPerfMark,
|
|
ae = i("FQhm"),
|
|
le = i("wjVR").ChartWidgetBase,
|
|
ce = i("qFKp").CheckMobile.any(),
|
|
he = i("uDHo").TIMEFRAMETYPE,
|
|
ue = i("jofe").createDeferredPromise,
|
|
de = i("GDWD").addPlusButtonProperty,
|
|
pe = s("On The Left"),
|
|
_e = s("On The Right"),
|
|
me = s("Move Scale To Left"),
|
|
fe = s("Move Scale To Right");
|
|
class ge extends le {
|
|
constructor(e, i, s) {
|
|
super(e, i, s), this._options.timeScaleWidget && (this._options
|
|
.timeScaleWidget.pressedMouseMoveScale = this._options.handleScale
|
|
.axisPressedMouseMove.time);
|
|
var r = this;
|
|
this._startSpinner(this._options.container.value());
|
|
var n = this._options.content,
|
|
o = this._options.readOnly;
|
|
this._removeMaximizeHotkey = null, r._hotkeys = v.createGroup({
|
|
desc: "Chart actions",
|
|
isDisabled: function() {
|
|
return !r._isActive
|
|
}
|
|
});
|
|
var a = this._options.containsData,
|
|
l = this._options.onWidget,
|
|
c = this._options.onCmeWidget;
|
|
c && ie.logWarn("[ChartWidget] 'onCmeWidget' option is depricated");
|
|
var h = this._options.widgetCustomer,
|
|
u = this._options.timezone,
|
|
d = this._options.hideSymbolSearch,
|
|
p = this._options.defSymbol,
|
|
_ = D.isValid(this._options.defInterval) ? this._options.defInterval :
|
|
void 0,
|
|
m = parseInt(this._options.defStyle),
|
|
f = V.isValidStyle(m) ? m : void 0,
|
|
g = this._options.defSessionId,
|
|
b = void 0 !== this._options.defTimeframe ? {
|
|
value: this._options.defTimeframe.toUpperCase(),
|
|
type: he.PeriodBack
|
|
} : void 0;
|
|
this._chartWidgetCollection = this._options.chartWidgetCollection, this
|
|
._content = n, this._initialLoading = this._options.initialLoading, this
|
|
._readOnly = o, this._containsData = a, this._showChartEvents = !a &&
|
|
this._options.chartEventsEnabled, this._defSymbol = p, this
|
|
._defInterval = _, this._defTimeframe = b, this._defStyle = f, this
|
|
._onWidget = !!l, this._compareSymbols = this._options.compareSymbols,
|
|
this._onWidget && (c ? this._widgetCustomer = "cme" : h && (this
|
|
._widgetCustomer = h)), this._hideSymbolSearch = d, this
|
|
._frameTime = 30, this._model = null, this._metaInfo = {},
|
|
this._drawRafId = 0, this._compareDialog = this._chartWidgetCollection
|
|
.getCompareDialogRenderer();
|
|
var S = this._contentSeriesProperties();
|
|
S && (p = S.symbol, _ = S.interval), void 0 === this._options
|
|
.useUserChartPreferences && (this._options.useUserChartPreferences = !
|
|
0), this._properties = new G("chartproperties", void 0, void 0, this
|
|
._options.useUserChartPreferences);
|
|
var y = this._options.useUserChartPreferences ? te.defaults(
|
|
"chartproperties.mainSeriesProperties") : te.factoryDefaults(
|
|
"chartproperties.mainSeriesProperties");
|
|
this._properties.mainSeriesProperties.merge(y), this._properties
|
|
.mainSeriesProperties.hasChild("esdBreaksStyle") && this._properties
|
|
.mainSeriesProperties.removeProperty("esdBreaksStyle"), _ = _ || y
|
|
.interval || "D", V.isValidStyle(f) || (f = V.isValidStyle(y.style) ? y
|
|
.style : B(D.isRange(_))), this._properties.mainSeriesProperties
|
|
.merge({
|
|
visible: !0,
|
|
symbol: p || DEFAULT_SYMBOL,
|
|
shortName: "",
|
|
timeframe: "",
|
|
onWidget: this._onWidget,
|
|
interval: _,
|
|
currencyId: null,
|
|
unitId: null,
|
|
style: f,
|
|
sessionId: g,
|
|
lineStyle: {
|
|
styleType: te.factoryDefaults(
|
|
"chartproperties.mainSeriesProperties.lineStyle.styleType"
|
|
)
|
|
}
|
|
}), this._containsData && this._properties.mainSeriesProperties.merge({
|
|
showCountdown: !1
|
|
}), u && K(u) && this._properties.timezone.setValue(u), this
|
|
._tagsChanged = new t, this._disconnected = new t, this
|
|
._reconnectBailout = new t, this._connected = new t, this._onScroll =
|
|
new t, this.chartWidgetInitialized = new t, this._chartSession = new J(
|
|
ChartApiInstance), this._metaInfoRepository = new re(this
|
|
._chartSession), this._timingsMeter = null, this._isActive = this
|
|
._options.isActive, this._options.container.subscribe((function(e) {
|
|
r._setElement(e)
|
|
}), {
|
|
callWithLast: !0
|
|
});
|
|
var w = function() {
|
|
r.resize()
|
|
};
|
|
this._options.width.subscribe(w), this._options.height.subscribe(w), this
|
|
._options.visible.subscribe(this._updateTimingsMeterState.bind(this)),
|
|
this._aboutToBeDestroyed = new t, this._actions = null, this
|
|
._definitionsViewModel = null, this._backgroundTopColorSpawn = null,
|
|
this._backgroundBottomColorSpawn = null, this._hintDefferedPromise =
|
|
null, this._activeHint = null
|
|
}
|
|
isInitialized() {
|
|
return Boolean(this._inited)
|
|
}
|
|
compareSymbols() {
|
|
return this._compareSymbols
|
|
}
|
|
async _getChartPropertyDefinitionsViewModel() {
|
|
if (null === this._definitionsViewModel) {
|
|
const {
|
|
ChartPropertyDefinitionsViewModel: e
|
|
} = await Promise.all([i.e(27), i.e(61), i.e("general-property-page")])
|
|
.then(i.bind(null, "5lPo"));
|
|
if (this._isDestroyed) throw new Error(
|
|
"Chart widget already destroyed");
|
|
await new Promise(e => this.withModel(null, e)), null === this
|
|
._definitionsViewModel && (this._definitionsViewModel = new e(this
|
|
.model(), this.properties(), this._options))
|
|
}
|
|
return this._definitionsViewModel
|
|
}
|
|
_initMaximizeHotkey(e) {
|
|
var t = this;
|
|
|
|
function i(e) {
|
|
e.defaultPrevented || b.modifiersFromEvent(e) === b.Modifiers.Alt && e
|
|
.stopPropagation()
|
|
}
|
|
|
|
function s(e) {
|
|
e.defaultPrevented || b.modifiersFromEvent(e) === b.Modifiers.Alt && (e
|
|
.preventDefault(), e.stopPropagation(), t.toggleFullscreen())
|
|
}
|
|
return e.addEventListener("mousedown", i, !0), e.addEventListener("click",
|
|
s, !0),
|
|
function() {
|
|
e.removeEventListener("mousedown", i, !0), e.removeEventListener(
|
|
"click", s, !0)
|
|
}
|
|
}
|
|
toggleFullscreen() {
|
|
var e = this.getResizerDetacher();
|
|
e.fullscreenable.value() && (e.fullscreen.value() ? e.exitFullscreen() : e
|
|
.requestFullscreen())
|
|
}
|
|
_beginRequestActive() {
|
|
var e = this._chartWidgetCollection.activeChartWidget.value() !== this;
|
|
this._chartWidgetCollection.activeChartWidget.setValue(this), e && (Q() &&
|
|
this._isLineToolModeExceptBrush() && this
|
|
.updateCrossHairPositionIfNeeded(), this._justActivated = !0)
|
|
}
|
|
_endRequestActive() {
|
|
var e = this;
|
|
this._justActivated && setTimeout((function() {
|
|
e._justActivated = !1
|
|
}), 0)
|
|
}
|
|
_requestActive() {
|
|
this._beginRequestActive(), this._endRequestActive()
|
|
}
|
|
justActivated() {
|
|
return this._justActivated
|
|
}
|
|
setTimezone(e) {
|
|
e && K(e) ? this._properties.timezone.setValue(e) : console.warn(
|
|
"Incorrect timezone: " + JSON.stringify(e))
|
|
}
|
|
getTimezone() {
|
|
return this._properties.timezone.value()
|
|
}
|
|
refreshMarks() {
|
|
this.model().barsMarksSources().forEach((function(e) {
|
|
e.refreshData()
|
|
}))
|
|
}
|
|
clearMarks() {
|
|
this.model().barsMarksSources().forEach((function(e) {
|
|
e.clearMarks()
|
|
}))
|
|
}
|
|
metaInfoRepository() {
|
|
return this._metaInfoRepository
|
|
}
|
|
_init() {
|
|
var e = this;
|
|
this.hasModel() && this.model().mainSeries().clearData(), this.initColors(),
|
|
this._makeDefaultGui();
|
|
var t = function() {
|
|
e._checkObsoleteTimezone(), e._chartSession && e._chartSession
|
|
.connected() && this._model.restart(), this._content && (this
|
|
.initColors(), this._updateGui(), this.update()), this
|
|
._resizeHandler = function() {
|
|
this.adjustSize(), this.paint()
|
|
}.bind(this), this._resizeHandler(), this._parent.appendChild(
|
|
this._mainDiv), this._spinner && (this._spinner.stop(),
|
|
delete this._spinner), this._keydownEventListener =
|
|
function(e) {
|
|
27 === e.which && e.preventDefault()
|
|
}, window.addEventListener("keydown:chart_" + this._id, this
|
|
._keydownEventListener), this._initBarsMarksSources(), this
|
|
._activateSymbolSearchHotkeys(), this.model().timeScale()
|
|
.onScroll().subscribe(this, (function() {
|
|
this._onScroll.fire()
|
|
})), this._inited = !0
|
|
}.bind(this),
|
|
i = this._makeDefaultModel();
|
|
void 0 === i ? t() : i.then(t)
|
|
}
|
|
_activateSymbolSearchHotkeys() {
|
|
this.readOnly() || this._hideSymbolSearch || U()
|
|
}
|
|
_checkObsoleteTimezone() {
|
|
var e = this._properties.timezone.value();
|
|
K(e) || this._properties.timezone.setValue({
|
|
UTC: "Etc/UTC",
|
|
EST: "America/New_York",
|
|
CST: "America/Chicago",
|
|
PST: "America/Los_Angeles"
|
|
} [e] || "exchange")
|
|
}
|
|
_initBarsMarksSources() {
|
|
var e = this;
|
|
this.withModel(this, (function() {
|
|
this.model().barsMarksSources().forEach((function(t) {
|
|
t.onNeedRepaint.subscribe(e, (function() {
|
|
e.model().model()
|
|
.lightUpdate()
|
|
}))
|
|
}))
|
|
}))
|
|
}
|
|
initColors() {
|
|
this._properties.scalesProperties.lineColor.listeners().subscribe(this, ge
|
|
.prototype.setScaleLineColor), this._properties.scalesProperties
|
|
.textColor.listeners().subscribe(this, ge.prototype.setScaleTextColor)
|
|
}
|
|
_initBackgroundColor() {
|
|
null === this._backgroundTopColorSpawn && (this._backgroundTopColorSpawn =
|
|
this._model.model().backgroundTopColor().spawn(), this
|
|
._backgroundTopColorSpawn.subscribe(this._onBackgroundColorChanged
|
|
.bind(this))), null === this._backgroundBottomColorSpawn && (
|
|
this._backgroundBottomColorSpawn = this._model.model()
|
|
.backgroundColor().spawn(), this._backgroundBottomColorSpawn
|
|
.subscribe(this._onBackgroundColorChanged.bind(this)))
|
|
}
|
|
paneWidgets() {
|
|
return this._paneWidgets
|
|
}
|
|
paneByCanvas(e) {
|
|
for (var t = 0; t < this._paneWidgets.length; t++)
|
|
if (this._paneWidgets[t].hasCanvas(e)) return this._paneWidgets[t];
|
|
return null
|
|
}
|
|
paneByState(e) {
|
|
for (var t = 0; t < this._paneWidgets.length; t++)
|
|
if (this._paneWidgets[t].state() === e) return this._paneWidgets[t];
|
|
return null
|
|
}
|
|
timeAxisByCanvas(e) {
|
|
return this._timeAxisWidget.hasCanvas(e) ? this._timeAxisWidget : null
|
|
}
|
|
properties() {
|
|
return this._properties
|
|
}
|
|
emulateCriticalError() {
|
|
this._chartSession.removeSeries("-1")
|
|
}
|
|
readOnly() {
|
|
return this._readOnly
|
|
}
|
|
onDisconnected() {
|
|
return this._disconnected
|
|
}
|
|
onReconnectBailout() {
|
|
return this._reconnectBailout
|
|
}
|
|
onConnected() {
|
|
return this._connected
|
|
}
|
|
onRedraw() {
|
|
return this._redraw
|
|
}
|
|
onScroll() {
|
|
return this._onScroll
|
|
}
|
|
modelCreated() {
|
|
return this._modelCreated
|
|
}
|
|
setResolution(e) {
|
|
if (this._model) {
|
|
var t = this._model.mainSeries().properties(),
|
|
i = s("Change Resolution");
|
|
this._model.setResolutionProperty(t.interval, e, this, i)
|
|
} else this._properties.mainSeriesProperties.merge({
|
|
interval: e
|
|
})
|
|
}
|
|
getResolution() {
|
|
return this._model ? this._model.mainSeries().properties().interval
|
|
.value() : this._properties.mainSeriesProperties.interval.value()
|
|
}
|
|
addOverlayStudy(e, t, i) {
|
|
var s = this.model();
|
|
return this._options.isSymbolAvailable(e).then((function(r) {
|
|
if (!r) return null;
|
|
var n = s.createStudyInserter({
|
|
type: "java",
|
|
studyId: "Overlay@tv-basicstudies"
|
|
}),
|
|
o = {
|
|
allowExtendTimeScale: i
|
|
};
|
|
if (h.enabled("use_overrides_for_overlay")) {
|
|
var a = te.factoryDefaults(
|
|
"[email protected]");
|
|
o.style = a
|
|
}
|
|
return n.setPropertiesState(o), n.setForceOverlay(t), n
|
|
.insert((function() {
|
|
return Promise.resolve({
|
|
symbol: e
|
|
})
|
|
}))
|
|
}))
|
|
}
|
|
addCompareStudy(e) {
|
|
var t = this.model();
|
|
return this._options.isSymbolAvailable(e).then((function(i) {
|
|
return i ? t.createStudyInserter({
|
|
type: "java",
|
|
studyId: "Compare@tv-basicstudies"
|
|
}).insert((function() {
|
|
return Promise.resolve({
|
|
symbol: e
|
|
})
|
|
})) : null
|
|
}))
|
|
}
|
|
updateActions() {
|
|
for (var e = this.actions(), t = this._model.dataSources(), i = !1, r = !1,
|
|
n = 0, o = t.length; n < o; n++) {
|
|
var a = t[n];
|
|
TradingView.isInherited(a.constructor, x) && a.isUserDeletable() && (
|
|
i = !0), TradingView.isInherited(a.constructor, w) && a
|
|
.removeByRemoveAllStudies() && (r = !0), TradingView.isInherited(a
|
|
.constructor, P) && (r = !0)
|
|
}
|
|
this._readOnly || (e.paneRemoveAllStudies && e.paneRemoveAllStudies.update({
|
|
disabled: !r
|
|
}), e.paneRemoveAllDrawingTools && e.paneRemoveAllDrawingTools
|
|
.update({
|
|
disabled: !i
|
|
}), e.paneRemoveAllStudiesDrawingTools && e
|
|
.paneRemoveAllStudiesDrawingTools.update({
|
|
disabled: !r && !i
|
|
}));
|
|
var l = this,
|
|
c = [],
|
|
h = function(e) {
|
|
return e.id === l.model().model().properties().timezone.value()
|
|
};
|
|
Y.forEach((function(e) {
|
|
if (!e.separator) {
|
|
var t = new A({
|
|
label: e.title,
|
|
checkable: !0,
|
|
checked: h(e),
|
|
statName: "SetTimeZone",
|
|
onExecute: function() {
|
|
l.model().setProperty(l.model()
|
|
.model().properties()
|
|
.timezone, e.id,
|
|
"Changed Time Zone")
|
|
}
|
|
});
|
|
c.push(t)
|
|
}
|
|
}), this), e.applyTimeZone.update({
|
|
subItems: c
|
|
}), e.addToWatchlist && (e.addToWatchlist.request(), e.addToWatchlist
|
|
.updateLabel(this.getSymbol(!0))), e.addToTextNotes && e
|
|
.addToTextNotes.update({
|
|
label: s("Add Text Note for {symbol}").format({
|
|
symbol: this.getSymbol(!0)
|
|
})
|
|
})
|
|
}
|
|
applyTheme(e) {
|
|
var t = this;
|
|
Promise.resolve().then(i.bind(null, "EsvI")).then(i => {
|
|
e = e || i.getCurrentTheme().name,
|
|
i.loadTheme(e, !0, !0, t._chartWidgetCollection)
|
|
})
|
|
}
|
|
actions() {
|
|
return null === this._actions && this._setActions(), this._actions
|
|
}
|
|
_setActions() {
|
|
this._actions && this._actions.addToWatchlist && (this._actions
|
|
.addToWatchlist.destroy(), delete this._actions.addToWatchlist);
|
|
var e, t = this,
|
|
r = [];
|
|
if (!this._readOnly) {
|
|
r = [new A({
|
|
label: s("Eraser"),
|
|
payload: "eraser",
|
|
statName: "Eraser"
|
|
}), new E, new A({
|
|
label: s("Trend Line"),
|
|
payload: "LineToolTrendLine",
|
|
statName: "LineToolTrendLine"
|
|
}), new A({
|
|
label: s("Horizontal Line"),
|
|
payload: "LineToolHorzLine",
|
|
statName: "LineToolHorzLine"
|
|
}), new A({
|
|
label: s("Vertical Line"),
|
|
payload: "LineToolVertLine",
|
|
statName: "LineToolVertLine"
|
|
}), new A({
|
|
label: s("Arrow"),
|
|
payload: "LineToolArrow",
|
|
statName: "LineToolArrow"
|
|
}), new A({
|
|
label: s("Ray"),
|
|
payload: "LineToolRay",
|
|
statName: "LineToolRay"
|
|
}), new A({
|
|
label: s("Extended"),
|
|
payload: "LineToolExtended",
|
|
statName: "LineToolExtended"
|
|
}), new A({
|
|
label: s("Parallel Channel"),
|
|
payload: "LineToolParallelChannel",
|
|
statName: "LineToolParallelChannel"
|
|
}), new E, new A({
|
|
label: s("Pitchfork"),
|
|
payload: "LineToolPitchfork",
|
|
statName: "LineToolPitchfork"
|
|
}), new A({
|
|
label: s("Schiff Pitchfork"),
|
|
payload: "LineToolSchiffPitchfork",
|
|
statName: "LineToolSchiffPitchfork"
|
|
}), new A({
|
|
label: s("Pitchfan"),
|
|
payload: "LineToolPitchfan",
|
|
statName: "LineToolPitchfan"
|
|
}), new A({
|
|
label: s("Gann Square"),
|
|
payload: "LineToolGannSquare",
|
|
statName: "LineToolGannSquare"
|
|
}), new A({
|
|
label: s("Gann Fan"),
|
|
payload: "LineToolGannFan",
|
|
statName: "LineToolGannFan"
|
|
}), new A({
|
|
label: s("Fib Retracement"),
|
|
payload: "LineToolFibRetracement",
|
|
statName: "LineToolFibRetracement"
|
|
}), new A({
|
|
label: s("Trend-Based Fib Extension"),
|
|
payload: "LineToolTrendBasedFibExtension",
|
|
statName: "LineToolTrendBasedFibExtension"
|
|
}), new A({
|
|
label: s("Fib Speed Resistance Fan"),
|
|
payload: "LineToolFibSpeedResistanceFan",
|
|
statName: "LineToolFibSpeedResistanceFan"
|
|
}), new A({
|
|
label: s("Fib Time Zone"),
|
|
payload: "LineToolFibTimeZone",
|
|
statName: "LineToolFibTimeZone"
|
|
}), new A({
|
|
label: s("Circle Lines"),
|
|
payload: "LineToolCircleLines",
|
|
statName: "LineToolCircleLines"
|
|
}), new A({
|
|
label: s("Fib Circles"),
|
|
payload: "LineToolFibCircles",
|
|
statName: "LineToolFibCircles"
|
|
}), new A({
|
|
label: s("Fib Speed Resistance Arcs"),
|
|
payload: "LineToolFibSpeedResistanceArcs",
|
|
statName: "LineToolFibSpeedResistanceArcs"
|
|
}), new E, new A({
|
|
label: s("Rectangle"),
|
|
payload: "LineToolRectangle",
|
|
statName: "LineToolRectangle"
|
|
}), new A({
|
|
label: s("Ellipse"),
|
|
payload: "LineToolEllipse",
|
|
statName: "LineToolEllipse"
|
|
}), new A({
|
|
label: s("Triangle"),
|
|
payload: "LineToolTriangle",
|
|
statName: "LineToolTriangle"
|
|
}), new A({
|
|
label: s("Polyline"),
|
|
payload: "LineToolPolyline",
|
|
statName: "LineToolPolyline"
|
|
}), new A({
|
|
label: s("Path"),
|
|
payload: "LineToolPath",
|
|
statName: "LineToolPath"
|
|
}), new A({
|
|
label: s("Arc"),
|
|
payload: "LineToolArc",
|
|
statName: "LineToolArc"
|
|
}), new E, new A({
|
|
label: s("Text", {
|
|
context: "tool"
|
|
}),
|
|
payload: "LineToolText",
|
|
statName: "LineToolText"
|
|
}), new A({
|
|
label: s("Anchored Text"),
|
|
payload: "LineToolTextAbsolute",
|
|
statName: "LineToolTextAbsolute"
|
|
}), new A({
|
|
label: s("Balloon"),
|
|
payload: "LineToolBalloon",
|
|
statName: "LineToolBalloon"
|
|
}), new A({
|
|
label: s("Price Label"),
|
|
payload: "LineToolPriceLabel",
|
|
statName: "LineToolPriceLabel"
|
|
}), new E, new A({
|
|
label: s("Elliott Wave Subminuette"),
|
|
payload: "LineToolElliottSubminuette",
|
|
statName: "LineToolElliottSubminuette"
|
|
}), new A({
|
|
label: s("Elliott Wave Minor"),
|
|
payload: "LineToolElliottMinor",
|
|
statName: "LineToolElliottMinor"
|
|
}), new A({
|
|
label: s("Elliott Wave Circle"),
|
|
payload: "LineToolElliottCircle",
|
|
statName: "LineToolElliottCircle"
|
|
}), new A({
|
|
label: s("Elliott Minor Retracement"),
|
|
payload: "LineToolElliottMinorRetr",
|
|
statName: "LineToolElliottMinorRetr"
|
|
}), new A({
|
|
label: s("Elliott Major Retracement"),
|
|
payload: "LineToolElliottMajorRetr",
|
|
statName: "LineToolElliottMajorRetr"
|
|
}), new E, new A({
|
|
label: s("Brush"),
|
|
payload: "LineToolBrush",
|
|
statName: "LineToolBrush"
|
|
}), new E, new A({
|
|
label: s("Forecast"),
|
|
payload: "LineToolPrediction",
|
|
statName: "LineToolPrediction"
|
|
})];
|
|
for (var n = function(e) {
|
|
k.tool.setValue(e.getPayload())
|
|
}, o = 0; o < r.length; o++) r[o] instanceof A && r[o].update({
|
|
onExecute: n
|
|
});
|
|
e = new A({
|
|
label: se(s("Settings")),
|
|
icon: i("MXV9"),
|
|
statName: "ScalesProperties",
|
|
onExecute: function() {
|
|
t.showGeneralChartProperties(f.scales)
|
|
}
|
|
})
|
|
}
|
|
this._hotkeys.add({
|
|
desc: "Maximize",
|
|
hotkey: v.Modifiers.Alt + 13,
|
|
handler: function() {
|
|
t.toggleFullscreen()
|
|
},
|
|
isDisabled: function() {
|
|
return !t._options.fullscreenable.value()
|
|
}
|
|
}), this._hotkeys.add({
|
|
desc: "Cancel selection",
|
|
hotkey: 27,
|
|
handler: function() {
|
|
t.selectPointMode().value() ? t
|
|
.cancelRequestSelectPoint() : t._model
|
|
.selectionMacro((function(e) {
|
|
t._cancelCreatingLine(), e
|
|
.clearSelection()
|
|
}))
|
|
},
|
|
isDisabled: function() {
|
|
var e = 0 === t._model.selection().allSources().length,
|
|
i = null === t._model.crossHairSource()
|
|
.measurePane(),
|
|
s = !t.selectPointMode().value(),
|
|
r = e && i && s;
|
|
return !t._model || r
|
|
}
|
|
}), t.withModel(null, (function() {
|
|
var e = function() {
|
|
t._hotkeys.promote()
|
|
};
|
|
t._model.onSelectedSourceChanged().subscribe(null, e), t
|
|
._model.crossHairSource().measuringEnabled().subscribe(
|
|
null, t => {
|
|
t && e()
|
|
})
|
|
}));
|
|
var a = new A({
|
|
label: s("Reset Chart"),
|
|
icon: i("LdoW"),
|
|
statName: "ResetChart",
|
|
onExecute: this.GUIResetScales.bind(this),
|
|
hotkeyGroup: this._hotkeys,
|
|
hotkeyHash: v.Modifiers.Alt + 82
|
|
}),
|
|
l = new A({
|
|
label: s("Invert Scale"),
|
|
statName: "Invert Scale",
|
|
checkable: !0,
|
|
onExecute: function() {
|
|
t._model.invertPriceScale(t._model.mainSeries()
|
|
.priceScale())
|
|
},
|
|
hotkeyGroup: this._hotkeys,
|
|
hotkeyHash: v.Modifiers.Alt + 73
|
|
}),
|
|
c = new A({
|
|
label: s("Auto (Fits Data To Screen)"),
|
|
checkable: !0,
|
|
onExecute: function() {
|
|
var e = t._model.mainSeries().priceScale();
|
|
t._model.togglePriceScaleAutoScaleMode(e), c.update({
|
|
checked: e.isAutoScale()
|
|
})
|
|
}
|
|
}),
|
|
d = new A({
|
|
label: s("Lock Price To Bar Ratio"),
|
|
checkable: !0,
|
|
statName: "ToggleLockScale",
|
|
onExecute: function() {
|
|
t._model.togglePriceScaleLockScaleMode(t._model
|
|
.mainSeries().priceScale())
|
|
}
|
|
}),
|
|
p = new A({
|
|
label: s("Regular"),
|
|
checkable: !0,
|
|
statName: "ToggleRegularScale",
|
|
onExecute: function() {
|
|
var e = t._model.mainSeries().priceScale();
|
|
t._model.setPriceScaleRegularScaleMode(e), p.update({
|
|
checked: e.isRegular()
|
|
})
|
|
}
|
|
}),
|
|
S = new A({
|
|
label: s("Percent"),
|
|
checkable: !0,
|
|
statName: "TogglePercantage",
|
|
onExecute: function() {
|
|
t._model.togglePriceScalePercentageScaleMode(t._model
|
|
.mainSeries().priceScale())
|
|
},
|
|
hotkeyGroup: this._hotkeys,
|
|
hotkeyHash: v.Modifiers.Alt + 80
|
|
}),
|
|
y = new A({
|
|
label: s("Indexed to 100"),
|
|
checkable: !0,
|
|
statName: "ToggleIndexedTo100",
|
|
onExecute: function() {
|
|
t._model.togglePriceScaleIndexedTo100ScaleMode(t._model
|
|
.mainSeries().priceScale())
|
|
}
|
|
}),
|
|
w = new A({
|
|
label: s("Logarithmic"),
|
|
statName: "ToggleLogScale",
|
|
checkable: !0,
|
|
onExecute: function() {
|
|
t._model.togglePriceScaleLogScaleMode(t._model
|
|
.mainSeries().priceScale())
|
|
},
|
|
hotkeyGroup: this._hotkeys,
|
|
hotkeyHash: v.Modifiers.Alt + 76
|
|
}),
|
|
P = new A({
|
|
label: s("Undo"),
|
|
onExecute: function() {
|
|
$("GUI", "Undo"), t._model.undoHistory().undo()
|
|
},
|
|
disabled: !0,
|
|
hotkeyGroup: this._hotkeys,
|
|
hotkeyHash: v.Modifiers.Mod + 90
|
|
}),
|
|
C = new A({
|
|
label: s("Redo"),
|
|
onExecute: function() {
|
|
$("GUI", "Redo"), t._model.undoHistory().redo()
|
|
},
|
|
disabled: !0,
|
|
hotkeyGroup: this._hotkeys,
|
|
hotkeyHash: v.Modifiers.Mod + 89
|
|
});
|
|
t.withModel(null, (function() {
|
|
t._model.undoHistory().undoStack().onChange().subscribe(t, t
|
|
.updateUndoRedo), t._model.undoHistory().redoStack()
|
|
.onChange().subscribe(t, t.updateUndoRedo)
|
|
}));
|
|
var x = [new A({
|
|
label: s("Loading")
|
|
})],
|
|
T = new A({
|
|
name: "apply-color-theme",
|
|
label: s("Color Theme"),
|
|
icon: i("opke"),
|
|
subItems: x,
|
|
statName: "ColorTheme"
|
|
}),
|
|
I = new A({
|
|
label: s("Time Zone"),
|
|
statName: "TimeZone"
|
|
}),
|
|
M = new A({
|
|
label: se(s("Change Symbol")),
|
|
statName: "ChangeSymbol",
|
|
onExecute: function() {
|
|
z({
|
|
defaultValue: ""
|
|
})
|
|
}
|
|
});
|
|
m("symboledit.dialog_last_entry", "");
|
|
var O = {
|
|
label: se(s("Change Interval")),
|
|
statName: "ChangeInterval",
|
|
onExecute: function() {
|
|
W({
|
|
initVal: F.interval.value(),
|
|
selectOnInit: !0
|
|
})
|
|
}
|
|
};
|
|
!h.enabled("show_interval_dialog_on_key_press") || this.readOnly() || this
|
|
._hideSymbolSearch || (O.shortcutHint = ",", O.hotkeyGroup = this
|
|
._hotkeys, O.hotkeyHash = 188);
|
|
var L, D, V = new A(O);
|
|
if (!TradingView.onWidget()) {
|
|
if (this._options.addToWatchlistEnabled) {
|
|
const e = {
|
|
hotkeyGroup: this._hotkeys
|
|
};
|
|
L = new WatchListAction(this, e)
|
|
}
|
|
D = new A({
|
|
label: s("Add To Text Notes"),
|
|
statName: "AddToTextNotes",
|
|
onExecute: function() {
|
|
window.runOrSignIn((function() {
|
|
TradingView.bottomWidgetBar && (
|
|
TradingView.bottomWidgetBar
|
|
.toggleWidget("text_notes",
|
|
!0), TradingView
|
|
.bottomWidgetBar._widgets
|
|
.text_notes.addNote(null, t
|
|
.getSymbol(!0), t
|
|
.getSymbol()))
|
|
}), {
|
|
source: "Add text note in chart context menu"
|
|
})
|
|
},
|
|
hotkeyGroup: this._hotkeys,
|
|
hotkeyHash: v.Modifiers.Alt + 78
|
|
})
|
|
}
|
|
var B = new A({
|
|
label: s("Reset Time Scale"),
|
|
icon: i("LdoW"),
|
|
statName: "ResetScale",
|
|
onExecute: function() {
|
|
t.model().resetTimeScale()
|
|
},
|
|
hotkeyGroup: this._hotkeys,
|
|
hotkeyHash: v.Modifiers.Mod + v.Modifiers.Alt + 81
|
|
}),
|
|
j = new A({
|
|
label: s("Insert Drawing Tool"),
|
|
subItems: r,
|
|
statName: "InsertDravingTool"
|
|
}),
|
|
H = new A({
|
|
label: s("Remove Indicators"),
|
|
statName: "RemoveAllIndicators",
|
|
onExecute: this.removeAllStudies.bind(this)
|
|
}),
|
|
U = new A({
|
|
label: s("Remove Drawings"),
|
|
statName: "RemoveAllDrawingTools",
|
|
onExecute: this.removeAllDrawingTools.bind(this)
|
|
}),
|
|
G = new A({
|
|
label: s("All Indicators And Drawing Tools"),
|
|
statName: "RemoveAllIndicatorsAndDrawingTools",
|
|
onExecute: this.removeAllStudiesDrawingTools.bind(this)
|
|
}),
|
|
q = this.chartWidgetCollection(),
|
|
Y = new A({
|
|
label: s("Apply these Indicators to Entire Layout"),
|
|
statName: "ApplyIndicatorsToAllCharts",
|
|
onExecute: function() {
|
|
q.applyIndicatorsToAllCharts(t)
|
|
}
|
|
}),
|
|
K = {
|
|
label: se(s("Insert Indicator")),
|
|
statName: "InsertIndicator",
|
|
onExecute: function() {
|
|
t.showIndicators()
|
|
}
|
|
};
|
|
this._options.indicatorsDialogShortcutEnabled && (K.hotkeyGroup = this
|
|
._hotkeys, K.hotkeyHash = 191, new A({
|
|
label: se(s("Insert Indicator")),
|
|
statName: "InsertIndicator",
|
|
onExecute: function() {
|
|
t.showIndicators()
|
|
},
|
|
hotkeyGroup: this._hotkeys,
|
|
hotkeyHash: 111
|
|
}));
|
|
var J, Z = new A(K),
|
|
X = new A({
|
|
label: se(s("Compare or Add Symbol")),
|
|
statName: "CompareOrAddSymbol",
|
|
onExecute: this.toggleCompareOrAdd.bind(this)
|
|
}),
|
|
Q = new A({
|
|
label: se(s("Compare")),
|
|
statName: "Compare",
|
|
onExecute: this.toggleCompareOrAdd.bind(this)
|
|
}),
|
|
ee = new A({
|
|
label: se(s("Object Tree")),
|
|
statName: "ObjectsTree",
|
|
onExecute: this.showObjectsTreePanelOrDialog.bind(this)
|
|
}),
|
|
te = new A({
|
|
label: se(s("Settings")),
|
|
icon: i("MXV9"),
|
|
statName: "ChartProperties",
|
|
onExecute: function() {
|
|
t.showGeneralChartProperties()
|
|
}
|
|
}),
|
|
ie = new A({
|
|
label: se(s("Settings")),
|
|
icon: i("MXV9"),
|
|
statName: "MainSeriesProperties",
|
|
onExecute: function() {
|
|
t.showGeneralChartProperties(f.symbol)
|
|
}
|
|
}),
|
|
re = new A({
|
|
label: s("Lock/Unlock"),
|
|
statName: "ToggleLockSelectedObject",
|
|
onExecute: this.toggleLockSelectedObject.bind(this)
|
|
}),
|
|
ne = new A({
|
|
label: s("Hide"),
|
|
icon: i("dmHa"),
|
|
statName: "HideSelectedObject",
|
|
onExecute: this.hideSelectedObject.bind(this)
|
|
});
|
|
h.enabled("property_pages") && (J = new A({
|
|
label: se(s("Settings")),
|
|
icon: i("MXV9"),
|
|
statName: "EditSelectedObject",
|
|
onExecute: function() {
|
|
t.showSelectedSourceProperties()
|
|
}
|
|
})), this.withModel(null, (function() {
|
|
var e = t.model().mainSeries(),
|
|
i = e.properties();
|
|
i.priceAxisProperties.subscribe(t, t._updateScalesActions),
|
|
e.priceScaleAboutToBeChanged().subscribe(t, (
|
|
function() {
|
|
i.priceAxisProperties.unsubscribeAll(t)
|
|
})), e.priceScaleChanged().subscribe(t, (
|
|
function() {
|
|
i.priceAxisProperties.subscribe(t, t
|
|
._updateScalesActions), t
|
|
._updateScalesActions()
|
|
}))
|
|
}));
|
|
var oe = new A({
|
|
label: s("Scale Price Chart Only"),
|
|
checkable: !0,
|
|
statName: "ScalePriceChartOnly"
|
|
});
|
|
oe.binder = new u(oe, this._properties.scalesProperties.scaleSeriesOnly,
|
|
this.model(), s("Scale Price Chart Only"));
|
|
var ae = this.model().model();
|
|
this._properties.scalesProperties.scaleSeriesOnly.listeners().subscribe(
|
|
null, (function() {
|
|
ae.recalculateAllPanes(), ae.invalidate(N.full())
|
|
}));
|
|
var le = new A({
|
|
label: s("Drawings Toolbar"),
|
|
checkable: !0,
|
|
statName: "ToggleDrawingToolbar"
|
|
}),
|
|
ce = this._options.isDrawingToolbarVisible;
|
|
ce && (ce.subscribe((function(e) {
|
|
le.update({
|
|
checked: e
|
|
})
|
|
}), {
|
|
callWithLast: !0
|
|
}), le.update({
|
|
onExecute: function() {
|
|
ce.setValue(!ce.value())
|
|
}
|
|
}));
|
|
var he = new A({
|
|
label: s("Stay in Drawing Mode"),
|
|
checkable: !0,
|
|
statName: "ToggleStayInDrawingMode"
|
|
});
|
|
he.binder = new u(he, k.properties().stayInDrawingMode, this.model(), s(
|
|
"Stay In Drawing Mode"));
|
|
var ue = new A({
|
|
label: s("Sync drawings to all charts"),
|
|
checkable: !0,
|
|
statName: "ToggleSyncDrawings"
|
|
});
|
|
ue.binder = new u(ue, k.properties().drawOnAllCharts, this.model(),
|
|
"SyncDrawings");
|
|
var ge = new A({
|
|
label: s("Lock All Drawing Tools"),
|
|
checkable: !0,
|
|
statName: "ToggleLockDrawings"
|
|
});
|
|
ge.binder = new u(ge, k.lockDrawings(), this.model(), s("Lock drawings"), (
|
|
function() {
|
|
k.lockDrawings().setValue(this.value())
|
|
}));
|
|
var be = new A({
|
|
label: s("Hide All Drawing Tools"),
|
|
checkable: !0,
|
|
statName: "ToggleHideAllDrawingTools",
|
|
hotkeyHash: v.Modifiers.Mod + v.Modifiers.Alt + 72,
|
|
hotkeyGroup: this._hotkeys
|
|
});
|
|
be.binder = new u(be, k.hideAllDrawings(), this.model(), s(
|
|
"Hide All Drawing Tools"), (function() {
|
|
var e = _("ChartToolsHideMode", "drawings"),
|
|
t = k.hideAllDrawings(),
|
|
i = k.hideAllIndicators();
|
|
switch (e) {
|
|
case "drawings":
|
|
t.setValue(!t.value());
|
|
break;
|
|
case "indicators":
|
|
i.setValue(!i.value());
|
|
break;
|
|
default:
|
|
t.setValue(!t.value()), i.setValue(!i.value())
|
|
}
|
|
}));
|
|
var ve = new A({
|
|
label: s("Hide Marks On Bars"),
|
|
checkable: !0,
|
|
statName: "ToggleHideMarksOnBars"
|
|
});
|
|
ve.binder = new u(ve, k.hideMarksOnBars(), this.model(), s(
|
|
"Hide Marks On Bars"), (function() {
|
|
k.hideMarksOnBars().setValue(this.value())
|
|
}));
|
|
var Se = new A({
|
|
label: s("Symbol Last Price Label"),
|
|
checkable: !0,
|
|
checked: !1,
|
|
statName: "ToggleSymbolLastValue"
|
|
});
|
|
Se.binder = new u(Se, this.properties().scalesProperties
|
|
.showSeriesLastValue, this.model(), s("Show Symbol Last Value"));
|
|
var ye = new A({
|
|
label: s("Symbol Name Label"),
|
|
checkable: !0,
|
|
checked: !1,
|
|
statName: "ToggleSymbolLabels"
|
|
});
|
|
ye.binding = new u(ye, this.properties().scalesProperties.showSymbolLabels,
|
|
this.model(), "Undo Show Symbol Labels");
|
|
var we = new A({
|
|
label: s("Indicator Last Value Label"),
|
|
checkable: !0,
|
|
checked: !1,
|
|
statName: "ToggleStudyLastValue"
|
|
});
|
|
we.binder = new u(we, this.properties().scalesProperties.showStudyLastValue,
|
|
this.model(), s("Show Indicator Last Value"));
|
|
var Pe = new A({
|
|
label: s("Indicator Name Label"),
|
|
checkable: !0,
|
|
checked: !1,
|
|
statName: "ToggleIndicatorsLabels"
|
|
});
|
|
Pe.binding = new u(Pe, this.properties().scalesProperties
|
|
.showStudyPlotLabels, this.model(), "Undo Show Indicator Labels");
|
|
var Ce = this.model().mainSeries().properties().highLowAvgPrice,
|
|
xe = new A({
|
|
label: s("High and low price labels"),
|
|
checkable: !0,
|
|
checked: !1,
|
|
statName: "ToggleHighLowPriceLabels"
|
|
});
|
|
xe.binding = new u(xe, Ce.highLowPriceLabelsVisible, this.model(), s(
|
|
"Show high and low price labels"));
|
|
var Te = new A({
|
|
label: s("High and low price lines"),
|
|
checkable: !0,
|
|
checked: !1,
|
|
statName: "ToggleHighLowPriceLine"
|
|
});
|
|
Te.binding = new u(Te, Ce.highLowPriceLinesVisible, this.model(), s(
|
|
"Show high and low price lines"));
|
|
var Ie = new A({
|
|
label: s("Average close price label"),
|
|
checkable: !0,
|
|
checked: !1,
|
|
statName: "ToggleAverageClosePriceLabel"
|
|
});
|
|
Ie.binding = new u(Ie, Ce.averageClosePriceLabelVisible, this.model(), s(
|
|
"Show average close price label"));
|
|
var Me = new A({
|
|
label: s("Average close price line"),
|
|
checkable: !0,
|
|
checked: !1,
|
|
statName: "ToggleAverageClosePriceLine"
|
|
});
|
|
Me.binding = new u(Me, Ce.averageClosePriceLineVisible, this.model(), s(
|
|
"Show average close price line"));
|
|
var Oe = new A({
|
|
label: s("Financials Last Value Label"),
|
|
checkable: !0,
|
|
checked: !1,
|
|
statName: "ToggleFundamentalsLastValue"
|
|
});
|
|
Oe.binder = new u(Oe, this.properties().scalesProperties
|
|
.showFundamentalLastValue, this.model(),
|
|
"Show Financials Last Value");
|
|
var Le = new A({
|
|
label: s("Financials Name Label"),
|
|
checkable: !0,
|
|
checked: !1,
|
|
statName: "ToggleFundamentalsLabels"
|
|
});
|
|
Le.binding = new u(Le, this.properties().scalesProperties
|
|
.showFundamentalNameLabel, this.model(),
|
|
"Show Financials Name Label");
|
|
var Ae = new A({
|
|
label: s("Countdown To Bar Close"),
|
|
checkable: !0,
|
|
checked: !1,
|
|
statName: "ToggleCountdown"
|
|
});
|
|
Ae.binder = new u(Ae, this.model().mainSeries().properties().showCountdown,
|
|
this.model(), Ae.getLabel());
|
|
var Ee = new A({
|
|
label: s("Currency"),
|
|
checkable: !0,
|
|
checked: !0,
|
|
statName: "ToggleScalesCurrency"
|
|
});
|
|
Ee.binder = new u(Ee, this.properties().scalesProperties.showCurrency, this
|
|
.model(), "Change Currency Label Visibility");
|
|
var ke = new A({
|
|
label: s("Unit"),
|
|
checkable: !0,
|
|
checked: !0,
|
|
statName: "ToggleScalesUnit"
|
|
});
|
|
ke.binder = new u(ke, this.properties().scalesProperties.showUnit, this
|
|
.model(), "Change Unit Label Visibility");
|
|
var De = new A({
|
|
label: s("Plus Button"),
|
|
checkable: !0,
|
|
checked: de.value(),
|
|
statName: "ToggleAddOrderPlusButton"
|
|
});
|
|
De.binder = new u(De, de, this.model(), De.getLabel());
|
|
var Ve = null;
|
|
this._options.goToDateEnabled && (Ve = new A({
|
|
label: se(s("Go to Date")),
|
|
statName: "GoToDate",
|
|
onExecute: function() {
|
|
var e = t._chartWidgetCollection.activeChartWidget
|
|
.value();
|
|
g(e)
|
|
},
|
|
hotkeyGroup: this._hotkeys,
|
|
hotkeyHash: v.Modifiers.Alt + 71
|
|
}));
|
|
var Be = new A({
|
|
label: se(s("Symbol Info")),
|
|
icon: i("1pHB"),
|
|
checkable: !1,
|
|
statName: "SymbolInfo",
|
|
onExecute: function() {
|
|
var e = t.model().mainSeries().symbol(),
|
|
i = t.model().mainSeries().symbolInfo(),
|
|
s = t.model().model().availableUnits(),
|
|
r = t.model().model().unitConversionEnabled();
|
|
R(e, {
|
|
symbolInfo: i,
|
|
showUnit: r,
|
|
unitName: function(e) {
|
|
return s.name(e)
|
|
}
|
|
})
|
|
}
|
|
}),
|
|
Re = new A({
|
|
label: pe,
|
|
statName: "MergeAllScalesToLeft",
|
|
onExecute: function() {
|
|
t.model().mergeAllScales("left")
|
|
}
|
|
}),
|
|
Ne = new A({
|
|
label: _e,
|
|
statName: "MergeAllScalesToRight",
|
|
onExecute: function() {
|
|
t.model().mergeAllScales("right")
|
|
}
|
|
}),
|
|
je = new A({
|
|
label: me,
|
|
statName: "MoveScaleToLeft",
|
|
onExecute: function() {
|
|
t.model().mergeAllScales("left")
|
|
}
|
|
}),
|
|
Fe = new A({
|
|
label: fe,
|
|
statName: "MoveScaleToRight",
|
|
onExecute: function() {
|
|
t.model().mergeAllScales("right")
|
|
}
|
|
});
|
|
var We = h.enabled("show_object_tree");
|
|
if (this._actions = {
|
|
chartProperties: te,
|
|
mainSeriesPropertiesAction: ie,
|
|
timeScaleReset: B,
|
|
chartReset: a,
|
|
invertSeriesScale: l,
|
|
logSeriesScale: w,
|
|
autoSeriesScale: c,
|
|
lockSeriesScale: d,
|
|
regularSeriesScale: p,
|
|
percentSeriesScale: S,
|
|
indexedTo100SeriesScale: y,
|
|
compareOrAdd: X,
|
|
compare: Q,
|
|
paneObjectTree: We ? ee : void 0,
|
|
insertIndicator: Z,
|
|
insertDrawingTool: j,
|
|
applyColorTheme: T,
|
|
symbolSearch: M,
|
|
showSymbolInfoDialog: Be,
|
|
changeInterval: V,
|
|
seriesHide: ne,
|
|
studyHide: ne,
|
|
lineToggleLock: re,
|
|
lineHide: ne,
|
|
scaleSeriesOnly: oe,
|
|
drawingToolbarAction: le,
|
|
stayInDrawingModeAction: he,
|
|
syncModeAction: ue,
|
|
lockDrawingsAction: ge,
|
|
hideAllDrawingsAction: be,
|
|
hideAllMarks: ve,
|
|
applyTimeZone: I,
|
|
showCountdown: Ae,
|
|
showCurrency: Ee,
|
|
showUnit: ke,
|
|
addPlusButton: De,
|
|
showSeriesLastValue: Se,
|
|
showHighLowPriceLabels: xe,
|
|
showHighLowPriceLines: Te,
|
|
showAverageClosePriceLabel: Ie,
|
|
showAverageClosePriceLine: Me,
|
|
showSymbolLabelsAction: ye,
|
|
showStudyLastValue: we,
|
|
showStudyPlotNamesAction: Pe,
|
|
showFundamentalsLastValueAction: Oe,
|
|
showFundamentalNamesAction: Le,
|
|
undo: P,
|
|
redo: C,
|
|
mergeLeftScalesAction: Re,
|
|
mergeRightScalesAction: Ne,
|
|
moveScaleToLeft: je,
|
|
moveScaleToRight: Fe,
|
|
moveChartAction: void 0
|
|
}, e && (this._actions.scalesProperties = e), L && (this._actions
|
|
.addToWatchlist = L), h.enabled("show_source_code") && (this
|
|
._actions.viewSourceCode = new A({
|
|
label: se(s("Source Code")),
|
|
statName: "OpenSelectedObjectSource",
|
|
onExecute: this.openSelectedObjectSource.bind(this)
|
|
})), !TradingView.onWidget() && h.enabled("text_notes") && (this
|
|
._actions.addToTextNotes = D), null !== Ve && (this._actions
|
|
.gotoDate = Ve), this.createSessionBreaksActions(), !this
|
|
.readOnly()) {
|
|
var He = new A({
|
|
label: s("Remove"),
|
|
icon: i("aVjL"),
|
|
statName: "RemoveSelectedObject",
|
|
onExecute: function() {
|
|
var e = this._chartWidgetCollection
|
|
.activeChartWidget.value();
|
|
e || (e = this), e.removeSelectedSources()
|
|
}.bind(this),
|
|
hotkeyGroup: this._hotkeys,
|
|
hotkeyHash: b.isMacKeyboard ? 8 : 46
|
|
});
|
|
this._hotkeys.add({
|
|
handler: function() {
|
|
this.removeSelectedSources()
|
|
}.bind(this),
|
|
desc: "Remove selected source",
|
|
hotkey: b.isMacKeyboard ? 46 : 8
|
|
}), this._actions.insertDrawingTool = j, this._actions
|
|
.paneRemoveAllStudies = H, this._actions.paneRemoveAllDrawingTools =
|
|
U, this._actions.paneRemoveAllStudiesDrawingTools = G, this._actions
|
|
.applyStudiesToAllCharts = Y, this._actions.seriesRemove = He, this
|
|
._actions.studyRemove = He, this._actions.lineRemove = He, h
|
|
.enabled("property_pages") && (this._actions.format = J), this
|
|
._actions.lockDrawingsAction = ge, this._actions
|
|
.hideAllDrawingsAction = be, this._actions.hideAllMarks = ve
|
|
}
|
|
this._actions.showPriceLine = new A({
|
|
label: s("Price Line"),
|
|
checkable: !0,
|
|
statName: "TogglePriceLine"
|
|
}), this._actions.showPriceLine.binding = new u(this._actions
|
|
.showPriceLine, this.model().mainSeries().properties()
|
|
.showPriceLine, this.model(), "Undo Toggle Price Line"), this
|
|
.readOnly() || (this._actions.horzLineRightThere = new A({
|
|
label: s("Draw Horizontal Line Here"),
|
|
onExecute: function() {
|
|
t.activePaneWidget && t.activePaneWidget
|
|
.drawRightThere("LineToolHorzLine")
|
|
},
|
|
hotkeyGroup: this._hotkeys,
|
|
hotkeyHash: v.Modifiers.Alt + 72
|
|
}), this._actions.vertLineRightThere = new A({
|
|
label: s("Draw Vertical Line Here"),
|
|
onExecute: function() {
|
|
t.activePaneWidget && t.activePaneWidget
|
|
.drawRightThere("LineToolVertLine")
|
|
},
|
|
hotkeyGroup: this._hotkeys,
|
|
hotkeyHash: v.Modifiers.Alt + 86
|
|
}), this._actions.crossLineRightThere = new A({
|
|
label: s("Draw Cross Line Here"),
|
|
onExecute: function() {
|
|
t.activePaneWidget && t.activePaneWidget
|
|
.drawRightThere("LineToolCrossLine")
|
|
},
|
|
hotkeyGroup: this._hotkeys,
|
|
hotkeyHash: v.Modifiers.Alt + 67
|
|
}), this._actions.trendLine = new A({
|
|
label: s("Draw Trend Line"),
|
|
onExecute: function() {
|
|
t.activePaneWidget && k.tool.setValue(
|
|
"LineToolTrendLine")
|
|
},
|
|
hotkeyGroup: this._hotkeys,
|
|
hotkeyHash: v.Modifiers.Alt + 84
|
|
}), this._actions.FibRetracement = new A({
|
|
label: s("Draw Fib Retracement"),
|
|
onExecute: function() {
|
|
t.activePaneWidget && k.tool.setValue(
|
|
"LineToolFibRetracement")
|
|
},
|
|
hotkeyGroup: this._hotkeys,
|
|
hotkeyHash: v.Modifiers.Alt + 70
|
|
})), this._updateScalesActions()
|
|
}
|
|
options() {
|
|
return this._options
|
|
}
|
|
executeActionById(e) {
|
|
if ("takeScreenshot" === e) return console.warn(
|
|
'Action "takeScreenshot" is deprecated. Use method "takeScreenshot" instead'
|
|
), void this._chartWidgetCollection.takeScreenshot();
|
|
"lockDrawingsAction" === e && console.warn(
|
|
'Action "lockDrawingsAction" is deprecated. Use method "lockAllDrawingTools" instead'
|
|
), "hideAllDrawingsAction" === e && console.warn(
|
|
'Action "hideAllDrawingsAction" is deprecated. Use method "hideAllDrawingTools" instead'
|
|
), e in this._actions ? this._actions[e] instanceof A && this
|
|
._actions[e].execute() : console.warn("Unknown action id: " + e)
|
|
}
|
|
getCheckableActionState(e) {
|
|
if ("lockDrawingsAction" === e) return console.warn(
|
|
'Action "lockDrawingsAction" is deprecated. Use method "lockAllDrawingTools" instead'
|
|
), null;
|
|
if ("hideAllDrawingsAction" === e) return console.warn(
|
|
'Action "hideAllDrawingsAction" is deprecated. Use method "hideAllDrawingTools" instead'
|
|
), null;
|
|
if (e in this._actions) {
|
|
var t = this._actions[e];
|
|
if (t instanceof A && t.isCheckable()) return t.isChecked();
|
|
console.warn("Action " + e + " has no state")
|
|
} else console.warn("Unknown action id: " + e);
|
|
return null
|
|
}
|
|
_updateScalesActions() {
|
|
if (null !== this._actions) {
|
|
var e = this.model().mainSeries(),
|
|
t = e.priceScale(),
|
|
i = e.properties(),
|
|
s = t.isLockScale(),
|
|
r = i.style.value() === c.STYLE_PNF;
|
|
this._actions.percentSeriesScale.update({
|
|
disabled: s || r,
|
|
checked: t.isPercentage()
|
|
}), this._actions.logSeriesScale.update({
|
|
disabled: s || r,
|
|
checked: t.isLog()
|
|
}), this._actions.regularSeriesScale.update({
|
|
disabled: s || r,
|
|
checked: t.isRegular()
|
|
}), this._actions.indexedTo100SeriesScale.update({
|
|
disabled: s || r,
|
|
checked: t.isIndexedTo100()
|
|
}), this._actions.invertSeriesScale.update({
|
|
checked: t.isInverted()
|
|
}), this._actions.lockSeriesScale.update({
|
|
checked: t.isLockScale()
|
|
}), this._actions.autoSeriesScale.update({
|
|
checked: t.isAutoScale(),
|
|
disabled: t.properties().autoScaleDisabled.value()
|
|
})
|
|
}
|
|
}
|
|
removeAllStudies() {
|
|
this._model.removeAllStudies()
|
|
}
|
|
removeAllDrawingTools() {
|
|
this._model.removeAllDrawingTools()
|
|
}
|
|
removeAllStudiesDrawingTools() {
|
|
this._model.removeAllStudiesAndDrawingTools()
|
|
}
|
|
defaultSymbol() {
|
|
return this._defSymbol
|
|
}
|
|
connect() {
|
|
this._handler = function(e) {
|
|
this._onData(e)
|
|
}.bind(this), this._boundOnChartSessionIsConnectedChanged = this
|
|
._onChartSessionIsConnectedChanged.bind(this), this._chartSession
|
|
.isConnected().subscribe(this._boundOnChartSessionIsConnectedChanged),
|
|
this._chartSession.criticalError().subscribe(this, this
|
|
._onChartSessionCriticalError), this._chartSession.connect(this
|
|
._handler)
|
|
}
|
|
finishInitWithoutConnect() {
|
|
this._chartSession.disable(), this._init(), this.chartWidgetInitialized
|
|
.fire()
|
|
}
|
|
reconnect() {
|
|
this._chartSession.disconnect(), this._chartSession.connect()
|
|
}
|
|
update() {
|
|
if (this._model) {
|
|
for (var e = 0; e < this._paneWidgets.length; e++) this._paneWidgets[e]
|
|
.update();
|
|
this._timeAxisWidget && this._timeAxisWidget.update()
|
|
}
|
|
}
|
|
_makeDefaultGui() {
|
|
this._makeLoadingScreen(), this._model && (this._makeTimeAxisWidget(), this
|
|
._makePaneWidgetsAndSeparators()), this.adjustSize(), this
|
|
._updateScalesActions(), y(this._elMainTable), this.update(), this
|
|
.paint()
|
|
}
|
|
widget() {
|
|
return this._mainDiv
|
|
}
|
|
_onBackgroundColorChanged() {
|
|
for (var e = 0; e < this._paneWidgets.length; e++) this._paneWidgets[e]
|
|
.setCursorForTool();
|
|
this.update(), this.model().model().fullUpdate()
|
|
}
|
|
setScaleLineColor(e) {
|
|
this.scaleLineColor = e.value(), this._paneSeparators.forEach((function(e) {
|
|
e.update()
|
|
})), this.update(), this.paint()
|
|
}
|
|
setScaleTextColor(e) {
|
|
this.scaleTextColor = e.value(), this.update(), this.paint()
|
|
}
|
|
setTimingsMeter(e) {
|
|
this._timingsMeter = e, this._updateTimingsMeterState()
|
|
}
|
|
ownerDocument() {
|
|
return this._parent.ownerDocument
|
|
}
|
|
_updateTimingsMeterState() {
|
|
var e = this._options.visible.value();
|
|
null !== this._timingsMeter && (e ? this._timingsMeter.startCollect() : this
|
|
._timingsMeter.stopCollect())
|
|
}
|
|
_update(e) {
|
|
var t = e ? e.fullInvalidation() : j.Full,
|
|
i = !!e && e.isVisibleTimeRangeLockedOnResize();
|
|
if (null !== this._timingsMeter && this._timingsMeter.startDraw(t),
|
|
t === j.Full && (this._model ? this._updateGui(i) : this.adjustSize(i)),
|
|
e.invalidateForTimeScale() > j.Cursor && this._timeAxisWidget.update(),
|
|
this.paint(e), this._dataWindowWidget) {
|
|
var s = e.maxPaneInvalidation();
|
|
s === j.Full ? this._dataWindowWidget.fullUpdate() : s > j.None && this
|
|
._dataWindowWidget.update()
|
|
}
|
|
for (var r = 0; r < this._paneWidgets.length; r++) this._paneWidgets[r]
|
|
.updateStatusWidget(e.invalidateForPane(r).fullInvalidation());
|
|
null !== this._timingsMeter && this._timingsMeter.stopDraw(), e && e
|
|
.panesOrderInvalidated() && ae.emit("panes_order_changed")
|
|
}
|
|
_createVolumeIfNeeded() {
|
|
var e = h.enabled("create_volume_indicator_by_default") && this._options
|
|
.addVolume,
|
|
t = !this._content,
|
|
i = h.enabled("charting_library_base"),
|
|
s = h.enabled("create_volume_indicator_by_default_once"),
|
|
r = this._content && !this._content.loading;
|
|
e && (t || i && r && !s) && this._model.mainSeries().dataEvents()
|
|
.symbolResolved().subscribe(this, (function() {
|
|
var e = this;
|
|
setTimeout((function() {
|
|
var t = e._model.model().mainSeries()
|
|
.symbolInfo();
|
|
if (t) {
|
|
var i = !t.has_no_volume;
|
|
if (!e.containsVolume() && i) {
|
|
var s = te.factoryDefaults(
|
|
"chartproperties.volumePaneSize"
|
|
),
|
|
r = e._model.model()
|
|
.createStudyInserter({
|
|
type: "java",
|
|
studyId: "Volume@tv-basicstudies"
|
|
});
|
|
r.setForceOverlay(h.enabled(
|
|
"volume_force_overlay")), r
|
|
.setPaneSize(s), h.enabled(
|
|
"hide_volume_ma") && r
|
|
.setPropertiesState({
|
|
styles: {
|
|
vol_ma: {
|
|
visible: !1
|
|
}
|
|
}
|
|
}), r.insert()
|
|
} else if (!i && e.containsVolume()) {
|
|
var n = e.model().dataSources()
|
|
.filter((function(e) {
|
|
return e instanceof w &&
|
|
"Volume" === e
|
|
.metaInfo()
|
|
.shortId
|
|
}))[0];
|
|
e._model.model().removeSource(n)
|
|
}
|
|
}
|
|
}), 0)
|
|
}), s)
|
|
}
|
|
_createSessions(e) {
|
|
var t = this.showGeneralChartProperties.bind(this, f.timezoneSessions);
|
|
e.createSessions(t)
|
|
}
|
|
_createPrePostMarket(e) {}
|
|
_createChartEventsSource() {
|
|
throw new Error("Not implemented")
|
|
}
|
|
_onChartStyleChanged() {
|
|
$("Chart", "Chart Style " + this._model.mainSeries().getStyleShortName()
|
|
.toUpperCase())
|
|
}
|
|
_updateGui(e) {
|
|
this._model && (this._makeTimeAxisWidget(), this
|
|
._makePaneWidgetsAndSeparators(), this._elMainTable.style
|
|
.userSelect = "none", this.adjustSize(e))
|
|
}
|
|
setVisibleTimeRange(e, t, i, s) {
|
|
{
|
|
const r = this._model.mainSeries().seriesSource();
|
|
this._chartSession.setVisibleTimeRange(r.instanceId(), r.turnaround(),
|
|
e, t, i || {}, s)
|
|
}
|
|
}
|
|
_makeLoadingScreen() {
|
|
if (h.enabled("lean_chart_load")) {
|
|
if (this.screen) return;
|
|
this.screen = new ee(this, this._parent)
|
|
} else this.screen = new ee(this, this._mainDiv)
|
|
}
|
|
_makeAvailableOnTVPopup() {
|
|
throw new Error("Not implemented")
|
|
}
|
|
_setSymbol(e, t) {
|
|
if (this._model) {
|
|
var i = this._model.mainSeries();
|
|
if (!t && i.symbolSameAsCurrent(e)) return;
|
|
this._model.selectionMacro((function(e) {
|
|
e.clearSelection()
|
|
})), this._model.setSymbol(this._model.mainSeries(), e)
|
|
} else this._properties.mainSeriesProperties.merge({
|
|
symbol: e
|
|
})
|
|
}
|
|
setSymbol(e, t) {
|
|
return this._setSymbol.apply(this, arguments)
|
|
}
|
|
loadRange(e) {
|
|
this._model && (this.screen.show(), this._model.loadRange(e))
|
|
}
|
|
getSymbol(e) {
|
|
var t;
|
|
return (t = this._model ? this._model.mainSeries().properties() : this
|
|
._properties.mainSeriesProperties) ? e && t.shortName && t.shortName
|
|
.value() ? t.shortName.value() : t.symbol.value() : ""
|
|
}
|
|
toggleMaximizePane(e) {
|
|
if (!(this._paneWidgets.length < 2)) {
|
|
this._maximizedPaneWidget ? (this._maximizedPaneWidget.state()
|
|
.setMaximized(!1), this._maximizedPaneWidget = null, this
|
|
._paneSeparators.forEach((function(e) {
|
|
e.show()
|
|
}))) : (this._maximizedPaneWidget = e, this._maximizedPaneWidget
|
|
.state().setMaximized(!0), this._paneSeparators.forEach((
|
|
function(e) {
|
|
e.hide()
|
|
})));
|
|
for (var t = this._paneWidgets.length; t--;) this._paneWidgets[t]
|
|
.updateControls(), this._paneWidgets[t].updatePriceAxisWidgets();
|
|
this._timeAxisWidget.updatePriceAxisStubs(), this.adjustSize(), this
|
|
.updateCrossHairPositionIfNeeded()
|
|
}
|
|
}
|
|
_titlesProvider(e, t) {
|
|
var i = this.model(),
|
|
s = this._maximizedPaneWidget ? this._maximizedPaneWidget.state() : i
|
|
.paneForSource(i.mainSeries()),
|
|
r = "right" === e ? s.rightPriceScales() : s.leftPriceScales();
|
|
if (r.length < t + 1) return [];
|
|
var n = r[t].orderedSources().filter((function(e) {
|
|
return e === i.mainSeries() || e instanceof w
|
|
}));
|
|
return n.reverse(), (n = a(n, i.mainSeries())).map((function(e) {
|
|
return e.title(!0, void 0, !1)
|
|
}))
|
|
}
|
|
_menuItemsProvider(e, t) {
|
|
var i = this.model(),
|
|
s = this._maximizedPaneWidget ? this._maximizedPaneWidget.state() : i
|
|
.paneForSource(i.mainSeries()),
|
|
r = "right" === e ? s.visibleRightPriceScales() : s
|
|
.visibleLeftPriceScales();
|
|
if (r.length < t + 1) return [];
|
|
var n = r[t],
|
|
o = i.panes().indexOf(s),
|
|
a = this._paneWidgets[o];
|
|
return ("right" === e ? a.rightPriceAxisesContainer() : a
|
|
.leftPriceAxisesContainer()).findAxisWidgetForScale(n)
|
|
.getContextMenuActions()
|
|
}
|
|
_makeTimeAxisWidget() {
|
|
if (this._timeAxisWidget) this._timeAxisWidget.updatePriceAxisStubs();
|
|
else {
|
|
var e = this.model();
|
|
this._timeAxisWidget = new l(this, this._options.timeScaleWidget, this
|
|
._titlesProvider.bind(this), this._menuItemsProvider.bind(this),
|
|
this._backgroundBasedTheme), this._elMainTable.appendChild(this
|
|
._timeAxisWidget.getElement()), this._timeAxisWidget
|
|
.updatePriceAxisStubs(), this._timeAxisWidget.onLabelHovered()
|
|
.subscribe(this, (function(t, i) {
|
|
var s = this._maximizedPaneWidget ? this
|
|
._maximizedPaneWidget.state() : e.paneForSource(e
|
|
.mainSeries()),
|
|
r = this.paneByState(s).highlightedPriceAxis(),
|
|
n = r.value();
|
|
(i || n.owner === t.owner) && (r.setValue({
|
|
owner: t.owner,
|
|
axis: i ? t.axis : null
|
|
}), this.model().model().lightUpdate())
|
|
}))
|
|
}
|
|
}
|
|
insertStudy(e, t, i, s) {
|
|
var r = this;
|
|
return new Promise((function(n) {
|
|
t ? window.runOrSignIn((function() {
|
|
n(r._insertStudy(e, t, i, s))
|
|
}), {
|
|
source: "study on study"
|
|
}) : n(r._insertStudy(e, t, i, s))
|
|
})).catch((function() {}))
|
|
}
|
|
_insertStudy(e, t, i, s) {
|
|
var r = this._model.createStudyInserter(e, t, i);
|
|
r.setForceOverlay("java" === e.type && "Volume@tv-basicstudies" === e
|
|
.studyId && h.enabled("volume_force_overlay"));
|
|
var n = this,
|
|
o = r.insert((function(e, t, i) {
|
|
return new Promise((function(r, o) {
|
|
n.selectPointMode().value() && n
|
|
.cancelRequestSelectPoint(), s ? r(s(e,
|
|
t, i)) : n.isSymbolicStudy(i) ? ($(
|
|
"GUI", "Confirmation dialogs",
|
|
"Symbol confirmation dialog"),
|
|
S(n, i, r, o, "symbol")) : n
|
|
.hasConfirmInputs(t) ? ($("GUI",
|
|
"Confirmation dialogs",
|
|
"Inputs confirmation dialog"),
|
|
S(n, i, r, o)) : r({})
|
|
}))
|
|
}));
|
|
return o.catch((function(e) {})), o
|
|
}
|
|
hasConfirmInputs(e) {
|
|
if (void 0 === e) return !1;
|
|
for (var t = 0; t < e.length; ++t) {
|
|
var i = e[t];
|
|
if (void 0 !== i.confirm && i.confirm) return !0
|
|
}
|
|
return !1
|
|
}
|
|
isSymbolicStudy(e) {
|
|
switch (e.id) {
|
|
case "Overlay@tv-basicstudies":
|
|
case "CorrelationCoefficient@tv-basicstudies":
|
|
case "Correlation Coeff@tv-basicstudies":
|
|
case "Spread@tv-basicstudies":
|
|
case "Ratio@tv-basicstudies":
|
|
return !0;
|
|
default:
|
|
return !1
|
|
}
|
|
}
|
|
_onChartSessionIsConnectedChanged(e) {
|
|
e ? this._onConnection() : this._onDisconnect()
|
|
}
|
|
_onChartSessionCriticalError(e, t) {
|
|
this._disconnected.fire(!0)
|
|
}
|
|
_onData(e) {
|
|
switch (e.method) {
|
|
case "reconnect_bailout":
|
|
this._reconnectBailout.fire();
|
|
break;
|
|
default:
|
|
this._model.onData(e)
|
|
}
|
|
}
|
|
_onConnection() {
|
|
this._online = !0, this._model ? (this._model.restart(), this._updateGui(),
|
|
this.update(), this.paint(), this._connected.fire()) : this
|
|
.requestMetadata()
|
|
}
|
|
_onDisconnect() {
|
|
this._model && this._model.disconnect(), this._online = !1, this.update(),
|
|
this.paint(), this._disconnected.fire()
|
|
}
|
|
_applyStudiesOverrides() {
|
|
Z.overrideDefaults(this._metaInfoRepository.getInternalMetaInfoArray())
|
|
}
|
|
requestMetadata() {
|
|
this._addPerfMark("RequestMetadataStart"), this._metaInfoRepository
|
|
.requestMetaInfo().then(function() {
|
|
this._addPerfMark("RequestMetadataEnd"), this._inited ? this
|
|
.model().model().setStudiesMetaData(this._metaInfoRepository
|
|
.getInternalMetaInfoArray(), this._metaInfoRepository
|
|
.getMigrations()) : (this._init(), this
|
|
.chartWidgetInitialized.fire(), h.enabled(
|
|
"charting_library_base") || ie.logDebug(
|
|
"initialized"))
|
|
}.bind(this))
|
|
}
|
|
studiesMetaData() {
|
|
return this._model.studiesMetaData()
|
|
}
|
|
getTimeScale() {
|
|
return this._timeAxisWidget
|
|
}
|
|
chartWidgetCollection() {
|
|
return this._chartWidgetCollection
|
|
}
|
|
setSeriesStyle(e, t) {
|
|
this._model.setProperty(e.properties().style, t)
|
|
}
|
|
showObjectsTreePanelOrDialog() {
|
|
var e = !1,
|
|
t = window.widgetbar;
|
|
t && t.isVisible() && (e = "object_tree" === t.setPage("object_tree").name);
|
|
e || this.showObjectsTreeDialog()
|
|
}
|
|
_showChartProperties(e, t, i, s) {
|
|
t && (m("properties_dialog.active_tab.chart", t), i.tabName = t);
|
|
var r = this;
|
|
return new Promise((function(t) {
|
|
d(e, r._model, i, r._chartWidgetCollection, s).then((
|
|
function(e) {
|
|
t(null !== e && e.isVisible() ? e : null)
|
|
}))
|
|
}))
|
|
}
|
|
showGeneralChartProperties(e) {
|
|
if (!h.enabled("show_chart_property_page")) return Promise.resolve(null);
|
|
var t = this;
|
|
return this._showChartProperties(this._model.mainSeries(), e, {
|
|
doNotCloseOnBgClick: !0,
|
|
onResetToDefault: function() {
|
|
t._model.restorePreferences(t._model), t.applyTheme(t)
|
|
}
|
|
}).then((function(e) {
|
|
if (null === e) return null;
|
|
var i = function() {
|
|
e.hide(), t._chartWidgetCollection.activeChartWidget
|
|
.unsubscribe(i)
|
|
};
|
|
return t._chartWidgetCollection.activeChartWidget.subscribe(
|
|
i), e
|
|
}))
|
|
}
|
|
showChartPropertiesForSource(e, t, i, s) {
|
|
return h.enabled("property_pages") ? e === this._model.model()
|
|
.mainSeries() ? this.showGeneralChartProperties(t) : ((i = i || {})
|
|
.onResetToDefault = this._model.restorePropertiesForSource.bind(this
|
|
._model, e), this._showChartProperties(e, t, i, s)) : Promise
|
|
.resolve(null)
|
|
}
|
|
generalPropertiesDefinitions() {
|
|
return this._getChartPropertyDefinitionsViewModel().then((function(e) {
|
|
return e.propertyPages()
|
|
}))
|
|
}
|
|
propertiesDefinitionsForSource(e) {
|
|
return I(e) || C(e) || M(e) ? e.getPropertyDefinitionsViewModel().then((
|
|
function(e) {
|
|
return null === e ? null : e.propertyPages()
|
|
})).catch((function(e) {
|
|
return ie.logWarn(e), null
|
|
})) : Promise.resolve(null)
|
|
}
|
|
toggleCompareOrAdd() {
|
|
this._compareDialog.visible().value() ? this._compareDialog.hide() : this
|
|
._compareDialog.show()
|
|
}
|
|
showIndicators(e) {
|
|
if (window.studyMarket) return window.studyMarket.visible().value() ?
|
|
void window.studyMarket.hide() : (window.studyMarket.show(e), window
|
|
.studyMarket)
|
|
}
|
|
showFundamentals(e) {
|
|
if (window.fundamentalsDialog) {
|
|
if (!window.fundamentalsDialog.visible().value()) {
|
|
var t, i = void 0 !== e ? e.title(!0) : void 0;
|
|
if (void 0 !== e) {
|
|
var s = e.symbolInfo();
|
|
t = null === s ? e.symbol() : s.ticker || s.full_name
|
|
}
|
|
return window.fundamentalsDialog.show(t, i), window
|
|
.fundamentalsDialog
|
|
}
|
|
window.fundamentalsDialog.hide()
|
|
}
|
|
}
|
|
removeSelectedSources() {
|
|
this.removeDataSources(this._model.selection().dataSources())
|
|
}
|
|
removeDataSources(e) {
|
|
var t = e.filter(function(e) {
|
|
return e !== this._model.mainSeries() && e !== this._model
|
|
.lineBeingCreated() && !(e instanceof O)
|
|
}.bind(this));
|
|
if (0 !== t.length) {
|
|
var i = null;
|
|
C(t[0]) && (n(1 === t.length,
|
|
"Cannot remove several studies (no multi select for studies)"
|
|
), i = t[0]);
|
|
t.find((function(e) {
|
|
return e.hasAlert.value() && e.isUserDeletable()
|
|
}));
|
|
i && i.hasChildren() ? showDeleteStudyTreeConfirm(this._model
|
|
.removeSelectedSources.bind(this._model)) : this._model
|
|
.removeSelectedSources()
|
|
}
|
|
}
|
|
unlinkSelectedLine() {
|
|
var e = this._model,
|
|
t = e.selection().lineDataSources();
|
|
e.unlinkLines(t)
|
|
}
|
|
copyLineToOtherCharts() {
|
|
var e = this._model,
|
|
t = e.selection().lineDataSources().filter((function(e) {
|
|
return e.isSynchronizable()
|
|
}));
|
|
e.copyToOtherCharts(t)
|
|
}
|
|
hideSelectedObject() {
|
|
this.hideDataSources(this._model.selection().dataSources())
|
|
}
|
|
hideDataSources(e) {
|
|
if (e.length) {
|
|
var t = e.map((function(e) {
|
|
return e.properties().visible
|
|
})),
|
|
i = e.map((function() {
|
|
return !1
|
|
}));
|
|
this._model.setProperties(t, i, "Hide " + e[0].title())
|
|
}
|
|
}
|
|
toggleLockSelectedObject() {
|
|
var e = this._model;
|
|
e.selection().lineDataSources().forEach((function(t) {
|
|
var i = t.properties().frozen.value();
|
|
e.setProperty(t.properties().frozen, !i, s(i ? "Unlock" :
|
|
"Lock") + " " + t.title())
|
|
}))
|
|
}
|
|
showSelectedSourceProperties() {
|
|
var e = this._model.selection().dataSources()[0];
|
|
e && this.showSourceProperties(e)
|
|
}
|
|
showSourceProperties(e) {
|
|
var t = null;
|
|
e === this._model.mainSeries() && (t = f.symbol), this
|
|
.showChartPropertiesForSource(e, t)
|
|
}
|
|
openSelectedObjectSource(e) {}
|
|
tags() {
|
|
return this._model ? this._model.calculateDefaultTags() : []
|
|
}
|
|
state(e, t, i, s) {
|
|
if (this._model) {
|
|
const r = this._model.state(e, t, i, s);
|
|
return r.chartId = this.id(), r
|
|
}
|
|
return this._content ? this._content : {}
|
|
}
|
|
asyncState() {
|
|
return this._model.asyncState()
|
|
}
|
|
metaInfo() {
|
|
var e = this._metaInfo;
|
|
return this._model && (e.systemTags = this._model.calculateDefaultTags()), e
|
|
}
|
|
onTagsChanged() {
|
|
return this._tagsChanged
|
|
}
|
|
onModelTagsChanged() {
|
|
this._tagsChanged.fire()
|
|
}
|
|
onAboutToBeDestroyed() {
|
|
return this._aboutToBeDestroyed
|
|
}
|
|
destroy() {
|
|
this._aboutToBeDestroyed.fire(), null !== this._removeMaximizeHotkey && (
|
|
this._removeMaximizeHotkey(), this._removeMaximizeHotkey = null),
|
|
0 !== this._drawRafId && this._parent.ownerDocument.defaultView
|
|
.cancelAnimationFrame(this._drawRafId), null !== this
|
|
._backgroundTopColorSpawn && this._backgroundTopColorSpawn.destroy(),
|
|
null !== this._backgroundBottomColorSpawn && this
|
|
._backgroundBottomColorSpawn.destroy(), null !== this._timingsMeter && (
|
|
this._timingsMeter.stopCollect(), this._timingsMeter = null);
|
|
for (var e = 0; e < this._paneWidgets.length; e++) this._paneWidgets[e]
|
|
.destroy();
|
|
this._paneWidgets.length = 0;
|
|
for (e = 0; e < this._paneSeparators.length; e++) this._paneSeparators[e]
|
|
.destroy();
|
|
for (var t in this._paneSeparators.length = 0, this._hotkeysListener && this
|
|
._hotkeysListener.destroy(), this._barsButton && this._barsButton
|
|
.destroy(), this._controlBarNavigation && (this
|
|
._controlBarNavigation.destroy(), this._controlBarNavigation =
|
|
void 0), this._mainDiv && this._mainDiv.remove(), this
|
|
._actions) {
|
|
var i = this._actions[t];
|
|
i instanceof A && (i.destroy(), i.binder && i.binder.destroy())
|
|
}
|
|
null !== this._timeAxisWidget && (this._timeAxisWidget.destroy(), this
|
|
._timeAxisWidget = null), null !== this._definitionsViewModel &&
|
|
this._definitionsViewModel.destroy(), this._hotkeys && (this._hotkeys
|
|
.destroy(), this._hotkeys = null), this._mainDiv
|
|
.removeEventListener("wheel", this._onWheelBound), window
|
|
.removeEventListener("keydown:chart_" + this._id, this
|
|
._keydownEventListener), super.destroy(), this._chartSession
|
|
.criticalError().unsubscribe(this, this._onChartSessionCriticalError),
|
|
this._chartSession.isConnected().unsubscribe(this
|
|
._boundOnChartSessionIsConnectedChanged), this._chartSession
|
|
.destroy()
|
|
}
|
|
title() {
|
|
return s("Chart Properties")
|
|
}
|
|
symbolProperty() {
|
|
return this._model.mainSeries().properties().shortName ? this._model
|
|
.mainSeries().properties().shortName : this._model.mainSeries()
|
|
.properties().symbol
|
|
}
|
|
loadContent(e, t) {
|
|
this.screen.show();
|
|
this.isMaximizedPane() && this.toggleMaximizePane();
|
|
for (var i, s = this._model.model().dataSources(), r = 0; r < s
|
|
.length; r++) {
|
|
var n = s[r];
|
|
n !== this._model.mainSeries() && this._model.model().removeSource(n, !
|
|
0)
|
|
}
|
|
this._model.disconnect(), this.activePaneWidget = null, this._model
|
|
.mainSeries().purgeSymbolInfo(), e.loading = !0, this._content = e, this
|
|
._initialLoading = Boolean(t);
|
|
for (r = 0; r < e.panes.length; ++r)
|
|
for (var o = 0; o < e.panes[r].sources.length; ++o)
|
|
if (e.panes[r].sources[o].state.symbol) {
|
|
i = e.panes[r].sources[o].state;
|
|
break
|
|
} if (!i) throw Error(
|
|
"An error occured while determining main series ion the chart");
|
|
this._properties.mainSeriesProperties.mergeAndFire({
|
|
visible: !0,
|
|
symbol: i.symbol,
|
|
timeframe: "",
|
|
onWidget: this._onWidget,
|
|
interval: i.interval || "D",
|
|
style: i.style
|
|
}), this._init(), this._model.undoHistory().clearStack()
|
|
}
|
|
_contentSeriesProperties() {
|
|
if (this._content)
|
|
for (var e = this._content.panes.length; e-- > 0;)
|
|
for (var t = this._content.panes[e].sources, i = t.length; i-- > 0;)
|
|
if ("MainSeries" === t[i].type) return t[i].state
|
|
}
|
|
updateUndoRedo() {
|
|
this._model && (this.actions().undo.update({
|
|
disabled: this._model.undoHistory().undoStack().isEmpty()
|
|
}), this.actions().redo.update({
|
|
disabled: this._model.undoHistory().redoStack().isEmpty()
|
|
}))
|
|
}
|
|
createSessionBreaksActions(e) {
|
|
var t = new A({
|
|
label: s("Session Breaks"),
|
|
checkable: !0,
|
|
statName: "ToggleSessionBreaks"
|
|
});
|
|
t.binder = new u(t, this._model.chartModel().sessions().properties()
|
|
.graphics.vertlines.sessBreaks.visible, this.model(),
|
|
"Session Breaks"), this._actions.sessionBreaks = t
|
|
}
|
|
updateActionForIntradayOnly(e) {
|
|
e && e instanceof A && e.update({
|
|
disabled: this.model().mainSeries().isDWM()
|
|
})
|
|
}
|
|
containsVolume() {
|
|
return this.model().dataSources().some((function(e) {
|
|
return e instanceof w && "Volume" === e.metaInfo().shortId
|
|
}))
|
|
}
|
|
containsStudyByPredicate(e) {
|
|
return !!this._model && this._model.dataSources().some((function(t) {
|
|
if (!(t instanceof w)) return !1;
|
|
var i = t.metaInfo();
|
|
return e(i)
|
|
}))
|
|
}
|
|
containsStudy(e) {
|
|
return this.containsStudyByPredicate((function(t) {
|
|
return t.id === e || t.fullId === e
|
|
}))
|
|
}
|
|
isSmall() {
|
|
return this._width() < 550 || this._height() < 300
|
|
}
|
|
onWidget() {
|
|
return this._onWidget
|
|
}
|
|
onCmeWidget() {
|
|
return "cme" === this.widgetCustomer()
|
|
}
|
|
widgetCustomer() {
|
|
return this._widgetCustomer
|
|
}
|
|
resize() {
|
|
var e = this._height() + "px",
|
|
t = this._width() + "px";
|
|
this._mainDiv.style.height = e, this._mainDiv.style.width = t, this
|
|
._elMainTable.style.height = e, this._elMainTable.style.width = t, this
|
|
._resizeHandler && this._mainDiv && this._resizeHandler()
|
|
}
|
|
chartSession() {
|
|
return this._chartSession
|
|
}
|
|
onLineCancelled() {
|
|
k.resetToCursor()
|
|
}
|
|
_startSpinner(e) {
|
|
this._spinner || e && (this._spinner = (new X).spin(e))
|
|
}
|
|
isJustClonedChart() {
|
|
return !!(this._options || {}).justCloned
|
|
}
|
|
applyOverrides(e) {
|
|
var t = {};
|
|
for (var i in e) i.startsWith("mainSeriesProperties.priceAxisProperties") ||
|
|
(t[i] = e[i]);
|
|
if (applyPropertiesOverrides(this.properties(), null, !1, t, null), this
|
|
._model) {
|
|
applyPropertiesOverrides(this._model.model().properties(), null, !1, t),
|
|
applyPropertiesOverrides(this._model.mainSeries().properties(),
|
|
null, !1, t, "mainSeriesProperties"), this._model.model()
|
|
.sessions().applyOverrides(t);
|
|
const e = this._model.chartModel().watermarkSource();
|
|
null !== e && e.applyOverrides(t)
|
|
}
|
|
}
|
|
applyStudiesOverrides(e) {
|
|
Z.mergeDefaultsOverrides(e), this._applyStudiesOverrides()
|
|
}
|
|
setActive(e) {
|
|
this._isActive = e, Q() && (e && this.selectPointMode().value() ? this
|
|
.startTrackingMode() : this.exitTrackingMode()), this._paneWidgets
|
|
.forEach((function(e) {
|
|
e.update()
|
|
})), e || this.model().selectionMacro((function(e) {
|
|
e.clearSelection()
|
|
}))
|
|
}
|
|
isActive() {
|
|
return this._isActive
|
|
}
|
|
trackTime() {
|
|
return this._chartWidgetCollection.lock.trackTime
|
|
}
|
|
crossHairSyncEnabled() {
|
|
return this._chartWidgetCollection.lock.crosshair.value()
|
|
}
|
|
isMultipleLayout() {
|
|
return ne(this._chartWidgetCollection.layout.value())
|
|
}
|
|
selectPointMode() {
|
|
return this._model.model().selectPointMode()
|
|
}
|
|
cancelRequestSelectPoint() {
|
|
this._model.model().cancelRequestSelectPoint()
|
|
}
|
|
requestSelectPoint(e, t, i) {
|
|
var s = this;
|
|
return new Promise((function(r, n) {
|
|
if (l()) {
|
|
k.resetToCursor(!0), s._model.lineBeingCreated() && s
|
|
._model.cancelCreatingLine();
|
|
var o = !1,
|
|
a = {};
|
|
s._model.model().onPointSelected().subscribe(a, (
|
|
function(e, t) {
|
|
o = !0, s._isVisible.unsubscribe(l), s
|
|
._hideHint(), r({
|
|
point: e,
|
|
pane: t
|
|
})
|
|
}), !0), s._model.model().requestSelectPoint(e,
|
|
i), s.startTrackingMode(), void 0 !== t && s
|
|
._showHint(t), s._isVisible.subscribe(l), s
|
|
.selectPointMode().subscribe((function() {
|
|
setTimeout((function() {
|
|
o || (s.selectPointMode()
|
|
.value() || s
|
|
._hideHint(), s
|
|
._model.model()
|
|
.onPointSelected()
|
|
.unsubscribeAll(
|
|
a), s
|
|
._isVisible
|
|
.unsubscribe(l),
|
|
n("cancelled"))
|
|
}))
|
|
}), {
|
|
once: !0
|
|
})
|
|
}
|
|
|
|
function l() {
|
|
return !!s.isVisible() || (n(
|
|
"Chartwidget must be visible"), s
|
|
.cancelRequestSelectPoint(), !1)
|
|
}
|
|
}))
|
|
}
|
|
showReplayOrderConfirmationDialog() {
|
|
if (!this.model().isInReplay()) return Promise.resolve()
|
|
}
|
|
_addPerfMark(e) {
|
|
oe("ChartWidget." + this._id + "." + e)
|
|
}
|
|
requestFullscreen() {
|
|
this._options.requestFullscreen()
|
|
}
|
|
getResizerDetacher() {
|
|
return this._options
|
|
}
|
|
_createHint() {
|
|
if (null === this._hintDefferedPromise) {
|
|
var e = ue();
|
|
this._hintDefferedPromise = e;
|
|
var t = this;
|
|
Promise.all([i.e("react"), i.e(89), i.e("chart-event-hint")]).then(i
|
|
.bind(null, "PN5r")).then((function(i) {
|
|
e.resolve(new i.ChartEventHintRenderer(t
|
|
._chartWidgetCollection.getContainer()))
|
|
}))
|
|
}
|
|
return this._hintDefferedPromise ? o(this._hintDefferedPromise).promise :
|
|
null
|
|
}
|
|
_showHint(e) {
|
|
if (h.enabled("popup_hints"))
|
|
if (null !== this._activeHint) this._activeHint.show(e);
|
|
else {
|
|
var t = this,
|
|
i = this._createHint();
|
|
null !== i && i.then((function(i) {
|
|
if (null !== i) {
|
|
if (t._activeHint = i, void 0 === e) return;
|
|
t._activeHint.show(e)
|
|
}
|
|
}))
|
|
}
|
|
}
|
|
_hideHint() {
|
|
null !== this._activeHint && this._activeHint.hide()
|
|
}
|
|
}
|
|
e.exports.ChartWidget = ge, e.exports.trackingModeIsAvailable = ce
|
|
}).call(this, i("aIyQ"))
|
|
},
|
|
"Zp/P": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "extendAndClipLineSegment", (function() {
|
|
return h
|
|
})), i.d(t, "getArrowPoints", (function() {
|
|
return u
|
|
})), i.d(t, "optimalBarWidth", (function() {
|
|
return d
|
|
})), i.d(t, "optimalCandlestickWidth", (function() {
|
|
return p
|
|
})), i.d(t, "optimalHiLoWidth", (function() {
|
|
return _
|
|
})), i.d(t, "interactionTolerance", (function() {
|
|
return m
|
|
})), i.d(t, "coordinateIsValid", (function() {
|
|
return f
|
|
})), i.d(t, "setValidLineStyle", (function() {
|
|
return g
|
|
})), i.d(t, "fillScaledRadius", (function() {
|
|
return b
|
|
})), i.d(t, "strokeScaledRadius", (function() {
|
|
return v
|
|
}));
|
|
var s = i("aO4+"),
|
|
r = i("hBTJ"),
|
|
n = i("VaSN"),
|
|
o = i("ogJP"),
|
|
a = i("jFln");
|
|
const l = {
|
|
line: 13,
|
|
minDistanceBetweenPoints: 10,
|
|
series: 14,
|
|
curve: 10,
|
|
anchor: 13,
|
|
esd: 4
|
|
},
|
|
c = {
|
|
line: 3,
|
|
minDistanceBetweenPoints: 5,
|
|
series: 2,
|
|
curve: 3,
|
|
anchor: 2,
|
|
esd: 0
|
|
};
|
|
|
|
function h(e, t, i, n, o, a) {
|
|
if (Object(s.equalPoints)(e, t)) return null;
|
|
const l = new s.Point(0, 0),
|
|
c = new s.Point(i, n);
|
|
if (o) {
|
|
if (a) {
|
|
const i = Object(r.intersectLineAndBox)(Object(s.lineThroughPoints)(e, t), Object(s
|
|
.box)(l, c));
|
|
return Array.isArray(i) ? i : null
|
|
} {
|
|
const i = Object(r.intersectRayAndBox)(t, e, Object(s.box)(l, c));
|
|
return null === i || Object(s.equalPoints)(t, i) ? null : Object(s.lineSegment)(t,
|
|
i)
|
|
}
|
|
}
|
|
if (a) {
|
|
const i = Object(r.intersectRayAndBox)(e, t, Object(s.box)(l, c));
|
|
return null === i || Object(s.equalPoints)(e, i) ? null : Object(s.lineSegment)(e, i)
|
|
} {
|
|
const i = Object(r.intersectLineSegmentAndBox)(Object(s.lineSegment)(e, t), Object(s
|
|
.box)(l, c));
|
|
return Array.isArray(i) ? i : null
|
|
}
|
|
}
|
|
|
|
function u(e, t, i, s) {
|
|
const r = .5 * i,
|
|
n = Math.sqrt(2),
|
|
o = t.subtract(e),
|
|
a = o.normalized();
|
|
let l = 5 * i;
|
|
s && (l = Math.min(l, .35 * o.length()));
|
|
const c = 1 * r;
|
|
if (l * n * .2 <= c) return [];
|
|
const h = a.scaled(l),
|
|
u = t.subtract(h),
|
|
d = a.transposed(),
|
|
p = 1 * l,
|
|
_ = d.scaled(p),
|
|
m = u.add(_),
|
|
f = u.subtract(_),
|
|
g = m.subtract(t).normalized().scaled(c),
|
|
b = f.subtract(t).normalized().scaled(c),
|
|
v = t.add(g),
|
|
S = t.add(b),
|
|
y = r * (n - 1),
|
|
w = d.scaled(y),
|
|
P = Math.min(l - 1 * r / n, r * n * 1),
|
|
C = a.scaled(P),
|
|
x = t.subtract(w),
|
|
T = t.add(w),
|
|
I = t.subtract(C);
|
|
return [
|
|
[m, v],
|
|
[f, S],
|
|
[x, I.subtract(w)],
|
|
[T, I.add(w)]
|
|
]
|
|
}
|
|
|
|
function d(e, t) {
|
|
return t = t || 1, Math.floor(.3 * e * t)
|
|
}
|
|
|
|
function p(e, t) {
|
|
if (e >= 2.5 && e <= 4) return Math.floor(3 * t);
|
|
const i = 1 - .2 * Math.atan(Math.max(4, e) - 4) / (.5 * Math.PI),
|
|
s = Math.floor(e * i * t),
|
|
r = Math.floor(e * t),
|
|
n = Math.min(s, r);
|
|
return Math.max(Math.floor(t), n)
|
|
}
|
|
|
|
function _(e) {
|
|
return .4 * e
|
|
}
|
|
|
|
function m() {
|
|
return Object(n.lastEventIsTouch)() ? l : c
|
|
}
|
|
|
|
function f(e) {
|
|
return null != e && !Object(o.isNaN)(e)
|
|
}
|
|
|
|
function g(e, t) {
|
|
void 0 !== t && Object(a.setLineStyle)(e, t)
|
|
}
|
|
|
|
function b(e, t) {
|
|
const i = Math.max(1, Math.floor(t)) % 2 ? .5 : 0;
|
|
return Math.round(e * t) + i
|
|
}
|
|
|
|
function v(e, t, i) {
|
|
const s = Math.max(1, Math.floor(t)) % 2 ? .5 : 0;
|
|
return Math.round(e * t) + (s !== i % 2 ? .5 : 0)
|
|
}
|
|
},
|
|
Zp8I: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "StepLineDecoration", (function() {
|
|
return s
|
|
})), i.d(t, "PaneRendererStepLine", (function() {
|
|
return f
|
|
}));
|
|
var s, r = i("GEp6"),
|
|
n = i("VdBB"),
|
|
o = i("aO4+"),
|
|
a = i("jFln"),
|
|
l = i("Y7w9"),
|
|
c = i("Zp/P"),
|
|
h = i("gAom"),
|
|
u = i("Tmoa");
|
|
! function(e) {
|
|
e[e.None = 0] = "None", e[e.Diamonds = 1] = "Diamonds"
|
|
}(s || (s = {}));
|
|
class d {
|
|
initialize(e, t, i, s) {
|
|
var r, n, o, l;
|
|
const c = e.lineStyle;
|
|
t.lineCap = "butt", t.lineJoin = "round";
|
|
const h = Math.max(Math.floor(null !== (n = null === (r = s.style) || void 0 === r ?
|
|
void 0 : r.width) && void 0 !== n ? n : e.lineWidth * i.pixelRatio));
|
|
void 0 !== c && Object(a.setLineStyle)(t, c);
|
|
const u = h % 2 ? .5 : 0;
|
|
t.moveTo(Math.round(s.x * i.pixelRatio) + u, Math.round(s.y * i.pixelRatio) + u), t
|
|
.strokeStyle = null !== (l = null === (o = s.style) || void 0 === o ? void 0 : o
|
|
.color) && void 0 !== l ? l : e.lineColor, t.lineWidth = h
|
|
}
|
|
finishFragment(e) {
|
|
e.stroke()
|
|
}
|
|
hitTest(e, t, i, s, n) {
|
|
var a, l;
|
|
const h = Math.round((i.x + s.x) / 2),
|
|
u = new o.Point(h, i.y),
|
|
d = new o.Point(h, s.y),
|
|
p = null !== (l = null === (a = i.style) || void 0 === a ? void 0 : a.width) &&
|
|
void 0 !== l ? l : e.lineWidth,
|
|
_ = Object(c.interactionTolerance)().series + p / 2;
|
|
return Math.min(Object(r.distanceToSegment)(i, u, n).distance, Object(r
|
|
.distanceToSegment)(u, d, n).distance, Object(r.distanceToSegment)(d, s,
|
|
n).distance) <= _
|
|
}
|
|
applyColor(e, t) {
|
|
e.strokeStyle = t
|
|
}
|
|
applyLineWidth(e, t) {
|
|
e.lineWidth = t
|
|
}
|
|
drawItem(e, t, i, s) {
|
|
e.lineTo(i.x, i.y), void 0 !== s && (e.lineTo(s.x, i.y), e.lineTo(s.x, s.y))
|
|
}
|
|
}
|
|
class p {
|
|
constructor() {
|
|
this._lineWidth = 1
|
|
}
|
|
initialize(e, t, i, s) {
|
|
var r, n, o, a;
|
|
this.applyColor(t, null !== (n = null === (r = s.style) || void 0 === r ? void 0 : r
|
|
.color) && void 0 !== n ? n : e.lineColor), this._lineWidth = Math.max(Math
|
|
.floor(null !== (a = null === (o = s.style) || void 0 === o ? void 0 : o
|
|
.width) && void 0 !== a ? a : e.lineWidth * i.pixelRatio))
|
|
}
|
|
finishFragment(e) {
|
|
e.fill()
|
|
}
|
|
drawItem(e, t, i, s, r) {
|
|
if (r && void 0 !== s && !Number.isNaN(s.y)) {
|
|
e.save(), e.translate(s.x, s.y), e.rotate(Math.PI / 4);
|
|
const i = this._scaleByLineWidth(this._lineWidth);
|
|
e.scale(i, i), this._drawItemRotatedAndTranslated(e, t), e.restore()
|
|
}
|
|
}
|
|
applyLineWidth(e, t) {
|
|
this._lineWidth = t
|
|
}
|
|
hitTest(e, t, i, s, r) {
|
|
var n, a;
|
|
if (!s.valIsNotSameAsPrev) return !1;
|
|
const l = Math.round((i.x + s.x) / 2),
|
|
c = new o.Point(l, s.y),
|
|
h = r.subtract(c),
|
|
u = Math.max(Math.floor(null !== (a = null === (n = i.style) || void 0 === n ?
|
|
void 0 : n.width) && void 0 !== a ? a : e.lineWidth * t.pixelRatio));
|
|
return this._hitTestTranslated(h, u)
|
|
}
|
|
_scaleByLineWidth(e) {
|
|
return Math.sqrt(e)
|
|
}
|
|
}
|
|
class _ extends p {
|
|
applyColor(e, t) {
|
|
e.fillStyle = t
|
|
}
|
|
_hitTestTranslated(e, t) {
|
|
return Math.abs(e.x) + Math.abs(e.y) < 8 * this._scaleByLineWidth(t) / 2
|
|
}
|
|
_drawItemRotatedAndTranslated(e, t) {
|
|
Object(h.drawRoundRect)(e, -4, -4, 8, 8, 2, !0)
|
|
}
|
|
}
|
|
class m extends p {
|
|
applyColor(e, t) {
|
|
e.fillStyle = Object(u.applyTransparency)(t, 90)
|
|
}
|
|
_hitTestTranslated(e, t) {
|
|
return Math.abs(e.x) + Math.abs(e.y) < 21 * this._scaleByLineWidth(t) / 2
|
|
}
|
|
_drawItemRotatedAndTranslated(e, t) {
|
|
Object(h.drawRoundRect)(e, -10.5, -10.5, 21, 21, 5, !0)
|
|
}
|
|
}
|
|
class f {
|
|
constructor() {
|
|
this._data = null
|
|
}
|
|
setData(e) {
|
|
this._data = e
|
|
}
|
|
hitTest(e, t) {
|
|
var i;
|
|
const r = this._data;
|
|
if (null === r || 0 === r.items.length) return null;
|
|
const o = r.items,
|
|
a = Object(l.lowerbound)(o, e, (e, t) => e.x <= t.x),
|
|
c = Math.max(0, a - 1),
|
|
h = Math.min(o.length - 1, a + 1),
|
|
u = function(e) {
|
|
switch (e) {
|
|
case s.Diamonds:
|
|
return [new d, new m];
|
|
default:
|
|
return [new d]
|
|
}
|
|
}(null === (i = this._data) || void 0 === i ? void 0 : i.decoration);
|
|
for (let i = c; i < h; i++) {
|
|
const s = o[i],
|
|
a = o[i + 1];
|
|
if (a && u.some(i => i.hitTest(r, t, s, a, e))) return new n.HitTestResult(n
|
|
.HitTestResult.REGULAR)
|
|
}
|
|
return null
|
|
}
|
|
draw(e, t) {
|
|
if (null === this._data || 0 === this._data.items.length) return;
|
|
e.save();
|
|
(function(e) {
|
|
switch (e) {
|
|
case s.Diamonds:
|
|
return [new d, new _, new m];
|
|
default:
|
|
return [new d]
|
|
}
|
|
})(this._data.decoration).forEach(i => this._drawImpl(e, t, i)), e.restore()
|
|
}
|
|
_drawImpl(e, t, i) {
|
|
var s, r, n, a, l, c, h, u, d, p;
|
|
if (null === this._data || 0 === this._data.items.length) return;
|
|
const {
|
|
lineWidth: _,
|
|
lineColor: m,
|
|
items: f
|
|
} = this._data, g = f.length, b = t.pixelRatio;
|
|
let v = Math.max(Math.floor(null !== (r = null === (s = f[0].style) || void 0 ===
|
|
s ? void 0 : s.width) && void 0 !== r ? r : _ * b)),
|
|
S = v % 2 ? .5 : 0;
|
|
i.initialize(this._data, e, t, f[0]), e.beginPath();
|
|
for (let s = 0; s < g; s++) {
|
|
const r = f[s],
|
|
g = f[s + 1],
|
|
y = Math.round(r.x * b) + S,
|
|
w = Math.round(r.y * b) + S;
|
|
if (!g) {
|
|
i.drawItem(e, t, Object(o.point)(y, w));
|
|
continue
|
|
}
|
|
const P = Math.round((r.x + g.x) / 2 * b) + S,
|
|
C = Math.round(g.y * b) + S;
|
|
i.drawItem(e, t, Object(o.point)(y, w), Object(o.point)(P, C), g
|
|
.valIsNotSameAsPrev);
|
|
const x = null !== (a = null === (n = r.style) || void 0 === n ? void 0 : n
|
|
.color) && void 0 !== a ? a : m,
|
|
T = null !== (c = null === (l = r.style) || void 0 === l ? void 0 : l
|
|
.width) && void 0 !== c ? c : _,
|
|
I = null !== (u = null === (h = g.style) || void 0 === h ? void 0 : h
|
|
.color) && void 0 !== u ? u : m,
|
|
M = null !== (p = null === (d = g.style) || void 0 === d ? void 0 : d
|
|
.width) && void 0 !== p ? p : _,
|
|
O = x !== I,
|
|
L = T !== M;
|
|
(O || L) && (i.finishFragment(e), O && i.applyColor(e, I), L && (v = Math.max(1,
|
|
Math.floor(M * b)), S = v % 2 ? .5 : 0, i.applyLineWidth(e, v)), e
|
|
.beginPath(), e.moveTo(P, C))
|
|
}
|
|
i.finishFragment(e)
|
|
}
|
|
}
|
|
},
|
|
ZsYR: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "OverlayStatusProvider", (function() {
|
|
return r
|
|
}));
|
|
var s = i("W+6j");
|
|
class r extends s.a {
|
|
getSplitTitle() {
|
|
return this._source.titleInParts(!0, void 0, !1, !1)
|
|
}
|
|
text() {
|
|
return this._source.isActualInterval() ? this._source.isFailed() ?
|
|
`${this._source.title(!0, void 0, !1, !1)}: ${this.sourceStatusText()}` :
|
|
`${this._source.title(!0, void 0, !1, !1)} ${this.sourceStatusText()}` :
|
|
this._source.title(!0, void 0, !1, !1)
|
|
}
|
|
}
|
|
},
|
|
ZtA1: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Ss5c").LineDataSource,
|
|
r = i("5rJj"),
|
|
n = i("j3hX"),
|
|
o = n.LineToolWidthsProperty,
|
|
a = n.LineToolColorsProperty;
|
|
class l extends s {
|
|
constructor(e, t) {
|
|
super(e, t || l.createProperties()), this.version = l.version, i.e("lt-pane-views")
|
|
.then(i.t.bind(null, "6sSH", 7)).then(({
|
|
TrendBasedFibExtensionPaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
levelsCount() {
|
|
return l.LevelsCount
|
|
}
|
|
pointsCount() {
|
|
return 3
|
|
}
|
|
name() {
|
|
return "Trend-Based Fib Extension"
|
|
}
|
|
migrateVersion(e, t, i) {
|
|
1 === e && this.properties().extendLines.setValue(!0)
|
|
}
|
|
processErase(e, t) {
|
|
var i = "level" + t,
|
|
s = this.properties()[i].visible;
|
|
e.setProperty(s, !1, "Erase level line")
|
|
}
|
|
static createProperties(e) {
|
|
var t = new r("linetooltrendbasedfibextension", e, !1, {
|
|
range: [0, 8]
|
|
});
|
|
return l._configureProperties(t), t
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "17v9")))
|
|
.FibDrawingsWith24LevelsDefinitionsViewModel
|
|
}
|
|
static _configureProperties(e) {
|
|
s._configureProperties(e);
|
|
for (var t = [e.child("trendline").child("linewidth"), e.child("levelsStyle").child(
|
|
"linewidth")], i = [e.child("trendline").child("color")], r = 1; r <= l
|
|
.LevelsCount; r++) i.push(e.child("level" + r).child("color"));
|
|
e.addChild("linesColors", new a(i)), e.addChild("linesWidths", new o(t))
|
|
}
|
|
fibLevelsBasedOnLogScale() {
|
|
return this.properties().fibLevelsBasedOnLogScale.value() && this.priceScale()
|
|
.isLog()
|
|
}
|
|
}
|
|
l.version = 2, l.LevelsCount = 24, t.LineToolTrendBasedFibExtension = l
|
|
},
|
|
"Zy3/": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "CompositeRenderer", (function() {
|
|
return s
|
|
}));
|
|
class s {
|
|
constructor() {
|
|
this._renderers = [], this._globalAlpha = 1
|
|
}
|
|
setGlobalAlpha(e) {
|
|
this._globalAlpha = e
|
|
}
|
|
append(e) {
|
|
this._renderers.push(e)
|
|
}
|
|
insert(e, t) {
|
|
this._renderers.splice(t, 0, e)
|
|
}
|
|
clear() {
|
|
this._renderers.length = 0
|
|
}
|
|
draw(e, t) {
|
|
for (let i = 0; i < this._renderers.length; i++) e.save(), e.globalAlpha = this
|
|
._globalAlpha, this._renderers[i].draw(e, t), e.restore()
|
|
}
|
|
drawBackground(e, t) {
|
|
e.save(), e.globalAlpha = this._globalAlpha;
|
|
for (let i = 0; i < this._renderers.length; i++) {
|
|
const s = this._renderers[i];
|
|
s.drawBackground && s.drawBackground(e, t)
|
|
}
|
|
e.restore()
|
|
}
|
|
hitTest(e, t) {
|
|
let i = null;
|
|
for (let s = this._renderers.length - 1; s >= 0; s--) {
|
|
const r = this._renderers[s].hitTest(e, t);
|
|
null !== r && (null === i || r.result() > i.result()) && (i = r)
|
|
}
|
|
return i
|
|
}
|
|
doesIntersectWithBox(e) {
|
|
return this._renderers.some(t => !!t.doesIntersectWithBox && t.doesIntersectWithBox(
|
|
e))
|
|
}
|
|
}
|
|
},
|
|
a7Ha: function(e, t, i) {
|
|
"use strict";
|
|
var s;
|
|
i.r(t), i.d(t, "LineEnd", (function() {
|
|
return s
|
|
})),
|
|
function(e) {
|
|
e[e.Normal = 0] = "Normal", e[e.Arrow = 1] = "Arrow", e[e.Circle = 2] = "Circle"
|
|
}(s || (s = {}))
|
|
},
|
|
aDyP: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Ss5c").LineDataSource,
|
|
r = i("5rJj"),
|
|
n = i("7KDR").Action,
|
|
o = i("rCHB").LineToolPitchforkStyle,
|
|
a = null,
|
|
l = i("j3hX"),
|
|
c = l.LineToolWidthsProperty,
|
|
h = l.LineToolColorsProperty;
|
|
class u extends s {
|
|
constructor(e, t) {
|
|
super(e, t || u.createProperties()), this._properties.style.listeners().subscribe(
|
|
this, u.prototype._recreatePaneView), this._recreatePaneView()
|
|
}
|
|
levelsCount() {
|
|
return u.LevelsCount
|
|
}
|
|
additionalActions(e) {
|
|
for (var t = [], i = ["Original", "Modified Schiff", "Inside", "Schiff"], s = 0; s <
|
|
4; s++) {
|
|
var r = new n({
|
|
checked: this.properties().style.value() === s,
|
|
checkable: !0,
|
|
label: window.t(i[s]),
|
|
payload: {
|
|
target: this,
|
|
value: s
|
|
},
|
|
onExecute: function(t) {
|
|
var i = t.getPayload(),
|
|
s = i.target;
|
|
e.setProperty(s.properties().style, i.value,
|
|
`Change ${s.name()} Style`), s.updateAllViews(), s
|
|
._model.updateSource(s)
|
|
}
|
|
});
|
|
t.push(r)
|
|
}
|
|
return [t[0], t[3], t[1], t[2]]
|
|
}
|
|
_recreatePaneView() {
|
|
if (null !== a) {
|
|
var e = [];
|
|
this._properties.style.value() === o.Original ? e = [new a
|
|
.PitchforkLinePaneView(this, this._model)
|
|
] : this._properties.style.value() === o.Schiff ? e = [new a
|
|
.SchiffPitchforkLinePaneView(this, this._model)
|
|
] : this._properties.style.value() === o.Schiff2 ? e = [new a
|
|
.SchiffPitchfork2LinePaneView(this, this._model)
|
|
] : this._properties.style.value() === o.Inside && (e = [new a
|
|
.InsidePitchforkLinePaneView(this, this._model)
|
|
]), this._setPaneViews(e)
|
|
} else i.e("lt-pane-views").then(i.t.bind(null, "cT+B", 7)).then(e => {
|
|
null === a && (a = e), this._recreatePaneView()
|
|
})
|
|
}
|
|
pointsCount() {
|
|
return 3
|
|
}
|
|
name() {
|
|
return "Pitchfork"
|
|
}
|
|
processErase(e, t) {
|
|
var i = "level" + t,
|
|
s = this.properties()[i].visible;
|
|
e.setProperty(s, !1, "Erase level line")
|
|
}
|
|
static createProperties(e) {
|
|
var t = new r("linetoolpitchfork", e, !1, {
|
|
range: [0, 8]
|
|
});
|
|
return u._configureProperties(t), t
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "HCdA")))
|
|
.PitchForkDefinitionsViewModel
|
|
}
|
|
static _configureProperties(e) {
|
|
s._configureProperties(e);
|
|
for (var t = [e.child("median").child("linewidth")], i = [e.child("median").child(
|
|
"color")], r = 0; r <= u.LevelsCount; r++) t.push(e.child("level" + r)
|
|
.child("linewidth")), i.push(e.child("level" + r).child("color"));
|
|
e.addChild("linesColors", new h(i)), e.addChild("linesWidths", new c(t))
|
|
}
|
|
}
|
|
u.LevelsCount = 8, t.LineToolPitchfork = u
|
|
},
|
|
aILO: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineToolHeadAndShoulders", (function() {
|
|
return o
|
|
}));
|
|
var s = i("Ocx9"),
|
|
r = i("Ss5c"),
|
|
n = i("j3hX");
|
|
class o extends r.LineDataSource {
|
|
constructor(e, t) {
|
|
const s = t || o.createProperties();
|
|
super(e, s), i.e("lt-pane-views").then(i.bind(null, "Fx2Q")).then(t => {
|
|
this._setPaneViews([new t.LineToolHeadAndShouldersPaneView(this,
|
|
e)])
|
|
})
|
|
}
|
|
pointsCount() {
|
|
return 7
|
|
}
|
|
name() {
|
|
return "Head and Shoulders"
|
|
}
|
|
properties() {
|
|
return super.properties()
|
|
}
|
|
static createProperties(e) {
|
|
const t = new s.DefaultProperty("linetoolheadandshoulders", e);
|
|
return o._configureProperties(t), t
|
|
}
|
|
_getPropertyDefinitionsViewModelClass() {
|
|
return Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "/HOw")).then(
|
|
e => e.PatternWithBackgroundDefinitionViewModel)
|
|
}
|
|
static _configureProperties(e) {
|
|
r.LineDataSource._configureProperties(e), e.addChild("linesColors", new n
|
|
.LineToolColorsProperty([e.childs().color])), e.addChild("textsColors",
|
|
new n.LineToolColorsProperty([e.childs().textcolor]))
|
|
}
|
|
}
|
|
},
|
|
aIha: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineToolFlagMark", (function() {
|
|
return a
|
|
}));
|
|
var s = i("aO4+"),
|
|
r = i("Ss5c"),
|
|
n = i("Ocx9"),
|
|
o = i("j3hX");
|
|
class a extends r.LineDataSource {
|
|
constructor(e, t) {
|
|
super(e, t || a.createProperties()), i.e("lt-pane-views").then(i.bind(null,
|
|
"y/56")).then(({
|
|
FlagMarkPaneView: e
|
|
}) => {
|
|
const t = new e(this, this.model());
|
|
t.setAnchors(new s.Point(0, 0)), this._setPaneViews([t])
|
|
})
|
|
}
|
|
pointsCount() {
|
|
return 1
|
|
}
|
|
name() {
|
|
return "Flag Mark"
|
|
}
|
|
properties() {
|
|
return super.properties()
|
|
}
|
|
static createProperties(e) {
|
|
e && void 0 === e.flagColor && (e.flagColor = "#318757");
|
|
const t = new n.DefaultProperty("linetoolflagmark", e);
|
|
return a._configureProperties(t), t
|
|
}
|
|
_getPropertyDefinitionsViewModelClass() {
|
|
return Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "w/mY")).then(
|
|
e => e.FlagMarkDefinitionsViewModel)
|
|
}
|
|
static _configureProperties(e) {
|
|
r.LineDataSource._configureProperties(e), e.addChild("backgroundsColors", new o
|
|
.LineToolColorsProperty([e.childs().flagColor])), e.addExclusion(
|
|
"backgroundsColors")
|
|
}
|
|
}
|
|
a.version = 2
|
|
},
|
|
aIyQ: function(e, t, i) {
|
|
"use strict";
|
|
(function(e) {
|
|
const t = i("txPx").getLogger("Common.Delegate");
|
|
|
|
function s() {
|
|
this._listeners = []
|
|
}
|
|
|
|
function r(e) {
|
|
return !e.singleshot
|
|
}
|
|
s.prototype.subscribe = function(e, t, i) {
|
|
const s = {
|
|
object: e,
|
|
member: t,
|
|
singleshot: !!i,
|
|
skip: !1
|
|
};
|
|
this._listeners.push(s)
|
|
}, s.prototype.unsubscribe = function(e, t) {
|
|
for (let i = 0; i < this._listeners.length; ++i) {
|
|
const s = this._listeners[i];
|
|
if (s.object === e && s.member === t) {
|
|
s.skip = !0, this._listeners.splice(i, 1);
|
|
break
|
|
}
|
|
}
|
|
}, s.prototype.unsubscribeAll = function(e) {
|
|
for (let t = this._listeners.length - 1; t >= 0; --t) {
|
|
const i = this._listeners[t];
|
|
i.object === e && (i.skip = !0, this._listeners.splice(t, 1))
|
|
}
|
|
}, s.prototype.destroy = function() {
|
|
delete this._listeners
|
|
}, s.prototype.fire = function() {
|
|
const e = this._listeners;
|
|
this._listeners = this._listeners.filter(r);
|
|
const i = e.length;
|
|
for (let s = 0; s < i; ++s) {
|
|
const i = e[s];
|
|
if (!i.skip) try {
|
|
i.member.apply(i.object || null, arguments)
|
|
} catch (e) {
|
|
t.logError(e.stack || e.message)
|
|
}
|
|
}
|
|
}, "undefined" != typeof window && (window.Delegate = s), e && e.exports && (e
|
|
.exports = s)
|
|
}).call(this, i("YuTi")(e))
|
|
},
|
|
"aO4+": function(e, t, i) {
|
|
"use strict";
|
|
Object.defineProperty(t, "__esModule", {
|
|
value: !0
|
|
}), t.equalBoxes = t.box = t.halfplaneThroughPoint = t.halfplane = t.lineSegment = t
|
|
.lineThroughPoints = t.line = t.equalPoints = t.point = t.Point = void 0;
|
|
var s = function() {
|
|
function e(e, t) {
|
|
this.x = e, this.y = t
|
|
}
|
|
return e.prototype.add = function(t) {
|
|
return new e(this.x + t.x, this.y + t.y)
|
|
}, e.prototype.addScaled = function(t, i) {
|
|
return new e(this.x + i * t.x, this.y + i * t.y)
|
|
}, e.prototype.subtract = function(t) {
|
|
return new e(this.x - t.x, this.y - t.y)
|
|
}, e.prototype.dotProduct = function(e) {
|
|
return this.x * e.x + this.y * e.y
|
|
}, e.prototype.crossProduct = function(e) {
|
|
return this.x * e.y - this.y * e.x
|
|
}, e.prototype.signedAngle = function(e) {
|
|
return Math.atan2(this.crossProduct(e), this.dotProduct(e))
|
|
}, e.prototype.angle = function(e) {
|
|
return Math.acos(this.dotProduct(e) / (this.length() * e.length()))
|
|
}, e.prototype.length = function() {
|
|
return Math.sqrt(this.x * this.x + this.y * this.y)
|
|
}, e.prototype.scaled = function(t) {
|
|
return new e(this.x * t, this.y * t)
|
|
}, e.prototype.normalized = function() {
|
|
return this.scaled(1 / this.length())
|
|
}, e.prototype.transposed = function() {
|
|
return new e(-this.y, this.x)
|
|
}, e.prototype.clone = function() {
|
|
return new e(this.x, this.y)
|
|
}, e
|
|
}();
|
|
|
|
function r(e, t) {
|
|
return new s(e, t)
|
|
}
|
|
|
|
function n(e, t) {
|
|
return e.x === t.x && e.y === t.y
|
|
}
|
|
|
|
function o(e, t, i) {
|
|
if (0 === e && 0 === t) throw new Error("A and B can not be both equal to zero.");
|
|
return {
|
|
A: e,
|
|
B: t,
|
|
C: i
|
|
}
|
|
}
|
|
|
|
function a(e, t) {
|
|
return {
|
|
edge: e,
|
|
isPositive: t
|
|
}
|
|
}
|
|
t.Point = s, t.point = r, t.equalPoints = n, t.line = o, t.lineThroughPoints = function(e, t) {
|
|
if (n(e, t)) throw new Error("Points should be distinct");
|
|
return o(e.y - t.y, t.x - e.x, e.x * t.y - t.x * e.y)
|
|
}, t.lineSegment = function(e, t) {
|
|
if (n(e, t)) throw new Error("Points of a segment should be distinct");
|
|
return [e, t]
|
|
}, t.halfplane = a, t.halfplaneThroughPoint = function(e, t) {
|
|
return a(e, e.A * t.x + e.B * t.y + e.C > 0)
|
|
}, t.box = function(e, t) {
|
|
return {
|
|
min: r(Math.min(e.x, t.x), Math.min(e.y, t.y)),
|
|
max: r(Math.max(e.x, t.x), Math.max(e.y, t.y))
|
|
}
|
|
}, t.equalBoxes = function(e, t) {
|
|
return n(e.min, t.min) && n(e.max, t.max)
|
|
}
|
|
},
|
|
aR4w: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Eyy1"),
|
|
r = i("Hr11"),
|
|
n = i("LxhU"),
|
|
o = i("ocLq"),
|
|
a = i("oamr");
|
|
class l extends a.a {
|
|
constructor(e, t, i, r, n, o) {
|
|
super(e), Object(s.assert)(t < i),
|
|
this._priceLow = this._mixinJSONObject.createDoubleField(t, "priceLow"),
|
|
this._priceHigh = this._mixinJSONObject.createDoubleField(i, "priceHigh"),
|
|
this._rate = this._mixinJSONObject.createDoubleArrayField(r, "rate"), this
|
|
._firstBarTime = this._mixinJSONObject.createTimeField(n, "firstBarTime"),
|
|
this._lastBarTime = this._mixinJSONObject.createTimeField(o, "lastBarTime")
|
|
}
|
|
isNaN() {
|
|
return super.isNaN() || Number.isNaN(this._priceLow.get()) || Number.isNaN(this
|
|
._priceHigh.get()) || 0 === this._rate.get().length
|
|
}
|
|
jsonName() {
|
|
return "hhists"
|
|
}
|
|
primitiveData() {
|
|
return {
|
|
id: this.id(),
|
|
priceHigh: this._priceHigh.get(),
|
|
priceLow: this._priceLow.get(),
|
|
rate: this._rate.get().slice(),
|
|
firstBarTime: this._firstBarTime.get(),
|
|
lastBarTime: this._lastBarTime.get()
|
|
}
|
|
}
|
|
setPriceLow(e) {
|
|
this._priceLow.set(e) && this._processObjUpdate()
|
|
}
|
|
priceLow() {
|
|
return this._priceLow.get()
|
|
}
|
|
priceHigh() {
|
|
return this._priceHigh.get()
|
|
}
|
|
setPriceHigh(e) {
|
|
this._priceHigh.set(e) && this._processObjUpdate()
|
|
}
|
|
rate() {
|
|
return this._rate.get().slice()
|
|
}
|
|
setRate(e) {
|
|
this._rate.set(e) && this._processObjUpdate()
|
|
}
|
|
rateAt(e) {
|
|
return this._rate.get()[e]
|
|
}
|
|
ratesSum() {
|
|
let e = 0;
|
|
for (const t of this._rate.get()) !Number.isNaN(t) && Number.isFinite(t) && (
|
|
e += t);
|
|
return e
|
|
}
|
|
firstBarTime() {
|
|
return this._firstBarTime.get()
|
|
}
|
|
setFirstBarTime(e) {
|
|
this._firstBarTime.set(e) && this._processObjUpdate()
|
|
}
|
|
lastBarTime() {
|
|
return this._lastBarTime.get()
|
|
}
|
|
setLastBarTime(e) {
|
|
this._lastBarTime.set(e) && this._processObjUpdate()
|
|
}
|
|
}
|
|
var c = i("WYmP");
|
|
class h {
|
|
constructor(e, t, i) {
|
|
this.index = e, this.offset = i, this.level = t
|
|
}
|
|
isNaN() {
|
|
return Number.isNaN(this.level)
|
|
}
|
|
equals(e) {
|
|
return e instanceof h && (!this.isNaN() && (!e.isNaN() && (this.index === e.index &&
|
|
this.offset === e.offset && o.Std.equal(this.level, e.level))))
|
|
}
|
|
getLevel() {
|
|
return this.level
|
|
}
|
|
getIndex() {
|
|
return this.index
|
|
}
|
|
}
|
|
class u extends a.a {
|
|
constructor(e, t) {
|
|
super(e), this._points = [], t && (this._points = t)
|
|
}
|
|
addPoint(e) {
|
|
this._processObjUpdate(), this._points.push(e)
|
|
}
|
|
addPoints(e) {
|
|
this._processObjUpdate(), this._points.push(...e)
|
|
}
|
|
setPoint(e, t) {
|
|
const i = this._points[e];
|
|
t.equals(i) || (this._processObjUpdate(), this._points[e] = t)
|
|
}
|
|
point(e) {
|
|
const t = this._points[e];
|
|
return new h(t.index, t.level, t.offset)
|
|
}
|
|
points() {
|
|
return this._points
|
|
}
|
|
pointsCount() {
|
|
return this._points.length
|
|
}
|
|
setPoints(e) {
|
|
if (e.length === this._points.length) {
|
|
let t = !0;
|
|
for (let i = 0; i < e.length; ++i)
|
|
if (!e[i].equals(this._points[i])) {
|
|
t = !1;
|
|
break
|
|
} if (t) return
|
|
}
|
|
this._processObjUpdate(), this._points = [], this._points.push(...e)
|
|
}
|
|
clearPoints() {
|
|
this._processObjUpdate(), this._points = []
|
|
}
|
|
isNaN() {
|
|
return super.isNaN() || this._points.length < 3
|
|
}
|
|
jsonName() {
|
|
return "polygons"
|
|
}
|
|
primitiveData() {
|
|
return {
|
|
id: this.id(),
|
|
points: this._points.map(e => ({
|
|
index: e.index,
|
|
offset: e.offset,
|
|
level: e.level
|
|
}))
|
|
}
|
|
}
|
|
}
|
|
class d extends a.a {
|
|
constructor(e, t, i, s, r = !1, n = !1) {
|
|
super(e), this._endIndex = this._mixinJSONObject.createTimeField(i, "endIndex"),
|
|
this._extendLeft = this._mixinJSONObject.createField(r, "extendLeft"), this
|
|
._extendRight = this._mixinJSONObject.createField(n, "extendRight"), this
|
|
._level = this._mixinJSONObject.createDoubleField(s, "level"), this
|
|
._startIndex = this._mixinJSONObject.createTimeField(t, "startIndex")
|
|
}
|
|
isNaN() {
|
|
return super.isNaN() || Number.isNaN(this._level.get()) || this._startIndex
|
|
.get() < 0 || this._endIndex.get() < 0 || this._startIndex.get() === this
|
|
._endIndex.get() && !this._extendLeft.get() && !this._extendRight.get()
|
|
}
|
|
jsonName() {
|
|
return "horizlines"
|
|
}
|
|
primitiveData() {
|
|
return {
|
|
id: this.id(),
|
|
startIndex: this._startIndex.get(),
|
|
endIndex: this._endIndex.get(),
|
|
extendLeft: this._extendLeft.get(),
|
|
extendRight: this._extendRight.get(),
|
|
level: this._level.get()
|
|
}
|
|
}
|
|
startIndex() {
|
|
return this._startIndex.get()
|
|
}
|
|
setStartIndex(e) {
|
|
this._startIndex.set(e) && this._processObjUpdate()
|
|
}
|
|
endIndex() {
|
|
return this._endIndex.get()
|
|
}
|
|
setEndIndex(e) {
|
|
this._endIndex.set(e) && this._processObjUpdate()
|
|
}
|
|
level() {
|
|
return this._level.get()
|
|
}
|
|
setLevel(e) {
|
|
this._level.set(e) && this._processObjUpdate()
|
|
}
|
|
isExtendLeft() {
|
|
return this._extendLeft.get()
|
|
}
|
|
setExtendLeft(e) {
|
|
this._extendLeft.set(e) && this._processObjUpdate()
|
|
}
|
|
extendLeft() {
|
|
return this.isExtendLeft()
|
|
}
|
|
isExtendRight() {
|
|
return this._extendRight.get()
|
|
}
|
|
setExtendRight(e) {
|
|
this._extendRight.set(e) && this._processObjUpdate()
|
|
}
|
|
extendRight() {
|
|
return this.isExtendRight()
|
|
}
|
|
}
|
|
i.d(t, "a", (function() {
|
|
return _
|
|
}));
|
|
class p {
|
|
constructor() {
|
|
this._map = new Map
|
|
}
|
|
get(e) {
|
|
const t = this._innerMap(e.start);
|
|
return t && t.get(e.end)
|
|
}
|
|
set(e, t) {
|
|
this._innerMap(e.start, !0).set(e.end, t)
|
|
}
|
|
clear() {
|
|
this._map.clear()
|
|
}
|
|
size() {
|
|
let e = 0;
|
|
return this._map.forEach(t => e += t.size), e
|
|
}
|
|
_innerMap(e, t) {
|
|
let i = this._map.get(e);
|
|
return void 0 === i && t && (i = new Map, this._map.set(e, i)), i
|
|
}
|
|
}
|
|
class _ {
|
|
constructor(e, t, i, r, n, o, a, l, h, u, d, _, m, f) {
|
|
this._freezedBoxes = new c.a, this._freezedHists = new c.a, this._freezedPocs =
|
|
new c.a, this._freezedVAHists = new c.a, this._currentHistsGr = new c.a, this
|
|
._currentVAHistsGr = new c.a, this._currentHists = [], this._currentHistsMap =
|
|
new p, this._currentBox = null, this._currentPoc = null, this
|
|
._historyBarSet = [], this._prevRtBar = null, this._minPrice = Number
|
|
.POSITIVE_INFINITY, this._maxPrice = Number.NEGATIVE_INFINITY, this
|
|
._leftBoxTime = null, this._rightBoxTime = null, this._needRecalc = !1, this
|
|
._largestHistItem = null, this._rowsLayout = null, this._currentVAStart = 0,
|
|
this._currentVAEnd = 0, this._previousVAStart = 0, this._previousVAEnd = 0, this
|
|
._idsGenerator = null, Object(s.assert)(1 === e || 2 === e), this
|
|
._numOfSubHists = e, this._outHists = r, this._outBoxLines = n, this
|
|
._outPocLines = o, this._extendPocLeftRight = a, this._outVAHists = l, this
|
|
._vaVolumePercent = h, this._rowsLayoutSupplier = u, this._outHists.addStable(
|
|
this._freezedHists), this._outVAHists.addStable(this._freezedVAHists), this
|
|
._maxHHistItems = d, this._layoutIsAutoselected = f, this._leftBoxTimeMutable =
|
|
_, this._rightBoxTimeMutable = m, this._ctx = t, this._seriesGetter = i
|
|
}
|
|
update(e) {
|
|
this._supplyRowsLayout(this._ctx), null === this._currentBox && this
|
|
._initCurrentBox(), null === this._currentPoc && this._initCurrentPoc();
|
|
const t = this._timeScale().get(e);
|
|
this._leftBoxTime = this._leftBoxTimeMutable, this._rightBoxTime = this
|
|
._rightBoxTimeMutable, this._ctx.symbol.isLastBar && !Number.isNaN(this
|
|
._rightBoxTime) && (this._rightBoxTime = Math.min(t + n.Interval.parse(this
|
|
._ctx.symbol.interval + this._ctx.symbol.resolution).inMilliseconds(
|
|
t) - 1, this._rightBoxTime));
|
|
const i = o.Std.greaterOrEqual(this._seriesClose().get(e), this._seriesOpen().get(
|
|
e)),
|
|
s = {
|
|
high: this._seriesHigh().get(e),
|
|
low: this._seriesLow().get(e),
|
|
volume: this._seriesVol().get(e),
|
|
isUp: i,
|
|
time: t
|
|
};
|
|
this._updateCurrentHistogram(s), this._currentHists.length > 0 && (this
|
|
._largestHistItem = this._getLargestHistItem(), this._updateCurrentPoc(),
|
|
this._seriesGetter.developingPoc().set(this._currentPoc.level()), this
|
|
._updateValueArea(), this._vaVolumePercent > 0 && (this._seriesGetter
|
|
.developingVAHigh().set(this._currentHists[this._currentVAEnd]
|
|
.priceHigh()), this._seriesGetter.developingVALow().set(this
|
|
._currentHists[this._currentVAStart].priceLow()))), this
|
|
._updateCurrentBox(), this._rebuildOutData()
|
|
}
|
|
setIdsGeneratorProxy(e) {
|
|
this._idsGenerator = e
|
|
}
|
|
nextGraphicsObjId() {
|
|
return Object(s.ensureNotNull)(this._idsGenerator).nextGraphicsObjId()
|
|
}
|
|
pushEraseObjCmd(e, t) {
|
|
Object(s.ensureNotNull)(this._idsGenerator).pushEraseObjCmd(e, t)
|
|
}
|
|
popEraseCmds() {
|
|
return Object(s.ensureNotNull)(this._idsGenerator).popEraseCmds()
|
|
}
|
|
_timeScale() {
|
|
return this._seriesGetter.time()
|
|
}
|
|
_seriesLow() {
|
|
return this._seriesGetter.low()
|
|
}
|
|
_seriesHigh() {
|
|
return this._seriesGetter.high()
|
|
}
|
|
_seriesVol() {
|
|
return this._seriesGetter.volume()
|
|
}
|
|
_seriesOpen() {
|
|
return this._seriesGetter.open()
|
|
}
|
|
_seriesClose() {
|
|
return this._seriesGetter.close()
|
|
}
|
|
_freezeCurrentHistogramAndCleanup() {
|
|
null !== this._currentBox && this._freezedBoxes.add(this._currentBox), o.Std
|
|
.greater(this._getVolume(this._currentHists), 0) && (this._freezedHists.addAll(
|
|
this._currentHistsGr), this._freezedVAHists.addAll(this
|
|
._currentVAHistsGr), null !== this._currentPoc && this._freezedPocs.add(
|
|
this._currentPoc)), this._currentHists = [], this._currentHistsGr.clear(),
|
|
this._currentHistsMap.clear(), this._initCurrentBox(), this._initCurrentPoc(),
|
|
this._currentVAHistsGr.clear(), this._historyBarSet = [], this._minPrice =
|
|
Number.POSITIVE_INFINITY, this._maxPrice = Number.NEGATIVE_INFINITY, this
|
|
._prevRtBar = null, this._leftBoxTime = null, this._rightBoxTime = null
|
|
}
|
|
_supplyRowsLayout(e) {
|
|
null === this._rowsLayout && e.symbol.isFirstBar && e.symbol.isNewBar && (this
|
|
._rowsLayout = this._rowsLayoutSupplier())
|
|
}
|
|
_updateCurrentHistogram(e) {
|
|
if (this._needRecalc = !1, o.Std.greater(this._minPrice, e.low) && (this._minPrice =
|
|
e.low, this._needRecalc = !0), o.Std.less(this._maxPrice, e.high) && (this
|
|
._maxPrice = e.high, this._needRecalc = !0), this._ctx.symbol.isBarClosed &&
|
|
this._historyBarSet.length > 0) {
|
|
const t = this._historyBarSet[this._historyBarSet.length - 1];
|
|
t.time === e.time && (this._prevRtBar = t, this._historyBarSet.pop())
|
|
}
|
|
this._needRecalc && 0 === Object(s.ensureNotNull)(this._rowsLayout).type() ? (this
|
|
._recalculateCurrentResultsOnHistoryBarSet(), this
|
|
._applyUpdateToCurrentResults(e, !1)) : this._applyUpdateToCurrentResults(e,
|
|
!0), this._ctx.symbol.isBarClosed ? (Object(s.assert)(null === this
|
|
._prevRtBar || e.time === this._prevRtBar.time), this._historyBarSet
|
|
.push(e), this._prevRtBar = null) : this._prevRtBar = e
|
|
}
|
|
_getMidLevel(e) {
|
|
return (e.priceHigh() + e.priceLow()) / 2
|
|
}
|
|
_getMidLevelFromList(e) {
|
|
return e.length % 2 == 0 ? e[e.length / 2].priceLow() : this._getMidLevel(e[Math
|
|
.floor(e.length / 2)])
|
|
}
|
|
_getLargestHistItem() {
|
|
let e = [],
|
|
t = this._currentHists[0];
|
|
for (const i of this._currentHists) o.Std.greater(i.ratesSum(), t.ratesSum()) ? (t =
|
|
i,
|
|
e = [t]) : o.Std.equal(i.ratesSum(), t.ratesSum()) && e.push(i);
|
|
if (e.length > 1) {
|
|
const i = this._getMidLevelFromList(this._currentHists);
|
|
t = e[e.length - 1];
|
|
for (let s = e.length - 2; s >= 0; s--) {
|
|
const r = e[s];
|
|
o.Std.lessOrEqual(Math.abs(this._getMidLevel(r) - i), Math.abs(this
|
|
._getMidLevel(t) - i)) && (t = r)
|
|
}
|
|
}
|
|
return t
|
|
}
|
|
_initCurrentPoc() {
|
|
this._currentPoc = new d(this, 0, 0, 0)
|
|
}
|
|
_updateCurrentPoc() {
|
|
const e = Object(s.ensureNotNull)(this._currentPoc);
|
|
e.setStartIndex(Object(s.ensureNotNull)(this._leftBoxTime)), e.setEndIndex(Object(s
|
|
.ensureNotNull)(this._rightBoxTime)), e.setExtendLeft(this
|
|
._extendPocLeftRight), e.setExtendRight(this._extendPocLeftRight);
|
|
const t = this._getMidLevel(Object(s.ensureNotNull)(this._largestHistItem));
|
|
e.setLevel(t)
|
|
}
|
|
_getVolume(e) {
|
|
let t = 0;
|
|
for (const i of e) t += i.ratesSum();
|
|
return t
|
|
}
|
|
_getPocHistItemIndex() {
|
|
for (let e = 0; e < this._currentHists.length; e++)
|
|
if (this._currentHists[e] === this._largestHistItem) return e;
|
|
return -1
|
|
}
|
|
_calculateValueArea() {
|
|
const e = this._getPocHistItemIndex();
|
|
Object(s.assert)(e >= 0, "ERROR - PocHistItemIndex == " + e), this._currentVAStart =
|
|
e - 1, this._currentVAEnd = e + 1;
|
|
const t = this._getVolume(this._currentHists) * this._vaVolumePercent * .01;
|
|
let i = this._currentHists[e].ratesSum(),
|
|
r = 0,
|
|
n = null;
|
|
for (; o.Std.lessOrEqual(i + r, t) && (i += r, 0 === n ? --this._currentVAStart :
|
|
1 === n && ++this._currentVAEnd, -1 !== this._currentVAStart || this
|
|
._currentVAEnd !== this._currentHists.length);) {
|
|
let t, i;
|
|
if (this._currentVAStart > -1)
|
|
if (t = this._currentHists[this._currentVAStart].ratesSum(), this
|
|
._currentVAEnd < this._currentHists.length)
|
|
if (i = this._currentHists[this._currentVAEnd].ratesSum(), o.Std
|
|
.greater(t, i)) r = t, n = 0;
|
|
else if (o.Std.greater(i, t)) r = i, n = 1;
|
|
else {
|
|
const s = Math.abs(e - this._currentVAStart),
|
|
o = Math.abs(e - this._currentVAEnd);
|
|
s < o ? (r = t, n = 0) : o <= s && (r = i, n = 1)
|
|
} else r = t, n = 0;
|
|
else r = this._currentHists[this._currentVAEnd].ratesSum(), n = 1
|
|
}
|
|
this._currentVAStart++, this._currentVAEnd--
|
|
}
|
|
_isVA(e) {
|
|
return e.priceHigh() > this._getMidLevel(this._currentHists[this
|
|
._currentVAStart]) && e.priceLow() < this._getMidLevel(this._currentHists[
|
|
this
|
|
._currentVAEnd])
|
|
}
|
|
_updateValueArea() {
|
|
if (this._calculateValueArea(), this._needRecalc || this._previousVAStart !== this
|
|
._currentVAStart || this._previousVAEnd !== this._currentVAEnd) {
|
|
let e = 0,
|
|
t = 0;
|
|
for (; e < this._currentHistsGr.size() && t < this._currentVAHistsGr.size();) {
|
|
for (; e < this._currentHistsGr.size() && !this._isVA(this._currentHistsGr
|
|
.get(e));) e++;
|
|
for (; t < this._currentVAHistsGr.size() && this._isVA(this
|
|
._currentVAHistsGr.get(t));) t++;
|
|
if (e < this._currentHistsGr.size() && t < this._currentVAHistsGr.size()) {
|
|
const i = this._currentHistsGr.get(e);
|
|
this._currentHistsGr.set(e, this._currentVAHistsGr.get(t)), this
|
|
._currentVAHistsGr.set(t, i)
|
|
}
|
|
}
|
|
for (; e < this._currentHistsGr.size(); e++) {
|
|
const t = this._currentHistsGr.get(e);
|
|
this._isVA(t) && (this._currentHistsGr.remove(e), e--, this
|
|
._currentVAHistsGr.add(t))
|
|
}
|
|
for (; t < this._currentVAHistsGr.size(); t++) {
|
|
const e = this._currentVAHistsGr.get(t);
|
|
this._isVA(e) || (this._currentVAHistsGr.remove(t), t--, this
|
|
._currentHistsGr.add(e))
|
|
}
|
|
}
|
|
this._previousVAStart = this._currentVAStart, this._previousVAEnd = this
|
|
._currentVAEnd
|
|
}
|
|
_initCurrentBox() {
|
|
this._currentBox = new u(this)
|
|
}
|
|
_updateCurrentBox() {
|
|
let e = this._minPrice,
|
|
t = this._maxPrice;
|
|
this._currentHists.length > 0 && (e = this._currentHists[0].priceLow(), t = this
|
|
._currentHists[this._currentHists.length - 1].priceHigh());
|
|
const i = [],
|
|
r = Object(s.ensureNotNull)(this._leftBoxTime),
|
|
n = Object(s.ensureNotNull)(this._rightBoxTime);
|
|
i.push(new h(r, e)), i.push(new h(r, t)), i.push(new h(n, t)), i.push(new h(n, e)),
|
|
Object(s.ensureNotNull)(this._currentBox).setPoints(i)
|
|
}
|
|
_recalculateCurrentResultsOnHistoryBarSet() {
|
|
for (let e = 0; e < this._currentHists.length; ++e) this._currentHists[e].erase();
|
|
this._currentHists = [], this._currentHistsGr.clear(), this._currentVAHistsGr
|
|
.clear(), this._currentHistsMap.clear();
|
|
for (let e = 0; e < this._historyBarSet.length; e++) this._addHistoryBarToHistogram(
|
|
this._historyBarSet[e], e, this._currentHists, this._currentHistsMap, 1);
|
|
this._currentHists.length > 0 && (this._largestHistItem = this
|
|
._getLargestHistItem(), this._updateCurrentPoc()), this._updateCurrentBox()
|
|
}
|
|
_applyUpdateToCurrentResults(e, t) {
|
|
t && null !== this._prevRtBar && this._addHistoryBarToHistogram(this._prevRtBar,
|
|
this._historyBarSet.length - 1, this._currentHists, this._currentHistsMap, -
|
|
1), this._addHistoryBarToHistogram(e, this._historyBarSet.length - 1, this
|
|
._currentHists, this._currentHistsMap, 1), this
|
|
._updateLastBarTimeInHistogram(this._currentHists)
|
|
}
|
|
_addHistoryBarToHistogram(e, t, i, r, n) {
|
|
Object(s.assert)(-1 === n || 1 === n, "Please set sign argument either +1 or -1");
|
|
const a = e.low,
|
|
l = e.high,
|
|
c = isNaN(e.volume) ? 0 : e.volume,
|
|
h = e.isUp,
|
|
u = Object(s.ensureNotNull)(this._rowsLayout);
|
|
u.init(this._ctx.symbol.minTick, this._minPrice, this._maxPrice, a, l);
|
|
const d = u.rowWidth();
|
|
if (!o.Std.greater(d, 0)) return;
|
|
u.calculate();
|
|
const p = u.getIndexLowVbP(),
|
|
_ = u.getIndexHighVbP(),
|
|
m = u.getStartPrice();
|
|
if (p === _) {
|
|
const e = p * d + m,
|
|
t = (p + 1) * d + m;
|
|
this._updateResult({
|
|
start: e,
|
|
end: t
|
|
}, n * c, h, i, r)
|
|
} else {
|
|
let e = 0;
|
|
for (let t = p; t <= _; t++) {
|
|
const s = t * d + m,
|
|
o = (t + 1) * d + m,
|
|
u = this._rowCoeff(s, o, a, l),
|
|
p = u * c;
|
|
e += u, this._updateResult({
|
|
start: s,
|
|
end: o
|
|
}, n * p, h, i, r)
|
|
}
|
|
Object(s.assert)(o.Std.equal(e, 1, .05),
|
|
"totalCoeff not equal 1! totalConf = " + e)
|
|
}
|
|
}
|
|
_updateResult(e, t, i, r, n) {
|
|
const a = this._createRates(i, t);
|
|
Object(s.assert)(null !== this._leftBoxTime,
|
|
"leftBoxTime is not set (equals null)"), Object(s.assert)(null !== this
|
|
._rightBoxTime, "rightBoxTime is not set (equals null)");
|
|
const c = Object(s.ensureNotNull)(this._leftBoxTime),
|
|
h = Object(s.ensureNotNull)(this._rightBoxTime);
|
|
let u = n.get(e);
|
|
if (void 0 === u) u = new l(this, e.start, e.end, a, c, h), n.set(e, u), this
|
|
._verifyHistogramSizeIsNotTooLarge(n.size()), this._currentHistsGr.add(u), _
|
|
._addInOrder(u, r, 0, r.length, (e, t) => {
|
|
let i = o.Std.compare(e.firstBarTime(), t.firstBarTime());
|
|
return 0 !== i ? i : (i = o.Std.compare(e.priceLow(), t.priceLow()),
|
|
0 !== i ? i : o.Std.compare(e.priceHigh(), t.priceHigh()))
|
|
});
|
|
else {
|
|
const e = [];
|
|
for (let t = 0; t < a.length; t++) e[t] = u.rateAt(t) + a[t];
|
|
u.setRate(e)
|
|
}
|
|
}
|
|
_rebuildOutData() {
|
|
const e = this._currentHistsMap.size(),
|
|
t = this._currentHists.length,
|
|
i = this._currentHistsGr.size(),
|
|
r = this._currentVAHistsGr.size();
|
|
Object(s.assert)(e === t && t === i + r,
|
|
`Collections of HHistItems are out of sync ${e} ${t} ${i} ${r}`), this
|
|
._outPocLines.clear(), this._outPocLines.addAll(this._freezedPocs),
|
|
o.Std.greater(this._getVolume(this._currentHists), 0) ? (this._outHists
|
|
.setVariable(this._currentHistsGr), this._outPocLines.add(Object(s
|
|
.ensureNotNull)(this._currentPoc)), this._outVAHists.setVariable(this
|
|
._currentVAHistsGr)) : (this._outHists.setVariable(null), this
|
|
._outVAHists.setVariable(null)), this._outBoxLines.clear(), this
|
|
._outBoxLines.addAll(this._freezedBoxes), this._outBoxLines.add(Object(s
|
|
.ensureNotNull)(this._currentBox))
|
|
}
|
|
_verifyHistogramSizeIsNotTooLarge(e) {
|
|
if (this._layoutIsAutoselected) return;
|
|
if (e <= this._maxHHistItems) return;
|
|
const t = Object(s.ensureNotNull)(this._rowsLayout);
|
|
0 === t.type() ? o.Std.error(
|
|
'Histogram is too large, please reduce "Row Size" input.') : (Object(s
|
|
.assert)(1 === t.type(), "Unexpected rowsLayout type " + t.type()), o
|
|
.Std.error('Histogram is too large, please increase "Row Size" input.'))
|
|
}
|
|
_createRates(e, t) {
|
|
if (1 === this._numOfSubHists) return [t];
|
|
if (2 === this._numOfSubHists) {
|
|
const i = [0, 0];
|
|
return i[e ? 0 : 1] = t, i
|
|
}
|
|
return Object(s.assert)(!1, "Incorrect value of numOfSubHists = " + this
|
|
._numOfSubHists), []
|
|
}
|
|
_updateLastBarTimeInHistogram(e) {
|
|
const t = Object(s.ensureNotNull)(this._rightBoxTime);
|
|
for (const i of e) i.setLastBarTime(t)
|
|
}
|
|
_rowCoeff(e, t, i, s) {
|
|
const r = s - i;
|
|
return (t - e - Math.max(t - s, 0) - Math.max(0, i - e)) / r
|
|
}
|
|
static _addInOrder(e, t, i, s, n) {
|
|
if (i === s) return void t.splice(i, 0, e);
|
|
const o = Object(r.toInt)((i + s) / 2),
|
|
a = t[o];
|
|
n(e, a) < 0 ? _._addInOrder(e, t, i, o, n) : n(e, a) > 0 ? _._addInOrder(e, t, o +
|
|
1, s, n) : t.splice(o, 0, e)
|
|
}
|
|
}
|
|
},
|
|
aVjL: function(e, t) {
|
|
e.exports =
|
|
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 28 28" width="28" height="28"><path fill="currentColor" fill-rule="evenodd" d="M11.5 6a.5.5 0 0 0-.5.5V8h6V6.5a.5.5 0 0 0-.5-.5h-5zM18 8V6.5c0-.83-.67-1.5-1.5-1.5h-5c-.83 0-1.5.67-1.5 1.5V8H5.5a.5.5 0 0 0 0 1H7v12.5A2.5 2.5 0 0 0 9.5 24h9a2.5 2.5 0 0 0 2.5-2.5V9h1.5a.5.5 0 0 0 0-1H18zm2 1H8v12.5c0 .83.67 1.5 1.5 1.5h9c.83 0 1.5-.67 1.5-1.5V9zm-8.5 3c.28 0 .5.22.5.5v7a.5.5 0 0 1-1 0v-7c0-.28.22-.5.5-.5zm5.5.5a.5.5 0 0 0-1 0v7a.5.5 0 0 0 1 0v-7z"/></svg>'
|
|
},
|
|
b1GK: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "addPerfMark", (function() {
|
|
return c
|
|
})), i.d(t, "startPerfMeasure", (function() {
|
|
return h
|
|
})), i.d(t, "endPerfMeasure", (function() {
|
|
return u
|
|
})), i.d(t, "perfMeasureOperation", (function() {
|
|
return d
|
|
}));
|
|
var s = i("e3/o");
|
|
|
|
function r() {}
|
|
const n = console.timeStamp ? console.timeStamp.bind(console) : r,
|
|
o = window.performance && performance.mark ? performance.mark.bind(performance) : r,
|
|
a = window.performance && performance.measure ? performance.measure.bind(performance) : r,
|
|
l = window.performance && performance.clearMarks ? performance.clearMarks.bind(
|
|
performance) : r;
|
|
|
|
function c(e) {
|
|
n(e), o(e)
|
|
}
|
|
|
|
function h(e) {
|
|
o(e)
|
|
}
|
|
|
|
function u(e) {
|
|
a(e, e), l(e)
|
|
}
|
|
async function d(e, t) {
|
|
const i = `measure-${e}-${Object(s.randomHash)()}`;
|
|
o(i);
|
|
try {
|
|
return await t()
|
|
} finally {
|
|
a(e, i), l(i)
|
|
}
|
|
}
|
|
},
|
|
bJYc: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "SetPropertyUndoCommand", (function() {
|
|
return n
|
|
}));
|
|
var s = i("RDU5"),
|
|
r = i("Ocx9");
|
|
class n extends s.UndoCommand {
|
|
constructor(e, t, i, s, r) {
|
|
super(i), this._targetObj = e, this._newValue = t, this._oldValue = this
|
|
._targetObj.value(), this._model = s, r && this.setCustomFlag(
|
|
"doesnt_affect_save", !0)
|
|
}
|
|
redo() {
|
|
Object(r.saveDefaultProperties)(!0), this._targetObj.setValue(this._newValue),
|
|
Object(r.saveDefaultProperties)(!1), this._model.recalculateAllPanes(), this
|
|
._model.lightUpdate()
|
|
}
|
|
undo() {
|
|
Object(r.saveDefaultProperties)(!0), this._targetObj.setValue(this._oldValue),
|
|
Object(r.saveDefaultProperties)(!1), this._model.recalculateAllPanes(), this
|
|
._model.lightUpdate()
|
|
}
|
|
}
|
|
},
|
|
bKFv: function(e, t, i) {
|
|
"use strict";
|
|
var s;
|
|
i.r(t), i.d(t, "StatsPosition", (function() {
|
|
return s
|
|
})),
|
|
function(e) {
|
|
e[e.Left = 0] = "Left", e[e.Center = 1] = "Center", e[e.Right = 2] = "Right"
|
|
}(s || (s = {}))
|
|
},
|
|
bOGh: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return r
|
|
}));
|
|
var s = i("RDU5");
|
|
class r extends s.UndoCommand {
|
|
constructor(e) {
|
|
super(e, !1), this._subcommands = []
|
|
}
|
|
addCommand(e) {
|
|
this._subcommands.push(e)
|
|
}
|
|
isEmpty() {
|
|
return 0 === this._subcommands.length
|
|
}
|
|
redo() {
|
|
for (let e = 0; e < this._subcommands.length; e++) this._subcommands[e].redo()
|
|
}
|
|
undo() {
|
|
for (let e = this._subcommands.length - 1; e >= 0; e--) this._subcommands[e]
|
|
.undo()
|
|
}
|
|
commands() {
|
|
return this._subcommands
|
|
}
|
|
}
|
|
},
|
|
bSeV: function(e, t, i) {},
|
|
bTqm: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineToolCypherPattern", (function() {
|
|
return n
|
|
}));
|
|
var s = i("NJRZ"),
|
|
r = i("Ocx9");
|
|
class n extends s.LineTool5PointsPattern {
|
|
constructor(e, t) {
|
|
super(e, t || n.createProperties())
|
|
}
|
|
name() {
|
|
return "Cypher Pattern"
|
|
}
|
|
static createProperties(e) {
|
|
const t = new r.DefaultProperty("linetoolcypherpattern", e);
|
|
return n._configureProperties(t), t
|
|
}
|
|
_loadPaneViews(e) {
|
|
i.e("lt-pane-views").then(i.bind(null, "mjK7")).then(t => {
|
|
this._setPaneViews([new t.CypherPaneView(this, e)])
|
|
})
|
|
}
|
|
static _configureProperties(e) {
|
|
s.LineTool5PointsPattern._configureProperties(e)
|
|
}
|
|
}
|
|
},
|
|
bc0y: function(e, t, i) {},
|
|
biIa: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "SeriesWaterlinePaneView", (function() {
|
|
return a
|
|
}));
|
|
var s = i("k4w6"),
|
|
r = i("//lt"),
|
|
n = i("VdBB"),
|
|
o = i("8Uy/");
|
|
class a extends s.a {
|
|
constructor(e) {
|
|
super(e);
|
|
const t = {
|
|
cursorType: r.PaneCursorType.VerticalResize,
|
|
activeItem: 0,
|
|
areaName: n.AreaName.SourceItemMove
|
|
};
|
|
this._lineRenderer.setHitTest(new n.HitTestResult(n.HitTestResult.MOVEPOINT,
|
|
t)), this._lineRendererData.visible = !0, this._lineRendererData
|
|
.linestyle =
|
|
o.LINESTYLE_SPARSE_DOTTED
|
|
}
|
|
_updateImpl() {
|
|
const e = this._series.properties().baselineStyle,
|
|
t = Math.abs(100 - e.baseLevelPercentage.value());
|
|
this._lineRendererData.y = Math.round(this._series.priceScale().height() * (t /
|
|
100)), this._lineRendererData.color = e.baselineColor.value()
|
|
}
|
|
}
|
|
},
|
|
bmVy: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "StudyStatusType", (function() {
|
|
return r
|
|
})), i.d(t, "convertStudyStatusToString", (function() {
|
|
return n
|
|
}));
|
|
const s = window.t("loading...");
|
|
var r;
|
|
|
|
function n(e, t) {
|
|
if (e.type === r.Loading) return t ? s : "loading...";
|
|
if (e.type === r.Error) {
|
|
const i = e.errorDescription,
|
|
s = t ? window.t(i.error) : i.error;
|
|
if (i.ctx) {
|
|
const e = {};
|
|
return Object.entries(i.ctx).forEach(([t, i]) => {
|
|
e[t] = i.toString()
|
|
}), s.format(e)
|
|
}
|
|
return s
|
|
}
|
|
return ""
|
|
}! function(e) {
|
|
e[e.Undefined = 0] = "Undefined", e[e.Loading = 1] = "Loading", e[e.Completed = 2] =
|
|
"Completed", e[e.Error = 3] = "Error"
|
|
}(r || (r = {}))
|
|
},
|
|
"bv/X": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineToolSineLine", (function() {
|
|
return n
|
|
}));
|
|
var s = i("Ocx9"),
|
|
r = i("Ss5c");
|
|
class n extends r.LineDataSource {
|
|
constructor(e, t) {
|
|
super(e, t || n.createProperties()), i.e("lt-pane-views").then(i.bind(null,
|
|
"piZW")).then(e => {
|
|
this._setPaneViews([new e.SineLinePaneView(this, this._model)])
|
|
})
|
|
}
|
|
pointsCount() {
|
|
return 2
|
|
}
|
|
name() {
|
|
return "Sine Line"
|
|
}
|
|
static createProperties(e) {
|
|
const t = new s.DefaultProperty("linetoolsineline", e);
|
|
return n._configureProperties(t), t
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "LX4V")))
|
|
.CyclicAndSineLinesPatternDefinitionsViewModel
|
|
}
|
|
static _configureProperties(e) {
|
|
r.LineDataSource._configureProperties(e)
|
|
}
|
|
}
|
|
},
|
|
c2JX: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "renderSpinnerTemplate", (function() {
|
|
return n
|
|
})), i.d(t, "Spinner", (function() {
|
|
return a
|
|
}));
|
|
i("SzKR");
|
|
var s = i("gWrr"),
|
|
r = i("Owlf");
|
|
|
|
function n(e = "") {
|
|
return '\n\t\t<div class="tv-spinner" role="progressbar">\n\t\t\t<div class="tv-spinner__spinner-layer">\n\t\t\t\t<div class="tv-spinner__background tv-spinner__width_element"></div>\n\t\t\t\t<div class="tv-spinner__circle-clipper tv-spinner__width_element tv-spinner__circle-clipper--left"></div>\x3c!--\n\t\t\t\t--\x3e<div class="tv-spinner__circle-clipper tv-spinner__width_element tv-spinner__circle-clipper--right"></div>\n\t\t\t</div>\n\t\t</div>\n\t'
|
|
}
|
|
const o = Object(s.b)(
|
|
'\n\t\t<div class="tv-spinner" role="progressbar">\n\t\t\t<div class="tv-spinner__spinner-layer">\n\t\t\t\t<div class="tv-spinner__background tv-spinner__width_element"></div>\n\t\t\t\t<div class="tv-spinner__circle-clipper tv-spinner__width_element tv-spinner__circle-clipper--left"></div>\x3c!--\n\t\t\t\t--\x3e<div class="tv-spinner__circle-clipper tv-spinner__width_element tv-spinner__circle-clipper--right"></div>\n\t\t\t</div>\n\t\t</div>\n\t'
|
|
);
|
|
class a {
|
|
constructor(e) {
|
|
this._shown = !1, this._el = o.cloneNode(!0), this.setSize(e || r.a)
|
|
}
|
|
spin(e) {
|
|
return this._el.classList.add("tv-spinner--shown"), void 0 === this._container && (
|
|
this._container = e, void 0 !== e && e.appendChild(this._el)), this
|
|
._shown = !0, this
|
|
}
|
|
stop(e) {
|
|
return e && void 0 !== this._container && this._container.removeChild(this._el),
|
|
this._el.classList.remove("tv-spinner--shown"), this._shown = !1, this
|
|
}
|
|
setStyle(e) {
|
|
return Object.keys(e).forEach(t => {
|
|
const i = e[t];
|
|
void 0 !== i && this._el.style.setProperty(t, i)
|
|
}), this
|
|
}
|
|
setSize(e) {
|
|
const t = void 0 !== e ? "tv-spinner--size_" + e : "";
|
|
return this._el.className =
|
|
`tv-spinner ${t} ${this._shown ? "tv-spinner--shown" : ""}`, this
|
|
}
|
|
getEl() {
|
|
return this._el
|
|
}
|
|
destroy() {
|
|
this.stop(), delete this._el, delete this._container
|
|
}
|
|
}
|
|
},
|
|
c44N: function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e, t) {
|
|
return e.pixelRatio === t.pixelRatio
|
|
}
|
|
i.r(t), i.d(t, "areEqualPaneRenderParams", (function() {
|
|
return s
|
|
}))
|
|
},
|
|
c7G1: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "b", (function() {
|
|
return s
|
|
})), i.d(t, "a", (function() {
|
|
return r
|
|
})), i.d(t, "c", (function() {
|
|
return n
|
|
}));
|
|
class s {
|
|
constructor(e, t) {
|
|
this.id = e, this.type = t
|
|
}
|
|
primitiveData() {
|
|
return {
|
|
action: "one",
|
|
id: this.id,
|
|
type: this.type
|
|
}
|
|
}
|
|
}
|
|
class r {
|
|
primitiveData() {
|
|
return {
|
|
action: "all"
|
|
}
|
|
}
|
|
}
|
|
class n {
|
|
constructor() {
|
|
this.erase = [], this.create = null, this._modified = !1
|
|
}
|
|
primitiveData(e) {
|
|
if (this.isNaN()) return null;
|
|
const t = {},
|
|
i = this.create && this.create.primitiveData(e);
|
|
return null !== i && (t.create = i), null !== this.erase && this.erase.length > 0 &&
|
|
(t.erase = this.erase.map(e => e.primitiveData())), void 0 === t.create &&
|
|
void 0 === t.erase ? null : t
|
|
}
|
|
setCreate(e) {
|
|
this.create = e, this.create.forEachList(e => e.setOwner(this))
|
|
}
|
|
isNaN() {
|
|
return (null === this.erase || 0 === this.erase.length) && null === this.create
|
|
}
|
|
isModified() {
|
|
return this._modified
|
|
}
|
|
setModified(e) {
|
|
this._modified = e
|
|
}
|
|
dirty() {
|
|
this._modified = !0
|
|
}
|
|
setOwner(e) {
|
|
throw new Error("Unsupported")
|
|
}
|
|
}
|
|
},
|
|
cBZt: function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e, t) {
|
|
return `${e}@${t}`
|
|
}
|
|
|
|
function r(e) {
|
|
return e.replace(/(@[^-]+-[^-]+).*$/, "$1")
|
|
}
|
|
i.r(t), i.d(t, "studyIdString", (function() {
|
|
return s
|
|
})), i.d(t, "extractStudyId", (function() {
|
|
return r
|
|
}))
|
|
},
|
|
cKqi: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("aO4+").Point,
|
|
r = i("qJq3").Series,
|
|
n = i("GVHu").Study,
|
|
o = i("FBsw").OverlayPriceAxisView,
|
|
a = i("KtbP").PanePriceAxisView,
|
|
l = i("x0JF"),
|
|
c = l.SeriesAreaPaneView,
|
|
h = l.SeriesLinePaneView,
|
|
u = l.SeriesHollowCandlesPaneView,
|
|
d = l.SeriesCandlesPaneView,
|
|
p = l.SeriesBarsPaneView,
|
|
_ = l.SeriesBaselinePaneView,
|
|
m = i("biIa").SeriesWaterlinePaneView,
|
|
f = i("2kV1").StudyStatusView,
|
|
g = i("JjUe").OverlayDataWindowView,
|
|
b = i("z8/4").OverlayLegendView,
|
|
v = i("qXYw").OverlayLegendValuesProvider,
|
|
S = i("ZsYR").OverlayStatusProvider,
|
|
y = i("38az").SeriesBarColorer,
|
|
w = i("l4sv").HorizontalLineRenderer,
|
|
P = i("Kxc7"),
|
|
C = i("6sst").OverlayStudyPriceLineAxisView,
|
|
x = i("n5al").createSeriesFormatter,
|
|
T = i("y/Xm").StudyOverlayBase,
|
|
I = i("qFKp").CheckMobile.any() && !1,
|
|
M = !P.enabled("hide_study_overlay_legend_item");
|
|
class O {
|
|
constructor(e, t) {
|
|
this._source = e, this._model = t, this._points = [new s(0, 0)], this
|
|
._lineRenderer = new w
|
|
}
|
|
update() {
|
|
if (this._visible = !1, this._source.properties().showPriceLine.value()) {
|
|
var e = this._source.lastValueData(void 0, !0);
|
|
e.noData || (this._visible = !0, this._points = [new s(0, e.coordinate)], this
|
|
._color = e.color)
|
|
}
|
|
}
|
|
renderer() {
|
|
var e = {};
|
|
return e.width = this._model.timeScale().width(), e.height = this._source
|
|
.priceScale().height(), e.y = this._points[0].y, e.color = this._color, e
|
|
.linewidth = 1, e.linestyle = CanvasEx.LINESTYLE_DOTTED, e.visible = this
|
|
._visible, this._lineRenderer.setData(e), this._lineRenderer
|
|
}
|
|
}
|
|
t.study_Overlay = class extends T {
|
|
constructor(e, t, i, s) {
|
|
super(e, t, i, s), this._formatter = null, this._paneView = null;
|
|
var r = this;
|
|
this.properties().minTick.listeners().subscribe(null, (function() {
|
|
r._recreatePriceFormattingDependencies(), r.updateAllViews(), r
|
|
._model.fullUpdate()
|
|
}))
|
|
}
|
|
_showLastValueOnPriceScale() {
|
|
return this._model.properties().scalesProperties.showSeriesLastValue.value()
|
|
}
|
|
_createViews() {
|
|
this._priceAxisViews = [];
|
|
var e = new o(this);
|
|
this._priceAxisViewsBase = [e];
|
|
var t = new C(this);
|
|
this._priceLinesAxisViews = [t], this._paneViews = [], this
|
|
._labelPaneViews = [];
|
|
var i = null,
|
|
s = null;
|
|
switch (this._properties.style.value()) {
|
|
case r.STYLE_BARS:
|
|
s = new p(this, this._model);
|
|
break;
|
|
case r.STYLE_CANDLES:
|
|
s = new d(this, this._model);
|
|
break;
|
|
case r.STYLE_HOLLOW_CANDLES:
|
|
s = new u(this, this._model);
|
|
break;
|
|
case r.STYLE_LINE:
|
|
s = new h(this, this._model);
|
|
break;
|
|
case r.STYLE_AREA:
|
|
s = new c(this, this._model);
|
|
break;
|
|
case r.STYLE_BASELINE:
|
|
s = new _(this, this._model), i = new m(this)
|
|
}
|
|
s && this._paneViews.push(s), null !== i && this._paneViews.push(i),
|
|
this._paneViews.push(new O(this, this._model)), this._dataWindowView || (
|
|
this._dataWindowView = new g(this, this._model)), this._legendView || (
|
|
this._legendView = new b(this, this._model)), this._statusView || (this
|
|
._statusView = new f(this)), this._priceAxisViews = [].concat(this
|
|
._priceAxisViewsBase, this._hlinesPriceAsisViews, this
|
|
._horizlinesPriceAsisViews), this._labelPaneViews.push(new a(e, this,
|
|
this._model))
|
|
}
|
|
barColorer() {
|
|
return new y(this)
|
|
}
|
|
start(e) {
|
|
this._formatter = null, n.prototype.start.apply(this, arguments), this
|
|
.priceScale() && this.priceScale().updateFormatter(), I && this
|
|
._setQuotesSymbol(this.symbol())
|
|
}
|
|
_tryCreateFormatter() {
|
|
return x(this.symbolInfo(), this.properties().minTick.value())
|
|
}
|
|
formatter() {
|
|
return this._formatter || this._recreateFormatter(), this._formatter
|
|
}
|
|
_tryChangeInputs() {
|
|
n.prototype._tryChangeInputs.call(this), this.m_formatter = null, this
|
|
.priceScale().updateFormatter()
|
|
}
|
|
stop(e) {
|
|
n.prototype.stop.call(this, e), this._quotesProvider.setQuotesSessionSymbol(
|
|
null)
|
|
}
|
|
_onQuotesUpdate(e, t) {
|
|
!this._legendView || void 0 === t.values.change && void 0 === t.values
|
|
.change_percent || (this._legendView.update(), this._model.updateSource(
|
|
this))
|
|
}
|
|
destroy() {
|
|
this._quotesProvider.quotesUpdate().unsubscribeAll(this), this._quotesProvider
|
|
.destroy(), super.destroy()
|
|
}
|
|
tags() {
|
|
var e = [],
|
|
t = this.symbolInfo();
|
|
return t ? e.push(t.name) : this._properties.inputs.symbol.value() && e.push(
|
|
this._properties.inputs.symbol.value()), e
|
|
}
|
|
statusView() {
|
|
return M ? n.prototype.statusView.call(this) : null
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(61), i.e(62), i.e(
|
|
"study-property-pages-with-definitions")]).then(i.bind(null,
|
|
"WUYT"))).StudyOverlayDefinitionsViewModel
|
|
}
|
|
defaultPlotIdForAlert() {
|
|
return ""
|
|
}
|
|
changeStyles() {
|
|
this.data().each((function(e, t) {
|
|
t[TradingView.STYLE_PLOT] = null
|
|
})), n.prototype.changeStyles.call(this)
|
|
}
|
|
valuesProvider() {
|
|
return new v(this, this.model())
|
|
}
|
|
statusProvider(e) {
|
|
return new S(this, this.model())
|
|
}
|
|
canBeHiddenByGlobalFlag() {
|
|
return !1
|
|
}
|
|
}
|
|
},
|
|
cPgM: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "ScaledPaneRenderer", (function() {
|
|
return s
|
|
})), i.d(t, "ScaledPaneRendererWrapper", (function() {
|
|
return r
|
|
}));
|
|
class s {
|
|
draw(e, t) {
|
|
e.save(), e.scale(t.pixelRatio, t.pixelRatio), e.translate(.5, .5), this._drawImpl(
|
|
e, {
|
|
...t,
|
|
pixelRatio: 1
|
|
}), e.restore()
|
|
}
|
|
drawBackground(e, t) {
|
|
e.save(), e.scale(t.pixelRatio, t.pixelRatio), e.translate(.5, .5), this
|
|
._drawBackgroundImpl(e, {
|
|
...t,
|
|
pixelRatio: 1
|
|
}), e.restore()
|
|
}
|
|
_drawBackgroundImpl(e, t) {}
|
|
}
|
|
class r {
|
|
constructor(e) {
|
|
this._base = e
|
|
}
|
|
hitTest(e, t) {
|
|
return this._base.hitTest(e, t)
|
|
}
|
|
draw(e, t) {
|
|
e.save(), e.scale(t.pixelRatio, t.pixelRatio), e.translate(.5, .5), this._base.draw(
|
|
e, {
|
|
...t,
|
|
pixelRatio: 1
|
|
}), e.restore()
|
|
}
|
|
drawBackground(e, t) {
|
|
e.save(), e.scale(t.pixelRatio, t.pixelRatio), e.translate(.5, .5), this._base
|
|
.drawBackground && this._base.drawBackground(e, {
|
|
...t,
|
|
pixelRatio: 1
|
|
}), e.restore()
|
|
}
|
|
}
|
|
},
|
|
cWHH: function(e, t, i) {
|
|
"use strict";
|
|
(function(t, s) {
|
|
var r = i("Eyy1").ensureNotNull,
|
|
n = i("Vdly"),
|
|
o = i("gP14").ChartModelBase,
|
|
a = i("CW80"),
|
|
l = a.isLineTool,
|
|
c = a.isStudyLineTool,
|
|
h = i("2+aH").Crosshair,
|
|
u = i("rY0k").Watermark,
|
|
d = i("hY3j").Grid,
|
|
p = i("22xp").TimeScale,
|
|
_ = i("qFKp").CheckMobile,
|
|
m = i("H0vP").InvalidationMask,
|
|
f = i("H0vP").InvalidationLevel,
|
|
g = i("GVHu"),
|
|
b = g.Study,
|
|
v = i("Qq0B").NonSeriesStudy,
|
|
S = i("3ClC"),
|
|
y = S.createStudy,
|
|
w = S.isStudy,
|
|
P = S.isFundamentalStudy,
|
|
C = g.prepareStudyProperties,
|
|
x = i("K4L1"),
|
|
T = i("qJq3").Series,
|
|
I = i("mMWL"),
|
|
M = i("wZIs").defaults,
|
|
O = i("Ocx9").DefaultProperty,
|
|
L = i("Qtjj").TimeSynchronizer,
|
|
A = i("txPx").getLogger("Chart.ChartModel"),
|
|
E = i("Y5iK").MainSeriesScaleRatioProperty,
|
|
k = i("FaJS").scaleRatio,
|
|
D = i("MROS").ModelSelection,
|
|
V = i("Y7w9").subtract,
|
|
B = i("VgjZ").PriceAxisRendererOptionsProvider,
|
|
R = i("/YGI").StudyInserter,
|
|
N = i("3t3b").dateFormatProperty,
|
|
j = i("/tGj").isSymbolSource,
|
|
F = i("gaBL").sourceNewCurrencyOnPinningToPriceScale,
|
|
W = i("SwuQ").sourceNewUnitOnPinningToPriceScale,
|
|
H = i("FQhm"),
|
|
U = i("i126").StudyColorRotatorFactory,
|
|
z = i("Kxc7"),
|
|
G = i("jeZR").AppliedTimeFrame,
|
|
q = z.enabled("auto_enable_symbol_labels");
|
|
z.enabled("fix_left_edge");
|
|
|
|
function Y() {
|
|
this._selection.clear()
|
|
}
|
|
|
|
function K(e) {
|
|
this._selection.remove(e)
|
|
}
|
|
|
|
function J(e, t) {
|
|
var i = this._selection.isSelected(e);
|
|
i && this._lastSelectedHittestData === t || e && !e.isSelectionEnabled() || (this
|
|
._lastSelectedHittestData = t || null, i || this._selection.add(e))
|
|
}
|
|
class Z extends o {
|
|
constructor(e, i, r, n, o, a, l, c) {
|
|
super(e, i, r, n, o, a, l, c), this._modelIntervals = [], this
|
|
._rendererOptionsProvider = new B(this), this.setStudiesMetaData(this
|
|
._studiesMetaInfoRepository.getInternalMetaInfoArray(), this
|
|
._studiesMetaInfoRepository.getMigrations()), I.init();
|
|
var _ = this;
|
|
this._panes = [], this.m_gridSource = new d;
|
|
var m = this._readOnly ? new t(M(
|
|
"chartproperties.paneProperties.crossHairProperties")) : this
|
|
._properties.paneProperties.crossHairProperties;
|
|
this.m_crossHairSource = new h(this, m, this._options.crossHair), this
|
|
.m_crossHairSource.selectPointMode().subscribe((function(e) {
|
|
if (e && _.lineBeingCreated()) {
|
|
var t = I.tool.value();
|
|
_.cancelCreatingLine(), I.tool.setValue(t)
|
|
}
|
|
})), this._tagsChanged = new s;
|
|
var f = new O("chartproperties.mainSeriesProperties");
|
|
f.addExclusion("minTick"), f.addExclusion("priceAxisProperties.lockScale"),
|
|
f.addExclusion("priceAxisProperties.percentage"), f.addExclusion(
|
|
"priceAxisProperties.indexedTo100"), f.addExclusion(
|
|
"priceAxisProperties.isInverted"), f.addExclusion(
|
|
"priceAxisProperties.log"), f.addExclusion(
|
|
"priceAxisProperties.logDisabled"), f.addExclusion(
|
|
"priceAxisProperties.percentageDisabled"), f.addExclusion(
|
|
"priceAxisProperties.autoScaleDisabled"), f.merge(r
|
|
.mainSeriesProperties.state()), this._timeScale = new p(this, this
|
|
._options.timeScale);
|
|
var g = {
|
|
countdownEnabled: this._options.countdownEnabled,
|
|
lastPriceAnimationEnabled: this._options.lastPriceAnimationEnabled
|
|
};
|
|
this.m_mainSeries = new T(this, f, g, n), this.m_mainSeries.onStyleChanged()
|
|
.subscribe(this._timeScale, this._timeScale.invalidateVisibleBars), this
|
|
.m_mainSeries.properties().showCountdown.subscribe(this, (function() {
|
|
this.m_mainSeries.updateAllViews(), this.fullUpdate()
|
|
})),
|
|
this._timeScale.visibleBarsStrictRangeChanged().subscribe(this
|
|
.m_mainSeries, this.m_mainSeries.clearHighLowAvgPriceCache), this
|
|
.createPane(void 0, {
|
|
axisProperties: f.priceAxisProperties.state(["autoScale"])
|
|
});
|
|
var b = this._panes[0];
|
|
b.setStretchFactor(2 * b.stretchFactor()), this._selection = new D, this
|
|
._selectedSourceChanged = new s, this._properties.listeners().subscribe(
|
|
this, Z.prototype.propertyChangeHandler), this._properties.timezone
|
|
.listeners().subscribe(null, (function() {
|
|
_._chartApi && _._chartApi.connected() && _._chartApi
|
|
.switchTimezone(_.timezone())
|
|
})), this._timeScale.defaultRightOffsetProperty().listeners().subscribe(
|
|
null, (function() {
|
|
_.recalculateAllPanes()
|
|
})), b.addDataSource(this.m_mainSeries, this._panes[0]
|
|
.findSuitableScale(this.m_mainSeries)), this
|
|
._mainSeriesScaleRatioProperty = new E(this), this.m_mainSeries
|
|
.dataEvents().completed().subscribe(this, function() {
|
|
this._scrollingState && this.gotoTime()
|
|
}.bind(this)), this.m_mainSeries.onIntervalChanged().subscribe(this, (
|
|
function() {
|
|
this._recalcVRStudiesParams.oldStartVisibleIndex = NaN, this
|
|
._recalcVRStudiesParams.oldEndVisibleIndex = NaN
|
|
})), this._readOnly || (f.addChild("priceAxisProperties", this
|
|
.m_mainSeries.m_priceScale.properties()), this._properties
|
|
.paneProperties.legendProperties.showStudyTitles.listeners()
|
|
.subscribe(this, (function(e) {
|
|
e.value() || _._properties.paneProperties
|
|
.legendProperties.showStudyArguments.setValue(!1)
|
|
}))), this._barsMarksSources = l(this);
|
|
for (var v = 0; v < this._barsMarksSources.length; v++) this
|
|
._barsMarksSources[v].setOwnerSource(this.m_mainSeries);
|
|
this._syncPointCache = {}, this._watermarkSource = this._options
|
|
.watermarkEnabled ? new u(this, this.m_mainSeries) : null, I
|
|
.hideAllDrawings().subscribe(this, this._onDrawingsVisibilityChanged), I
|
|
.hideAllIndicators().subscribe(this, this
|
|
._onIndicatorsVisibilityChanged), this._properties.scalesProperties
|
|
.listeners().subscribe(this, Z.prototype.fullUpdate), this
|
|
._studyInserted = new s, this._studyShiftColorStartOffset = void 0, this
|
|
._linePointBeingEdited = null, this._lineBeingEdited = null, N
|
|
.subscribe(this, this._updateDateTimeFormatter), this.mainSeries()
|
|
.properties().interval.subscribe(this, this._updateDateTimeFormatter),
|
|
this._updateDateTimeFormatter(), this._studyColorRotatorFactory = new U(
|
|
this), this._dataSourceCollectionChanged.subscribe(this, this
|
|
._updateShowLegendProperty.bind(this)), this._properties
|
|
.paneProperties.legendProperties.showLegend.subscribe(this, this
|
|
._updateShowLegendProperty), this._appliedTimeFrame = new G(this),
|
|
this.mainSeries().onTimeFrameApplied().subscribe(this, (function(e) {
|
|
var t = null !== e ? {
|
|
res: this.mainSeries().interval(),
|
|
val: e
|
|
} : null;
|
|
this.appliedTimeFrame().setValue(t)
|
|
}))
|
|
}
|
|
applyPreferences(e) {
|
|
for (var t in e) void 0 !== this._properties[t] && "m_mainSeries" !== this
|
|
._properties[t] && this._properties[t].mergeAndFire(e[t]);
|
|
void 0 !== e.timeScale && this._timeScale.defaultRightOffsetProperty()
|
|
.setValue(e.timeScale.defaultRightOffset), this._properties
|
|
.saveDefaults(), this.m_mainSeries.applyPreferences(e.mainSeries), this
|
|
.sessions().applyPreferences(e.sessions), this.recalculateAllPanes(),
|
|
this.fullUpdate()
|
|
}
|
|
setStudiesMetaData(e, t) {
|
|
this._studiesMetaData = e,
|
|
this._studyVersioning = new x(this._studiesMetaData, t)
|
|
}
|
|
isSnapshot() {
|
|
return this._isSnapshot
|
|
}
|
|
timezone() {
|
|
return this._properties.timezone.value()
|
|
}
|
|
initConnection() {
|
|
this._chartApi.switchTimezone(this.timezone())
|
|
}
|
|
updatePane(e) {
|
|
var t = this._paneInvalidationMask(e);
|
|
this.invalidate(t)
|
|
}
|
|
fullUpdate() {
|
|
this.invalidate(m.full())
|
|
}
|
|
lightUpdate() {
|
|
this.invalidate(m.light())
|
|
}
|
|
studiesMetaData() {
|
|
return this._studiesMetaData
|
|
}
|
|
studyVersioning() {
|
|
return this._studyVersioning
|
|
}
|
|
disconnect() {
|
|
this.sessions().stop();
|
|
for (var e, t = this.dataSources(), i = 0; i < t.length; i++)(e = t[i])
|
|
.disconnect && e.disconnect();
|
|
this._timeScale.disconnect()
|
|
}
|
|
restart() {
|
|
this.initConnection(), this._timeScale.reset(), this.m_mainSeries.restart();
|
|
for (var e, t = this.dataSources(), i = 0; i < t.length; i++)(e = t[i])
|
|
.restart && e !== this.m_mainSeries && e.restart();
|
|
this.sessions().restart()
|
|
}
|
|
startNotStartedStudies() {
|
|
if (!this.m_mainSeries.isStarted()) throw new Error(
|
|
"Cannot start studies: main series is not started");
|
|
for (var e = this.dataSources(), t = 0; t < e.length; t++) w(e[t]) && !e[t]
|
|
.isStarted() && e[t].restart && e[t] !== this.m_mainSeries && e[t]
|
|
.restart()
|
|
}
|
|
readOnly() {
|
|
return this._readOnly
|
|
}
|
|
properties() {
|
|
return this._properties
|
|
}
|
|
chartApi() {
|
|
return this._chartApi
|
|
}
|
|
propertyChangeHandler() {
|
|
this.lightUpdate()
|
|
}
|
|
_onDrawingsVisibilityChanged(e) {
|
|
for (var t = !1 === e.value(), i = this.dataSources(), s = 0; s < i
|
|
.length; s++) {
|
|
var r = i[s],
|
|
n = l(r) && r.properties().visible.value();
|
|
t && n ? H.emit("drawing_event", r.id(), "show") : !t && n && H.emit(
|
|
"drawing_event", r.id(), "hide")
|
|
}
|
|
this.selectionMacro((function(e) {
|
|
e.clearSelection()
|
|
}))
|
|
}
|
|
_onIndicatorsVisibilityChanged() {
|
|
var e = this.allStudies().filter((function(e) {
|
|
return e.properties().visible.value() && e
|
|
.canBeHiddenByGlobalFlag()
|
|
}));
|
|
if (0 !== e.length) {
|
|
for (var t = !1, i = 0; i < e.length; i++)
|
|
if (this.selection().isSelected(e[i])) {
|
|
t = !0;
|
|
break
|
|
} t ? this.selectionMacro((function(e) {
|
|
e.clearSelection()
|
|
})) : this.lightUpdate()
|
|
}
|
|
}
|
|
updateAllPaneViews() {
|
|
for (var e = 0; e < this._panes.length; e++) {
|
|
this._panes[e].updateAllViews()
|
|
}
|
|
}
|
|
mainSeries() {
|
|
return this.m_mainSeries
|
|
}
|
|
timeScale() {
|
|
return this._timeScale
|
|
}
|
|
gridSource() {
|
|
return this.m_gridSource
|
|
}
|
|
watermarkSource() {
|
|
return this._watermarkSource
|
|
}
|
|
crossHairSource() {
|
|
return this.m_crossHairSource
|
|
}
|
|
publishedChartsTimelineSource() {
|
|
return null
|
|
}
|
|
barsMarksSources() {
|
|
return this._barsMarksSources
|
|
}
|
|
barMarksSourceForId(e) {
|
|
for (var t = 0; t < this._barsMarksSources.length; t++)
|
|
if (this._barsMarksSources[t].id() === e) return this._barsMarksSources[
|
|
t];
|
|
return null
|
|
}
|
|
priceScaleSlotsCount() {
|
|
var e = 0,
|
|
t = 0;
|
|
this._panes.forEach((function(i) {
|
|
e = Math.max(i.leftPriceScales().length, e), t = Math.max(i
|
|
.rightPriceScales().length, t)
|
|
}));
|
|
var i = e + t;
|
|
if (_.any()) {
|
|
var s = this.paneForSource(this.mainSeries()),
|
|
r = s.priceScalePosition(this.mainSeries().priceScale()),
|
|
n = "right" === r;
|
|
return "overlay" === r && (n = s.rightPriceScales().length > 0), n ? {
|
|
left: 0,
|
|
right: 1,
|
|
totallySlots: i
|
|
} : {
|
|
left: 1,
|
|
right: 0,
|
|
totallySlots: i
|
|
}
|
|
}
|
|
return {
|
|
left: e,
|
|
right: t,
|
|
totallySlots: e + t
|
|
}
|
|
}
|
|
startScrollPrice(e, t, i) {
|
|
e.startScrollPrice(t, i)
|
|
}
|
|
scrollPriceTo(e, t, i) {
|
|
e.scrollPriceTo(t, i), this.invalidate(this._paneInvalidationMask(e, f
|
|
.Light))
|
|
}
|
|
endScrollPrice(e, t) {
|
|
e.endScrollPrice(t), this.invalidate(this._paneInvalidationMask(e, f.Light))
|
|
}
|
|
setPriceAutoScale(e, t, i) {
|
|
e.setPriceAutoScale(t, i), this.invalidate(this._paneInvalidationMask(e, f
|
|
.Light))
|
|
}
|
|
updateScales(e, t) {
|
|
this._undoModel._chartWidget._updateScalesActions()
|
|
}
|
|
mainSeriesScaleRatioProperty() {
|
|
return this._mainSeriesScaleRatioProperty
|
|
}
|
|
mainSeriesScaleRatioPropertyOnChanged() {
|
|
this._mainSeriesScaleRatioProperty.listeners().fire(this
|
|
._mainSeriesScaleRatioProperty)
|
|
}
|
|
mainSeriesScaleRatio() {
|
|
return k(this._timeScale, this.m_mainSeries.priceScale())
|
|
}
|
|
setMainSeriesScaleRatio(e) {
|
|
this.paneForSource(this.m_mainSeries).applyPriceScaleRatio(this.m_mainSeries
|
|
.priceScale(), e)
|
|
}
|
|
startScrollTime(e) {
|
|
this._timeScale.startScroll(e), this._isTimeScrolling = !0
|
|
}
|
|
scrollTimeTo(e) {
|
|
this._timeScale.scrollTo(e), this.recalculateAllPanes(), this.lightUpdate(),
|
|
this._setScalesResetAvailable(!0)
|
|
}
|
|
endScrollTime() {
|
|
this._timeScale.endScroll(), this.lightUpdate(), this
|
|
.recalcVisibleRangeStudies(), this._isTimeScrolling = !1
|
|
}
|
|
recalcStudyBasedLineTools() {
|
|
this.dataSources().forEach((function(e) {
|
|
c(e) && e.recalcStudyIfNeeded && e.recalcStudyIfNeeded()
|
|
}))
|
|
}
|
|
restoreTimeScaleState(e) {
|
|
this._timeScale.restoreState(e), this.recalculateAllPanes(), this
|
|
.lightUpdate(), this._setScalesResetAvailable(!0)
|
|
}
|
|
restoreFactoryDefaults(e) {
|
|
e.restoreFactoryDefaults(), this.recalcVisibleRangeStudies(!0)
|
|
}
|
|
selectionMacro(e) {
|
|
var t = this.selection().allSources();
|
|
e({
|
|
removeSourceFromSelection: K.bind(this),
|
|
addSourceToSelection: J.bind(this),
|
|
clearSelection: Y.bind(this),
|
|
selection: this.selection.bind(this)
|
|
});
|
|
var i = V(t, this.selection().allSources()),
|
|
s = V(this.selection().allSources(), t);
|
|
s.concat(t).forEach((function(e) {
|
|
e.updateAllViews()
|
|
})), i.forEach((function(e) {
|
|
var t = e.hasAlert && e.hasAlert.value() && e
|
|
.getAlertSync();
|
|
t && t.set("selected", !1)
|
|
})), s.forEach((function(e) {
|
|
var t = e.hasAlert && e.hasAlert.value() && e
|
|
.getAlertSync();
|
|
t && t.set("selected", !0)
|
|
})), this.lightUpdate(), (i.length > 0 || s.length > 0) && this
|
|
._selectedSourceChanged.fire()
|
|
}
|
|
checkLineToolSelection() {
|
|
this._selection.checkLineToolSelection()
|
|
}
|
|
onSelectedSourceChanged() {
|
|
return this._selectedSourceChanged
|
|
}
|
|
selection() {
|
|
return this._selection
|
|
}
|
|
orderedDataSources(e) {
|
|
var t = [];
|
|
t.push(this.m_crossHairSource);
|
|
for (var i = 0; i < this._panes.length; i++) {
|
|
var s = this._panes[i].sourcesByGroup().all().slice();
|
|
e && s.reverse(), t = t.concat(s)
|
|
}
|
|
return t
|
|
}
|
|
dataSourceForId(e) {
|
|
for (var t, i = 0; i < this._panes.length; ++i)
|
|
if (t = this._panes[i].dataSourceForId(e)) return t;
|
|
return null
|
|
}
|
|
children(e, t) {
|
|
return this.dataSources().filter((function(i) {
|
|
return (!0 !== t || !w(i) || !i.isChildStudy()) && i
|
|
.ownerSource() === e
|
|
}))
|
|
}
|
|
onSyncScrollNeeded(e) {
|
|
var t = this._undoModel._chartWidget;
|
|
if (t._chartWidgetCollection) {
|
|
var i = this.mainSeries().syncModel();
|
|
if (i) {
|
|
var s = 1e3 * this._timeScale.points().roughTime(e, i.projectTime
|
|
.bind(i));
|
|
t._chartWidgetCollection.syncScroll(s, this)
|
|
}
|
|
}
|
|
}
|
|
createSyncPoint(e, t) {
|
|
var i = this._syncPointCache[e.uniqueId()];
|
|
if (i) {
|
|
var s = i[t.uniqueId()];
|
|
if (s) return s
|
|
} else this._syncPointCache[e.uniqueId()] = {};
|
|
var r = new L(e, t);
|
|
return this._syncPointCache[e.uniqueId()][t.uniqueId()] = r, r
|
|
}
|
|
updateTimeScale(e, t, i, s, r, n, o) {
|
|
if (o) {
|
|
this._timeScale.reset();
|
|
for (var a = this.dataSources(), l = 0; l < a.length; l++) a[l]
|
|
.clearData && a[l].clearData()
|
|
}
|
|
if (s.length > 0)
|
|
for (a = this.dataSources(), l = 0; l < a.length; l++) a[l].moveData &&
|
|
a[l].moveData(s);
|
|
var c = this._timeScale.indexToTimePoint(this._timeScale.baseIndex());
|
|
this._timeScale.update(e, t, i, n);
|
|
var h = "ChartModel.prototype.updateTimeScale(" + e + "," + t + "," + i
|
|
.length + "," + s.length + "," + n.length + "," + o + ")";
|
|
if (h += "TimeScale: {first:" + this._timeScale.points().firstIndex() +
|
|
",last:" + this._timeScale.points().lastIndex() + "}", void 0 !== r) {
|
|
var u = this._timeScale.indexToTimePoint(r),
|
|
d = null !== c && null !== u && u > c;
|
|
this._updateBaseIndex(r, d)
|
|
}
|
|
A.logDebug(h), this.recalculateAllPanes(), this.lightUpdate()
|
|
}
|
|
updateTimeScaleBaseIndex(e) {
|
|
var t = this.mainSeries().bars();
|
|
t.isEmpty() || this._updateBaseIndex(r(t.lastIndex()), e && e.index > 0)
|
|
}
|
|
_updateBaseIndex(e, t) {
|
|
var i = this.timeScale(),
|
|
s = i.baseIndex(),
|
|
r = i.visibleBarsStrictRange(),
|
|
n = i.logicalRange();
|
|
if (null !== n && t) {
|
|
var o = n.contains(s),
|
|
a = e - s,
|
|
l = o ? null : i.rightOffset() - a;
|
|
if (!this._options.shiftVisibleRangeOnNewBar && o) {
|
|
var c = i.indexToCoordinate(s) + i.barSpacing() / 2 + 1,
|
|
h = s - n.left() + a,
|
|
u = c / h;
|
|
if (u >= i.minBarSpacing()) i.setBarSpacing(u), l = i.width() / u -
|
|
h;
|
|
else r.lastBar() !== s && (l = i.rightOffset() - a)
|
|
}
|
|
null !== l && i.setRightOffset(l)
|
|
}
|
|
i.setBaseIndex(e)
|
|
}
|
|
recalculatePane(e) {
|
|
e && e.recalculate()
|
|
}
|
|
recalculateAllPanes() {
|
|
for (var e = 0; e < this._panes.length; ++e) this._panes[e].recalculate();
|
|
this.updateAllPaneViews(), this.crossHairSource().updateAllViews()
|
|
}
|
|
_invalidateBarColorerCaches() {
|
|
for (var e = this.dataSources(), t = 0; t < e.length; ++t) {
|
|
var i = e[t];
|
|
i instanceof T && i.invalidateBarColorerCache()
|
|
}
|
|
}
|
|
createStudyInserter(e) {
|
|
return new R(e, this._studiesMetaInfoRepository, {
|
|
createStudy: this.insertStudyWithParams.bind(this)
|
|
})
|
|
}
|
|
insertStudyWithParams(e, t, i, s, r, o, a, l, c, h, u) {
|
|
null == o && (o = this.mainSeries());
|
|
var d = null;
|
|
if (!r && void 0 !== e.groupingKey) {
|
|
var p = this.findNonOverlayStudyWithGroupingKey(e.groupingKey);
|
|
null !== p && (d = p.pane)
|
|
}
|
|
null === d && (r || e.is_price_study ? d = this.paneForSource(o) : (d = this
|
|
.createPane(), void 0 !== h && d.setPaneSize(h))),
|
|
"Compare@tv-basicstudies" === e.id && this.m_mainSeries.priceScale()
|
|
.setMode({
|
|
log: !1,
|
|
percentage: !0
|
|
});
|
|
var _ = Object.assign({}, s, {
|
|
inputs: t
|
|
}),
|
|
m = C(e, _, d, this.studyVersioning(), o),
|
|
f = y(this, m, o, e, u);
|
|
this._recalcVisibleRangeStudiesImpl({
|
|
studies: [f],
|
|
oldEndVisibleIndex: -1,
|
|
oldStartVisibleIndex: -1,
|
|
force: !0,
|
|
timerId: null
|
|
});
|
|
var g = d.findSuitableScale(f, o, a);
|
|
if (g === this.mainSeries().priceScale() && j(f)) {
|
|
var b = l ? F(f, g, this, !0) : null,
|
|
v = c ? W(f, g, this, !0) : null;
|
|
null === b && null === v || f.setSymbolCurrencyUnit(void 0, b || void 0,
|
|
v || void 0)
|
|
}
|
|
return j(f) && d.hasDataSource(this.mainSeries()) && q && !n.getBool(
|
|
"enable_symbol_labels_on_inserting_compare_once", !1) && (this
|
|
.properties().scalesProperties.showSymbolLabels.setValue(!0), n
|
|
.setValue("enable_symbol_labels_on_inserting_compare_once", !0)), f
|
|
.start(), null !== i && d.id() === i.paneId ? d.insertDataSource(f, g, i
|
|
.zorder) : d.addDataSource(f, g), f.properties().linkedToSeries && f
|
|
.properties().linkedToSeries.value() && f.setOwnerSource(this
|
|
.mainSeries()), this.recalculatePane(d), this.fullUpdate(), this
|
|
._invalidateBarColorerCaches(), this._recalcVisibleRangeStudiesImpl({
|
|
studies: [f],
|
|
force: !0
|
|
}), this._recalcColorStudiesImpl({
|
|
studies: [f],
|
|
force: !0
|
|
}),
|
|
this._studyInserted.fire(f), f
|
|
}
|
|
studyInserted() {
|
|
return this._studyInserted
|
|
}
|
|
detachSource(e, t) {
|
|
var i = this.paneForSource(e);
|
|
if (i) return i.removeDataSource(e), i.isEmpty() ? (this
|
|
._lineBeingCreated && i === this._paneBeingCreatedLineOn && this
|
|
.cancelCreatingLine(), this.removePane(i, t), !0) : (this
|
|
.fullUpdate(), !1)
|
|
}
|
|
removeSource(e, t) {
|
|
this.selectionMacro((function(t) {
|
|
t.removeSourceFromSelection(e)
|
|
})), this._sourcesBeingMoved.includes(e) && (this._sourcesBeingMoved =
|
|
this._sourcesBeingMoved.filter((function(t) {
|
|
return t !== e
|
|
})), this._sourcesBeingMoved.length || (this._lineItemBeingMoved =
|
|
null)), e === this._lineBeingEdited && (this._lineBeingEdited =
|
|
null, I.isToolEditingNow.setValue(!1)), e === this
|
|
._lineBeingCreated && (this._lineBeingCreated = null, I
|
|
.isToolCreatingNow.setValue(!1)), e.stop && e.stop();
|
|
var i = this.detachSource(e, t);
|
|
const s = this.mainSeries().priceScale();
|
|
return w(e) && j(e) && e.priceScale() === s && s.isPercentage() && 1 === s
|
|
.seriesLikeSources().length && s.setMode({
|
|
percentage: !1
|
|
}), this.fullUpdate(), this._invalidateBarColorerCaches(), w(e) && (H
|
|
.emit("study_event", e.id(), "remove"), e.isChildStudy() && e
|
|
.source().unsetChild(e)), e.destroy && e.destroy(), l(e) && H.emit(
|
|
"drawing_event", e.id(), "remove"), i
|
|
}
|
|
_unmergeAvailable(e) {
|
|
return e === this.m_mainSeries || TradingView.isInherited(e.constructor,
|
|
b) && !e.isLinkedToSeries() && !TradingView.isInherited(e
|
|
.constructor,
|
|
v) && e.showInObjectTree()
|
|
}
|
|
isMergeUpAvailableForSource(e) {
|
|
return !!this._unmergeAvailable(e) && this.paneForSource(e) !== this
|
|
.panes()[0]
|
|
}
|
|
isMergeDownAvailableForSource(e) {
|
|
if (!this._unmergeAvailable(e)) return !1;
|
|
var t = this.paneForSource(e),
|
|
i = this.panes();
|
|
return t !== i[i.length - 1]
|
|
}
|
|
isUnmergeAvailableForSource(e) {
|
|
return !!this._unmergeAvailable(e) && this.paneForSource(e).dataSources()
|
|
.filter(this._unmergeAvailable, this).length > 1
|
|
}
|
|
lineBeingEdited() {
|
|
return this._lineBeingEdited
|
|
}
|
|
linePointBeingEdited() {
|
|
return this._linePointBeingEdited
|
|
}
|
|
calculateDefaultTags() {
|
|
for (var e = [], t = this.dataSources(), i = 0; i < t.length; i++) {
|
|
var s = t[i];
|
|
s.tags && (e = e.concat(s.tags()))
|
|
}
|
|
return e
|
|
}
|
|
_sendTo(e, t) {
|
|
var i = {},
|
|
s = this;
|
|
for (var r in e.forEach((function(e) {
|
|
var t = s.paneForSource(e),
|
|
r = s._panes.indexOf(t);
|
|
i[r] || (i[r] = []), i[r].push(e)
|
|
})), i) {
|
|
t(s._panes[r], i[r])
|
|
}
|
|
this.fullUpdate()
|
|
}
|
|
sendToBack(e) {
|
|
this._sendTo(e, (function(e, t) {
|
|
e.sendToBack(t)
|
|
}))
|
|
}
|
|
bringToFront(e) {
|
|
this._sendTo(e, (function(e, t) {
|
|
e.bringToFront(t)
|
|
}))
|
|
}
|
|
clearAllStudies() {
|
|
for (var e = this.dataSources(), t = 0; t < e.length; t++) e[t].clearData &&
|
|
e[t].clearData()
|
|
}
|
|
allLineTools() {
|
|
return this._getAllSources(l)
|
|
}
|
|
getStudyById(e) {
|
|
var t = this.dataSourceForId(e);
|
|
return null !== t && w(t) ? t : null
|
|
}
|
|
getLineToolById(e) {
|
|
var t = this.dataSourceForId(e);
|
|
return null !== t && l(t) ? t : null
|
|
}
|
|
getStudyById(e) {
|
|
var t = this.dataSourceForId(e);
|
|
return t instanceof b ? t : null
|
|
}
|
|
_initAlertsList() {
|
|
throw new Error("Not implemented")
|
|
}
|
|
_addAlertLabelToChart(e) {
|
|
throw new Error("Not implemented")
|
|
}
|
|
_removeAlertLabelFromChart(e) {
|
|
throw new Error("Not implemented")
|
|
}
|
|
_removeAllAlertLabelsFromChart() {
|
|
throw new Error("Not implemented")
|
|
}
|
|
getAlertsList() {
|
|
return Promise.resolve(null)
|
|
}
|
|
resetAlertList() {}
|
|
setInterval(e, t) {
|
|
var i = setInterval(e, t);
|
|
return this._modelIntervals.push(i), i
|
|
}
|
|
clearInterval(e) {
|
|
clearInterval(e);
|
|
var t = this._modelIntervals.indexOf(e);
|
|
t > -1 && this._modelIntervals.splice(t, 1)
|
|
}
|
|
clearIntervals() {
|
|
for (var e = 0; e < this._modelIntervals.length; e++) clearInterval(this
|
|
._modelIntervals[e]);
|
|
this._modelIntervals = []
|
|
}
|
|
destroy() {
|
|
this.mainSeries().properties().childs().showCountdown.unsubscribeAll(this),
|
|
this.mainSeries().onTimeFrameApplied().unsubscribeAll(this), this
|
|
._appliedTimeFrame.destroy();
|
|
for (var e = 0; e < this._barsMarksSources.length; e++) this
|
|
._barsMarksSources[e].destroy();
|
|
this.clearIntervals(), I.hideAllDrawings().unsubscribe(this, this
|
|
._onDrawingsVisibilityChanged), I.hideAllIndicators().unsubscribe(
|
|
this, this._onIndicatorsVisibilityChanged), this
|
|
.resetDeferredStudies();
|
|
for (e = 0; e < this._barsMarksSources.length; e++) this._barsMarksSources[
|
|
e].destroy();
|
|
for (e = 0; e < this._panes.length; e++) this._panes[e].destroy();
|
|
this._panes.length = 0, this._sessions = null, this.m_mainSeries
|
|
.onStyleChanged().unsubscribe(this._timeScale, this._timeScale
|
|
.invalidateVisibleBars), this._timeScale
|
|
.visibleBarsStrictRangeChanged().unsubscribe(this.m_mainSeries, this
|
|
.m_mainSeries.clearHighLowAvgPriceCache), this._timeScale.destroy(),
|
|
N.unsubscribe(this, this._updateDateTimeFormatter), this.mainSeries()
|
|
.properties().interval.unsubscribe(this, this._updateDateTimeFormatter),
|
|
this._trendLineStatsCache && this._trendLineStatsCache.destroy(), this
|
|
._fibRetracementLabelsCache && this._fibRetracementLabelsCache
|
|
.destroy(), this._properties.paneProperties.legendProperties.showLegend
|
|
.unsubscribeAll(this), this._dataSourceCollectionChanged.unsubscribeAll(
|
|
this), this.m_crossHairSource.destroy(), super.destroy()
|
|
}
|
|
countUserStudies(e) {
|
|
var t = 0;
|
|
e = e || {};
|
|
for (var i = 0; i < this._panes.length; i++)
|
|
for (var s = this._panes[i].dataSources(), r = 0; r < s.length; r++) {
|
|
var n = s[r];
|
|
if (w(n) && !P(n) && n.showInObjectTree()) {
|
|
var o = n.metaInfo && n.metaInfo();
|
|
if (o) {
|
|
var a = o.id;
|
|
if (e.dontCountVolume && "Volume@tv-basicstudies" === a)
|
|
continue;
|
|
if (e.dontCountCompare && "Compare@tv-basicstudies" === a)
|
|
continue;
|
|
if (e.dontCountOverlay && "Overlay@tv-basicstudies" === a)
|
|
continue
|
|
}
|
|
t++
|
|
}
|
|
}
|
|
return t
|
|
}
|
|
isJustClonedChart() {
|
|
return this._undoModel.isJustClonedChart()
|
|
}
|
|
restoreSource(e, t, i, s, r) {
|
|
var n, o;
|
|
n = e ? this.createPane(t) : this.panes()[t];
|
|
var a = s.type.toLowerCase().startsWith("study");
|
|
if (!(o = a ? n.restoreStudy(s) : n.restoreLineTool(s))) return null;
|
|
var l = null;
|
|
s.ownerSource && (l = n.dataSourceForId(s.ownerSource)), o.setOwnerSource(
|
|
l);
|
|
var c = null;
|
|
if (r ? c = n.getPriceScaleById(r.id) : o.ownerSource() && (c = o
|
|
.ownerSource().priceScale()), c) o.setPriceScale(c), c
|
|
.addDataSource(o);
|
|
else {
|
|
c = n.createPriceScaleAtPosition(r.position, r.priceScaleIndex);
|
|
r && r.id && c.setId(r.id), o.setPriceScale(c), c.addDataSource(o)
|
|
}
|
|
if (!e && i && i.overlayPriceScales) {
|
|
var h = this.dataSources().filter((function(e) {
|
|
return void 0 !== i.overlayPriceScales[e.id()]
|
|
}));
|
|
h.forEach(n.removeSourceFromPriceScale.bind(n));
|
|
var u = new Map;
|
|
h.forEach((function(e) {
|
|
var t, s = i.overlayPriceScales[e.id()];
|
|
u.has(s.id) ? t = u.get(s.id) : ((t = n
|
|
.createPriceScaleAtPosition("overlay"))
|
|
.restoreState(s), u.set(s.id, t)), t
|
|
.addDataSource(e), e.setPriceScale(t)
|
|
}))
|
|
}
|
|
return o.start(), o.restore && o.restore(), e && n.restoreState(i, !1, this
|
|
.version()),
|
|
a && (this.recalculateAllPanes(), this.mainSeries()
|
|
.invalidateBarColorerCache(), this.fullUpdate()), o
|
|
}
|
|
selectPointMode() {
|
|
return this.m_crossHairSource.selectPointMode()
|
|
}
|
|
cancelRequestSelectPoint() {
|
|
this.m_crossHairSource.cancelRequestSelectPoint()
|
|
}
|
|
requestSelectPoint(e, t) {
|
|
return this.m_crossHairSource.requestSelectPoint(e, t)
|
|
}
|
|
onPointSelected() {
|
|
return this.m_crossHairSource.onPointSelected()
|
|
}
|
|
isSeriesStyleSupported(e) {
|
|
return this.m_mainSeries.isStyleSupported(e)
|
|
}
|
|
getStudyShiftColorStartOffset() {
|
|
return this._studyShiftColorStartOffset
|
|
}
|
|
setStudyShiftColorStartOffset(e) {
|
|
this._studyShiftColorStartOffset = e
|
|
}
|
|
isInReplay() {
|
|
return this.m_mainSeries.isInReplay()
|
|
}
|
|
onInReplayStateChanged() {
|
|
return new s
|
|
}
|
|
switchToReplay(e, t) {
|
|
0
|
|
}
|
|
switchToRealtime() {
|
|
0
|
|
}
|
|
rendererOptionsProvider() {
|
|
return this._rendererOptionsProvider
|
|
}
|
|
priceAxisRendererOptions() {
|
|
return this._rendererOptionsProvider.options()
|
|
}
|
|
magnet() {
|
|
return this._magnet
|
|
}
|
|
isPriceScaleVisible(e) {
|
|
var t = this.paneForSource(e.mainSource()),
|
|
i = t.priceScalePosition(e);
|
|
if ("overlay" === i) return !0;
|
|
var s = this.priceScaleSlotsCount();
|
|
return t.priceScaleIndex(e, i) < s[i]
|
|
}
|
|
studyMetaInfoRepository() {
|
|
return this._studiesMetaInfoRepository
|
|
}
|
|
studiesColorRotatorFactory() {
|
|
return this._studyColorRotatorFactory
|
|
}
|
|
}
|
|
e.exports = Z
|
|
}).call(this, i("tc+8"), i("aIyQ"))
|
|
},
|
|
cZRT: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return s
|
|
}));
|
|
class s {
|
|
constructor() {
|
|
this._retries = 5, this._cache = null, this._tryLoad = e => {
|
|
this._retries = this._retries - 1;
|
|
this._startLoading().then(e, 0 !== this._retries ? () => setTimeout(() =>
|
|
this._tryLoad(e), 3e3) : void 0)
|
|
}
|
|
}
|
|
load() {
|
|
return this._cache || (this._cache = new Promise(this._tryLoad)), this._cache
|
|
}
|
|
}
|
|
},
|
|
cdbK: function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e) {
|
|
return Promise.all([i.e("react"), i.e(1), i.e(3), i.e(4), i.e(6), i.e(8), i.e(9), i.e(12), i
|
|
.e(16), i.e(17), i.e(23), i.e(34), i.e(42), i.e(43), i.e(49), i.e(50), i.e(76),
|
|
i.e(0), i.e(2), i.e(5), i.e(7), i.e(10), i.e(15), i.e(32), i.e(40), i.e(46), i
|
|
.e("go-to-date-dialog-impl")
|
|
]).then(i.bind(null, "uUY/")).then(t => t.showGoToDateDialog(e))
|
|
}
|
|
i.r(t), i.d(t, "showGoToDateDialog", (function() {
|
|
return s
|
|
}))
|
|
},
|
|
cgFQ: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Tmoa"),
|
|
r = i("ikwP");
|
|
const n = /[1-9]/g;
|
|
class o {
|
|
constructor() {
|
|
this._data = null
|
|
}
|
|
setData(e) {
|
|
this._data = e
|
|
}
|
|
draw(e, t, i) {
|
|
if (null === this._data || !this._data.visible || 0 === this._data.text.length)
|
|
return;
|
|
const s = this._data;
|
|
e.font = t.font;
|
|
const o = Math.round(t.widthCache.measureText(e, s.text, n));
|
|
if (o <= 0) return;
|
|
e.save();
|
|
const a = t.paddingHorizontal,
|
|
l = o + 2 * a,
|
|
c = l / 2;
|
|
let h = s.coordinate,
|
|
u = Math.floor(h - c) + .5;
|
|
if (s.alwaysInViewPort) {
|
|
const e = s.width;
|
|
u < 0 ? (h += Math.abs(0 - u), u = Math.floor(h - c) + .5) : u + l > e && (h -=
|
|
Math.abs(e - (u + l)), u = Math.floor(h - c) + .5)
|
|
}
|
|
const d = u + l,
|
|
p = Math.ceil(0 + t.borderSize + t.offsetSize + t.paddingTop + t.fontSize + t
|
|
.paddingBottom);
|
|
e.fillStyle = s.background;
|
|
const _ = Math.round(u * i),
|
|
m = Math.round(0 * i),
|
|
f = Math.round(d * i),
|
|
g = Math.round(p * i),
|
|
b = Math.round(2 * i);
|
|
e.beginPath(), e.moveTo(_, m), e.lineTo(_, g - b), e.arcTo(_, g, _ + b, g, b), e
|
|
.lineTo(f - b, g), e.arcTo(f, g, f, g - b, b), e.lineTo(f, m), e.fill();
|
|
const v = 0 + t.borderSize + t.offsetSize + t.paddingTop + t.fontSize / 2;
|
|
e.textAlign = "left", e.textBaseline = "middle", e.fillStyle = s.color;
|
|
const S = t.widthCache.yMidCorrection(e, "Apr0");
|
|
e.translate((u + a) * i, (v + S) * i), Object(r.drawScaled)(e, i, () => e.fillText(s
|
|
.text, 0, 0)), e.restore()
|
|
}
|
|
}
|
|
i.d(t, "a", (function() {
|
|
return a
|
|
}));
|
|
class a {
|
|
constructor(e) {
|
|
this._renderer = new o, this._rendererData = {
|
|
background: "",
|
|
color: "",
|
|
coordinate: 0,
|
|
text: "",
|
|
visible: !1,
|
|
width: 0,
|
|
alwaysInViewPort: !0
|
|
}, this._invalidated = !0, this._model = e, this._renderer.setData(this
|
|
._rendererData)
|
|
}
|
|
update() {
|
|
this._invalidated = !0
|
|
}
|
|
renderer() {
|
|
return this._invalidated && (this._updateImpl(), this._invalidated = !1), this
|
|
._renderer
|
|
}
|
|
coordinate() {
|
|
return this._rendererData.coordinate
|
|
}
|
|
_getAlwaysInViewPort() {
|
|
return !0
|
|
}
|
|
_updateImpl() {
|
|
const e = this._rendererData;
|
|
if (e.visible = !1, this._model.timeScale().isEmpty()) return;
|
|
const t = this._getIndex();
|
|
if (null === t) return;
|
|
e.visible = !0, e.width = this._model.timeScale().width(), e.background = this
|
|
._getBgColor(), e.color = Object(s.colorFromBackground)(e.background), e
|
|
.coordinate = this._model.timeScale().indexToCoordinate(t), e.alwaysInViewPort =
|
|
this._getAlwaysInViewPort();
|
|
const i = this._model.timeScale().indexToUserTime(t);
|
|
e.text = null !== i ? this._model.dateTimeFormatter().format(i) : "", this
|
|
._invalidated = !1
|
|
}
|
|
}
|
|
},
|
|
d700: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "b", (function() {
|
|
return r
|
|
})), i.d(t, "a", (function() {
|
|
return n
|
|
}));
|
|
var s = i("/3z9");
|
|
|
|
function r(e) {
|
|
if ("INPUT" === e.tagName) {
|
|
const t = e.type;
|
|
return "text" === t || "email" === t || "number" === t || "password" === t ||
|
|
"search" === t || "tel" === t || "url" === t
|
|
}
|
|
return "TEXTAREA" === e.tagName || e.isContentEditable
|
|
}
|
|
|
|
function n(e, t) {
|
|
if (!t) return !1;
|
|
const i = 255 & e;
|
|
if (27 === i || i >>> 4 == 7) return !1;
|
|
switch (e ^ i) {
|
|
case s.Modifiers.Alt:
|
|
return (38 === i || 40 === i) && "SELECT" === t.tagName || r(t);
|
|
case s.Modifiers.Alt + s.Modifiers.Shift:
|
|
return r(t);
|
|
case s.Modifiers.Mod:
|
|
if (67 === i || !s.isMacKeyboard && 45 === i) {
|
|
const e = t.ownerDocument && t.ownerDocument.getSelection();
|
|
if (e && !e.isCollapsed) return !0
|
|
}
|
|
return r(t);
|
|
case s.Modifiers.Mod + s.Modifiers.Shift:
|
|
return i >= 33 && i <= 40 && r(t);
|
|
case s.Modifiers.Shift:
|
|
case 0:
|
|
return !!(9 !== i || t.ownerDocument && t !== t.ownerDocument.body && t !== t
|
|
.ownerDocument.documentElement) && ((13 === i || 32 === i || ! function(e) {
|
|
if ("BUTTON" === e.tagName) return !0;
|
|
if ("INPUT" === e.tagName) {
|
|
const t = e.type;
|
|
if ("submit" === t || "button" === t || "reset" === t ||
|
|
"checkbox" === t || "radio" === t) return !0
|
|
}
|
|
return !1
|
|
}(t)) && ("form" in t || t.isContentEditable))
|
|
}
|
|
return !1
|
|
}
|
|
},
|
|
dDSx: function(e, t, i) {
|
|
"use strict";
|
|
(function(e) {
|
|
var s = i("Ss5c").LineDataSource,
|
|
r = i("//lZ").doAnimate,
|
|
n = i("onDC").ChartUndoModelBase,
|
|
o = (i("Ocx9").saveDefaultProperties, i("GVHu").Study),
|
|
a = i("8sOK").StudyStub,
|
|
l = i("vwKG").showTooManyStudiesNotice,
|
|
c = (i("RDU5").UndoCommand, i("YlKu").ApplyLineToolTemplateUndoCommand),
|
|
h = i("s9sR").SetResolutionUndoCommand,
|
|
u = i("FKaq").SetPriceScaleSelectionStrategyCommand,
|
|
d = i("CsKN").SetScaleRatioPropertiesCommand,
|
|
p = i("/YGI").StudyInserter,
|
|
_ = i("JWMC").trackEvent,
|
|
m = i("txPx").getLogger("Chart.ChartUndoModel"),
|
|
f = i("QTwd").RestoreDefaultsPreferencesUndoCommand,
|
|
g = i("bJYc").SetPropertyUndoCommand,
|
|
b = i("pOzK").SetPriceScaleModeCommand,
|
|
v = i("7MWe").PriceScaleChangeUndoCommand,
|
|
S = i("LxhU").Interval,
|
|
y = i("ri5u").ChartLoadThemeUndoCommand;
|
|
t.ChartUndoModel = class extends n {
|
|
constructor(t, i, s, r, n, o, a, l, c) {
|
|
super(t, i, s, r, n, o, a, l, c), this._onSimpleZoomIn = new e, this
|
|
._onSimpleZoomOut = new e, this.beginUndoMacro = a.beginUndoMacro
|
|
.bind(a), this.endUndoMacro = a.endUndoMacro.bind(a), this
|
|
.createUndoCheckpoint = a.createUndoCheckpoint.bind(a), this
|
|
.undoToCheckpoint = a.undoToCheckpoint.bind(a)
|
|
}
|
|
version() {
|
|
return this.m_model.version()
|
|
}
|
|
onData(e) {
|
|
switch (e.method) {
|
|
case "timescale_update":
|
|
var t = e.params;
|
|
this.m_model.updateTimeScale(t.index, t.zoffset, t.changes, t
|
|
.index_diff, t.baseIndex, t.marks, t.clear);
|
|
break;
|
|
case "timescale_completed":
|
|
var i = e.params[0];
|
|
this.m_model.timeScale().onTimeScaleCompleted(i)
|
|
}
|
|
}
|
|
paneForSource(e) {
|
|
return this.m_model.paneForSource(e)
|
|
}
|
|
createPane(e) {
|
|
return this.m_model.createPane(e)
|
|
}
|
|
readOnly() {
|
|
return this.m_model.readOnly()
|
|
}
|
|
restart() {
|
|
this.m_model.restart()
|
|
}
|
|
disconnect() {
|
|
this.m_model.disconnect()
|
|
}
|
|
studiesMetaData() {
|
|
return this.m_model.studiesMetaData()
|
|
}
|
|
studyVersioning() {
|
|
return this.m_model.studyVersioning()
|
|
}
|
|
chartModel() {
|
|
return this._model()
|
|
}
|
|
_model() {
|
|
return this.m_model
|
|
}
|
|
pushUndoCommand(e) {
|
|
this._pushUndoCommand(e)
|
|
}
|
|
_pushUndoCommand(e) {
|
|
this._undoHistory.pushUndoCommand(e)
|
|
}
|
|
startScrollPrice(e, t, i) {
|
|
t.isAutoScale() || (this._initialPriceScrollState = t.state(), this
|
|
._initialPriceScrollPos = i, this.chartModel().startScrollPrice(
|
|
e, t, i))
|
|
}
|
|
scrollPriceTo(e, t, i) {
|
|
t.isAutoScale() || (this._initialPriceScrollPos && Math.abs(this
|
|
._initialPriceScrollPos - i) > 20 && (this.pushUndoCommand(
|
|
new v(this.m_model, e, t, this._initialPriceScrollState)
|
|
), delete this._initialPriceScrollState, delete this
|
|
._initialPriceScrollPos), this.chartModel().scrollPriceTo(e,
|
|
t, i))
|
|
}
|
|
endScrollPrice(e, t) {
|
|
t.isAutoScale() || (delete this._initialPriceScrollState, delete this
|
|
._initialPriceScrollPos, this.chartModel().endScrollPrice(e, t))
|
|
}
|
|
setPriceAutoScale(e, t, i) {
|
|
this.pushUndoCommand(new v(this.m_model, e, t, t.state())), this
|
|
.chartModel().setPriceAutoScale(e, t, i)
|
|
}
|
|
setWidth(e) {
|
|
this.m_model.setWidth(e)
|
|
}
|
|
setPaneHeight(e, t) {
|
|
this.m_model.setPaneHeight(e, t)
|
|
}
|
|
gridSource() {
|
|
return this.m_model.gridSource()
|
|
}
|
|
watermarkSource() {
|
|
return this.m_model.watermarkSource()
|
|
}
|
|
addAlertsSource(e) {
|
|
return this.m_model.addAlertsSource(e)
|
|
}
|
|
alertsSources() {
|
|
return this.m_model.alertsSources()
|
|
}
|
|
publishedChartsTimelineSource() {
|
|
return this.m_model.publishedChartsTimelineSource()
|
|
}
|
|
barsMarksSources() {
|
|
return this.m_model.barsMarksSources()
|
|
}
|
|
barMarksSourceForId(e) {
|
|
return this.m_model.barMarksSourceForId(e)
|
|
}
|
|
crossHairSource() {
|
|
return this.m_model.crossHairSource()
|
|
}
|
|
model() {
|
|
return this.m_model
|
|
}
|
|
chartWidget() {
|
|
return this._chartWidget
|
|
}
|
|
mainSeries() {
|
|
return this.m_model.m_mainSeries
|
|
}
|
|
mainSeriesScaleRatioProperty() {
|
|
return this.m_model.mainSeriesScaleRatioProperty()
|
|
}
|
|
panes() {
|
|
return this.m_model.panes()
|
|
}
|
|
timeScale() {
|
|
return this.m_model.timeScale()
|
|
}
|
|
selectionMacro(e) {
|
|
return this.m_model.selectionMacro(e)
|
|
}
|
|
setHoveredSource(e, t) {
|
|
this.m_model.setHoveredSource(e, t)
|
|
}
|
|
selection() {
|
|
return this.m_model.selection()
|
|
}
|
|
onSelectedSourceChanged() {
|
|
return this.m_model.onSelectedSourceChanged()
|
|
}
|
|
hoveredSource() {
|
|
return this.m_model.hoveredSource()
|
|
}
|
|
activeStrategySource() {
|
|
return this.m_model.activeStrategySource()
|
|
}
|
|
invalidate(e) {
|
|
this.m_model.invalidate(e)
|
|
}
|
|
setCurrentPosition(e, t, i, s) {
|
|
this.m_model.setCurrentPosition(e, t, i, s)
|
|
}
|
|
setAndSaveCurrentPosition(e, t, i, s) {
|
|
this.m_model.setAndSaveCurrentPosition(e, t, i, s)
|
|
}
|
|
canCreateStudy(e) {
|
|
return this.model().chartApi().chartApi().isCanCreateStudy(e)
|
|
}
|
|
_isCountedStudy(e) {
|
|
throw new Error("Not implemented")
|
|
}
|
|
checkIfFeatureAvailable(e, t) {
|
|
var i = this.canCreateStudy(),
|
|
s = t && t instanceof o;
|
|
return !this.readOnly() && s && (i = this.canCreateStudy(!0)), !!i || (
|
|
s || l(), !1)
|
|
}
|
|
createStudyInserter(e, t, i) {
|
|
var s = this,
|
|
r = null,
|
|
n = {
|
|
createStudy: function(e, t, i, n, o, a, l, c, h, u, d) {
|
|
return s.checkIfFeatureAvailable(e, a) ? (_("studies",
|
|
"Study_" + e.id),
|
|
"Compare@tv-basicstudies" === e.id && _(
|
|
"compare", "symbol:" + t.symbol), s
|
|
._insertStudy(e, t, n, o, a, l, c, h, u, r, d)
|
|
) : (m.logNormal("Cannot insert study " + e.id),
|
|
null)
|
|
}
|
|
};
|
|
void 0 !== i && (n.createStub = function() {
|
|
var e = s.m_model.insertStudyStub(i);
|
|
return r = {
|
|
targetPaneId: s.m_model.paneForSource(e).id(),
|
|
targetZOrder: e.zorder()
|
|
}, e.id()
|
|
}, n.removeStub = function(e) {
|
|
return s.m_model.removeStudyStub(e)
|
|
});
|
|
var o = new p(e, this.m_model._studiesMetaInfoRepository, n);
|
|
return o.setParentSource(t), o
|
|
}
|
|
setProperty(e, t, i, s) {
|
|
if (e && e.value() !== t) {
|
|
var r = new g(e, t, i, this.m_model, s);
|
|
this.pushUndoCommand(r), this.emitEvent("setProperty")
|
|
}
|
|
}
|
|
setProperties(e, t, i) {
|
|
var s = this;
|
|
this.beginUndoMacro(i), this.m_model.selectionMacro((function() {
|
|
for (var r = 0; r < e.length; r++) s.setProperty(e[r],
|
|
t[r], i)
|
|
})), this.endUndoMacro()
|
|
}
|
|
setPriceScaleMode(e, t, i) {
|
|
for (var s = Object.keys(e), r = t.mode(), n = !1, o = 0; o < s
|
|
.length; o++)
|
|
if (r[s[o]] !== e[s[o]]) {
|
|
n = !0;
|
|
break
|
|
} if (n) {
|
|
var a = new b(e, t, i, this.m_model);
|
|
this.pushUndoCommand(a)
|
|
}
|
|
}
|
|
setPriceScaleSelectionStrategy(e) {
|
|
if (this.m_model.properties().priceScaleSelectionStrategyName
|
|
.value() !== e) {
|
|
_("Chart", "Change PriceScale Selection Strategy");
|
|
var t = "Set Price Scale Selection Stretegy to " + e;
|
|
this.beginUndoMacro(t), this.setProperty(this.m_model.properties()
|
|
.priceScaleSelectionStrategyName, e, t);
|
|
var i = new u(this.m_model, e, t);
|
|
this.pushUndoCommand(i), this.endUndoMacro()
|
|
}
|
|
}
|
|
setScaleRatioProperty(e, t, i) {
|
|
if (e.value() !== t) {
|
|
var s = new d(e, t, i, this.m_model);
|
|
this.pushUndoCommand(s)
|
|
}
|
|
}
|
|
setResolutionProperty(e, t, i, s) {
|
|
if (!S.isEqual(e.value(), t)) {
|
|
var r = new h(e, t, i, s);
|
|
this.pushUndoCommand(r)
|
|
}
|
|
}
|
|
lineBeingCreated() {
|
|
return this.m_model.lineBeingCreated()
|
|
}
|
|
paneBeingCreatedLineOn() {
|
|
return this.m_model.paneBeingCreatedLineOn()
|
|
}
|
|
cancelCreatingLine() {
|
|
this.m_model.cancelCreatingLine()
|
|
}
|
|
lineCancelled() {
|
|
return this.m_model.lineCancelled()
|
|
}
|
|
lineBeingEdited() {
|
|
return this.m_model.lineBeingEdited()
|
|
}
|
|
sourcesBeingMoved() {
|
|
return this.m_model.sourcesBeingMoved()
|
|
}
|
|
dataSources() {
|
|
return this.m_model.dataSources()
|
|
}
|
|
orderedDataSources(e) {
|
|
return this.m_model.orderedDataSources(e)
|
|
}
|
|
dataSourceForId(e) {
|
|
return this.m_model.dataSourceForId(e)
|
|
}
|
|
state(e, t, i, s) {
|
|
return this.m_model.state(e, t, i, s)
|
|
}
|
|
asyncState() {
|
|
return this.m_model.asyncState()
|
|
}
|
|
calculateDefaultTags() {
|
|
return this.m_model.calculateDefaultTags()
|
|
}
|
|
onTagsChanged() {
|
|
return this.m_model.onTagsChanged()
|
|
}
|
|
_removeAllStudiesImpl() {
|
|
for (var e = this.m_model.dataSources(), t = 0; t < e.length; t++) {
|
|
var i = e[t];
|
|
(TradingView.isInherited(i.constructor, o) && !i.isChildStudy() && i
|
|
.removeByRemoveAllStudies() || TradingView.isInherited(i
|
|
.constructor, a)) && this.removeSource(i)
|
|
}
|
|
}
|
|
removeAllStudies() {
|
|
this.beginUndoMacro(window.t("Remove all studies")), this
|
|
._removeAllStudiesImpl(), this.endUndoMacro()
|
|
}
|
|
_removeAllDrawingToolsImpl(e) {
|
|
var t = this;
|
|
this.selectionMacro((function() {
|
|
t.lineBeingCreated() && t.cancelCreatingLine();
|
|
for (var i = t.dataSources(), r = 0; r < i
|
|
.length; r++) {
|
|
var n = i[r];
|
|
TradingView.isInherited(n.constructor, s) && n
|
|
.isActualSymbol() && n.isUserDeletable() && (
|
|
e && e !== n.toolname || t.removeSource(n))
|
|
}
|
|
}))
|
|
}
|
|
removeAllDrawingTools(e) {
|
|
this.beginUndoMacro(window.t("Remove Drawings")), this
|
|
._removeAllDrawingToolsImpl(), this.endUndoMacro()
|
|
}
|
|
removeAllStudiesAndDrawingTools() {
|
|
this.beginUndoMacro(window.t("Remove all studies and drawing tools")),
|
|
this._removeAllDrawingToolsImpl(), this._removeAllStudiesImpl(),
|
|
this.endUndoMacro()
|
|
}
|
|
moveLeft() {
|
|
try {
|
|
this.beginUndoMacro("Move Left")
|
|
} catch (e) {
|
|
return
|
|
}
|
|
var e = this.m_model.timeScale().width(),
|
|
t = this;
|
|
r({
|
|
to: e / 5,
|
|
onStep: function(e) {
|
|
t.startScrollTime(e), t.scrollTimeTo(0), t
|
|
.endScrollTime()
|
|
},
|
|
onComplete: function() {
|
|
t.endUndoMacro()
|
|
}
|
|
})
|
|
}
|
|
moveRight() {
|
|
try {
|
|
this.beginUndoMacro("Move Right")
|
|
} catch (e) {
|
|
return
|
|
}
|
|
var e = this.m_model.timeScale().width(),
|
|
t = this;
|
|
r({
|
|
to: e / 5,
|
|
onStep: function(e) {
|
|
t.startScrollTime(0), t.scrollTimeTo(e), t
|
|
.endScrollTime()
|
|
},
|
|
onComplete: function() {
|
|
t.endUndoMacro()
|
|
}
|
|
})
|
|
}
|
|
scrollChart(e) {
|
|
this.m_model.scrollEnabled() && (this.startScrollTime(0), this
|
|
.scrollTimeTo(e), this.endScrollTime())
|
|
}
|
|
scrollChartByBar(e) {
|
|
if (this.m_model.scrollEnabled()) {
|
|
var t = e * this.m_model.timeScale().barSpacing();
|
|
this.startScrollTime(0), this.scrollTimeTo(t), this.endScrollTime()
|
|
}
|
|
}
|
|
restorePreferences() {
|
|
var e = new f(this.model());
|
|
this.pushUndoCommand(e)
|
|
}
|
|
applyPreferences(e) {
|
|
throw new Error("Not implemented")
|
|
}
|
|
chartLoadTheme(e, t, i, s) {
|
|
var r = new y(e, t, i);
|
|
s ? r.redo() : this.pushUndoCommand(r)
|
|
}
|
|
applyLineToolTemplate(e, t, i) {
|
|
this.beginUndoMacro(i), this.saveLineToolState(e, i);
|
|
var s = new c(e, t, i);
|
|
this.pushUndoCommand(s), this.saveLineToolState(e, i), this
|
|
.endUndoMacro(), this.model().updateSource(e)
|
|
}
|
|
onSimpleZoomIn() {
|
|
return this._onSimpleZoomIn
|
|
}
|
|
onSimpleZoomOut() {
|
|
return this._onSimpleZoomOut
|
|
}
|
|
getAlertsList() {
|
|
return this.m_model.getAlertsList()
|
|
}
|
|
isJustClonedChart() {
|
|
return this._chartWidget.isJustClonedChart()
|
|
}
|
|
trackTime() {
|
|
return this._chartWidget.trackTime()
|
|
}
|
|
isInReplay() {
|
|
return this.m_model.isInReplay()
|
|
}
|
|
switchToReplay(e, t) {}
|
|
switchToRealtime() {}
|
|
togglePriceScaleAutoScaleMode(e) {
|
|
var t = {
|
|
autoScale: !e.isAutoScale()
|
|
};
|
|
this.setPriceScaleMode(t, e, "Auto Scale")
|
|
}
|
|
togglePriceScaleLockScaleMode(e) {
|
|
var t = {
|
|
lockScale: !e.isLockScale()
|
|
};
|
|
this.setPriceScaleMode(t, e, "Lock Scale")
|
|
}
|
|
setPriceScaleRegularScaleMode(e) {
|
|
this.setPriceScaleMode({
|
|
log: !1,
|
|
percentage: !1,
|
|
indexedTo100: !1
|
|
}, e, "Regular")
|
|
}
|
|
togglePriceScaleIndexedTo100ScaleMode(e) {
|
|
var t = {
|
|
indexedTo100: !e.isIndexedTo100()
|
|
};
|
|
this.setPriceScaleMode(t, e, "Indexed to 100")
|
|
}
|
|
togglePriceScalePercentageScaleMode(e) {
|
|
var t = {
|
|
percentage: !e.isPercentage()
|
|
};
|
|
this.setPriceScaleMode(t, e, "Percent")
|
|
}
|
|
togglePriceScaleLogScaleMode(e) {
|
|
var t = {
|
|
log: !e.isLog()
|
|
};
|
|
this.setPriceScaleMode(t, e, "Logarithmic")
|
|
}
|
|
invertPriceScale(e) {
|
|
var t = e.properties().isInverted;
|
|
this.setProperty(t, !t.value(), "Invert Scale")
|
|
}
|
|
removePane(e) {
|
|
var t = this.m_model.panes()[e].dataSources().slice();
|
|
this.removeSources(t, !1, "Remove pane")
|
|
}
|
|
destroy() {
|
|
this.model().destroy()
|
|
}
|
|
}
|
|
}).call(this, i("aIyQ"))
|
|
},
|
|
dOnf: function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e) {
|
|
let t;
|
|
if ("object" != typeof e || null == e || "number" == typeof e.nodeType) t = e;
|
|
else if (e instanceof Date) t = new Date(e.valueOf());
|
|
else if (Array.isArray(e)) {
|
|
t = [];
|
|
let i = 0;
|
|
const r = e.length;
|
|
for (; i < r; i++) Object.prototype.hasOwnProperty.call(e, i) && (t[i] = s(e[i]))
|
|
} else {
|
|
t = {};
|
|
for (const i in e) Object.prototype.hasOwnProperty.call(e, i) && (t[i] = s(e[i]))
|
|
}
|
|
return t
|
|
}
|
|
i.r(t), i.d(t, "deepCopy", (function() {
|
|
return s
|
|
}))
|
|
},
|
|
dTSQ: function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e) {
|
|
return e.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&")
|
|
}
|
|
i.r(t), i.d(t, "regExpEscape", (function() {
|
|
return s
|
|
}))
|
|
},
|
|
"dUJ+": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "replaceGraphicsTimesWithTimePointIndexIndex", (function() {
|
|
return n
|
|
}));
|
|
const s = new Map([
|
|
["horizlines", e => [e.startIndex, e.endIndex]],
|
|
["hhists", e => [e.firstBarTime, e.firstBarTime]],
|
|
["vertlines", e => [e.index]],
|
|
["polygons", e => e.points.map(e => e.index)]
|
|
]),
|
|
r = new Map([
|
|
["horizlines", (e, t) => {
|
|
const i = e;
|
|
i.startIndex = t.get(i.startIndex), i.endIndex = t.get(i.endIndex)
|
|
}],
|
|
["hhists", (e, t) => {
|
|
const i = e;
|
|
i.firstBarTime = t.get(i.firstBarTime), i.lastBarTime = t.get(i.lastBarTime)
|
|
}],
|
|
["vertlines", (e, t) => {
|
|
const i = e;
|
|
i.index = t.get(i.index)
|
|
}],
|
|
["polygons", (e, t) => {
|
|
const i = e;
|
|
for (const e of i.points) e.index = t.get(e.index)
|
|
}]
|
|
]);
|
|
|
|
function n(e) {
|
|
const t = e.data && e.data.graphicsCmds && e.data.graphicsCmds.create;
|
|
if (!t) return [];
|
|
const i = new Map,
|
|
n = new Set;
|
|
s.forEach((e, s) => {
|
|
const r = t[s];
|
|
if (r)
|
|
for (const t of r)
|
|
for (const s of t.data) {
|
|
const t = e(s);
|
|
for (const e of t) i.set(e, -1), n.add(e)
|
|
}
|
|
});
|
|
const o = Array.from(n).sort((e, t) => e - t);
|
|
return o.forEach((e, t) => i.set(e, t)), r.forEach((e, s) => {
|
|
const r = t[s];
|
|
if (r)
|
|
for (const t of r)
|
|
for (const s of t.data) e(s, i)
|
|
}), o
|
|
}
|
|
},
|
|
dfhE: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "STATUS_OFFLINE", (function() {
|
|
return s
|
|
})), i.d(t, "STATUS_RESOLVING", (function() {
|
|
return r
|
|
})), i.d(t, "STATUS_LOADING", (function() {
|
|
return n
|
|
})), i.d(t, "STATUS_READY", (function() {
|
|
return o
|
|
})), i.d(t, "STATUS_INVALID_SYMBOL", (function() {
|
|
return a
|
|
})), i.d(t, "STATUS_SNAPSHOT", (function() {
|
|
return l
|
|
})), i.d(t, "STATUS_EOD", (function() {
|
|
return c
|
|
})), i.d(t, "STATUS_PULSE", (function() {
|
|
return h
|
|
})), i.d(t, "STATUS_DELAYED", (function() {
|
|
return u
|
|
})), i.d(t, "STATUS_DELAYED_STREAMING", (function() {
|
|
return d
|
|
})), i.d(t, "STATUS_NO_BARS", (function() {
|
|
return p
|
|
})), i.d(t, "STATUS_REPLAY", (function() {
|
|
return _
|
|
})), i.d(t, "STATUS_ERROR", (function() {
|
|
return m
|
|
})), i.d(t, "SERIES_STATUS_TEXT", (function() {
|
|
return f
|
|
})), i.d(t, "STYLE_LINE_TYPE_MARKERS", (function() {
|
|
return g
|
|
})), i.d(t, "STYLE_LINE_TYPE_STEP", (function() {
|
|
return b
|
|
})), i.d(t, "STYLE_LINE_TYPE_SIMPLE", (function() {
|
|
return v
|
|
})), i.d(t, "STYLE_BARS", (function() {
|
|
return S
|
|
})), i.d(t, "STYLE_CANDLES", (function() {
|
|
return y
|
|
})), i.d(t, "STYLE_LINE", (function() {
|
|
return w
|
|
})), i.d(t, "STYLE_AREA", (function() {
|
|
return P
|
|
})), i.d(t, "STYLE_RENKO", (function() {
|
|
return C
|
|
})), i.d(t, "STYLE_KAGI", (function() {
|
|
return x
|
|
})), i.d(t, "STYLE_PNF", (function() {
|
|
return T
|
|
})), i.d(t, "STYLE_PB", (function() {
|
|
return I
|
|
})), i.d(t, "STYLE_HEIKEN_ASHI", (function() {
|
|
return M
|
|
})), i.d(t, "STYLE_HOLLOW_CANDLES", (function() {
|
|
return O
|
|
})), i.d(t, "STYLE_BASELINE", (function() {
|
|
return L
|
|
})), i.d(t, "STYLE_RANGE", (function() {
|
|
return A
|
|
})), i.d(t, "STYLE_HILO", (function() {
|
|
return E
|
|
})), i.d(t, "STYLE_SHORT_NAMES", (function() {
|
|
return k
|
|
})), i.d(t, "SYMBOL_STRING_DATA", (function() {
|
|
return D
|
|
}));
|
|
const s = 0,
|
|
r = 1,
|
|
n = 2,
|
|
o = 3,
|
|
a = 4,
|
|
l = 5,
|
|
c = 6,
|
|
h = 7,
|
|
u = 8,
|
|
d = 9,
|
|
p = 10,
|
|
_ = 11,
|
|
m = 12,
|
|
f = {
|
|
[s]: "connecting",
|
|
[r]: "loading",
|
|
[n]: "loading",
|
|
[o]: "realtime",
|
|
[a]: "invalid",
|
|
[l]: "snapshot",
|
|
[c]: "endofday",
|
|
[h]: "endofday",
|
|
[u]: "delayed",
|
|
[d]: "delayed_streaming",
|
|
[p]: "forbidden",
|
|
[_]: "replay",
|
|
[m]: "error"
|
|
},
|
|
g = 0,
|
|
b = 1,
|
|
v = 2,
|
|
S = 0,
|
|
y = 1,
|
|
w = 2,
|
|
P = 3,
|
|
C = 4,
|
|
x = 5,
|
|
T = 6,
|
|
I = 7,
|
|
M = 8,
|
|
O = 9,
|
|
L = 10,
|
|
A = 11,
|
|
E = 12,
|
|
k = {
|
|
0: "bar",
|
|
1: "candle",
|
|
9: "hollowCandle",
|
|
2: "line",
|
|
3: "area",
|
|
4: "renko",
|
|
7: "pb",
|
|
5: "kagi",
|
|
6: "pnf",
|
|
8: "ha",
|
|
10: "baseline",
|
|
11: "range",
|
|
12: "hilo"
|
|
},
|
|
D = {
|
|
4: {
|
|
type: "BarSetRenko@tv-prostudies",
|
|
basicStudyVersion: 40
|
|
},
|
|
7: {
|
|
type: "BarSetPriceBreak@tv-prostudies",
|
|
basicStudyVersion: 34
|
|
},
|
|
5: {
|
|
type: "BarSetKagi@tv-prostudies",
|
|
basicStudyVersion: 34
|
|
},
|
|
6: {
|
|
type: "BarSetPnF@tv-prostudies",
|
|
basicStudyVersion: 34
|
|
},
|
|
8: {
|
|
type: "BarSetHeikenAshi@tv-basicstudies",
|
|
basicStudyVersion: 60
|
|
},
|
|
11: {
|
|
type: "BarSetRange@tv-basicstudies",
|
|
basicStudyVersion: 72
|
|
}
|
|
}
|
|
},
|
|
dhFz: function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e) {
|
|
return Boolean(e.isNaN)
|
|
}
|
|
i.d(t, "a", (function() {
|
|
return s
|
|
}))
|
|
},
|
|
di4O: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "watermarkProperty", (function() {
|
|
return h
|
|
})), i.d(t, "restoreWatermarkPropertyDefaults", (function() {
|
|
return u
|
|
}));
|
|
var s = i("eJTA"),
|
|
r = i("Vdly"),
|
|
n = i("tc+8"),
|
|
o = i.n(n);
|
|
const a = {
|
|
visibility: !1,
|
|
color: "rgba(80, 83, 94, 0.25)"
|
|
};
|
|
|
|
function l() {
|
|
const e = r.getJSON("symbolWatermark");
|
|
let t = Object.assign({}, a, e);
|
|
if (void 0 === e) {
|
|
if (void 0 !== r.getJSON("chartproperties")) {
|
|
const e = r.getJSON("chartproperties").symbolWatermarkProperties;
|
|
if (void 0 !== e) {
|
|
const i = Object(s.tryParseRgba)(e.color);
|
|
t = Object.assign(t, e), null !== i && (0 !== i[3] ? t.visibility = !0 : (i[3] =
|
|
.25, t.color = Object(s.rgbaToString)(i)))
|
|
}
|
|
}
|
|
delete t.transparency
|
|
}
|
|
return t
|
|
}
|
|
let c = null;
|
|
|
|
function h() {
|
|
return null === c && (c = new o.a(l()), r.onSync.subscribe(null, () => {
|
|
null !== c && c.mergeAndFire(l())
|
|
}), c.listeners().subscribe(null, () => {
|
|
null !== c && r.setJSON("symbolWatermark", c.state())
|
|
})), c
|
|
}
|
|
|
|
function u() {
|
|
null !== c && c.mergeAndFire(a)
|
|
}
|
|
},
|
|
dmHa: function(e, t) {
|
|
e.exports =
|
|
'<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28"><path fill="currentColor" d="M18.15 7.02A9.05 9.05 0 0014 6c-3.45 0-6.08 2-7.8 3.92a18.18 18.18 0 00-2.64 3.84v.02h-.01L4 14l-.45-.21-.1.21.1.21L4 14l-.45.21.01.03a5.85 5.85 0 00.16.32c.11.2.28.51.5.87a18.18 18.18 0 002.4 3.12l.71-.71A17.18 17.18 0 014.56 14a10.05 10.05 0 01.52-.91c.41-.69 1.04-1.6 1.85-2.5C8.58 8.75 10.95 7 14 7a8 8 0 013.4.77l.75-.75zm-3.11 3.12a4 4 0 00-4.9 4.9l.86-.87V14a3 3 0 013.17-3l.87-.86zm1.96 3.7l.86-.88a4 4 0 01-4.9 4.9l.87-.86A3 3 0 0017 13.83zm-6.4 6.4A8 8 0 0014 21c3.05 0 5.42-1.76 7.07-3.58A17.18 17.18 0 0023.44 14a9.47 9.47 0 00-.52-.91 17.18 17.18 0 00-2.25-2.93l.7-.7a18.18 18.18 0 013.06 4.3l.02.02L24 14l.45.21-.01.03a7.03 7.03 0 01-.16.32c-.11.2-.28.51-.5.87-.44.72-1.1 1.69-1.97 2.65C20.08 20.01 17.45 22 14 22c-1.55 0-2.94-.4-4.15-1.02l.75-.75zM24 14l.45-.21.1.21-.1.21L24 14zM22.2 6.5L6.5 22.2l-.7-.7L21.5 5.8l.7.7z"/></svg>'
|
|
},
|
|
e1Hy: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return r
|
|
}));
|
|
var s = i("EYFt");
|
|
class r extends s.a {
|
|
constructor(e, t) {
|
|
super(e, t), this._showStudyValues = t.properties().paneProperties
|
|
.legendProperties.showStudyValues
|
|
}
|
|
getValues(e) {
|
|
const t = super.getValues(e),
|
|
i = this._showStudyValues.value();
|
|
for (const e of t) e.visible = e.visible && i;
|
|
return t
|
|
}
|
|
}
|
|
},
|
|
e1ZQ: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "b", (function() {
|
|
return p
|
|
})), i.d(t, "a", (function() {
|
|
return _
|
|
})), i.d(t, "c", (function() {
|
|
return m
|
|
}));
|
|
var s = i("YFKU"),
|
|
r = i("kcTO");
|
|
const n = {
|
|
1: () => Object(s.t)("Jan"),
|
|
2: () => Object(s.t)("Feb"),
|
|
3: () => Object(s.t)("Mar"),
|
|
4: () => Object(s.t)("Apr"),
|
|
5: () => Object(s.t)("May", {
|
|
context: "short"
|
|
}),
|
|
6: () => Object(s.t)("Jun"),
|
|
7: () => Object(s.t)("Jul"),
|
|
8: () => Object(s.t)("Aug"),
|
|
9: () => Object(s.t)("Sep"),
|
|
10: () => Object(s.t)("Oct"),
|
|
11: () => Object(s.t)("Nov"),
|
|
12: () => Object(s.t)("Dec")
|
|
},
|
|
o = (e, t) => (t ? e.getMonth() : e.getUTCMonth()) + 1,
|
|
a = (e, t) => t ? e.getFullYear() : e.getUTCFullYear(),
|
|
l = (e, t) => Object(r.numberToStringWithLeadingZero)(((e, t) => t ? e.getDate() : e
|
|
.getUTCDate())(e, t), 2),
|
|
c = (e, t) => n[o(e, t)](),
|
|
h = (e, t) => Object(r.numberToStringWithLeadingZero)(o(e, t), 2),
|
|
u = (e, t) => Object(r.numberToStringWithLeadingZero)(a(e, t) % 100, 2),
|
|
d = (e, t) => Object(r.numberToStringWithLeadingZero)(a(e, t), 4),
|
|
p = {
|
|
"dd MMM 'yy": (e, t) => `${l(e, t)} ${c(e, t)} '${u(e, t)}`,
|
|
"MMM dd, yyyy": (e, t) => `${c(e, t)} ${l(e, t)}, ${d(e, t)}`,
|
|
"MMM dd": (e, t) => `${c(e, t)} ${l(e, t)}`,
|
|
"yyyy-MM-dd": (e, t) => `${d(e, t)}-${h(e, t)}-${l(e, t)}`,
|
|
"yy-MM-dd": (e, t) => `${u(e, t)}-${h(e, t)}-${l(e, t)}`,
|
|
"yy/MM/dd": (e, t) => `${u(e, t)}/${h(e, t)}/${l(e, t)}`,
|
|
"yyyy/MM/dd": (e, t) => `${d(e, t)}/${h(e, t)}/${l(e, t)}`,
|
|
"dd-MM-yyyy": (e, t) => `${l(e, t)}-${h(e, t)}-${d(e, t)}`,
|
|
"dd-MM-yy": (e, t) => `${l(e, t)}-${h(e, t)}-${u(e, t)}`,
|
|
"dd/MM/yy": (e, t) => `${l(e, t)}/${h(e, t)}/${u(e, t)}`,
|
|
"dd/MM/yyyy": (e, t) => `${l(e, t)}/${h(e, t)}/${d(e, t)}`,
|
|
"MM/dd/yy": (e, t) => `${h(e, t)}/${l(e, t)}/${u(e, t)}`,
|
|
"MM/dd/yyyy": (e, t) => `${h(e, t)}/${l(e, t)}/${d(e, t)}`
|
|
},
|
|
_ = Object.keys(p),
|
|
m = () => -1 !== ["ja", "ko", "zh", "zh_TW"].indexOf(window.language || "") ? "yyyy-MM-dd" :
|
|
"dd MMM 'yy"
|
|
},
|
|
"e3/o": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "guid", (function() {
|
|
return r
|
|
})), i.d(t, "randomHash", (function() {
|
|
return n
|
|
})),
|
|
i.d(t, "randomHashN", (function() {
|
|
return o
|
|
}));
|
|
const s = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
|
|
|
function r() {
|
|
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, e => {
|
|
const t = 16 * Math.random() | 0;
|
|
return ("x" === e ? t : 3 & t | 8).toString(16)
|
|
})
|
|
}
|
|
|
|
function n() {
|
|
return o(12)
|
|
}
|
|
|
|
function o(e) {
|
|
let t = "";
|
|
for (let i = 0; i < e; ++i) {
|
|
const e = Math.floor(Math.random() * s.length);
|
|
t += s[e]
|
|
}
|
|
return t
|
|
}
|
|
},
|
|
e92V: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "isMtpPredictorToolName", (function() {
|
|
return n
|
|
})), i.d(t, "isStudyLineToolName", (function() {
|
|
return o
|
|
})), i.d(t, "isLineToolName", (function() {
|
|
return a
|
|
})), i.d(t, "isLineDrawnWithPressedButton", (function() {
|
|
return l
|
|
})), i.d(t, "isLineToolDrawWithoutPoints", (function() {
|
|
return c
|
|
})), i.d(t, "isImageToolName", (function() {
|
|
return h
|
|
})), i.d(t, "isTextToolName", (function() {
|
|
return u
|
|
}));
|
|
var s = i("OH2X");
|
|
const r = new Set([]);
|
|
|
|
function n(e) {
|
|
return r.has(e)
|
|
}
|
|
|
|
function o(e) {
|
|
return "LineToolRegressionTrend" === e || "LineToolVbPFixed" === e ||
|
|
"LineToolFixedRangeVolumeProfile" === e
|
|
}
|
|
|
|
function a(e) {
|
|
return e in s || o(e)
|
|
}
|
|
|
|
function l(e) {
|
|
return "LineToolBrush" === e || "LineToolHighlighter" === e
|
|
}
|
|
|
|
function c(e) {
|
|
return "LineToolTweet" === e
|
|
}
|
|
|
|
function h(e) {
|
|
return "LineToolImage" === e
|
|
}
|
|
|
|
function u(e) {
|
|
switch (e) {
|
|
case "LineToolBalloon":
|
|
case "LineToolText":
|
|
case "LineToolTextAbsolute":
|
|
case "LineToolCallout":
|
|
case "LineToolNote":
|
|
case "LineToolNoteAbsolute":
|
|
case "LineToolSignpost":
|
|
return !0
|
|
}
|
|
return !1
|
|
}
|
|
},
|
|
eCE5: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "b", (function() {
|
|
return n
|
|
})), i.d(t, "a", (function() {
|
|
return a
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("LxhU");
|
|
|
|
function n(e, t) {
|
|
let i = t.multiplier();
|
|
if (t.isTicks() && (e.ticks = !0), t.isSeconds() && (i < 60 ? (e.seconds = !0, e
|
|
.secondsFrom = Math.min(e.secondsFrom, i), e.secondsTo = Math.max(e.secondsTo,
|
|
i)) : (i /= 60, t = new r.Interval(r.ResolutionKind.Minutes, i))), t
|
|
.isMinutes())
|
|
if (i < 60) e.minutes = !0, e.minutesFrom = Math.min(e.minutesFrom, i), e.minutesTo =
|
|
Math.max(e.minutesTo, i);
|
|
else {
|
|
const t = Math.floor(i / 60);
|
|
e.hours = !0, e.hoursFrom = Math.min(e.hoursFrom, t), e.hoursTo = Math.max(e
|
|
.hoursTo, t)
|
|
} t.isDays() && (e.days = !0, e.daysFrom = Math.min(e.daysFrom, i), e.daysTo = Math.max(
|
|
e.daysTo, i)), t.isWeeks() && (e.weeks = !0, e.weeksFrom = Math.min(e.weeksFrom, i),
|
|
e.weeksTo = Math.max(e.weeksTo, i)), t.isMonths() && (e.months = !0, e.monthsFrom =
|
|
Math.min(e.monthsFrom, i), e.monthsTo = Math.max(e.monthsTo, i)), t.isRange() && (e
|
|
.ranges = !0)
|
|
}
|
|
|
|
function o(e, t, i, s) {
|
|
return e && s >= t && s <= i
|
|
}
|
|
|
|
function a(e, t) {
|
|
const i = t.childs();
|
|
switch (e.kind()) {
|
|
case r.ResolutionKind.Ticks:
|
|
return i.ticks.value();
|
|
case r.ResolutionKind.Seconds:
|
|
if (e.multiplier() < 60) return o(i.seconds.value(), i.secondsFrom.value(), i
|
|
.secondsTo.value(), e.multiplier()); {
|
|
const t = Math.floor(e.multiplier() / 60);
|
|
return o(i.minutes.value(), i.minutesFrom.value(), i.minutesTo.value(), t)
|
|
}
|
|
case r.ResolutionKind.Minutes:
|
|
if (e.multiplier() < 60) return o(i.minutes.value(), i.minutesFrom.value(), i
|
|
.minutesTo.value(), e.multiplier()); {
|
|
const t = Math.floor(e.multiplier() / 60);
|
|
return o(i.hours.value(), i.hoursFrom.value(), i.hoursTo.value(), t)
|
|
}
|
|
case r.ResolutionKind.Days:
|
|
return o(i.days.value(), i.daysFrom.value(), i.daysTo.value(), e
|
|
.multiplier());
|
|
case r.ResolutionKind.Weeks:
|
|
return o(i.weeks.value(), i.weeksFrom.value(), i.weeksTo.value(), e
|
|
.multiplier());
|
|
case r.ResolutionKind.Months:
|
|
return o(i.months.value(), i.monthsFrom.value(), i.monthsTo.value(), e
|
|
.multiplier());
|
|
case r.ResolutionKind.Range:
|
|
return i.ranges.value()
|
|
}
|
|
return Object(s.assert)(!1, "Unsupported resolution: " + e.value()), !1
|
|
}
|
|
},
|
|
eJTA: function(e, t, i) {
|
|
"use strict";
|
|
Object.defineProperty(t, "__esModule", {
|
|
value: !0
|
|
});
|
|
var s = i("ivNn");
|
|
|
|
function r(e, t, i) {
|
|
return s.isNaN(t) || t < e ? e : t > i ? i : Math.round(t)
|
|
}
|
|
|
|
function n(e, t, i) {
|
|
return s.isNaN(t) || t < e ? e : t > i ? i : Math.round(1e4 * t) / 1e4
|
|
}
|
|
|
|
function o(e) {
|
|
return r(0, e, 255)
|
|
}
|
|
|
|
function a(e) {
|
|
return r(0, e, 255)
|
|
}
|
|
|
|
function l(e) {
|
|
return r(0, e, 255)
|
|
}
|
|
|
|
function c(e) {
|
|
return n(0, e, 1)
|
|
}
|
|
|
|
function h(e) {
|
|
return n(0, e, 1)
|
|
}
|
|
|
|
function u(e) {
|
|
return n(0, e, 1)
|
|
}
|
|
|
|
function d(e) {
|
|
return n(0, e, 1)
|
|
}
|
|
|
|
function p(e) {
|
|
return n(0, e, 1)
|
|
}
|
|
|
|
function _(e) {
|
|
return n(0, e, 1)
|
|
}
|
|
|
|
function m(e) {
|
|
var t = e[0] / 255,
|
|
i = e[1] / 255,
|
|
s = e[2] / 255,
|
|
r = Math.min(t, i, s),
|
|
n = Math.max(t, i, s),
|
|
o = 0,
|
|
a = 0,
|
|
l = (r + n) / 2;
|
|
if (r === n) o = 0, a = 0;
|
|
else {
|
|
var c = n - r;
|
|
switch (a = l > .5 ? c / (2 - n - r) : c / (n + r), n) {
|
|
case t:
|
|
o = ((i - s) / c + (i < s ? 6 : 0)) / 6;
|
|
break;
|
|
case i:
|
|
o = ((s - t) / c + 2) / 6;
|
|
break;
|
|
case s:
|
|
o = ((t - i) / c + 4) / 6
|
|
}
|
|
}
|
|
return [o, a, l]
|
|
}
|
|
|
|
function f(e, t, i) {
|
|
return i < 0 && (i += 1), i > 1 && (i -= 1), i < 1 / 6 ? e + 6 * (t - e) * i : i < .5 ? t :
|
|
i < 2 / 3 ? e + (t - e) * (2 / 3 - i) * 6 : e
|
|
}
|
|
|
|
function g(e) {
|
|
var t, i, s, r = e[0],
|
|
n = e[1],
|
|
c = e[2];
|
|
if (0 === n) t = i = s = c;
|
|
else {
|
|
var h = c < .5 ? c * (1 + n) : c + n - c * n,
|
|
u = 2 * c - h;
|
|
t = f(u, h, r + 1 / 3), i = f(u, h, r), s = f(u, h, r - 1 / 3)
|
|
}
|
|
return [o(255 * t), a(255 * i), l(255 * s)]
|
|
}
|
|
t.normalizeRedComponent = o, t.normalizeGreenComponent = a, t.normalizeBlueComponent = l, t
|
|
.normalizeAlphaComponent = c, t.rgb = function(e, t, i) {
|
|
return [o(e), a(t), l(i)]
|
|
}, t.areEqualRgb = function(e, t) {
|
|
return e[0] === t[0] && e[1] === t[1] && e[2] === t[2]
|
|
}, t.rgba = function(e, t, i, s) {
|
|
if (Array.isArray(e)) {
|
|
var r = e;
|
|
return s = t, [r[0], r[1], r[2], c(s)]
|
|
}
|
|
var n = t;
|
|
return i = i || 0, s = s || 0, [o(e), a(n), l(i), c(s)]
|
|
}, t.areEqualRgba = function(e, t) {
|
|
return e[0] === t[0] && e[1] === t[1] && e[2] === t[2] && e[3] === t[3]
|
|
}, t.normalizeHue = h, t.normalizeHslSaturation = u, t.normalizeHsvSaturation = d, t
|
|
.normalizeLightness = p, t.normalizeValue = _, t.hsl = function(e, t, i) {
|
|
return [h(e), u(t), p(i)]
|
|
}, t.areEqualHsl = function(e, t) {
|
|
return e[0] === t[0] && e[1] === t[1] && e[2] === t[2]
|
|
}, t.hsv = function(e, t, i) {
|
|
return [h(e), d(t), _(i)]
|
|
}, t.areEqualHsv = function(e, t) {
|
|
return e[0] === t[0] && e[1] === t[1] && e[2] === t[2]
|
|
}, t.rgbToHsl = m, t.hslToRgb = g, t.rgbToHsv = function(e) {
|
|
var t = e[0],
|
|
i = e[1],
|
|
s = e[2],
|
|
r = t / 255,
|
|
n = i / 255,
|
|
o = s / 255,
|
|
a = Math.min(r, n, o),
|
|
l = Math.max(r, n, o),
|
|
c = l - a,
|
|
h = 0,
|
|
u = 0 === l ? 0 : c / l,
|
|
d = l;
|
|
if (l === a) h = 0;
|
|
else switch (l) {
|
|
case t:
|
|
h = ((n - o) / c + (n < o ? 6 : 0)) / 6;
|
|
break;
|
|
case i:
|
|
h = ((o - r) / c + 2) / 6;
|
|
break;
|
|
case s:
|
|
h = ((r - n) / c + 4) / 6
|
|
}
|
|
return [h, u, d]
|
|
}, t.hsvToRgb = function(e) {
|
|
var t = e[0],
|
|
i = e[1],
|
|
s = e[2],
|
|
r = Math.floor(6 * t),
|
|
n = 6 * t - r,
|
|
c = s * (1 - i),
|
|
h = s * (1 - n * i),
|
|
u = s * (1 - (1 - n) * i),
|
|
d = 0,
|
|
p = 0,
|
|
_ = 0;
|
|
switch (r % 6) {
|
|
case 0:
|
|
d = s, p = u, _ = c;
|
|
break;
|
|
case 1:
|
|
d = h, p = s, _ = c;
|
|
break;
|
|
case 2:
|
|
d = c, p = s, _ = u;
|
|
break;
|
|
case 3:
|
|
d = c, p = h, _ = s;
|
|
break;
|
|
case 4:
|
|
d = u, p = c, _ = s;
|
|
break;
|
|
case 5:
|
|
d = s, p = c, _ = h
|
|
}
|
|
return [o(255 * d), a(255 * p), l(255 * _)]
|
|
};
|
|
var b = [.199, .687, .114];
|
|
|
|
function v(e) {
|
|
return b[0] * e[0] + b[1] * e[1] + b[2] * e[2]
|
|
}
|
|
|
|
function S(e, t, i) {
|
|
void 0 === i && (i = .05);
|
|
var s = m(e),
|
|
r = s[0] + t * i;
|
|
return s[0] = h(r - Math.floor(r)), g(s)
|
|
}
|
|
|
|
function y(e, t, i) {
|
|
void 0 === i && (i = .05);
|
|
var s = e[0],
|
|
r = e[1],
|
|
n = e[2],
|
|
o = e[3],
|
|
a = S([s, r, n], t, i);
|
|
return [a[0], a[1], a[2], o]
|
|
}
|
|
t.rgbToGrayscale = v, t.distanceRgb = function(e, t) {
|
|
var i = e[0],
|
|
s = e[1],
|
|
r = e[2],
|
|
n = t[0] - i,
|
|
o = t[1] - s,
|
|
a = t[2] - r;
|
|
return Math.sqrt(n * n + o * o + a * a)
|
|
}, t.invertRgb = function(e) {
|
|
return [255 - e[0], 255 - e[1], 255 - e[2]]
|
|
}, t.darkenRgb = function(e, t) {
|
|
var i = m(e);
|
|
return g([i[0], i[1], p(i[2] - t / 100)])
|
|
}, t.blendRgba = function(e, t) {
|
|
var i = e[0],
|
|
s = e[1],
|
|
r = e[2],
|
|
n = e[3],
|
|
h = t[0],
|
|
u = t[1],
|
|
d = t[2],
|
|
p = t[3],
|
|
_ = c(1 - (1 - p) * (1 - n));
|
|
return [o(h * p / _ + i * n * (1 - p) / _), a(u * p / _ + s * n * (1 - p) / _), l(d *
|
|
p / _ + r * n * (1 - p) / _), _]
|
|
}, t.shiftRgb = S, t.shiftRgba = y, t.shiftColor = function(e, t, i) {
|
|
return void 0 === i && (i = .05), E(y(V(e), t, i))
|
|
};
|
|
var w, P, C, x, T = {
|
|
aliceblue: "#f0f8ff",
|
|
antiquewhite: "#faebd7",
|
|
aqua: "#00ffff",
|
|
aquamarine: "#7fffd4",
|
|
azure: "#f0ffff",
|
|
beige: "#f5f5dc",
|
|
bisque: "#ffe4c4",
|
|
black: "#000000",
|
|
blanchedalmond: "#ffebcd",
|
|
blue: "#0000ff",
|
|
blueviolet: "#8a2be2",
|
|
brown: "#a52a2a",
|
|
burlywood: "#deb887",
|
|
cadetblue: "#5f9ea0",
|
|
chartreuse: "#7fff00",
|
|
chocolate: "#d2691e",
|
|
coral: "#ff7f50",
|
|
cornflowerblue: "#6495ed",
|
|
cornsilk: "#fff8dc",
|
|
crimson: "#dc143c",
|
|
cyan: "#00ffff",
|
|
darkblue: "#00008b",
|
|
darkcyan: "#008b8b",
|
|
darkgoldenrod: "#b8860b",
|
|
darkgray: "#a9a9a9",
|
|
darkgreen: "#006400",
|
|
darkkhaki: "#bdb76b",
|
|
darkmagenta: "#8b008b",
|
|
darkolivegreen: "#556b2f",
|
|
darkorange: "#ff8c00",
|
|
darkorchid: "#9932cc",
|
|
darkred: "#8b0000",
|
|
darksalmon: "#e9967a",
|
|
darkseagreen: "#8fbc8f",
|
|
darkslateblue: "#483d8b",
|
|
darkslategray: "#2f4f4f",
|
|
darkturquoise: "#00ced1",
|
|
darkviolet: "#9400d3",
|
|
deeppink: "#ff1493",
|
|
deepskyblue: "#00bfff",
|
|
dimgray: "#696969",
|
|
dodgerblue: "#1e90ff",
|
|
feldspar: "#d19275",
|
|
firebrick: "#b22222",
|
|
floralwhite: "#fffaf0",
|
|
forestgreen: "#228b22",
|
|
fuchsia: "#ff00ff",
|
|
gainsboro: "#dcdcdc",
|
|
ghostwhite: "#f8f8ff",
|
|
gold: "#ffd700",
|
|
goldenrod: "#daa520",
|
|
gray: "#808080",
|
|
green: "#008000",
|
|
greenyellow: "#adff2f",
|
|
honeydew: "#f0fff0",
|
|
hotpink: "#ff69b4",
|
|
indianred: "#cd5c5c",
|
|
indigo: "#4b0082",
|
|
ivory: "#fffff0",
|
|
khaki: "#f0e68c",
|
|
lavender: "#e6e6fa",
|
|
lavenderblush: "#fff0f5",
|
|
lawngreen: "#7cfc00",
|
|
lemonchiffon: "#fffacd",
|
|
lightblue: "#add8e6",
|
|
lightcoral: "#f08080",
|
|
lightcyan: "#e0ffff",
|
|
lightgoldenrodyellow: "#fafad2",
|
|
lightgreen: "#90ee90",
|
|
lightgrey: "#d3d3d3",
|
|
lightpink: "#ffb6c1",
|
|
lightsalmon: "#ffa07a",
|
|
lightseagreen: "#20b2aa",
|
|
lightskyblue: "#87cefa",
|
|
lightslateblue: "#8470ff",
|
|
lightslategray: "#778899",
|
|
lightsteelblue: "#b0c4de",
|
|
lightyellow: "#ffffe0",
|
|
lime: "#00ff00",
|
|
limegreen: "#32cd32",
|
|
linen: "#faf0e6",
|
|
magenta: "#ff00ff",
|
|
maroon: "#800000",
|
|
mediumaquamarine: "#66cdaa",
|
|
mediumblue: "#0000cd",
|
|
mediumorchid: "#ba55d3",
|
|
mediumpurple: "#9370d8",
|
|
mediumseagreen: "#3cb371",
|
|
mediumslateblue: "#7b68ee",
|
|
mediumspringgreen: "#00fa9a",
|
|
mediumturquoise: "#48d1cc",
|
|
mediumvioletred: "#c71585",
|
|
midnightblue: "#191970",
|
|
mintcream: "#f5fffa",
|
|
mistyrose: "#ffe4e1",
|
|
moccasin: "#ffe4b5",
|
|
navajowhite: "#ffdead",
|
|
navy: "#000080",
|
|
oldlace: "#fdf5e6",
|
|
olive: "#808000",
|
|
olivedrab: "#6b8e23",
|
|
orange: "#ffa500",
|
|
orangered: "#ff4500",
|
|
orchid: "#da70d6",
|
|
palegoldenrod: "#eee8aa",
|
|
palegreen: "#98fb98",
|
|
paleturquoise: "#afeeee",
|
|
palevioletred: "#d87093",
|
|
papayawhip: "#ffefd5",
|
|
peachpuff: "#ffdab9",
|
|
peru: "#cd853f",
|
|
pink: "#ffc0cb",
|
|
plum: "#dda0dd",
|
|
powderblue: "#b0e0e6",
|
|
purple: "#800080",
|
|
red: "#ff0000",
|
|
rosybrown: "#bc8f8f",
|
|
royalblue: "#4169e1",
|
|
saddlebrown: "#8b4513",
|
|
salmon: "#fa8072",
|
|
sandybrown: "#f4a460",
|
|
seagreen: "#2e8b57",
|
|
seashell: "#fff5ee",
|
|
sienna: "#a0522d",
|
|
silver: "#c0c0c0",
|
|
skyblue: "#87ceeb",
|
|
slateblue: "#6a5acd",
|
|
slategray: "#708090",
|
|
snow: "#fffafa",
|
|
springgreen: "#00ff7f",
|
|
steelblue: "#4682b4",
|
|
tan: "#d2b48c",
|
|
teal: "#008080",
|
|
thistle: "#d8bfd8",
|
|
tomato: "#ff6347",
|
|
turquoise: "#40e0d0",
|
|
violet: "#ee82ee",
|
|
violetred: "#d02090",
|
|
wheat: "#f5deb3",
|
|
white: "#ffffff",
|
|
whitesmoke: "#f5f5f5",
|
|
yellow: "#ffff00",
|
|
yellowgreen: "#9acd32"
|
|
};
|
|
|
|
function I(e, t) {
|
|
return t in e
|
|
}
|
|
|
|
function M(e) {
|
|
var t = w.re.exec(e);
|
|
return null !== t ? w.parse(t) : null
|
|
}
|
|
|
|
function O(e) {
|
|
var t = P.re.exec(e);
|
|
return null !== t ? P.parse(t) : null
|
|
}
|
|
|
|
function L(e) {
|
|
var t = C.re.exec(e);
|
|
return null !== t ? C.parse(t) : null
|
|
}
|
|
|
|
function A(e) {
|
|
var t = x.re.exec(e);
|
|
return null !== t ? x.parse(t) : null
|
|
}
|
|
|
|
function E(e) {
|
|
return "rgba(" + e[0] + ", " + e[1] + ", " + e[2] + ", " + e[3] + ")"
|
|
}
|
|
|
|
function k(e) {
|
|
if (e = e.toLowerCase(), I(T, e)) {
|
|
var t = O(T[e]);
|
|
if (null !== t) return t;
|
|
throw new Error("Invalid named color definition")
|
|
}
|
|
var i = M(e);
|
|
if (null !== i) return i;
|
|
var s = O(e);
|
|
if (null !== s) return s;
|
|
var r = L(e);
|
|
if (null !== r) return r;
|
|
var n = A(e);
|
|
return null !== n ? [n[0], n[1], n[2]] : null
|
|
}
|
|
|
|
function D(e) {
|
|
if (e = e.toLowerCase(), I(T, e)) {
|
|
var t = O(T[e]);
|
|
if (null !== t) return [t[0], t[1], t[2], 1];
|
|
throw new Error("Invalid named color definition")
|
|
}
|
|
var i = M(e);
|
|
if (null !== i) return [i[0], i[1], i[2], 1];
|
|
var s = O(e);
|
|
if (null !== s) return [s[0], s[1], s[2], 1];
|
|
var r = L(e);
|
|
if (null !== r) return [r[0], r[1], r[2], 1];
|
|
var n = A(e);
|
|
return null !== n ? n : null
|
|
}
|
|
|
|
function V(e) {
|
|
var t = D(e);
|
|
if (null !== t) return t;
|
|
throw new Error("Passed color string does not match any of the known color representations")
|
|
}! function(e) {
|
|
e.re = /^rgb\(\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*\)$/, e.parse =
|
|
function(e) {
|
|
return [o(parseInt(e[1], 10)), a(parseInt(e[2], 10)), l(parseInt(e[3], 10))]
|
|
}
|
|
}(w || (w = {})), t.rgbToString = function(e) {
|
|
return "rgb(" + e[0] + ", " + e[1] + ", " + e[2] + ")"
|
|
},
|
|
function(e) {
|
|
e.re = /^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/, e.parse = function(e) {
|
|
return [o(parseInt(e[1], 16)), a(parseInt(e[2], 16)), l(parseInt(e[3], 16))]
|
|
}
|
|
}(P || (P = {})), t.rgbToHexString = function(e) {
|
|
var t = e[0],
|
|
i = e[1],
|
|
s = e[2],
|
|
r = t.toString(16),
|
|
n = i.toString(16),
|
|
o = s.toString(16);
|
|
return "#" + (1 === r.length ? "0" : "") + r + (1 === n.length ? "0" : "") + n + (1 ===
|
|
o.length ? "0" : "") + o
|
|
},
|
|
function(e) {
|
|
e.re = /^#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])$/, e.parse = function(e) {
|
|
return [o(parseInt(e[1] + e[1], 16)), a(parseInt(e[2] + e[2], 16)), l(parseInt(
|
|
e[3] + e[3], 16))]
|
|
}
|
|
}(C || (C = {})),
|
|
function(e) {
|
|
e.re =
|
|
/^rgba\(\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?[\d]{0,10}(?:\.\d+)?)\s*\)$/,
|
|
e.parse = function(e) {
|
|
return [o(parseInt(e[1], 10)), a(parseInt(e[2], 10)), l(parseInt(e[3], 10)), c(
|
|
parseFloat(e[4]))]
|
|
}
|
|
}(x || (x = {})), t.rgbaToString = E, t.rgbToBlackWhiteString = function(e, t) {
|
|
if (t < 0 || t > 255) throw new Error(
|
|
"invalid threshold value, valid values are [0, 255]");
|
|
return v(e) >= t ? "white" : "black"
|
|
}, t.tryParseRgb = k, t.parseRgb = function(e) {
|
|
var t = k(e);
|
|
if (null !== t) return t;
|
|
throw new Error(
|
|
"Passed color string does not match any of the known color representations")
|
|
}, t.tryParseRgba = D, t.parseRgba = V
|
|
},
|
|
eqEH: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "registerService", (function() {
|
|
return o
|
|
})), i.d(t, "unregisterService", (function() {
|
|
return a
|
|
})), i.d(t, "hasService", (function() {
|
|
return l
|
|
})),
|
|
i.d(t, "service", (function() {
|
|
return c
|
|
})), i.d(t, "waitServiceRegistered", (function() {
|
|
return h
|
|
}));
|
|
var s = i("jofe");
|
|
const r = {},
|
|
n = new Map;
|
|
|
|
function o(e, t) {
|
|
if (l(e)) throw new Error("Service already registered");
|
|
r[e.id] = t;
|
|
const i = n.get(e.id);
|
|
void 0 !== i && (n.delete(e.id), i.resolve(t))
|
|
}
|
|
|
|
function a(e) {
|
|
if (!l(e)) throw new Error("Service not found");
|
|
r[e.id] = void 0
|
|
}
|
|
|
|
function l(e) {
|
|
return void 0 !== r[e.id]
|
|
}
|
|
|
|
function c(e) {
|
|
const t = r[e.id];
|
|
if (void 0 === t) throw new Error("ServiceLocator: Service " + e.id + " not found");
|
|
return t
|
|
}
|
|
|
|
function h(e) {
|
|
if (l(e)) return Promise.resolve(c(e));
|
|
let t = n.get(e.id);
|
|
return void 0 === t && (t = Object(s.createDeferredPromise)(), n.set(e.id, t)), t.promise
|
|
}
|
|
},
|
|
f6yo: function(e, t, i) {
|
|
"use strict";
|
|
Object.defineProperty(t, "__esModule", {
|
|
value: !0
|
|
}), t.pointInCircle = t.pointInPolygon = t.pointInBox = t.pointInTriangle = t
|
|
.pointInHalfplane = void 0;
|
|
var s = i("hBTJ");
|
|
t.pointInHalfplane = function(e, t) {
|
|
var i = t.edge;
|
|
return i.A * e.x + i.B * e.y + i.C > 0 === t.isPositive
|
|
}, t.pointInTriangle = function(e, t, i, r) {
|
|
var n = t.add(i).scaled(.5).add(r).scaled(.5),
|
|
o = s.intersectLineSegments(t, i, n, e);
|
|
return null === o && (null === (o = s.intersectLineSegments(i, r, n, e)) && null === (
|
|
o = s.intersectLineSegments(r, t, n, e)))
|
|
}, t.pointInBox = function(e, t) {
|
|
return e.x >= t.min.x && e.x <= t.max.x && e.y >= t.min.y && e.y <= t.max.y
|
|
}, t.pointInPolygon = function(e, t) {
|
|
for (var i = t.length - 1, s = !1, r = e.x, n = e.y, o = 0; o < t.length; o++) {
|
|
var a = t[o],
|
|
l = t[i];
|
|
(a.y < n && l.y >= n || l.y < n && a.y >= n) && a.x + (n - a.y) / (l.y - a.y) * (l
|
|
.x - a.x) < r && (s = !s), i = o
|
|
}
|
|
return s
|
|
}, t.pointInCircle = function(e, t, i) {
|
|
return (e.x - t.x) * (e.x - t.x) + (e.y - t.y) * (e.y - t.y) <= i * i
|
|
}
|
|
},
|
|
fFKx: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "b", (function() {
|
|
return o
|
|
})), i.d(t, "a", (function() {
|
|
return a
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("tqok"),
|
|
n = i("hsV8");
|
|
|
|
function o(e, t) {
|
|
if (e.startIndex >= t.length || e.endIndex >= t.length) return null;
|
|
const i = t[e.startIndex],
|
|
n = t[e.endIndex];
|
|
return i === r.INVALID_TIME_POINT_INDEX || n === r.INVALID_TIME_POINT_INDEX ? null : (
|
|
Object(s.assert)(i <= n, "startIndex should not exceed endIndex"), {
|
|
startIndex: i,
|
|
endIndex: n,
|
|
level: e.level,
|
|
extendLeft: e.extendLeft,
|
|
extendRight: e.extendRight
|
|
})
|
|
}
|
|
|
|
function a(e, t, i) {
|
|
const s = Object(n.ensureTimePointIndexIndex)(i.indexOf(e.startIndex)),
|
|
r = Object(n.ensureTimePointIndexIndex)(i.indexOf(e.endIndex));
|
|
return {
|
|
id: t,
|
|
...e,
|
|
startIndex: s,
|
|
endIndex: r
|
|
}
|
|
}
|
|
},
|
|
fJhV: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineDataSourceTimeAxisView", (function() {
|
|
return n
|
|
}));
|
|
var s = i("cgFQ"),
|
|
r = i("Ulff");
|
|
class n extends s.a {
|
|
constructor(e, t) {
|
|
super(e.model()), this._active = !1, this._source = e, this._pointIndex = t
|
|
}
|
|
setActive(e) {
|
|
this._active = e
|
|
}
|
|
_getBgColor() {
|
|
return this._active ? r.a.active : r.a.common
|
|
}
|
|
_getIndex() {
|
|
if (!this._model.selection().isSelected(this._source)) return null;
|
|
const e = this._source.timeAxisPoints();
|
|
return e.length <= this._pointIndex ? null : e[this._pointIndex].index
|
|
}
|
|
}
|
|
},
|
|
fPdn: function(e, t, i) {
|
|
"use strict";
|
|
window.TradingView = window.TradingView || {}, window.requireAll = function(e) {
|
|
return e.keys().map(e)
|
|
}, i("6jKD"), i("bZMm"), i("YFKU"), i("8+VR").setClasses(), i("jjqu"), i("w9cH").install(),
|
|
i("qFKp"), i("ogJP"), i("jFln"), i("HbRj"), i("VVxS"), i("CLNU"), i("mZrn"), i("Vdly"), i(
|
|
"+GxX")
|
|
},
|
|
fRER: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t),
|
|
i.d(t, "DropdownApi", (function() {
|
|
return s
|
|
}));
|
|
class s {
|
|
constructor(e, t) {
|
|
this._headerToolbar = e, this._dropdownId = t
|
|
}
|
|
applyOptions(e) {
|
|
this._headerToolbar.updateDropdown(this._dropdownId, e)
|
|
}
|
|
remove() {
|
|
this._headerToolbar.removeDropdown(this._dropdownId)
|
|
}
|
|
}
|
|
},
|
|
fTGZ: function(e, t, i) {
|
|
"use strict";
|
|
(function(e, s, r) {
|
|
var n = i("Eyy1").ensureNotNull,
|
|
o = i("Ss5c").LineDataSource,
|
|
a = i("ogJP").isNumber,
|
|
l = i("BOPY").BarsMarksContainerPaneView,
|
|
c = i("BOPY").BarsMarksContainerRenderer,
|
|
h = i("Bt3k").TooltipRenderer,
|
|
u = i("LxhU").Interval,
|
|
d = i("n5al").isPriceSourceStyle,
|
|
p = i("txPx").getLogger("Chart.BarsMarksContainer");
|
|
class _ extends o {
|
|
constructor(t, i) {
|
|
var a = t._undoModel._chartWidget,
|
|
l = a.onWidget(),
|
|
c = !1;
|
|
c = l ? a._options && !a._options.hideIdeas : !!e.enabled("bars_marks") &&
|
|
TVSettings.getBool("BarsMarksContainer.visibile", !1), i ? i.merge({
|
|
visible: c,
|
|
frozen: !1
|
|
}) : i = new s({
|
|
visible: c,
|
|
frozen: !1
|
|
}), i.visible.listeners().subscribe(null, (function(t) {
|
|
l || a._containsData || !e.enabled("bars_marks") ||
|
|
TVSettings.setValue("BarsMarksContainer.visibile", !!t
|
|
.value()), u._tooltip && u._tooltip.removeAll()
|
|
})), o._configureProperties(i), super(t, i);
|
|
var u = this;
|
|
this.onNeedRepaint = new r, this._requests = [], this._marks = {}, this
|
|
._loadedRange = null, this._getDataTimeout = null, this
|
|
._collectedRange = null, this._model.mainSeries()
|
|
.onSymbolIntervalChanged().subscribe(this, this.clearMarks), this._model
|
|
.mainSeries().dataEvents().symbolResolved().subscribe(this, this
|
|
.clearMarks), this._model.mainSeries().dataEvents().completed()
|
|
.subscribe(this, (function() {
|
|
var e = this._model.mainSeries().data();
|
|
if (0 !== e.size()) {
|
|
var t = n(e.first()).index,
|
|
i = n(e.last()).index,
|
|
s = this.timeScale();
|
|
this.getData({
|
|
start: s.indexToTimePoint(t),
|
|
end: s.indexToTimePoint(i)
|
|
})
|
|
}
|
|
})), this._initialize(), this.pinnedTooltips = {}, this._tooltip =
|
|
new h(this._createTooltip.bind(this), this)
|
|
}
|
|
_initialize(e) {
|
|
throw new Error("Child class must override this member")
|
|
}
|
|
onClicked() {
|
|
throw new Error("Child class must override this member")
|
|
}
|
|
_getData(e) {
|
|
throw new Error("Child class must override this member")
|
|
}
|
|
_createTooltip() {
|
|
throw new Error("Child class must override this member")
|
|
}
|
|
updateDotData(e, t) {
|
|
return t
|
|
}
|
|
updatePlateData(e, t) {}
|
|
isAvailableInFloatingWidget() {
|
|
return !1
|
|
}
|
|
_plateViewData(e) {
|
|
return {}
|
|
}
|
|
pinTooltip(e, t) {
|
|
this.pinnedTooltips[e] = t
|
|
}
|
|
timeScale() {
|
|
return this._model.timeScale()
|
|
}
|
|
getIntervalInTicks() {
|
|
var e = this._model.mainSeries().properties().interval.value(),
|
|
t = u.parse(e);
|
|
if (!t.isValid()) throw new TypeError("Unexpected interval");
|
|
return t.isRange() ? 60 : t.inMilliseconds() / 1e3
|
|
}
|
|
getVisibleTickMarksRange() {
|
|
if (this.timeScale().isEmpty()) return {
|
|
start: 0,
|
|
end: 0
|
|
};
|
|
var e, t = this.timeScale().visibleBarsStrictRange();
|
|
return t.lastBar() > this.timeScale().points().firstIndex() && t
|
|
.firstBar() < this.timeScale().points().lastIndex() ? (e = t.lastBar() <
|
|
this.timeScale().points().lastIndex() ? this.timeScale()
|
|
.indexToTimePoint(t.lastBar()) : this._maxDate, {
|
|
start: (t = {
|
|
start: this.timeScale().indexToTimePoint(Math.max(t
|
|
.firstBar(), this.timeScale().points()
|
|
.firstIndex())),
|
|
end: e
|
|
}).start ? t.start : void 0,
|
|
end: t.end ? t.end : void 0
|
|
}) : {
|
|
start: 0,
|
|
end: 0
|
|
}
|
|
}
|
|
getVisibleRangePlates() {
|
|
var e = [],
|
|
t = this.getVisibleTickMarksRange(),
|
|
i = this.getIntervalInTicks();
|
|
return Object.keys(this._marks).forEach((function(s) {
|
|
var r = this._marks[s],
|
|
n = r.tickmark;
|
|
n >= t.start && n <= t.end + i && e.push(r)
|
|
}), this), e
|
|
}
|
|
getPublishedPlates() {
|
|
var e = {},
|
|
t = this;
|
|
return is_authenticated ? (this.getVisibleRangePlates().forEach((function(
|
|
i) {
|
|
i.is_public && (t.pinnedTooltips[i.id] || i.user__id ===
|
|
user.id) && (e[i.id] = i)
|
|
})), e) : e
|
|
}
|
|
filterDisplayedPlates(e) {
|
|
return e = e.reduce(function(e, t) {
|
|
var i = this._getIndex(t.tickmark);
|
|
return e[i] = e[i] || [], e[i].push(t), e
|
|
}.bind(this), {}), e = Object.keys(e).reduce(function(t, i) {
|
|
var s = e[i];
|
|
return s = (s = s.sort((function(e, t) {
|
|
return t.views_count - e.views_count
|
|
}))).slice(0, this._maxPlatesPerBar), t.concat(s)
|
|
}.bind(this), [])
|
|
}
|
|
_layout(e) {
|
|
switch (e) {
|
|
default:
|
|
case 0:
|
|
return "up";
|
|
case 1:
|
|
return "down";
|
|
case 2:
|
|
return "up";
|
|
case 3:
|
|
case 4:
|
|
case 5:
|
|
case 6:
|
|
return "up"
|
|
}
|
|
}
|
|
_theme(e) {
|
|
switch (e) {
|
|
default:
|
|
case 0:
|
|
return "neutral";
|
|
case 1:
|
|
return "green";
|
|
case 2:
|
|
return "red";
|
|
case 3:
|
|
return "yellow";
|
|
case 4:
|
|
return "blue";
|
|
case 5:
|
|
return "green";
|
|
case 6:
|
|
return "red"
|
|
}
|
|
}
|
|
_offset(e, t, i) {
|
|
var s;
|
|
switch (e) {
|
|
default:
|
|
case "up":
|
|
s = null === i ? t[TradingView.HIGH_PLOT] : i(t);
|
|
break;
|
|
case "down":
|
|
s = null === i ? t[TradingView.LOW_PLOT] : i(t)
|
|
}
|
|
return this.priceScale().priceToCoordinate(s, this.ownerSource()
|
|
.firstValue())
|
|
}
|
|
_getIndex(e) {
|
|
return this.timeScale().timePointToIndex(e)
|
|
}
|
|
getViewData() {
|
|
return {
|
|
barWidth: this.barWidth(),
|
|
plates: this.getPlatesViewData(),
|
|
tooltip: this._tooltip
|
|
}
|
|
}
|
|
barWidth() {
|
|
return this.timeScale().barSpacing()
|
|
}
|
|
getPlatesViewData() {
|
|
var e = this._model.mainSeries();
|
|
if (e.data().isEmpty()) return [];
|
|
for (var t = d(e.style()) ? e.barFunction() : null, i = this
|
|
.filterDisplayedPlates(this.getVisibleRangePlates()), s = this,
|
|
r = {}, n = this._model.lastHittestData(), o = (i = (i = i.map(
|
|
function(e) {
|
|
var i = this._getIndex(e.tickmark),
|
|
o = this._getBar(i);
|
|
if (null === o) return !1;
|
|
var a, l = this._layout(e.direction),
|
|
c = this._theme(e.direction),
|
|
h = null !== n && n.id === e.id,
|
|
u = this.timeScale().indexToCoordinate(i),
|
|
d = this._offset(l, o, t),
|
|
p = this.priceScale().isInverted();
|
|
return i in r || (r[i] = {
|
|
up: 0,
|
|
down: 0
|
|
}), a = r[i][l]++, TradingView.merge({
|
|
id: e.id,
|
|
x: u,
|
|
y: d,
|
|
yInverted: p,
|
|
order: a,
|
|
direction: l,
|
|
theme: c,
|
|
hovered: h,
|
|
pinned: !0 === s.pinnedTooltips[e.id],
|
|
user__id: e.user__id,
|
|
label: e.label,
|
|
labelFontColor: e.labelFontColor ||
|
|
"#444",
|
|
minSize: e.minSize || 5
|
|
}, this._plateViewData(e))
|
|
}.bind(this))).filter((function(e) {
|
|
return !!e
|
|
}))).filter((function(e) {
|
|
return !0 === e.hovered
|
|
})), a = 0; a < i.length; a++) null != o[0] && i[a].user__id === o[
|
|
0].user__id && (i[a].highlightByAuthor = !0);
|
|
return i.sort((function(e, t) {
|
|
return e.hovered && !t.hovered ? 1 : 0
|
|
})), i
|
|
}
|
|
_getBar(e) {
|
|
return this._model.mainSeries().data().valueAt(e)
|
|
}
|
|
paneViews() {
|
|
var e = this;
|
|
return this._properties.visible.value() ? [new l(this, (function(t) {
|
|
return new c(t.getViewData(), e)
|
|
}))] : []
|
|
}
|
|
dataWindowView() {
|
|
return null
|
|
}
|
|
priceAxisViews() {
|
|
return null
|
|
}
|
|
statusView() {
|
|
return null
|
|
}
|
|
updateAllViews() {}
|
|
pointsCount() {
|
|
return 0
|
|
}
|
|
properties() {
|
|
return this._properties
|
|
}
|
|
_rangeDifference(e) {
|
|
return e = Object.assign({}, e), this._loadedRange && (e.start < this
|
|
._loadedRange.start ? e.end = this._loadedRange.start : e.end > this
|
|
._loadedRange.end && (e.start = this._loadedRange.end)), e
|
|
}
|
|
_rangeUnion(e, t) {
|
|
return e = Object.assign({}, e), t && (e.start = Math.min(t.start, e.start),
|
|
e.end = Math.max(t.end, e.end)), e
|
|
}
|
|
_pushGetDataStack(e) {
|
|
a(e.start) && a(e.end) ? (this._getDataTimeout && clearTimeout(this
|
|
._getDataTimeout), this._collectedRange = this._rangeUnion(e,
|
|
this._collectedRange), this._getDataTimeout = setTimeout(
|
|
function() {
|
|
this._getData(this._collectedRange), this._getDataTimeout =
|
|
this._collectedRange = null
|
|
}.bind(this), 300)) : p.logError("Wrong tickmark range")
|
|
}
|
|
roundRange(e) {
|
|
return {
|
|
start: Math.round(e.start),
|
|
end: Math.round(e.end)
|
|
}
|
|
}
|
|
refreshData() {
|
|
this.getData(this._lastRange)
|
|
}
|
|
getData(e) {
|
|
a(e.start) && a(e.end) ? (this._lastRange = e, (e = Object.assign({}, e))
|
|
.end = this._maxDate, this._pushGetDataStack(e)) : p.logError(
|
|
"Wrong range")
|
|
}
|
|
_abortAllRequests() {
|
|
this._requests.forEach((function(e) {
|
|
e.abort()
|
|
})), this._requests = [], this._getDataTimeout && clearTimeout(this
|
|
._getDataTimeout), this._getDataTimeout = this._collectedRange =
|
|
null
|
|
}
|
|
clearMarks() {
|
|
this._abortAllRequests(), this._marks = {}, this._loadedRange = null
|
|
}
|
|
}
|
|
_.prototype._maxDate = Math.round(new Date(2037, 0, 1).getTime() / 1e3), _.prototype
|
|
._maxPlatesPerBar = 10, t.BarsMarksContainer = _
|
|
}).call(this, i("Kxc7"), i("tc+8"), i("aIyQ"))
|
|
},
|
|
fZEr: function(e, t, i) {
|
|
"use strict";
|
|
async function s(e, t) {
|
|
const s = await Promise.all([i.e("react"), i.e(1), i.e(3), i.e(4), i.e(16), i.e(17), i
|
|
.e(28), i.e(88), i.e(0), i.e(2), i.e(15), i.e("simple-dialog")
|
|
]).then(i.bind(null, "EcUf"));
|
|
return s.showSimpleDialog(e, s.renameModule, t)
|
|
}
|
|
async function r(e, t) {
|
|
const s = await Promise.all([i.e("react"), i.e(1), i.e(3), i.e(4), i.e(16), i.e(17), i
|
|
.e(28), i.e(88), i.e(0), i.e(2), i.e(15), i.e("simple-dialog")
|
|
]).then(i.bind(null, "EcUf"));
|
|
return s.showSimpleDialog(e, s.confirmModule, t)
|
|
}
|
|
async function n(e, t) {
|
|
const s = await Promise.all([i.e("react"), i.e(1), i.e(3), i.e(4), i.e(16), i.e(17), i
|
|
.e(28), i.e(88), i.e(0), i.e(2), i.e(15), i.e("simple-dialog")
|
|
]).then(i.bind(null, "EcUf"));
|
|
return s.showSimpleDialog(e, s.warningModule, t)
|
|
}
|
|
i.r(t), i.d(t, "showRename", (function() {
|
|
return s
|
|
})), i.d(t, "showConfirm", (function() {
|
|
return r
|
|
})), i.d(t, "showWarning", (function() {
|
|
return n
|
|
}))
|
|
},
|
|
fgLi: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "DataSource", (function() {
|
|
return l
|
|
}));
|
|
var s = i("hY0g"),
|
|
r = i.n(s),
|
|
n = i("e3/o"),
|
|
o = i("aIyQ"),
|
|
a = i.n(o);
|
|
class l {
|
|
constructor() {
|
|
this.hasAlert = new r.a(!1), this._zorder = 0, this.m_priceScale = null, this._id =
|
|
Object(n.randomHashN)(6), this._ownerSource = null, this._userEditEnabled = !0,
|
|
this._onPriceScaleChanged = new a.a, this._isSelectionEnabled = !0, this
|
|
._ownerSourceChanged = new a.a, this._zOrderChanged = new a.a
|
|
}
|
|
id() {
|
|
return this._id
|
|
}
|
|
preferNoScale() {
|
|
return !1
|
|
}
|
|
idForAlert() {
|
|
return this._id
|
|
}
|
|
setId(e) {
|
|
this._id = e
|
|
}
|
|
zorder() {
|
|
return this._zorder
|
|
}
|
|
setZorder(e) {
|
|
"number" == typeof e && this._zorder !== e && (this._zorder = e, this._zOrderChanged
|
|
.fire(e))
|
|
}
|
|
isSpeciallyZOrderedSource() {
|
|
return !1
|
|
}
|
|
title() {
|
|
throw new Error("Implement this fun in a subclass")
|
|
}
|
|
priceScale() {
|
|
return this.m_priceScale
|
|
}
|
|
setPriceScale(e) {
|
|
this.m_priceScale = e, this._onPriceScaleChanged.fire()
|
|
}
|
|
ownerSource() {
|
|
return this._ownerSource
|
|
}
|
|
setOwnerSource(e) {
|
|
this._ownerSource = e, this._ownerSourceChanged.fire()
|
|
}
|
|
ownerSourceChanged() {
|
|
return this._ownerSourceChanged
|
|
}
|
|
zOrderChanged() {
|
|
return this._zOrderChanged
|
|
}
|
|
isSavedInChart(e) {
|
|
return !0
|
|
}
|
|
isSavedInStudyTemplates() {
|
|
return !0
|
|
}
|
|
isRemovedByStudyTemplates() {
|
|
return !0
|
|
}
|
|
hasContextMenu() {
|
|
return !0
|
|
}
|
|
showInObjectTree() {
|
|
return !0
|
|
}
|
|
setUserEditEnabled(e) {
|
|
this._userEditEnabled = e
|
|
}
|
|
userEditEnabled() {
|
|
return this._userEditEnabled
|
|
}
|
|
canBeHidden() {
|
|
return this.userEditEnabled()
|
|
}
|
|
isUserDeletable() {
|
|
return this.userEditEnabled()
|
|
}
|
|
canHasAlert() {
|
|
return !1
|
|
}
|
|
properties() {
|
|
throw new Error("Implement this fun in a subclass")
|
|
}
|
|
isVisible() {
|
|
return this.properties().visible.value()
|
|
}
|
|
statusView() {
|
|
return null
|
|
}
|
|
dataWindowView() {
|
|
return null
|
|
}
|
|
legendView() {
|
|
return null
|
|
}
|
|
marketStatusModel() {
|
|
return null
|
|
}
|
|
dataUpdatedModeModel() {
|
|
return null
|
|
}
|
|
dataProblemModel() {
|
|
return null
|
|
}
|
|
priceAxisViews(e, t) {
|
|
return null
|
|
}
|
|
timeAxisViews() {
|
|
return null
|
|
}
|
|
updateAllViews() {}
|
|
paneViews() {
|
|
return null
|
|
}
|
|
labelPaneViews() {
|
|
return null
|
|
}
|
|
isFailed() {
|
|
return !1
|
|
}
|
|
isLoading() {
|
|
return !1
|
|
}
|
|
isPhantom() {
|
|
return !1
|
|
}
|
|
isChildStudy() {
|
|
return !1
|
|
}
|
|
hasChildren() {
|
|
return !1
|
|
}
|
|
canHaveChildren() {
|
|
return !1
|
|
}
|
|
onClickOutside() {}
|
|
getSourceIcon() {
|
|
return null
|
|
}
|
|
state(e) {
|
|
throw new Error("Implement this fun in a subclass")
|
|
}
|
|
onPriceScaleChanged() {
|
|
return this._onPriceScaleChanged
|
|
}
|
|
doesMovingAffectsUndo() {
|
|
return !0
|
|
}
|
|
isMultiPaneAvailable() {
|
|
return !1
|
|
}
|
|
isMultiPaneEnabled() {
|
|
return !1
|
|
}
|
|
copiable() {
|
|
return !1
|
|
}
|
|
cloneable() {
|
|
return !1
|
|
}
|
|
movable() {
|
|
return !1
|
|
}
|
|
isIncludedInAutoScale() {
|
|
return !1
|
|
}
|
|
isHoveredEnabled() {
|
|
return this.isSelectionEnabled()
|
|
}
|
|
isSelectionEnabled() {
|
|
return this._isSelectionEnabled
|
|
}
|
|
setSelectionEnabled(e) {
|
|
this._isSelectionEnabled = e
|
|
}
|
|
firstValue() {
|
|
return null
|
|
}
|
|
priceRange(e, t) {
|
|
return null
|
|
}
|
|
autoScaleInfo(e, t) {
|
|
return {
|
|
range: this.priceRange(e, t)
|
|
}
|
|
}
|
|
}
|
|
},
|
|
fs3R: function(e, t) {
|
|
e.exports =
|
|
'<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28"><g fill="none" fill-rule="evenodd" stroke="currentColor" transform="translate(6 4)"><rect width="15" height="12" rx="2" x=".5" y="7.5"/><path stroke-linecap="round" stroke-width="2" d="M8 14v2"/><path d="M11.5 7.5V4a3.5 3.5 0 0 0-7 0v3.5"/></g></svg>'
|
|
},
|
|
g5Qf: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "getFavoriteDrawingToolbarPromise", (function() {
|
|
return o
|
|
})), i.d(t, "createFavoriteDrawingToolbar", (function() {
|
|
return a
|
|
}));
|
|
i("YFKU");
|
|
var s = i("yMne");
|
|
let r = null,
|
|
n = null;
|
|
|
|
function o() {
|
|
return n
|
|
}
|
|
|
|
function a() {
|
|
null === n && (n = Promise.all([i.e("react"), i.e(1), i.e(4), i.e(6), i.e(11), i.e(12), i.e(
|
|
13), i.e(14), i.e(17), i.e(21), i.e(22), i.e(24), i.e(28), i.e(33), i.e(
|
|
41), i.e(48), i.e(51), i.e(52), i.e(60), i.e(67), i.e(75), i.e(0), i.e(
|
|
5), i.e(30), i.e(38), i.e("line-tools-icons"), i.e(53), i.e(54), i.e(
|
|
"floating-toolbars")]).then(i.bind(null, "gmn6")).then(({
|
|
FavoriteDrawingToolbar: e
|
|
}) => (r = null !== r ? r : new e({
|
|
left: window.innerWidth / 2,
|
|
top: s.b + 61
|
|
}), r)))
|
|
}
|
|
},
|
|
gASG: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("Ocx9"),
|
|
r = i("Ss5c"),
|
|
n = i("tc+8"),
|
|
o = i.n(n),
|
|
a = i("+FzY"),
|
|
l = i("aIyQ"),
|
|
c = i.n(l);
|
|
class h {
|
|
constructor(e) {
|
|
this._image = null, this._currentImageURL = null, this._imageReady = !1, this
|
|
._ready = new c.a, this._source = e, this.updateImage()
|
|
}
|
|
updateImage() {
|
|
const e = this.imageURL();
|
|
this._currentImageURL !== e && (this._currentImageURL = e, this._image = null, this
|
|
._imageReady = !1, null !== this._currentImageURL && (this._image =
|
|
new Image, this._image.onload = () => {
|
|
this._imageReady = !0, this._ready.fire()
|
|
},
|
|
this._image.crossOrigin = "anonymous", this._image.src = this
|
|
._currentImageURL))
|
|
}
|
|
itemIndex() {
|
|
return 1
|
|
}
|
|
labelIndex() {
|
|
return 0
|
|
}
|
|
image() {
|
|
return this._imageReady && this.showPlate() ? this._image : null
|
|
}
|
|
showPlate() {
|
|
return this._props().childs().showImage.value()
|
|
}
|
|
backgroundPlateColor(e) {
|
|
return this._props().childs().plateColor.value()
|
|
}
|
|
ready() {
|
|
return this._ready
|
|
}
|
|
type() {
|
|
return this._props().childs().itemType.value()
|
|
}
|
|
category() {
|
|
return 1
|
|
}
|
|
index() {
|
|
const e = this._source.points();
|
|
return 0 === e.length ? null : e[0].index
|
|
}
|
|
imageURL() {
|
|
const e = this._props().childs().emoji.value();
|
|
return Object(a.a)(e, "png") || null
|
|
}
|
|
sourceImage() {
|
|
return null
|
|
}
|
|
additionalImageURL() {
|
|
return null
|
|
}
|
|
additionalImageSource() {
|
|
return null
|
|
}
|
|
name() {
|
|
return ""
|
|
}
|
|
headline() {
|
|
return this._props().childs().text.value()
|
|
}
|
|
text() {
|
|
return ""
|
|
}
|
|
fullTextAst() {
|
|
return null
|
|
}
|
|
position() {
|
|
return this._props().childs().position.value()
|
|
}
|
|
fontSize() {
|
|
return this._props().childs().fontSize.value()
|
|
}
|
|
fontBold() {
|
|
return this._props().childs().bold.value()
|
|
}
|
|
fontItalic() {
|
|
return this._props().childs().italic.value()
|
|
}
|
|
sourceLabel() {
|
|
return null
|
|
}
|
|
_props() {
|
|
return this._source.properties()
|
|
}
|
|
}
|
|
class u extends o.a {
|
|
constructor(e) {
|
|
super(), this._source = e, e.pointAdded().subscribe(this, () => this.listeners()
|
|
.fire(this)), e.pointChanged().subscribe(this, () => this.listeners()
|
|
.fire(this))
|
|
}
|
|
value() {
|
|
const e = this._source.properties().childs().position.value();
|
|
return parseFloat(e.toFixed(2))
|
|
}
|
|
setValue(e) {
|
|
this._source.properties().childs().position.setValue(e), this._source.model()
|
|
.updateSource(this._source), this.listeners().fire(this), this._source
|
|
.syncMultichartState({
|
|
pricesChanged: !1,
|
|
indexesChanged: !1
|
|
})
|
|
}
|
|
}
|
|
var d = i("j8de");
|
|
class p extends d.a {
|
|
constructor(e, t) {
|
|
super(e, t), this._source = e
|
|
}
|
|
_setPointImpl(e) {
|
|
this._source.setPointAndChangeIndex(this._pointIndex, e)
|
|
}
|
|
}
|
|
var _ = i("j3hX"),
|
|
m = i("Eyy1"),
|
|
f = i("jvrd"),
|
|
g = i("mMWL");
|
|
class b extends r.LineDataSource {
|
|
constructor() {
|
|
super(...arguments), this._startMovingAnchorY = NaN
|
|
}
|
|
priceSource() {
|
|
return this.ownerSource()
|
|
}
|
|
addPoint(e, t, i) {
|
|
return super.addPoint(this._updatePositionAndCorrectPoint(e), t, i)
|
|
}
|
|
setPoint(e, t, i) {
|
|
super.setPoint(e, this._updatePositionAndCorrectPoint(t, !this.isPhantom() && !
|
|
this._allowChangeAnchorHorizontally()), i), this._syncPosition()
|
|
}
|
|
setPointAndChangeIndex(e, t, i) {
|
|
super.setPoint(e, this._updatePositionAndCorrectPoint(t, !1), i), this
|
|
._syncPosition()
|
|
}
|
|
startMoving(e, t, i, s) {
|
|
s || (this._startMovingAnchorY = Object(m.ensureNotNull)(this
|
|
._anchorYCoordinate())), super.startMoving(e, t, i)
|
|
}
|
|
move(e, t, i, s) {
|
|
var r;
|
|
const n = Object(m.ensureDefined)(Object(m.ensureNotNull)(this
|
|
.startMovingPoint()).logical),
|
|
o = Object(m.ensureDefined)(e.logical);
|
|
if (!s && 0 === t) {
|
|
const e = this._points[0],
|
|
t = o.index - n.index,
|
|
i = Object(m.ensureNotNull)(this.priceScale()),
|
|
s = Object(m.ensure)(null === (r = this.ownerSource()) || void 0 === r ?
|
|
void 0 : r.firstValue()),
|
|
a = i.priceToCoordinate(o.price, s) - i.priceToCoordinate(n.price, s),
|
|
l = this._startMovingAnchorY + a,
|
|
c = i.coordinateToPrice(l, s);
|
|
this._updatePositionAndCorrectPoint({
|
|
index: e.index + t,
|
|
price: c
|
|
})
|
|
}
|
|
super.move(e, t, i), s || this._syncPosition()
|
|
}
|
|
_allowChangeAnchorHorizontally() {
|
|
return !1
|
|
}
|
|
_updatePositionAndCorrectPoint(e, t) {
|
|
t && (e.index = this._points[0].index);
|
|
const i = this.priceSource();
|
|
if (null === i) return e;
|
|
const s = i.priceScale(),
|
|
r = i.firstValue();
|
|
if (null === s || s.isEmpty() || null === r) return e;
|
|
const n = s.height();
|
|
let o = n / 2,
|
|
a = e.price >= s.coordinateToPrice(o, r) ? 1 : -1;
|
|
const l = this._model.mainSeries();
|
|
if (i === l) {
|
|
const t = l.data().search(this._baseSeriesIndexForPoint(e));
|
|
if (null !== t) {
|
|
const i = Object(f.g)(l, t, -1),
|
|
n = Object(f.g)(l, t, 1);
|
|
a = e.price >= i ? 1 : -1, o = s.priceToCoordinate(1 === a ? n : i, r),
|
|
e.price = 1 === a ? Math.max(n, e.price) : e.price
|
|
}
|
|
}
|
|
const c = 1 === (-1 === a !== s.isInverted() ? -1 : 1) ? o : n - o,
|
|
h = s.priceToCoordinate(e.price, r),
|
|
u = Math.min(n, Math.abs(h - o)),
|
|
d = Math.max(0, Math.min(100, 100 * u / c)) * a;
|
|
return this.properties().childs().position.setValue(d), e
|
|
}
|
|
_baseSeriesIndexForPoint(e) {
|
|
return e.index
|
|
}
|
|
_syncPosition() {
|
|
const e = this.linkKey().value();
|
|
if (null !== e) {
|
|
const t = {
|
|
position: this.properties().childs().position.value()
|
|
};
|
|
Object(g.changeLineStyle)({
|
|
linkKey: e,
|
|
state: t,
|
|
model: this._model
|
|
})
|
|
}
|
|
}
|
|
_anchorYCoordinate() {
|
|
const e = this.priceSource();
|
|
if (null === e) return null;
|
|
const t = e.priceScale(),
|
|
i = e.firstValue();
|
|
if (null === t || t.isEmpty() || null === i) return null;
|
|
const s = this._model.mainSeries(),
|
|
r = this.customEvent();
|
|
if (null === r) return null;
|
|
let n = null;
|
|
if (e === s && (n = Object(f.f)(s, r)), null === n && (n = Object(f.c)(r, t,
|
|
i)), null === n) return null;
|
|
const o = r.position(),
|
|
a = t.priceToCoordinate(n.price, i);
|
|
return Object(f.d)(o, t.height(), a, Object(f.e)(o, t.isInverted()))
|
|
}
|
|
}
|
|
i.d(t, "LineToolSignpost", (function() {
|
|
return v
|
|
}));
|
|
class v extends b {
|
|
constructor(e, t) {
|
|
const s = t || v.createProperties();
|
|
super(e, s), this._item = new h(this), this.properties().childs().emoji.subscribe(
|
|
this, () => this._item.updateImage()), this._item.ready().subscribe(this,
|
|
() => this._model.updateSource(this)), i.e("lt-pane-views").then(i.bind(
|
|
null,
|
|
"KFbh")).then(t => {
|
|
this._setPaneViews([new t.SignpostPaneView(this, e)])
|
|
})
|
|
}
|
|
isItemHovered(e) {
|
|
return !1
|
|
}
|
|
isItemSelected(e) {
|
|
return !1
|
|
}
|
|
isHidden(e) {
|
|
return !1
|
|
}
|
|
items() {
|
|
return [this.customEvent()]
|
|
}
|
|
priceSource() {
|
|
return this.ownerSource()
|
|
}
|
|
pointsCount() {
|
|
return 1
|
|
}
|
|
properties() {
|
|
return super.properties()
|
|
}
|
|
name() {
|
|
return "Signpost"
|
|
}
|
|
customEvent() {
|
|
return this._item
|
|
}
|
|
showInObjectTree() {
|
|
return !this.isPhantom() && super.showInObjectTree()
|
|
}
|
|
isPhantom() {
|
|
return this._model.isPhantomLine(this)
|
|
}
|
|
clonePositionOffset() {
|
|
return {
|
|
barOffset: 1,
|
|
xCoordOffset: 0,
|
|
yCoordOffset: 0
|
|
}
|
|
}
|
|
template() {
|
|
const e = super.template(),
|
|
t = this.properties().childs();
|
|
return e.text = t.text.value(), e.position = t.position.value(), e
|
|
}
|
|
static createProperties(e) {
|
|
const t = new s.DefaultProperty("linetoolsignpost", e);
|
|
return v._configureProperties(t), t.hasChild("text") || t.addChild("text", new o.a(
|
|
window.t("Text"))), t.hasChild("position") || t.addChild("position", new o
|
|
.a(50)), t.addExclusion("text"), t.addExclusion("position"), t.addChild(
|
|
"backgroundsColors", new _.LineToolColorsProperty([t.childs().plateColor])),
|
|
t
|
|
}
|
|
_createPointProperty(e) {
|
|
super._createPointProperty(e);
|
|
const t = this._pointsProperty.childs().points[e];
|
|
t.removeProperty("price"), t.removeProperty("bar"), t.addChild("price", new u(
|
|
this)), t.addChild("bar", new p(this, 0))
|
|
}
|
|
_applyTemplateImpl(e) {
|
|
super._applyTemplateImpl(e), this.properties().childs().text.setValue(e.text),
|
|
this.properties().childs().position.setValue(e.position)
|
|
}
|
|
_getPropertyDefinitionsViewModelClass() {
|
|
return Promise.all([i.e(27), i.e(62), i.e("lt-property-pages-with-definitions")])
|
|
.then(i.bind(null, "zb1A")).then(e => e.SignpostDefinitionsViewModel)
|
|
}
|
|
static _configureProperties(e) {
|
|
r.LineDataSource._configureProperties(e)
|
|
}
|
|
}
|
|
v.supportPhantomMode = !0
|
|
},
|
|
gAom: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "clearRectWithGradient", (function() {
|
|
return o
|
|
})), i.d(t, "fillRectInnerBorder", (function() {
|
|
return a
|
|
})), i.d(t, "drawHorizontalLine", (function() {
|
|
return l
|
|
})), i.d(t, "drawVerticalLine", (function() {
|
|
return c
|
|
})), i.d(t, "drawRoundRect", (function() {
|
|
return u
|
|
})), i.d(t, "drawRoundRectWithInnerBorder", (function() {
|
|
return d
|
|
})), i.d(t, "fillRectWithBorder", (function() {
|
|
return p
|
|
})), i.d(t, "createCircle", (function() {
|
|
return _
|
|
}));
|
|
var s = i("aO4+"),
|
|
r = i("jFln"),
|
|
n = i("972a");
|
|
|
|
function o(e, t, i, s, r, n, o) {
|
|
e.save(), e.globalCompositeOperation = "copy";
|
|
const a = e.createLinearGradient(0, 0, 0, r);
|
|
a.addColorStop(0, n), a.addColorStop(1, o), e.fillStyle = a, e.fillRect(t, i, s, r), e
|
|
.restore()
|
|
}
|
|
|
|
function a(e, t, i, s, r, n) {
|
|
e.fillRect(t + n, i, s - 2 * n, n), e.fillRect(t + n, i + r - n, s - 2 * n, n), e.fillRect(
|
|
t, i, n, r), e.fillRect(t + s - n, i, n, r)
|
|
}
|
|
|
|
function l(e, t, i, s) {
|
|
e.beginPath();
|
|
const r = e.lineWidth % 2 ? .5 : 0;
|
|
e.moveTo(i, t + r), e.lineTo(s, t + r), e.stroke()
|
|
}
|
|
|
|
function c(e, t, i, s) {
|
|
e.beginPath();
|
|
const r = e.lineWidth % 2 ? .5 : 0;
|
|
e.moveTo(t + r, i), e.lineTo(t + r, s), e.stroke()
|
|
}
|
|
|
|
function h(e, t) {
|
|
return Array.isArray(e) ? e.map(e => 0 === e ? e : e + t) : e + t
|
|
}
|
|
|
|
function u(e, t, i, s, r, n, o) {
|
|
let a, l, c, h;
|
|
if (Array.isArray(n))
|
|
if (2 === n.length) {
|
|
const e = Math.max(0, n[0]),
|
|
t = Math.max(0, n[1]);
|
|
a = e, l = e, c = t, h = t
|
|
} else {
|
|
if (4 !== n.length) throw new Error(
|
|
"Wrong border radius - it should be like css border radius");
|
|
a = Math.max(0, n[0]), l = Math.max(0, n[1]), c = Math.max(0, n[2]), h = Math.max(0,
|
|
n[3])
|
|
}
|
|
else {
|
|
const e = Math.max(0, n);
|
|
a = e, l = e, c = e, h = e
|
|
}
|
|
o || e.beginPath(), e.moveTo(t + a, i), e.lineTo(t + s - l, i), 0 !== l && e.arcTo(t + s, i,
|
|
t + s, i + l, l), e.lineTo(t + s, i + r - c), 0 !== c && e.arcTo(t + s, i + r, t +
|
|
s - c, i + r, c), e.lineTo(t + h, i + r), 0 !== h && e.arcTo(t, i + r, t, i + r - h,
|
|
h), e.lineTo(t, i + a), 0 !== a && e.arcTo(t, i, t + a, i, a)
|
|
}
|
|
|
|
function d(e, t, i, s, o, a, l = 0, c = 0, d = "", p = n.b.Solid) {
|
|
if (e.save(), !c || !d || d === a) return u(e, t, i, s, o, l), e.fillStyle = a, e.fill(),
|
|
void e.restore();
|
|
const _ = c / 2;
|
|
if ("transparent" !== a) {
|
|
const r = "transparent" !== d && p !== n.b.Solid;
|
|
u(e, r ? t : t + c, r ? i : i + c, r ? s : s - 2 * c, r ? o : o - 2 * c, r ? l : h(l, -
|
|
c)), e.fillStyle = a, e.fill()
|
|
}
|
|
if ("transparent" !== d) {
|
|
u(e, t + _, i + _, s - c, o - c, h(l, -_)), e.lineWidth = c, e.strokeStyle = d, Object(r
|
|
.setLineStyle)(e, p), e.closePath(), e.stroke()
|
|
}
|
|
e.restore()
|
|
}
|
|
|
|
function p(e, t, i, n, o, a, l, c, h, u, d, p, _, m, f) {
|
|
const g = u ? 0 : t,
|
|
b = d ? _ : n;
|
|
if (void 0 !== a && (e.fillStyle = a, e.fillRect(g, i, b - g + m, o - i)), void 0 !== l &&
|
|
c > 0) {
|
|
if (e.beginPath(), Object(r.setLineStyle)(e, h), void 0 !== f) {
|
|
const t = f.map(e => e * c);
|
|
Object(r.setLineDash)(e, t)
|
|
}
|
|
let a = Object(s.point)(0, 0),
|
|
u = Object(s.point)(0, 0),
|
|
d = Object(s.point)(0, 0),
|
|
_ = Object(s.point)(0, 0);
|
|
switch (p) {
|
|
case "outer": {
|
|
const e = .5 * c;
|
|
d = Object(s.point)(0, e), _ = Object(s.point)(0, e), a = Object(s.point)(e, -
|
|
c), u = Object(s.point)(e, -c);
|
|
break
|
|
}
|
|
case "center": {
|
|
const e = c % 2 ? .5 : 0,
|
|
t = c % 2 ? .5 : m;
|
|
d = Object(s.point)(.5 * c - e, -e), _ = Object(s.point)(t + .5 * c, -e), a =
|
|
Object(s.point)(-e, e + .5 * c),
|
|
u = Object(s.point)(t, e + .5 * c);
|
|
break
|
|
}
|
|
case "inner": {
|
|
const e = .5 * c;
|
|
d = Object(s.point)(0, -e), _ = Object(s.point)(1, -e), a = Object(s.point)(-e,
|
|
c), u = Object(s.point)(1 - e, c);
|
|
break
|
|
}
|
|
}
|
|
e.lineWidth = c, e.strokeStyle = l, e.moveTo(g - d.x, i - d.y), e.lineTo(b + _.x, i - _
|
|
.y), e.moveTo(n + u.x, i + u.y), e.lineTo(n + u.x, o - u.y), e.moveTo(g - d.x,
|
|
o + d.y), e.lineTo(b + _.x, o + _.y), e.moveTo(t - a.x, i + a.y), e.lineTo(t - a
|
|
.x, o - a.y), e.stroke()
|
|
}
|
|
}
|
|
|
|
function _(e, t, i, s) {
|
|
e.beginPath(), e.arc(t, i, s, 0, 2 * Math.PI, !1), e.closePath()
|
|
}
|
|
},
|
|
gLxC: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Ss5c").LineDataSource,
|
|
r = i("tc+8"),
|
|
n = i("Ocx9").DefaultProperty;
|
|
class o extends s {
|
|
constructor(e, t) {
|
|
super(e, t || o.createProperties()), this.version = o.version, i.e("lt-pane-views")
|
|
.then(i.bind(null, "Dz+H")).then(({
|
|
NotePaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
pointsCount() {
|
|
return 1
|
|
}
|
|
name() {
|
|
return "Note"
|
|
}
|
|
getTooltipWidth() {
|
|
return o.TOOLTIP_WIDTH
|
|
}
|
|
getTooltipPadding() {
|
|
return o.TOOLTIP_PADDING
|
|
}
|
|
getTooltipLineSpacing() {
|
|
return o.TOOLTIP_LINESPACING
|
|
}
|
|
template() {
|
|
var e = s.prototype.template.call(this);
|
|
return e.text = this.properties().childs().text.value(), e
|
|
}
|
|
_applyTemplateImpl(e) {
|
|
super._applyTemplateImpl(e), this.properties().childs().text.setValue(e.text)
|
|
}
|
|
static createProperties(e) {
|
|
void 0 !== e && void 0 !== e.markerColor && void 0 === e.borderColor && (e
|
|
.borderColor = e.markerColor);
|
|
var t = new n("linetoolnote", e);
|
|
return o._configureProperties(t), t
|
|
}
|
|
state(e) {
|
|
var t = s.prototype.state.call(this, e);
|
|
return e && (t.state.fixedSize = !1), t
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "74nv")))
|
|
.NoteDefinitionsViewModel
|
|
}
|
|
static _configureProperties(e) {
|
|
s._configureProperties(e), e.hasChild("text") || e.addChild("text", new r(window.t(
|
|
"Text"))), e.addExclusion("text")
|
|
}
|
|
}
|
|
o.TOOLTIP_WIDTH = 300, o.TOOLTIP_PADDING = 10, o.TOOLTIP_LINESPACING = 5, o.version = 1;
|
|
class a extends o {
|
|
constructor(e, t) {
|
|
super(e, t || a.createProperties())
|
|
}
|
|
title() {
|
|
return window.t("Anchored Note")
|
|
}
|
|
name() {
|
|
return "Anchored Note"
|
|
}
|
|
isFixed() {
|
|
return !0
|
|
}
|
|
hasEditableCoordinates() {
|
|
return !1
|
|
}
|
|
static createProperties(e) {
|
|
var t = new n("linetoolnoteabsolute", e);
|
|
return a._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
o._configureProperties(e)
|
|
}
|
|
}
|
|
t.LineToolNote = o, t.LineToolNoteAbsolute = a
|
|
},
|
|
gMtF: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineToolRiskRewardPriceAxisView", (function() {
|
|
return r
|
|
}));
|
|
var s = i("KcY8");
|
|
class r extends s.a {
|
|
constructor(e, t) {
|
|
super(), this._source = e, this._data = t
|
|
}
|
|
_updateRendererData(e, t, i) {
|
|
if (e.visible = !1, !this._showAxisLabel()) return;
|
|
const s = this._source.priceScale();
|
|
if (0 === this._source.points().length || null === s || s.isEmpty()) return;
|
|
const r = this._source.ownerSource(),
|
|
n = null !== r ? r.firstValue() : null;
|
|
if (null === n) return;
|
|
const o = this._data.priceProperty.value(),
|
|
a = this._data.colorProperty.value();
|
|
i.background = a, i.textColor = this.generateTextColor(a), i.coordinate = s
|
|
.priceToCoordinate(o, n), e.text = s.formatPrice(o, n), e.visible = !0
|
|
}
|
|
_showAxisLabel() {
|
|
return this._source.properties().childs().showPriceLabels.value()
|
|
}
|
|
}
|
|
},
|
|
gP14: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("hbEN"),
|
|
r = i("Eyy1"),
|
|
n = i("aO4+"),
|
|
o = i("eJTA"),
|
|
a = i("HGP3"),
|
|
l = i("oiZD"),
|
|
c = i("JWMC"),
|
|
h = i("jofe"),
|
|
u = i("vTIA"),
|
|
d = i("GxN8"),
|
|
p = i("8sOK"),
|
|
_ = i("LxhU"),
|
|
m = i("tc+8"),
|
|
f = i.n(m),
|
|
g = i("gvrv"),
|
|
b = i("jenN"),
|
|
v = i("kcTO"),
|
|
S = i("Ocx9"),
|
|
y = i("wZIs"),
|
|
w = i("oV8k"),
|
|
P = i("Kxc7"),
|
|
C = i("n5al"),
|
|
x = i("sDZI");
|
|
const T = new v.PriceFormatter;
|
|
class I extends w.a {
|
|
constructor(e, t, i) {
|
|
super(e, t), this._studySource = null, this._paneViews = [], this._metaInfo =
|
|
null, this._destroyed = !1, this._isStarted = !1, this._loadedGraphics =
|
|
null, this._doubleClickHandler = i;
|
|
const s = t.mainSeries();
|
|
this._properties = new S.DefaultProperty("sessions"), Object(y
|
|
.applyDefaultsOverrides)(this._properties.childs().graphics, void 0, !1,
|
|
"sessions"), this._removeDuplicateProperties(), this._properties
|
|
.subscribe(this, this._onPropertiesChanged), t.studyMetaInfoRepository()
|
|
.findById({
|
|
type: "java",
|
|
studyId: "Sessions@tv-basicstudies"
|
|
}).then(e => {
|
|
this._destroyed || null === this._loadedGraphics && (this
|
|
._setMetaInfo(e), null !== this._metaInfo && (this
|
|
._studySource = new g.a(t.chartApi(), s.seriesSource(),
|
|
"sessions_", this._metaInfo), this
|
|
._createPaneViews(), this._studySource.dataCleared()
|
|
.subscribe(this, this.updateAllViews), this._studySource
|
|
.dataUpdated().subscribe(this, this.updateAllViews),
|
|
this._studySource.setInputs({}), this
|
|
._processHibernate()))
|
|
}), t.timeScale().onReset().subscribe(this, this._clearData), t.timeScale()
|
|
.logicalRangeChanged().subscribe(this, this.updateAllViews), t.mainSeries()
|
|
.sessionIdProxyProperty().subscribe(this, this
|
|
._updateVisibleOfPreAndPostMarketBackground), t.mainSeries()
|
|
.properties().interval.subscribe(this, this._processHibernate), this
|
|
._updateVisibleOfPreAndPostMarketBackground(t.mainSeries().properties()
|
|
.sessionId)
|
|
}
|
|
applyOverrides(e) {
|
|
Object(y.applyPropertiesOverrides)(this._properties.childs().graphics, void 0, !
|
|
1, e, "sessions"), this._model.updateSource(this)
|
|
}
|
|
start() {
|
|
this._isStarted = !0, this._processHibernate()
|
|
}
|
|
restart() {
|
|
this._clearData(), P.enabled("stop_study_on_restart") && this.stop(), this
|
|
.start()
|
|
}
|
|
isStarted() {
|
|
return this._isStarted
|
|
}
|
|
stop() {
|
|
this._isStarted = !1, null !== this._studySource && this._studySource.stop()
|
|
}
|
|
isHoveredEnabled() {
|
|
return !1
|
|
}
|
|
paneViews(e) {
|
|
return this._paneViews
|
|
}
|
|
updateAllViews() {
|
|
this._paneViews.forEach(e => e.update())
|
|
}
|
|
updateViewsForPane(e) {
|
|
this.updateAllViews()
|
|
}
|
|
destroy() {
|
|
this._destroyed = !0, null !== this._studySource && (this._studySource
|
|
.dataCleared().unsubscribeAll(this), this._studySource.dataUpdated()
|
|
.unsubscribeAll(this), this._studySource.destroy(), this._studySource =
|
|
null), this._model.timeScale().logicalRangeChanged().unsubscribeAll(
|
|
this), this._model.timeScale().onReset().unsubscribeAll(this), this
|
|
._model.mainSeries().sessionIdProxyProperty().unsubscribeAll(this), this
|
|
._model.mainSeries().properties().interval.unsubscribeAll(this), this
|
|
._properties.unsubscribeAll(this)
|
|
}
|
|
series() {
|
|
return this._model.mainSeries()
|
|
}
|
|
priceScale() {
|
|
return this.series().priceScale()
|
|
}
|
|
graphics() {
|
|
return this._loadedGraphics || Object(r.ensureNotNull)(this._studySource)
|
|
.graphics()
|
|
}
|
|
properties() {
|
|
return this._properties
|
|
}
|
|
graphicsInfo() {
|
|
return Object(r.ensureNotNull)(this._metaInfo).graphics
|
|
}
|
|
firstValue(e) {
|
|
return this._model.mainSeries().firstValue()
|
|
}
|
|
formatter() {
|
|
return T
|
|
}
|
|
state(e) {
|
|
const t = {
|
|
properties: this._properties.state()
|
|
};
|
|
return e && null !== this._metaInfo && (t.data = {
|
|
graphics: Object(b.saveStudyGraphics)(this.graphics()),
|
|
metaInfo: this._metaInfo
|
|
}), t
|
|
}
|
|
restoreState(e, t) {
|
|
const i = e.properties;
|
|
this._migrateOutOfSessionProperty(i), this._properties.mergeAndFire(i), this
|
|
._removeDuplicateProperties(), this
|
|
._updateVisibleOfPreAndPostMarketBackground(this._model.mainSeries()
|
|
.properties().sessionId), void 0 !== e.data && t && (this
|
|
._loadStudyGraphics(e.data.graphics), this._setMetaInfo(e.data
|
|
.metaInfo), this._createPaneViews())
|
|
}
|
|
restoreOldState(e, t) {
|
|
const i = {
|
|
properties: {
|
|
graphics: e.state.graphics
|
|
}
|
|
};
|
|
void 0 !== e.data && void 0 !== e.metaInfo && t && (i.data = {
|
|
metaInfo: e.metaInfo,
|
|
graphics: e.data.graphics
|
|
}), this.restoreState(i, t)
|
|
}
|
|
applyPreferences(e) {
|
|
this._properties.mergePreferences(e)
|
|
}
|
|
metaInfo() {
|
|
return Object(r.ensureNotNull)(this._metaInfo)
|
|
}
|
|
_loadStudyGraphics(e) {
|
|
const t = e.backgrounds;
|
|
if (void 0 !== t) {
|
|
const e = t.findIndex(e => "inSession" === e.styleId); - 1 !== e && t
|
|
.splice(e, 1)
|
|
}
|
|
this._loadedGraphics = Object(b.loadStudyGraphics)(e)
|
|
}
|
|
_setMetaInfo(e) {
|
|
const t = e.graphics.backgrounds;
|
|
void 0 !== t && void 0 !== t.inSession && delete t.inSession, this._metaInfo = e
|
|
}
|
|
_updateVisibleOfPreAndPostMarketBackground(e) {
|
|
const t = !Object(C.isRegularSessionId)(e.value());
|
|
this._outOfSessionVisibilityProperty().setValue(t), this
|
|
._preMarketVisibilityProperty().setValue(t), this
|
|
._postMarketVisibilityProperty().setValue(t)
|
|
}
|
|
_clearData() {
|
|
null !== this._studySource && this._studySource.clearData()
|
|
}
|
|
_createPaneViews() {
|
|
const e = {
|
|
doubleClickHandler: this._doubleClickHandler
|
|
};
|
|
Object(b.createGraphicsPaneViews)(this, this._model, e).then(e => {
|
|
this._paneViews = e, this._model.lightUpdate()
|
|
})
|
|
}
|
|
_onPropertiesChanged() {
|
|
this._processHibernate(), this.updateAllViews()
|
|
}
|
|
_processHibernate() {
|
|
if (null !== this._studySource) {
|
|
const e = this._canBeHibernated(),
|
|
t = this._isHibernated(),
|
|
i = this._studySource.isStarted();
|
|
!t && e && i ? this._studySource.stop() : !t || e || i || this._studySource
|
|
.start()
|
|
}
|
|
}
|
|
_canBeHibernated() {
|
|
const e = this._model.mainSeries(),
|
|
t = this._preMarketVisibilityProperty().value() && this
|
|
._postMarketVisibilityProperty().value() && this
|
|
._outOfSessionVisibilityProperty().value();
|
|
return e.isDWM() || !t && !this._vertLinesVisibleProperty().value()
|
|
}
|
|
_isHibernated() {
|
|
return this._isStarted && (null === this._studySource || !this._studySource
|
|
.isStarted())
|
|
}
|
|
_outOfSessionVisibilityProperty() {
|
|
return this._properties.childs().graphics.childs().backgrounds.childs()
|
|
.outOfSession.childs().visible
|
|
}
|
|
_preMarketVisibilityProperty() {
|
|
return this._properties.childs().graphics.childs().backgrounds.childs()
|
|
.preMarket.childs().visible
|
|
}
|
|
_postMarketVisibilityProperty() {
|
|
return this._properties.childs().graphics.childs().backgrounds.childs()
|
|
.postMarket.childs().visible
|
|
}
|
|
_vertLinesVisibleProperty() {
|
|
return this._properties.childs().graphics.childs().vertlines.childs().sessBreaks
|
|
.childs().visible
|
|
}
|
|
_removeDuplicateProperties() {
|
|
this._properties.hasChild("properties") && (this._properties.removeProperty(
|
|
"properties"), Object(S.saveDefaultProperties)(!0), this._properties
|
|
.childChanged("", null),
|
|
Object(S.saveDefaultProperties)(!1))
|
|
}
|
|
_migrateOutOfSessionProperty(e) {
|
|
const t = e.graphics.backgrounds;
|
|
if (void 0 !== t) {
|
|
const i = t.outOfSession;
|
|
i.color === Object(r.ensureDefined)(x.sessionsPreferencesDefault.graphics
|
|
.backgrounds).outOfSession.color || "postMarket" in t || (e.graphics
|
|
.backgrounds = {
|
|
...t,
|
|
postMarket: {
|
|
color: i.color,
|
|
transparency: i.transparency,
|
|
visible: i.visible
|
|
},
|
|
preMarket: {
|
|
color: i.color,
|
|
transparency: i.transparency,
|
|
visible: i.visible
|
|
}
|
|
})
|
|
}
|
|
}
|
|
}
|
|
var M = i("3ClC"),
|
|
O = i("aIyQ"),
|
|
L = i.n(O),
|
|
A = i("hY0g"),
|
|
E = i.n(A),
|
|
k = i("H0vP"),
|
|
D = i("iDOr"),
|
|
V = i("MbIA"),
|
|
B = i("gQ5K"),
|
|
R = i("3t3b"),
|
|
N = i("4kQX"),
|
|
j = i("mPvX"),
|
|
F = i("mMWL"),
|
|
W = i("txPx"),
|
|
H = i("CW80"),
|
|
U = i("e3/o"),
|
|
z = i("ogJP"),
|
|
G = i("Tmoa"),
|
|
q = i("fTGZ"),
|
|
Y = i("4vW/");
|
|
|
|
function K(e, t) {
|
|
return e.code < t.code ? -1 : e.code > t.code ? 1 : 0
|
|
}
|
|
class J {
|
|
constructor(e) {
|
|
this._convertibleItems = e, this._idsToItems = new Map;
|
|
for (const t of e) this._idsToItems.set(t.id, t)
|
|
}
|
|
convertible(e) {
|
|
return void 0 !== this._idsToItems.get(e)
|
|
}
|
|
size() {
|
|
return this._convertibleItems.length
|
|
}
|
|
filterConvertible(e, t) {
|
|
const i = this._convertibleItems.filter(function(e, t) {
|
|
return i => !e.has(i.id) && t(i.id)
|
|
}(e, t));
|
|
return i.sort(K), i
|
|
}
|
|
}
|
|
class Z {
|
|
constructor(e) {
|
|
this._allGroups = new Set, this._idToName = new Map, this._idToDescription =
|
|
new Map, this._groupedUnitIds = new Map, this._groupedUnits = new Map, this
|
|
._groupById = new Map, this._size = 0, this._units = e;
|
|
for (const t in e)
|
|
if (e.hasOwnProperty(t)) {
|
|
this._allGroups.add(t), this._groupedUnitIds.set(t, new Set(e[t].map(e => e
|
|
.id))), this._groupedUnits.set(t, e[t]);
|
|
for (const i of e[t]) this._size++, this._idToName.set(i.id, i.name), this
|
|
._idToDescription.set(i.id, i.description), this._groupById.set(i.id, t)
|
|
}
|
|
}
|
|
unitsChanged(e) {
|
|
return this._units !== e
|
|
}
|
|
size() {
|
|
return this._size
|
|
}
|
|
name(e) {
|
|
return this._idToName.get(e) || e
|
|
}
|
|
description(e) {
|
|
return this._idToDescription.get(e) || e
|
|
}
|
|
unitGroupById(e) {
|
|
return this._groupById.get(e) || null
|
|
}
|
|
allGroups() {
|
|
return new Set(this._allGroups)
|
|
}
|
|
unitsByGroups(e) {
|
|
const t = [];
|
|
return e.forEach(e => {
|
|
const i = this._groupedUnits.get(e);
|
|
void 0 !== i && t.push({
|
|
name: e,
|
|
units: i
|
|
})
|
|
}), t
|
|
}
|
|
convertible(e, t) {
|
|
for (const i of t) {
|
|
const t = this._groupedUnitIds.get(i);
|
|
if (void 0 !== t && t.has(e)) return !0
|
|
}
|
|
return !1
|
|
}
|
|
}
|
|
var X = i("ivNn");
|
|
class $ {
|
|
constructor(e) {
|
|
this._source = null, this._sourcePane = null, this
|
|
._currentToolSupportsPhantomMode = !1, this._model = e
|
|
}
|
|
destroy() {
|
|
this._source = null, this._sourcePane = null
|
|
}
|
|
source() {
|
|
return this._source
|
|
}
|
|
onToolChanged() {
|
|
this._removeSource();
|
|
const e = this._model.currentTool();
|
|
this._currentToolSupportsPhantomMode = Object(H.isLineToolName)(e) && Object(H
|
|
.supportsPhantomMode)(e)
|
|
}
|
|
onCursorPositionUpdated() {
|
|
if (!this._currentToolSupportsPhantomMode) return;
|
|
const e = this._model.crossHairSource();
|
|
if (this._sourcePane !== e.pane && this._removeSource(), null === e.pane || !Object(
|
|
X.isNumber)(e.index) || !Object(X.isNumber)(e.price)) return void this
|
|
._removeSource();
|
|
const t = {
|
|
index: e.index,
|
|
price: e.price
|
|
};
|
|
null !== this._source ? this._source.setPoint(0, t) : (this._source = this._model
|
|
.createLineTool(e.pane, t, this._model.currentTool(), void 0, null), this
|
|
._sourcePane = e.pane)
|
|
}
|
|
_removeSource() {
|
|
null !== this._source && (this._model.removeSource(this._source), this._source =
|
|
null, this._sourcePane = null)
|
|
}
|
|
}
|
|
var Q = i("k9/m"),
|
|
ee = i("4o++"),
|
|
te = i("zL3Q");
|
|
class ie {
|
|
align(e, t, i) {
|
|
let s = e;
|
|
if (!Object(te.a)().value()) return s;
|
|
const n = i.mainDataSource();
|
|
if (null === n) return s;
|
|
const o = n.model().mainSeries();
|
|
if (n !== o) return s;
|
|
const a = o.priceScale(),
|
|
l = o.bars();
|
|
if (a.isEmpty() || !l.contains(t)) return s;
|
|
const c = l.valueAt(t);
|
|
if (null === c) return s;
|
|
const h = [];
|
|
null !== o.priceSource() ? h.push(o.barFunction()(c)) : h.push(c[1], c[2], c[3], c[
|
|
4]);
|
|
const u = Object(r.ensure)(o.firstValue()),
|
|
d = h.map(e => ({
|
|
y: a.priceToCoordinate(e, u),
|
|
price: e
|
|
})),
|
|
p = a.priceToCoordinate(e, u);
|
|
d.sort((e, t) => Math.abs(e.y - p) - Math.abs(t.y - p));
|
|
const _ = d[0];
|
|
return (Object(te.b)().value() === ee.MagnetMode.StrongMagnet || Math.abs(_.y - p) <
|
|
50) && (s = _.price), s
|
|
}
|
|
}
|
|
var se = i("Qb4w"),
|
|
re = i("jCNj"),
|
|
ne = i("OLhd");
|
|
i.d(t, "ChartModelBase", (function() {
|
|
return ce
|
|
}));
|
|
const oe = Object(W.getLogger)("Chart.ChartModel");
|
|
|
|
function ae(e, t) {
|
|
const i = e.indexOf(t);
|
|
return -1 !== i && (e.splice(i, 1), !0)
|
|
}
|
|
const le = {
|
|
isSnapshot: !1,
|
|
readOnly: !1,
|
|
watermarkEnabled: !0,
|
|
shiftVisibleRangeOnNewBar: !0,
|
|
currencyConversionEnabled: !1,
|
|
unitConversionEnabled: !1,
|
|
countdownEnabled: !0,
|
|
lastPriceAnimationEnabled: !0
|
|
};
|
|
class ce {
|
|
constructor(e, t, i, r, n, o, a, c) {
|
|
this._onRearrangePanes = new L.a, this._lineToolsGroupModel = new j
|
|
.LineToolsGroupModel, this._sourcesBeingMoved = [], this._lineItemBeingMoved =
|
|
null, this._lineBeingEdited = null, this._linePointBeingEdited = null, this
|
|
._linePointBeingChanged = null, this._customSourceBeingMovedHitTestData = null,
|
|
this._customSourceBeingMoved = null, this._dataSourceCollectionChanged = new L
|
|
.a, this._sourceProperitesChanged = new L.a, this._sourceZOrderChanged = new L
|
|
.a, this._dataSourceSymbolResolved = new L.a, this._sessions = null, this
|
|
._currentTool = "", this._lineBeingCreated = null, this
|
|
._paneBeingCreatedLineOn = null, this._lineCancelled = new L.a, this
|
|
._phantomSourceContainer = new $(this), this._destroyed = !1, this
|
|
._isSettingsExternalPosition = !1, this._isTimeScrolling = !1, this._magnet =
|
|
new ie, this._scrollingState = null, this._panes = [], this._tagsChanged = new L
|
|
.a, this._strategySources = [], this._strategySourcesChange = new L.a, this
|
|
._activeStrategySource = new E.a(null), this._panesCollectionChanged = new L.a,
|
|
this._scrollEnabled = P.enabled("chart_scroll"), this._zoomEnabled = P.enabled(
|
|
"chart_zoom"), this._isScalesResetAvailableChanged = new L.a, this
|
|
._isScalesResetAvailable = !1, this._esdWatcher = null, this._alertsWatcher =
|
|
null, this._hoveredSource = null, this._hoveredSourceChanged = new L.a, this
|
|
._lastHoveredHittestData = null, this._lastSelectedHittestData = null, this
|
|
._topmostCustomSources = [], this._fgCustomSources = [], this
|
|
._bgCustomSources = [], this._allCustomSources = [], this._customSourcesMap =
|
|
new Map, this._multiPaneSources = [], this._showLegendProperty = new f.a, this
|
|
._id = Object(U.guid)(), this._chartSaveTime = null, this
|
|
._availableCurrenciesList = null, this._availableCurrencies = new J([]), this
|
|
._availableUnitsObject = null, this._availableUnits = new Z({}), this
|
|
._shouldBeSavedEvenIfHidden = !1, this._watchedThemeSpawn = l.watchedTheme
|
|
.spawn(), this._gradientColorsCache = null, this._recalcVRStudiesParams = {},
|
|
this._recalcColorStudiesParams = {},
|
|
this._recalcVisibleRangeStudiesImplDebounced = Object(s.default)(this
|
|
._recalcVisibleRangeStudiesImpl.bind(this, this._recalcVRStudiesParams), 500
|
|
), this._recalcColorStudiesImplDebounced = Object(s.default)(this
|
|
._recalcColorStudiesImpl.bind(this, this._recalcColorStudiesParams), 250),
|
|
this._width = 0, this._resetScales = new L.a, this._chartThemeLoaded = new L.a,
|
|
this._chartApi = e, this._invalidateHandler = t, this._undoModel = o, this
|
|
._properties = i, this._options = Object(z.merge)(Object(z.clone)(le), c), this
|
|
._studiesMetaInfoRepository = n, this._readOnly = this._options.readOnly, this
|
|
._isSnapshot = this._options.isSnapshot, this._chartSaveTime = (new Date)
|
|
.valueOf(), this._backgroundColor = new E.a(this._getBackgroundColor()), this
|
|
._backgroundTopColor = new E.a(this._getBackgroundColor(!0)), this._properties
|
|
.childs().paneProperties.childs().background.subscribe(this, this
|
|
._updateBackgroundColor), this._properties.childs().paneProperties.childs()
|
|
.backgroundType.subscribe(this, this._updateBackgroundColor), this._properties
|
|
.childs().paneProperties.childs().backgroundGradientStartColor.subscribe(this,
|
|
this._updateBackgroundColor), this._properties.childs().paneProperties
|
|
.childs().backgroundGradientEndColor.subscribe(this, this
|
|
._updateBackgroundColor), this._backgroundColor.subscribe(this
|
|
.recalcColorStudies.bind(this, !1)), this._watchedThemeSpawn.subscribe(this
|
|
._updateBackgroundColor.bind(this))
|
|
}
|
|
version() {
|
|
return 3
|
|
}
|
|
chartSaveTime() {
|
|
return this._chartSaveTime
|
|
}
|
|
setChartSaveTime(e) {
|
|
this._chartSaveTime = e
|
|
}
|
|
destroy() {
|
|
this._phantomSourceContainer.destroy(), this._hoveredSourceChanged.destroy(),
|
|
null !== this._watermarkSource && (this._watermarkSource.destroy(), this
|
|
._watermarkSource = null), Array.from(this._customSourcesMap.keys())
|
|
.forEach(this._removeCustomSource, this), Object(r.assert)(0 === this
|
|
._topmostCustomSources.length), Object(r.assert)(0 === this._fgCustomSources
|
|
.length), Object(r.assert)(0 === this._bgCustomSources.length), Object(r
|
|
.assert)(0 === this._allCustomSources.length), Object(r.assert)(0 === this
|
|
._customSourcesMap.size), null !== this._esdWatcher && (this._esdWatcher
|
|
.destroy(), this._esdWatcher = null), null !== this._alertsWatcher && (this
|
|
._alertsWatcher.destroy(), this._alertsWatcher = null), this._properties
|
|
.childs().paneProperties.childs().background.unsubscribeAll(this), this
|
|
._properties.childs().paneProperties.childs().backgroundType.unsubscribeAll(
|
|
this), this._properties.childs().paneProperties.childs()
|
|
.backgroundGradientEndColor.unsubscribeAll(this), this._properties.childs()
|
|
.paneProperties.childs().backgroundGradientStartColor.unsubscribeAll(this), this
|
|
._watchedThemeSpawn.destroy(), this._destroyed = !0
|
|
}
|
|
undoModel() {
|
|
return this._undoModel
|
|
}
|
|
addStrategySource(e) {
|
|
-1 === this._strategySources.indexOf(e) && (this._strategySources.push(e), this
|
|
._strategySourcesChange.fire(), this.setActiveStrategySource(e))
|
|
}
|
|
removeStrategySource(e) {
|
|
const t = this._strategySources.indexOf(e);
|
|
if (-1 !== t) {
|
|
if (this._strategySources.splice(t, 1)[0] === this._activeStrategySource
|
|
.value() && this.unsetActiveStrategySource(), this._strategySources.length >
|
|
0
|
|
) {
|
|
const e = this._strategySources[this._strategySources.length - 1];
|
|
this.setActiveStrategySource(e)
|
|
}
|
|
this._strategySourcesChange.fire()
|
|
}
|
|
}
|
|
setActiveStrategySource(e) {
|
|
-1 !== this._strategySources.indexOf(e) && this._activeStrategySource.setValue(e)
|
|
}
|
|
unsetActiveStrategySource() {
|
|
this._activeStrategySource.setValue(null)
|
|
}
|
|
activeStrategySource() {
|
|
return this._activeStrategySource
|
|
}
|
|
strategySources() {
|
|
return this._strategySources
|
|
}
|
|
strategySourcesChange() {
|
|
return this._strategySourcesChange
|
|
}
|
|
setScrollEnabled(e) {
|
|
this._scrollEnabled = e
|
|
}
|
|
scrollEnabled() {
|
|
return this._scrollEnabled
|
|
}
|
|
setZoomEnabled(e) {
|
|
this._zoomEnabled = e
|
|
}
|
|
zoomEnabled() {
|
|
return this._zoomEnabled
|
|
}
|
|
zoomToViewport(e, t, i, s, r) {
|
|
this.setTimeViewport(e, t);
|
|
let n = Math.min(i, s),
|
|
o = Math.max(i, s);
|
|
const a = r.defaultPriceScale();
|
|
a.isPercentage() || a.setMode({
|
|
autoScale: !1
|
|
}), a.isLog() && (n = a.priceToLogical(n), o = a.priceToLogical(o)), a
|
|
.setPriceRange(new se.PriceRange(n, o)), this.recalculateAllPanes(), this
|
|
.invalidate(this._paneInvalidationMask(r, k.InvalidationLevel.Light)), this
|
|
._setScalesResetAvailable(!0)
|
|
}
|
|
setTimeViewport(e, t) {
|
|
this.timeScale().zoomToBarsRange(e, t), this.recalculateAllPanes(), this
|
|
.recalcVisibleRangeStudies(), this.lightUpdate()
|
|
}
|
|
onTagsChanged() {
|
|
return this._tagsChanged
|
|
}
|
|
canZoomIn() {
|
|
return this._timeScale.canZoomIn() && this._zoomEnabled
|
|
}
|
|
canZoomOut() {
|
|
return this._timeScale.canZoomOut() && this._zoomEnabled
|
|
}
|
|
onPaneTagsChanged() {
|
|
this._tagsChanged.fire()
|
|
}
|
|
panesCollectionChanged() {
|
|
return this._panesCollectionChanged
|
|
}
|
|
dataSourceCollectionChanged() {
|
|
return this._dataSourceCollectionChanged
|
|
}
|
|
symbolSourceResolved() {
|
|
return this._dataSourceSymbolResolved
|
|
}
|
|
sourceProperitesChanged() {
|
|
return this._sourceProperitesChanged
|
|
}
|
|
sourceZOrderChanged() {
|
|
return this._sourceZOrderChanged
|
|
}
|
|
updateCrosshairPositionByOriginCoords() {
|
|
const e = this.crossHairSource(),
|
|
t = e.pane;
|
|
let i = e.originX(),
|
|
s = e.originY();
|
|
if (Number.isFinite(i) || (i = e.x, s = e.y), null !== t && Number.isFinite(i) &&
|
|
Number.isFinite(s)) {
|
|
const e = this._timeScale.coordinateToVisibleIndex(i);
|
|
let n = NaN;
|
|
const o = t.defaultPriceScale();
|
|
if (!o.isEmpty()) {
|
|
const e = Object(r.ensureNotNull)(t.mainDataSource()).firstValue();
|
|
null !== e && (n = o.coordinateToPrice(s, Object(r.ensureNotNull)(e)))
|
|
}
|
|
this.crossHairSource().setPosition(e, n, t) && this._undoModel.chartWidget()
|
|
.isActive() && this._syncCrosshair()
|
|
}
|
|
}
|
|
zoomTime(e, t, i) {
|
|
if (!this._zoomEnabled) return;
|
|
const s = this.timeScale();
|
|
if (s.isEmpty() || 0 === t) return;
|
|
const r = s.width();
|
|
e = Math.max(1, Math.min(e, r - 2)), s.zoom(e, t, i), this.recalculateAllPanes(),
|
|
this.lightUpdate(), this.recalcVisibleRangeStudies(), this
|
|
._setScalesResetAvailable(!0)
|
|
}
|
|
linePointBeingEdited() {
|
|
return this._linePointBeingEdited
|
|
}
|
|
linePointBeingChanged() {
|
|
return this._linePointBeingChanged
|
|
}
|
|
dataSources() {
|
|
const e = [this.crossHairSource()];
|
|
for (const t of this._panes)
|
|
for (const i of t.dataSources()) e.push(i);
|
|
return e
|
|
}
|
|
priceDataSources() {
|
|
const e = [];
|
|
for (const t of this._panes)
|
|
for (const i of t.priceDataSources()) e.push(i);
|
|
return e
|
|
}
|
|
lineToolsGroupModel() {
|
|
return this._lineToolsGroupModel
|
|
}
|
|
restoreLineToolsGroups(e) {
|
|
this._lineToolsGroupModel = j.LineToolsGroupModel.fromState(this, e)
|
|
}
|
|
realignLineTools() {
|
|
for (const e of this._panes) e.realignLineTools() && this
|
|
._dataSourceCollectionChanged.fire(e)
|
|
}
|
|
updateSource(e) {
|
|
const t = this._invalidationMaskForSource(e);
|
|
null !== t && this.invalidate(t)
|
|
}
|
|
updateSourcePriceScale(e) {
|
|
const t = this._invalidationMaskForSourcePriceScale(e);
|
|
null !== t && this.invalidate(t)
|
|
}
|
|
replaceStudyStub(e, t) {
|
|
const i = this.paneForSource(e);
|
|
if (null === i) return !1;
|
|
const s = e.priceScale(),
|
|
r = e.zorder(),
|
|
n = e.ownerSource();
|
|
return this.paneForSource(e) === i ? i.replaceSource(e, t, s) : (i.insertDataSource(
|
|
t, s, r), this.removeSource(e)), t.setOwnerSource(n), this.dataSources()
|
|
.forEach(i => {
|
|
i.ownerSource() === e && i.setOwnerSource(t)
|
|
}), t.start(), this.recalculatePane(i), this.fullUpdate(), !0
|
|
}
|
|
insertStudyStub(e) {
|
|
const t = this.mainSeries(),
|
|
i = Object(r.ensureNotNull)(this.paneForSource(t)),
|
|
s = new p.StudyStub(this, null, e),
|
|
n = i.createPriceScaleAtPosition("overlay");
|
|
return i.addDataSource(s, n, !1), this.recalculatePane(i), this.fullUpdate(), s
|
|
}
|
|
removeStudyStub(e) {
|
|
const t = this.dataSourceForId(e);
|
|
return null === t ? (oe.logNormal("StudyStub id=" + e +
|
|
" is not found in chart model"), !1) : (this.removeSource(t), !0)
|
|
}
|
|
setHoveredSource(e, t = null) {
|
|
const i = this._hoveredSource !== e;
|
|
if (!i && this._lastHoveredHittestData === t) return;
|
|
this._lastHoveredHittestData = t;
|
|
let s = null;
|
|
if (this._hoveredSource) {
|
|
this._hoveredSource.updateAllViews(), s = new k.InvalidationMask(k
|
|
.InvalidationLevel.Cursor);
|
|
const e = this._invalidationMaskForSource(this._hoveredSource, k
|
|
.InvalidationLevel.Light);
|
|
null !== e && s.merge(e)
|
|
}
|
|
if (this._hoveredSource = e, e) {
|
|
e.updateAllViews(), s || (s = new k.InvalidationMask(k.InvalidationLevel
|
|
.Cursor));
|
|
const t = this._invalidationMaskForSource(e, k.InvalidationLevel.Light);
|
|
null !== t && s.merge(t)
|
|
}
|
|
s && this.invalidate(s), i && this._hoveredSourceChanged.fire(e)
|
|
}
|
|
hoveredSource() {
|
|
return this._hoveredSource
|
|
}
|
|
hoveredSourceChanged() {
|
|
return this._hoveredSourceChanged
|
|
}
|
|
lastHittestData() {
|
|
return this._lastHoveredHittestData || this.lastSelectedHittestData()
|
|
}
|
|
lastSelectedHittestData() {
|
|
var e;
|
|
return this._lastSelectedHittestData || ((null === (e = this
|
|
._customSourceBeingMovedHitTestData) || void 0 === e ? void 0 : e
|
|
.beingMoved) ? this._customSourceBeingMovedHitTestData : null)
|
|
}
|
|
syncTimeWithModel(e, t) {
|
|
const i = this.mainSeries().syncModel();
|
|
if (null === i) return;
|
|
const s = 1e3 * this.createSyncPoint(Object(r.ensureNotNull)(e.mainSeries()
|
|
.syncModel()), i).sourceTimeToTargetTime(t / 1e3),
|
|
n = Object(re.get_timezone)(this.timezone());
|
|
let o = Object(re.utc_to_cal)(n, s);
|
|
this.mainSeries().isDWM() && (o = i.getSession().spec.correctTradingDay(o), Object(
|
|
re.set_hms)(o, 0, 0, 0, 0, Object(re.get_timezone)("Etc/UTC"))), this
|
|
._gotoTimeImpl(o.getTime(), {
|
|
centerIfVisible: !1
|
|
})
|
|
}
|
|
gotoTime(e) {
|
|
return this._gotoTimeImpl(e, {
|
|
centerIfVisible: !0
|
|
})
|
|
}
|
|
paneForSource(e) {
|
|
if (!Object(d.a)(e)) return Array.from(this._customSourcesMap.values()).includes(
|
|
e) ? this.paneForSource(this.mainSeries()) : null;
|
|
for (let t = this._panes.length - 1; t >= 0; t--)
|
|
if (this._panes[t].hasDataSource(e)) return this._panes[t];
|
|
return e instanceof q.BarsMarksContainer ? this.paneForSource(this.mainSeries()) :
|
|
null
|
|
}
|
|
allStudies(e) {
|
|
const t = e ? e => Object(M.isStudy)(e) && !Object(M.isESDStudy)(e) : M.isStudy;
|
|
return this._getAllSources(t)
|
|
}
|
|
findNonOverlayStudyWithGroupingKey(e, t) {
|
|
const i = void 0 !== t ? [t] : this._panes;
|
|
for (const t of i) {
|
|
const i = t.dataSources().find(i => Object(M.isStudy)(i) && i.metaInfo()
|
|
.groupingKey === e && !t.isOverlay(i));
|
|
if (void 0 !== i) return {
|
|
pane: t,
|
|
study: i
|
|
}
|
|
}
|
|
return null
|
|
}
|
|
movePaneUp(e) {
|
|
this.movePane(e, e - 1)
|
|
}
|
|
movePaneDown(e) {
|
|
this.movePane(e, e + 1)
|
|
}
|
|
movePane(e, t) {
|
|
const i = this._panes[e];
|
|
this._panes.splice(e, 1), this._panes.splice(t, 0, i), this._panesCollectionChanged
|
|
.fire(this._panes), this._onRearrangePanes.fire(), this.invalidate(k
|
|
.InvalidationMask.panesOrder())
|
|
}
|
|
backgroundColor() {
|
|
return this._backgroundColor
|
|
}
|
|
backgroundTopColor() {
|
|
return this._backgroundTopColor
|
|
}
|
|
backgroundColorAtYPercentFromTop(e) {
|
|
const t = this.backgroundColor().value(),
|
|
i = this.backgroundTopColor().value();
|
|
if (t === i) return t;
|
|
if (e = Math.max(0, Math.min(100, Math.round(100 * e))), null === this
|
|
._gradientColorsCache || this._gradientColorsCache.topColor !== i || this
|
|
._gradientColorsCache.bottomColor !== t) this._gradientColorsCache = {
|
|
topColor: i,
|
|
bottomColor: t,
|
|
colors: new Map
|
|
};
|
|
else {
|
|
const t = this._gradientColorsCache.colors.get(e);
|
|
if (void 0 !== t) return t
|
|
}
|
|
const s = Object(G.gradientColorAtPercent)(i, t, e / 100);
|
|
return this._gradientColorsCache.colors.set(e, s), s
|
|
}
|
|
backgroundCounterColor() {
|
|
const e = this.backgroundColor().value();
|
|
if (void 0 === this._lastBackgroundColor || void 0 === this._lastOriginalColor ||
|
|
e !== this._lastBackgroundColor) {
|
|
const t = Object(o.rgbToBlackWhiteString)(Object(o.parseRgb)(e), 150);
|
|
this._lastBackgroundColor = e, this._lastOriginalColor = "black" === t ?
|
|
"white" : "black"
|
|
}
|
|
return this._lastOriginalColor
|
|
}
|
|
isDark() {
|
|
return "white" === this.backgroundCounterColor()
|
|
}
|
|
defaultResolutions() {
|
|
return this.chartApi().defaultResolutions()
|
|
}
|
|
availableCurrencies() {
|
|
const e = this._getAvailableCurrencies();
|
|
return e.length !== this._availableCurrencies.size() && (this._availableCurrencies =
|
|
new J(e)), this._availableCurrencies
|
|
}
|
|
currencyConversionEnabled() {
|
|
return this._options.currencyConversionEnabled
|
|
}
|
|
availableUnits() {
|
|
const e = this._getAvailableUnits();
|
|
return this._availableUnits.unitsChanged(e) && (this._availableUnits = new Z(e)),
|
|
this._availableUnits
|
|
}
|
|
unitConversionEnabled() {
|
|
return this._options.unitConversionEnabled
|
|
}
|
|
studyTemplate(e, t, i) {
|
|
const s = {
|
|
panes: [],
|
|
version: this.version()
|
|
};
|
|
for (const e of this.panes()) s.panes.push(e.state(!0, !1, !0));
|
|
const r = this.mainSeries();
|
|
return e && (s.symbol = r.symbol(), i && (s.currency = r.currency()), i && (s.unit =
|
|
r.unit())), t && (s.interval = r.interval()), s
|
|
}
|
|
restoreLineToolState(e, t) {
|
|
e.restorePoints(t.points, t.indexes || []), e.properties().merge(t.state), e
|
|
.restoreData && e.restoreData(t), e.linkKey().setValue(t.linkKey || null), e
|
|
.createServerPoints(), this.fullUpdate();
|
|
const i = e.linkKey().value();
|
|
null !== i && Object(F.restoreLineToolState)({
|
|
model: this,
|
|
linkKey: i,
|
|
state: t
|
|
})
|
|
}
|
|
updateLineTools() {
|
|
for (const e of this.dataSources()) Object(H.isLineTool)(e) && (e
|
|
.tryCreateServerPoints(), e.checkAlert && e.checkAlert())
|
|
}
|
|
onResetScales() {
|
|
return this._resetScales
|
|
}
|
|
startMovingSources(e, t, i, s, n, o) {
|
|
if (this._sourcesBeingMoved = e, this._lineItemBeingMoved = i, this
|
|
._sourcesBeingMoved.forEach(e => {
|
|
const a = Object(r.ensureNotNull)(this.paneForSource(e)),
|
|
l = Object(H.isLineTool)(e),
|
|
c = l && e.linkKey().value();
|
|
if (!1 !== c && null !== c && s.has(c) && l && e.isFixed()) {
|
|
const t = Object(r.ensureDefined)(s.get(c)),
|
|
l = {
|
|
screen: this._percentPositionToPoint(t, a)
|
|
};
|
|
e.startMoving(l, i, n, o)
|
|
} else e.startMoving(t, i, n, o);
|
|
const h = this._paneInvalidationMask(a, k.InvalidationLevel.Light);
|
|
this.invalidate(h)
|
|
}), !o) {
|
|
const s = e.filter(H.isLineTool).filter(e => e.linkKey().value() && e
|
|
.isSynchronizable()).map(e => e.linkKey().value());
|
|
if (s.length && t.logical) {
|
|
const o = this.externalTimeStamp(t.logical.index),
|
|
a = {
|
|
linkKeys: s,
|
|
model: this,
|
|
symbol: this.mainSeries().symbol(),
|
|
point: {
|
|
price: t.logical.price,
|
|
timeStamp: o
|
|
},
|
|
itemIndex: null !== i ? i : void 0,
|
|
envState: n,
|
|
pointPositionPercents: new Map
|
|
};
|
|
e.forEach(e => {
|
|
if (Object(H.isLineTool)(e)) {
|
|
const i = e.linkKey().value();
|
|
if (i && e.isSynchronizable() && e.isFixed()) {
|
|
const s = Object(r.ensureNotNull)(this.paneForSource(
|
|
e));
|
|
a.pointPositionPercents.set(i, this
|
|
._pointToPercentPosition(Object(r.ensureDefined)
|
|
(t.screen), s))
|
|
}
|
|
}
|
|
}), Object(F.startMovingLineTool)(a)
|
|
}
|
|
}
|
|
F.isToolMovingNow.setValue(!0)
|
|
}
|
|
moveSources(e, t, i, s) {
|
|
if (this._sourcesBeingMoved.filter(e => !e.isLocked || !e.isLocked()).forEach(n => {
|
|
const o = Object(H.isLineTool)(n) ? n.linkKey().value() : null;
|
|
if (null !== o && t.has(o)) {
|
|
const e = Object(r.ensureNotNull)(this.paneForSource(n)),
|
|
a = Object(r.ensureDefined)(t.get(o)),
|
|
l = {
|
|
screen: this._percentPositionToPoint(a, e)
|
|
};
|
|
n.move(l, this._lineItemBeingMoved, i, s)
|
|
} else n.move(e, this._lineItemBeingMoved, i, s)
|
|
}), this.lightUpdate(), !s && e.logical) {
|
|
const t = this._sourcesBeingMoved.filter(H.isLineTool).filter(e => e
|
|
.isSynchronizable() && !!e.linkKey().value()).map(e => e.linkKey()
|
|
.value()),
|
|
s = this.externalTimeStamp(e.logical.index),
|
|
n = {
|
|
linkKeys: t,
|
|
model: this,
|
|
point: {
|
|
price: e.logical.price,
|
|
timeStamp: s
|
|
},
|
|
envState: i,
|
|
pointPositionPercents: new Map
|
|
};
|
|
this._sourcesBeingMoved.filter(H.isLineTool).forEach(t => {
|
|
if (t.linkKey().value() && t.isSynchronizable() && t.isFixed()) {
|
|
const i = Object(r.ensureNotNull)(this.paneForSource(t));
|
|
n.pointPositionPercents.set(t.linkKey().value(), this
|
|
._pointToPercentPosition(Object(r.ensureDefined)(e
|
|
.screen), i))
|
|
}
|
|
}), Object(F.moveLineTool)(n)
|
|
}
|
|
}
|
|
endMovingSources(e, t) {
|
|
const i = this._sourcesBeingMoved.map(i => {
|
|
const s = Object(r.ensureNotNull)(this.paneForSource(i)),
|
|
n = i.endMoving(e, t),
|
|
o = this._paneInvalidationMask(s, k.InvalidationLevel.Light);
|
|
return o.invalidateAll(k.InvalidationLevel.Light), this.invalidate(o), n
|
|
}),
|
|
s = this._sourcesBeingMoved.filter(H.isLineTool).filter(e => e
|
|
.isSynchronizable() && !!e.linkKey().value()).map(e => e.linkKey().value()),
|
|
n = this._sourcesBeingMoved.filter(H.isLineTool).filter(e => e
|
|
.isSynchronizable() && !!e.linkKey).map(e => {
|
|
const t = {
|
|
points: e.normalizedPoints(),
|
|
interval: this.mainSeries().interval()
|
|
};
|
|
return e.isFixed() && (t.pointPositionPercents = e
|
|
.calcPositionPercents()), t
|
|
});
|
|
s.length && Object(F.finishMovingLineTool)({
|
|
linkKeys: s,
|
|
model: this,
|
|
finalStates: n,
|
|
changes: i
|
|
}), this._sourcesBeingMoved = [], this._lineItemBeingMoved = null, F
|
|
.isToolMovingNow.setValue(!1)
|
|
}
|
|
sourcesBeingMoved() {
|
|
return this._sourcesBeingMoved
|
|
}
|
|
setMovingCustomSource(e, t) {
|
|
this._customSourceBeingMoved = e, this._customSourceBeingMovedHitTestData = null !==
|
|
t ? {
|
|
beingMoved: !1,
|
|
...t
|
|
} : null
|
|
}
|
|
processingCustomSourceMove() {
|
|
null !== this._customSourceBeingMovedHitTestData && (this
|
|
._customSourceBeingMovedHitTestData.beingMoved = !0)
|
|
}
|
|
customSourceMovingHitTestData() {
|
|
return this._customSourceBeingMovedHitTestData
|
|
}
|
|
customSourceBeingMoved() {
|
|
return null !== this._customSourceBeingMovedHitTestData && this
|
|
._customSourceBeingMovedHitTestData.beingMoved ? this._customSourceBeingMoved :
|
|
null
|
|
}
|
|
width() {
|
|
return this._width
|
|
}
|
|
setWidth(e, t) {
|
|
this._width = e, this._timeScale.setWidth(e, t);
|
|
for (const t of this._panes) t.setWidth(e);
|
|
this.recalculateAllPanes(), this.recalcVisibleRangeStudies()
|
|
}
|
|
setPaneHeight(e, t) {
|
|
e.setHeight(t), this.recalculateAllPanes(), this.lightUpdate()
|
|
}
|
|
isScalesResetAvailableChanged() {
|
|
return this._isScalesResetAvailableChanged
|
|
}
|
|
isScalesResetAvailable() {
|
|
return this._isScalesResetAvailable
|
|
}
|
|
panes() {
|
|
return this._panes
|
|
}
|
|
paneForId(e) {
|
|
return this._panes.find(t => t.id() === e) || null
|
|
}
|
|
createPane(e, t, i) {
|
|
const s = this._undoModel.chartWidget();
|
|
s.isMaximizedPane() && s.toggleMaximizePane();
|
|
const r = this._properties.childs().paneProperties;
|
|
t && r.merge(t);
|
|
const n = new D.Pane(this._timeScale, r, this, i);
|
|
return void 0 !== e ? this._panes.splice(e, 0, n) : this._panes.push(n), n
|
|
.onTagsChanged().subscribe(this, ce.prototype.onPaneTagsChanged), n
|
|
.dataSourcesCollectionChanged().subscribe(this, () => this
|
|
._dataSourceCollectionChanged.fire(n)), n.sourcePropertiesChanged()
|
|
.subscribe(this, e => this._sourceProperitesChanged.fire(n, e)), n
|
|
.sourceZOrderChanged().subscribe(this, e => this._sourceZOrderChanged.fire(n,
|
|
e)), n.symbolSourceResolved().subscribe(this, e => this
|
|
._dataSourceSymbolResolved.fire(n, e)), this._panesCollectionChanged.fire(
|
|
this._panes), this.invalidate(k.InvalidationMask.panesOrder()), n
|
|
}
|
|
removePane(e) {
|
|
const t = this._undoModel.chartWidget();
|
|
t.isMaximizedPane() && t.toggleMaximizePane();
|
|
const i = e;
|
|
i.destroy();
|
|
const s = this._panes.indexOf(i); - 1 !== s && (this._panes.splice(s, 1), e
|
|
.dataSourcesCollectionChanged().unsubscribeAll(this), e
|
|
.sourcePropertiesChanged().unsubscribeAll(this), e.onTagsChanged()
|
|
.unsubscribeAll(this), e.symbolSourceResolved().unsubscribeAll(this));
|
|
this.crossHairSource().pane === e && this.clearCurrentPosition(), this
|
|
._panesCollectionChanged.fire(this._panes), this.invalidate(k.InvalidationMask
|
|
.panesOrder())
|
|
}
|
|
changePanesHeight(e, t) {
|
|
if (this._panes.length < 2) return;
|
|
Object(r.assert)(e >= 0 && e < this._panes.length, "Invalid pane index");
|
|
const i = this._panes[e],
|
|
s = this._panes.reduce((e, t) => e + t.stretchFactor(), 0),
|
|
n = this._panes.reduce((e, t) => e + t.height(), 0),
|
|
o = n - 30 * (this._panes.length - 1);
|
|
t = Math.min(o, Math.max(30, t));
|
|
const a = s / n,
|
|
l = i.height();
|
|
i.setStretchFactor(t * a);
|
|
let c = t - l,
|
|
h = this._panes.length - 1;
|
|
for (const e of this._panes)
|
|
if (e !== i) {
|
|
const t = Math.min(o, Math.max(30, e.height() - c / h));
|
|
c -= e.height() - t, h -= 1;
|
|
const i = t * a;
|
|
e.setStretchFactor(i)
|
|
} this.fullUpdate()
|
|
}
|
|
clearCurrentPosition() {
|
|
const e = this.crossHairSource();
|
|
e.clearPosition(), Object(r.ensureNotNull)(e.dataWindowView()).update();
|
|
const t = this._panes;
|
|
for (let e = t.length; e--;) {
|
|
const i = t[e].dataSources();
|
|
for (let e = i.length; e--;) {
|
|
const t = i[e].dataWindowView();
|
|
t && t.update();
|
|
const s = i[e].legendView();
|
|
s && s.update()
|
|
}
|
|
}
|
|
this.invalidate(k.InvalidationMask.cursor());
|
|
const i = this._undoModel.chartWidget();
|
|
i.chartWidgetCollection().syncCrosshair(null, i), this._phantomSourceContainer
|
|
.onCursorPositionUpdated()
|
|
}
|
|
setAndSaveCurrentPosition(e, t, i, s) {
|
|
this.crossHairSource().saveOriginCoords(e, t), this.setCurrentPosition(e, t, i, s)
|
|
}
|
|
setCurrentPosition(e, t, i, s) {
|
|
let n = NaN;
|
|
const o = this._timeScale.coordinateToVisibleIndex(e),
|
|
a = i.defaultPriceScale();
|
|
let l = null;
|
|
a.isEmpty() || (l = Object(r.ensureNotNull)(i.mainDataSource()).firstValue(),
|
|
null !== l && (n = a.coordinateToPrice(t, l)));
|
|
const c = this.crossHairSource(),
|
|
h = c.selectPointMode().value(),
|
|
u = this.currentTool(),
|
|
d = this.mainSeries();
|
|
if (!this._isSettingsExternalPosition && (this._lineBeingCreated || this
|
|
._lineBeingEdited || Object(H.isLineToolName)(u) || Object(F.toolIsMeasure)(
|
|
u)) && (n = this._magnet.align(n, o, i), null !== l && c
|
|
.saveOriginCoords(c.originX(), a.priceToCoordinate(n, l))), this
|
|
._isTimeScrolling) {
|
|
if (!this._isSettingsExternalPosition && h) {
|
|
const e = d.bars().firstIndex(),
|
|
t = d.bars().lastIndex();
|
|
if (null !== e && null !== t) {
|
|
const s = Math.min(Math.max(o, e), t);
|
|
s !== o && this._setCorrectedPositionToCrosshair(s, n, l, i)
|
|
}
|
|
} else c.setPosition(c.index, n, i);
|
|
return
|
|
}
|
|
c.setOnHoveredChartWidget(!0), c.setPosition(o, n, i), Object(r.ensureNotNull)(c
|
|
.dataWindowView()).update();
|
|
const p = this._panes;
|
|
for (let e = p.length; e--;) {
|
|
const t = p[e].dataSources();
|
|
for (let e = t.length; e--;) {
|
|
const i = t[e].dataWindowView();
|
|
i && i.update();
|
|
const s = t[e].legendView();
|
|
s && s.update()
|
|
}
|
|
}
|
|
const _ = d.syncModel();
|
|
if (this.crossHairSource().startMeasurePoint() || this._lineBeingCreated ? this
|
|
.lightUpdate() : this.invalidate(k.InvalidationMask.cursor()), this
|
|
._lineBeingCreated) {
|
|
const e = this._lineBeingCreated.linkKey().value();
|
|
if (!this._isSettingsExternalPosition) {
|
|
this._lineBeingCreated.setLastPoint({
|
|
index: o,
|
|
price: n
|
|
}, s), this._lineBeingCreated.updateAllViews();
|
|
const t = Object(r.ensureNotNull)(this._lineBeingCreated.lastPoint());
|
|
if (t.price === n && t.index === o || this._setCorrectedPositionToCrosshair(
|
|
t.index, t.price, l, i), _ && e) {
|
|
const i = this._timeScale.points().roughTime(t.index, _.projectTime
|
|
.bind(_));
|
|
Object(F.setLineToolLastPoint)({
|
|
model: this,
|
|
linkKey: e,
|
|
point: {
|
|
timeStamp: Object(r.ensureNotNull)(i),
|
|
price: t.price
|
|
}
|
|
})
|
|
}
|
|
}
|
|
}
|
|
if (!this._isSettingsExternalPosition && null !== this._lineBeingEdited && null !==
|
|
this._linePointBeingEdited) {
|
|
this.changeLinePoint({
|
|
index: o,
|
|
price: n
|
|
}, s);
|
|
const e = this._lineBeingEdited.getPoint(this._linePointBeingEdited);
|
|
null !== e && this._setCorrectedPositionToCrosshair(e.index, e.price, l, i)
|
|
}
|
|
if (!this._isSettingsExternalPosition && h) {
|
|
const e = d.bars().firstIndex(),
|
|
t = d.bars().lastIndex();
|
|
if (null !== e && null !== t) {
|
|
const s = Math.min(Math.max(o, e), t);
|
|
s !== o && this._setCorrectedPositionToCrosshair(s, n, l, i)
|
|
}
|
|
}
|
|
this._syncCrosshair(s)
|
|
}
|
|
setExternalPosition(e, t) {
|
|
let i;
|
|
const s = this.crossHairSource();
|
|
if (s.setOnHoveredChartWidget(!1), null !== e && Object(z.isNumber)(e.timeStamp)) {
|
|
const t = this.mainSeries().syncModel();
|
|
if (t) {
|
|
const s = this.createSyncPoint(e.syncModel, t).sourceTimeToTargetTime(e
|
|
.timeStamp);
|
|
i = this._timeScale.points().roughIndex(s, t.distance.bind(t))
|
|
}
|
|
}
|
|
if (null !== e && null != i && Number.isFinite(i) && void 0 !== e.price && Number
|
|
.isFinite(e.price)) {
|
|
this._isSettingsExternalPosition = !0;
|
|
const n = Object(r.ensureNotNull)(this.paneForSource(this.mainSeries())),
|
|
o = this._timeScale.indexToCoordinate(i),
|
|
a = Object(r.ensureNotNull)(n.mainDataSource()).firstValue();
|
|
if (null !== a) {
|
|
const i = this.mainSeries().priceScale().priceToCoordinate(e.price, a);
|
|
s.clearOriginCoords(), this.setCurrentPosition(o, i, n, t)
|
|
}
|
|
return s.setOnHoveredChartWidget(!1), void(this._isSettingsExternalPosition = !
|
|
1)
|
|
}
|
|
null != i && Number.isFinite(i) ? (s.clearOriginCoords(), s.setPosition(i, NaN,
|
|
null)) : (s.clearPosition(), Object(r.ensureNotNull)(s.dataWindowView())
|
|
.update());
|
|
const n = this.dataSources();
|
|
for (let e = n.length; e--;) {
|
|
const t = n[e].dataWindowView();
|
|
t && t.update();
|
|
const i = n[e].legendView();
|
|
i && i.update()
|
|
}
|
|
this.invalidate(k.InvalidationMask.cursor())
|
|
}
|
|
startScaleTime(e) {
|
|
this._timeScale.startScale(e)
|
|
}
|
|
scaleTimeTo(e) {
|
|
this._timeScale.scaleTo(e), this.recalculateAllPanes(), this.lightUpdate(), this
|
|
._setScalesResetAvailable(!0)
|
|
}
|
|
endScaleTime() {
|
|
this._timeScale.endScale(), this.lightUpdate(), this.recalcVisibleRangeStudies()
|
|
}
|
|
resetTimeScale() {
|
|
this._timeScale.restoreDefault(), this.recalculateAllPanes(), this
|
|
.recalcVisibleRangeStudies(), this.lightUpdate(), this._resetScales.fire(), this
|
|
._setScalesResetAvailable(!1)
|
|
}
|
|
startScalePrice(e, t, i) {
|
|
e.startScalePrice(t, i)
|
|
}
|
|
scalePriceTo(e, t, i) {
|
|
e.scalePriceTo(t, i), this.mainSeries().priceScale().isLockScale() ? this
|
|
.lightUpdate() : this.invalidate(this._paneInvalidationMask(e, k
|
|
.InvalidationLevel.Light)), this._setScalesResetAvailable(!0)
|
|
}
|
|
endScalePrice(e, t) {
|
|
e.endScalePrice(t), this.invalidate(this._paneInvalidationMask(e, k
|
|
.InvalidationLevel.Light))
|
|
}
|
|
resetPriceScale(e, t) {
|
|
this._setScalesResetAvailable(!1), e.resetPriceScale(t), this.invalidate(this
|
|
._paneInvalidationMask(e, k.InvalidationLevel.Light))
|
|
}
|
|
restorePriceScaleState(e, t, i) {
|
|
e.restorePriceScaleState(t, i), this.invalidate(this._paneInvalidationMask(e, k
|
|
.InvalidationLevel.Light))
|
|
}
|
|
currentTool() {
|
|
return this._currentTool
|
|
}
|
|
setCurrentTool(e) {
|
|
this._currentTool !== e && (Object(H.isLineToolName)(e) && this.selectionMacro(
|
|
e => {
|
|
e.clearSelection()
|
|
}), this._currentTool = e, this._phantomSourceContainer.onToolChanged())
|
|
}
|
|
onRearrangePanes() {
|
|
return this._onRearrangePanes
|
|
}
|
|
finishLineTool(e) {
|
|
const t = e.linkKey().value();
|
|
Object(F.drawOnAllCharts)().value() && null !== t && e.isSynchronizable() && Object(
|
|
F.finishLineTool)({
|
|
linkKey: t,
|
|
model: this
|
|
})
|
|
}
|
|
startChangingLinetool(e, t, i, s, n) {
|
|
this._lineBeingEdited = e, this._linePointBeingChanged = t || null, this
|
|
._linePointBeingEdited = void 0 === i ? null : i, F.isToolEditingNow.setValue(!
|
|
0), this._lineBeingEdited.startChanging(i, t, n);
|
|
const o = Object(r.ensureNotNull)(this.paneForSource(e));
|
|
this._lineBeingEdited.startDragPoint && void 0 !== i && void 0 !== t && this
|
|
._lineBeingEdited.startDragPoint(i, t), n || void 0 === i || void 0 === t ||
|
|
this._lineBeingEdited.setPoint(i, t, s, n), this._lineBeingEdited
|
|
.updateAllViews();
|
|
const a = this._paneInvalidationMask(o, k.InvalidationLevel.Light);
|
|
this.invalidate(a);
|
|
const l = e.linkKey().value();
|
|
if (l && e.isSynchronizable() && void 0 !== i && void 0 !== t) {
|
|
const e = Object(r.ensureNotNull)(this.externalTimeStamp(t.index));
|
|
Object(F.startChangingLineTool)({
|
|
linkKey: l,
|
|
model: this,
|
|
symbol: this.mainSeries().symbol(),
|
|
point: {
|
|
price: t.price,
|
|
timeStamp: e
|
|
},
|
|
pointIndex: i,
|
|
envState: s || null
|
|
})
|
|
}
|
|
}
|
|
createLineTool(e, t, i, s, o, a) {
|
|
if (Object(r.assert)(Object(H.isLineToolName)(i),
|
|
"Cannot create unknown line tool: " + i), "LineToolExecution" !== i &&
|
|
Object(c.trackEvent)("drawings", "Study_Drawing_" + i), s) {
|
|
const e = s.state();
|
|
s = Object(H.createLineToolProperties)(i, e)
|
|
}
|
|
const l = Object(H.createLineTool)(i, this, s, null),
|
|
h = !l.linkKey().value() && !o;
|
|
Object(F.drawOnAllCharts)().value() ? l.linkKey().setValue(o || Object(U.randomHash)
|
|
()) : l.linkKey().setValue(o), a = a || Object(r.ensureNotNull)(e
|
|
.mainDataSource()), s || Object(H.prepareLineToolPropertiesByOwnerSource)(l
|
|
.properties(), a), l.setOwnerSource(a);
|
|
const u = a.priceScale();
|
|
let d;
|
|
if (e.addDataSource(l, u, !1), l.isFixed()) {
|
|
const i = Object(r.ensureNotNull)(Object(r.ensureNotNull)(e.mainDataSource())
|
|
.firstValue()),
|
|
s = this._timeScale.indexToCoordinate(t.index),
|
|
o = Object(r.ensureNotNull)(u).priceToCoordinate(t.price, i);
|
|
d = l.addFixedPoint(new n.Point(s, o))
|
|
} else d = l.addPoint(t);
|
|
return d || (this._lineBeingCreated = l, this._paneBeingCreatedLineOn = e, F
|
|
.isToolCreatingNow.setValue(!0)), h && l.enableCurrentIntervalVisibility(),
|
|
this.fullUpdate(), l
|
|
}
|
|
endChangingLinetool(e, t) {
|
|
const i = Object(r.ensureNotNull)(this._lineBeingEdited),
|
|
s = i.endChanging(!1, e);
|
|
this._lineBeingEdited = null, F.isToolEditingNow.setValue(!1), this
|
|
._linePointBeingEdited = null, this._linePointBeingChanged = null, this
|
|
.lightUpdate();
|
|
const n = {
|
|
points: i.normalizedPoints(),
|
|
interval: this.mainSeries().interval()
|
|
},
|
|
o = i.linkKey().value();
|
|
null !== o && i.isSynchronizable() && Object(F.finishChangingLineTool)({
|
|
model: this,
|
|
linkKey: o,
|
|
symbol: this.mainSeries().symbol(),
|
|
finalState: n,
|
|
changes: s
|
|
})
|
|
}
|
|
continueCreatingLine(e, t, i, s) {
|
|
const n = Object(r.ensureNotNull)(this._lineBeingCreated),
|
|
o = n.addPoint(e, t, i);
|
|
n.updateAllViews();
|
|
const a = new k.InvalidationMask(k.InvalidationLevel.Light);
|
|
return o && (this._paneBeingCreatedLineOn = null, this._lineBeingCreated = null, F
|
|
.isToolCreatingNow.setValue(!1)), this.invalidate(a), o
|
|
}
|
|
cancelCreatingLine() {
|
|
if (!this._lineBeingCreated) return;
|
|
const e = this._lineBeingCreated;
|
|
this.removeSource(this._lineBeingCreated), this._lineBeingCreated = null, this
|
|
._lineCancelled.fire(), F.isToolCreatingNow.setValue(!1), Object(F
|
|
.drawOnAllCharts)().value() && e.isSynchronizable() && Object(F
|
|
.cancelLineTool)({
|
|
model: this
|
|
})
|
|
}
|
|
lineBeingCreated() {
|
|
return this._lineBeingCreated
|
|
}
|
|
paneBeingCreatedLineOn() {
|
|
return this._paneBeingCreatedLineOn
|
|
}
|
|
lineCancelled() {
|
|
return this._lineCancelled
|
|
}
|
|
isPhantomLine(e) {
|
|
return this._phantomSourceContainer.source() === e
|
|
}
|
|
changeLinePoint(e, t, i) {
|
|
const s = Object(r.ensureNotNull)(this._lineBeingEdited),
|
|
n = Object(r.ensureNotNull)(this._linePointBeingEdited);
|
|
let o = e.price,
|
|
a = e.index;
|
|
if (s.setPoint(n, e, t), !i) {
|
|
const e = s.getPoint(n);
|
|
null !== e && (a = e.index, o = e.price)
|
|
}
|
|
s.updateAllViews(), this.lightUpdate();
|
|
const l = s.linkKey().value();
|
|
if (!i && null !== l && s.isSynchronizable()) {
|
|
const e = Object(r.ensureNotNull)(this._linePointBeingChanged),
|
|
i = {
|
|
indexesChanged: a !== e.index,
|
|
pricesChanged: o !== e.price
|
|
},
|
|
c = s.getChangePointForSync(n);
|
|
if (null !== c) {
|
|
const e = this.externalTimeStamp(a);
|
|
null !== e && (o = c.price, Object(F.changeLineTool)({
|
|
linkKey: l,
|
|
model: this,
|
|
symbol: this.mainSeries().symbol(),
|
|
point: {
|
|
price: o,
|
|
timeStamp: e
|
|
},
|
|
envState: t,
|
|
changes: i
|
|
}))
|
|
}
|
|
}
|
|
}
|
|
changeLinePoints(e, t, i) {
|
|
const s = e.points(),
|
|
n = e.linkKey().value();
|
|
!i && n && e.isSynchronizable() && t.forEach((t, i) => {
|
|
const o = s[i],
|
|
a = o.price !== t.price,
|
|
l = o.index !== t.index;
|
|
if (e.getChangePointForSync(i)) {
|
|
const e = Object(r.ensureNotNull)(this.externalTimeStamp(t.index));
|
|
Object(F.changeLineTool)({
|
|
linkKey: n,
|
|
model: this,
|
|
symbol: this.mainSeries().symbol(),
|
|
point: {
|
|
price: t.price,
|
|
timeStamp: e
|
|
},
|
|
changes: {
|
|
pricesChanged: a,
|
|
indexesChanged: l
|
|
}
|
|
})
|
|
}
|
|
}), e.setPoints(t), e.updateAllViews(), this.lightUpdate()
|
|
}
|
|
addCustomSource(e, t, i = u.CustomSourceLayer.Foreground) {
|
|
this._customSourcesMap.has(e) && oe.logWarn(
|
|
`Attempt to add the same custom source multiple time "${e}"`), oe.logNormal(
|
|
`Adding custom source "${e}"`);
|
|
const s = t(e, this);
|
|
switch (i) {
|
|
case u.CustomSourceLayer.Background:
|
|
this._bgCustomSources.push(s);
|
|
break;
|
|
case u.CustomSourceLayer.Foreground:
|
|
this._fgCustomSources.push(s);
|
|
break;
|
|
case u.CustomSourceLayer.Topmost:
|
|
this._topmostCustomSources.push(s);
|
|
break;
|
|
default:
|
|
throw new Error("Unknown custom sources layer " + i)
|
|
}
|
|
this._allCustomSources.push(s), this._customSourcesMap.set(e, s), this.lightUpdate()
|
|
}
|
|
removeCustomSource(e) {
|
|
this._removeCustomSource(e), this.lightUpdate()
|
|
}
|
|
hasCustomSource(e) {
|
|
return this._customSourcesMap.has(e)
|
|
}
|
|
customSourceForName(e) {
|
|
return this._customSourcesMap.get(e) || null
|
|
}
|
|
customSourceName(e) {
|
|
let t = null;
|
|
return this._customSourcesMap.forEach((i, s) => {
|
|
i === e && (t = s)
|
|
}), t
|
|
}
|
|
customSources(e) {
|
|
switch (e) {
|
|
case u.CustomSourceLayer.Background:
|
|
return this._bgCustomSources;
|
|
case u.CustomSourceLayer.Foreground:
|
|
return this._fgCustomSources;
|
|
case u.CustomSourceLayer.Topmost:
|
|
return this._topmostCustomSources;
|
|
default:
|
|
return this._allCustomSources
|
|
}
|
|
}
|
|
addMultiPaneSource(e) {
|
|
this._multiPaneSources.push(e), this.lightUpdate()
|
|
}
|
|
removeMultiPaneSource(e) {
|
|
const t = this._multiPaneSources.indexOf(e); - 1 === t ? oe.logWarn(
|
|
"Attempt to remove multi-pane source which does not exist in the model") :
|
|
this._multiPaneSources.splice(t, 1), this.lightUpdate()
|
|
}
|
|
multiPaneSources(e) {
|
|
return this._multiPaneSources.filter(t => !e.hasDataSource(t))
|
|
}
|
|
dateTimeFormatter() {
|
|
return this._dateTimeFormatter
|
|
}
|
|
dateFormatter() {
|
|
return this._dateFormatter
|
|
}
|
|
timeFormatter() {
|
|
return this._timeFormatter
|
|
}
|
|
sessions() {
|
|
return Object(r.ensureNotNull)(this._sessions)
|
|
}
|
|
createSessions(e) {
|
|
Object(r.assert)(null === this._sessions, "Sessions are already created"), this
|
|
.addCustomSource("sessions", (t, i) => (this._sessions = new I(t, i, e), this
|
|
._sessions.start(), this._sessions), u.CustomSourceLayer.Background)
|
|
}
|
|
createPrePostMarket(e) {
|
|
this.addCustomSource("prePostMarket", (t, i) => new PrePostMarket(t, i, e))
|
|
}
|
|
theme() {
|
|
const e = this.properties().paneProperties.state();
|
|
delete e.topMargin, delete e.bottomMargin;
|
|
const t = this.mainSeries().state().state;
|
|
t && (delete t.symbol, delete t.interval, delete t.currencyId, delete t.unitId);
|
|
const i = {
|
|
mainSourceProperties: t,
|
|
sessions: this.sessions().properties().state(),
|
|
chartProperties: {
|
|
paneProperties: e,
|
|
scalesProperties: this.properties().scalesProperties.state()
|
|
}
|
|
};
|
|
return i.version = this.version(), i
|
|
}
|
|
onChartThemeLoaded() {
|
|
return this._chartThemeLoaded
|
|
}
|
|
chartThemeLoaded() {
|
|
this._chartThemeLoaded.fire()
|
|
}
|
|
shouldBeSavedEvenIfHidden() {
|
|
return this._shouldBeSavedEvenIfHidden
|
|
}
|
|
setShouldBeSavedEvenIfHidden(e) {
|
|
this._shouldBeSavedEvenIfHidden = e
|
|
}
|
|
externalTimeStamp(e) {
|
|
const t = this.mainSeries().syncModel();
|
|
return this.timeScale().points().roughTime(e, t && t.projectTime.bind(t))
|
|
}
|
|
syncESD() {
|
|
null !== this._esdWatcher && this._esdWatcher.syncESDStudies()
|
|
}
|
|
recalcVisibleRangeStudies(e) {
|
|
this._recalcVRStudiesParams.force = this._recalcVRStudiesParams.force || Boolean(e),
|
|
this._recalcVisibleRangeStudiesImplDebounced()
|
|
}
|
|
recalcColorStudies(e) {
|
|
this._recalcColorStudiesParams.force = this._recalcColorStudiesParams.force ||
|
|
Boolean(e), this._recalcColorStudiesImplDebounced()
|
|
}
|
|
alertsWatcher() {
|
|
return this._alertsWatcher
|
|
}
|
|
showLegend() {
|
|
return this._showLegendProperty
|
|
}
|
|
id() {
|
|
return this._id
|
|
}
|
|
recalculatePriceRangeOnce() {
|
|
const e = this.mainSeries();
|
|
for (const t of this._panes)
|
|
for (const i of t.priceDataSources()) i.symbolSource() === e && i
|
|
.disablePriceRangeReady()
|
|
}
|
|
invalidate(e) {
|
|
var t;
|
|
null === (t = this._invalidateHandler) || void 0 === t || t.call(this, e)
|
|
}
|
|
appliedTimeFrame() {
|
|
return this._appliedTimeFrame.appliedTimeFrame()
|
|
}
|
|
_createESDWatcher() {}
|
|
_updateDateTimeFormatter() {
|
|
const e = R.dateFormatProperty.value(),
|
|
t = new B.DateFormatter(e);
|
|
if (this._dateFormatter = t, this.mainSeries().isDWM()) this._dateTimeFormatter = t,
|
|
this._timeFormatter = new N.TimeFormatter("%h:%m");
|
|
else {
|
|
const t = _.Interval.parse(this.mainSeries().interval()),
|
|
i = t.isSeconds() || t.isTicks() ? "%h:%m:%s" : "%h:%m";
|
|
this._dateTimeFormatter = new V.a({
|
|
dateFormat: e,
|
|
timeFormat: i,
|
|
dateTimeSeparator: " "
|
|
}), this._timeFormatter = new N.TimeFormatter(i)
|
|
}
|
|
}
|
|
_setScalesResetAvailable(e) {
|
|
this._isScalesResetAvailable !== e && (this._isScalesResetAvailable = e, this
|
|
._isScalesResetAvailableChanged.fire())
|
|
}
|
|
_invalidationMaskForSource(e, t = k.InvalidationLevel.Light) {
|
|
if (e === this.crossHairSource()) return k.InvalidationMask.cursor();
|
|
if (this._watermarkSource === e) return this._paneInvalidationMask(Object(r
|
|
.ensureNotNull)(this.paneForSource(this.mainSeries())), t);
|
|
if (-1 !== this._allCustomSources.indexOf(e)) {
|
|
const e = new k.InvalidationMask;
|
|
return e.invalidateAll(t), e
|
|
}
|
|
if (!Object(d.a)(e)) return null;
|
|
if (e.isMultiPaneEnabled()) return new k.InvalidationMask(t);
|
|
const i = this.paneForSource(e);
|
|
return null !== i ? this._paneInvalidationMask(i, t) : null
|
|
}
|
|
_paneInvalidationMask(e, t = k.InvalidationLevel.Light) {
|
|
const i = new k.InvalidationMask,
|
|
s = this._panes.indexOf(e);
|
|
return i.invalidateAllPane(s, t), i
|
|
}
|
|
_invalidationMaskForSourcePriceScale(e, t = k.InvalidationLevel.Light) {
|
|
if (!Object(d.a)(e)) return new k.InvalidationMask(t);
|
|
const i = this.paneForSource(e);
|
|
if (null === i) return null;
|
|
let s = e.priceScale();
|
|
if (null === s) return null;
|
|
const r = this._panes.indexOf(i);
|
|
let n = i.priceScalePosition(s);
|
|
if ("overlay" === n) {
|
|
const e = this._panes[r].defaultPriceScale();
|
|
s = e, n = i.priceScalePosition(e)
|
|
}
|
|
const o = i.priceScaleIndex(s, n);
|
|
if (void 0 === o) return null;
|
|
const a = new k.InvalidationMask;
|
|
return a.invalidatePriceScale(r, n, o, t), a
|
|
}
|
|
_removeCustomSource(e) {
|
|
const t = this._customSourcesMap.get(e);
|
|
if (void 0 === t) return void oe.logWarn(
|
|
`Attempt to remove custom source which does not exist in the model - "${e}"`
|
|
);
|
|
oe.logNormal(`Removing custom source "${e}"`),
|
|
this.selectionMacro(e => {
|
|
e.removeSourceFromSelection(t)
|
|
}), this._hoveredSource === t && this.setHoveredSource(null), this
|
|
._customSourceBeingMoved === t && this.setMovingCustomSource(null, null);
|
|
const i = ae(this._bgCustomSources, t),
|
|
s = ae(this._fgCustomSources, t),
|
|
n = ae(this._topmostCustomSources, t),
|
|
o = ae(this._allCustomSources, t);
|
|
Object(r.assert)(i || s || n, "Source should be presented in one of the layers"),
|
|
Object(r.assert)(o, "Source should be presented in the array"), this
|
|
._customSourcesMap.delete(e), t.destroy()
|
|
}
|
|
_updateShowLegendProperty() {
|
|
const e = this._properties.childs().paneProperties.childs().legendProperties
|
|
.childs().showLegend,
|
|
t = this._showLegendProperty;
|
|
if (e.value()) t.setValue(!0);
|
|
else {
|
|
for (const e of this._panes) {
|
|
let i = 0;
|
|
for (const s of e.dataSources())
|
|
if (s !== this.mainSeries() && null !== s.statusView() && (i++, i > 1))
|
|
return void t.setValue(!1)
|
|
}
|
|
t.setValue(!0)
|
|
}
|
|
}
|
|
_pointToPercentPosition(e, t) {
|
|
return {
|
|
x: e.x / this._timeScale.width(),
|
|
y: e.y / Object(r.ensureNotNull)(Object(r.ensureNotNull)(t.mainDataSource())
|
|
.priceScale()).height()
|
|
}
|
|
}
|
|
_percentPositionToPoint(e, t) {
|
|
const i = e.x * this._timeScale.width(),
|
|
s = e.y * Object(r.ensureNotNull)(Object(r.ensureNotNull)(t.mainDataSource())
|
|
.priceScale()).height();
|
|
return new n.Point(i, s)
|
|
}
|
|
_recalcVisibleRangeStudiesImpl(e) {
|
|
var t;
|
|
if (e.timerId = null, this.timeScale().isEmpty()) return;
|
|
const i = this.timeScale().visibleBarsStrictRange();
|
|
if (null === i) return;
|
|
const s = this.mainSeries().nearestData(i.firstBar(), Q.PlotRowSearchMode
|
|
.NearestRight),
|
|
r = this.mainSeries().nearestData(i.lastBar(), Q.PlotRowSearchMode.NearestLeft),
|
|
n = this.mainSeries().bars().lastIndex(),
|
|
o = s ? s.index : void 0,
|
|
a = r ? r.index : void 0,
|
|
l = o === e.oldStartVisibleIndex,
|
|
c = a === e.oldEndVisibleIndex;
|
|
if (l && c && !e.force) return;
|
|
e.force = !1, e.oldStartVisibleIndex = void 0 !== o ? o : NaN, e
|
|
.oldEndVisibleIndex = void 0 !== a ? a : NaN;
|
|
const h = {
|
|
first_visible_bar_time: 1e3 * Math.floor(s && s.value ? s.value[0] : 0),
|
|
last_visible_bar_time: 1e3 * Math.floor(r && r.value ? r.value[0] : 0),
|
|
subscribeRealtime: r && r.index === n
|
|
},
|
|
u = null !== (t = e.studies) && void 0 !== t ? t : this.priceDataSources();
|
|
e.studies = void 0;
|
|
for (const e of u)
|
|
if (Object(M.isStudy)(e)) {
|
|
const t = e.metaInfo().inputs,
|
|
i = [];
|
|
for (const e of t) h.hasOwnProperty(e.id) && i.push(e.id);
|
|
const s = e.properties().inputs;
|
|
for (const e of i) s[e].setValueSilently(h[e]);
|
|
i.length > 0 && s.listeners().fire(s)
|
|
}
|
|
}
|
|
_recalcColorStudiesImpl(e) {
|
|
var t;
|
|
if (e.timerId = null, this.timeScale().isEmpty()) return;
|
|
const i = this.backgroundColor().value(),
|
|
s = this.isDark() ? a.colorsPalette["color-cold-gray-200"] : a.colorsPalette[
|
|
"color-cold-gray-900"],
|
|
r = i === e.oldBgColor,
|
|
n = s === e.oldFgColor;
|
|
if (r && n && !e.force) return;
|
|
e.force = !1, e.oldBgColor = i, e.oldFgColor = s;
|
|
const o = {
|
|
chart_bgcolor: i,
|
|
chart_fgcolor: s
|
|
},
|
|
l = null !== (t = e.studies) && void 0 !== t ? t : this.priceDataSources();
|
|
e.studies = void 0;
|
|
for (const e of l)
|
|
if (Object(M.isStudy)(e)) {
|
|
const t = e.metaInfo(),
|
|
i = t.inputs,
|
|
s = t.isRGB,
|
|
r = [];
|
|
for (const e of i) o.hasOwnProperty(e.id) && r.push(e.id);
|
|
const n = e.properties().inputs;
|
|
for (const e of r) n[e].setValueSilently(s ? Object(G.colorToInteger)(o[
|
|
e]) : o[e]);
|
|
r.length > 0 && n.listeners().fire(n)
|
|
}
|
|
}
|
|
_getAllSources(e) {
|
|
const t = [];
|
|
for (const i of this._panes) {
|
|
const s = i.sourcesByGroup().all();
|
|
for (const i of s) e(i) && t.push(i)
|
|
}
|
|
return t
|
|
}
|
|
_getAvailableCurrencies() {
|
|
return this._options.currencyConversionEnabled ? Object(z.isArray)(this
|
|
._availableCurrenciesList) ? this._availableCurrenciesList : (null !== this
|
|
._availableCurrenciesList || (this._availableCurrenciesList = this
|
|
.chartApi().availableCurrencies(), this._availableCurrenciesList.then(
|
|
e => {
|
|
this._destroyed || (this._availableCurrenciesList = e, this
|
|
.lightUpdate())
|
|
}).catch(e => {
|
|
oe.logWarn(
|
|
"An error occurred while getting currencies config: " +
|
|
e)
|
|
})), []) : []
|
|
}
|
|
_getAvailableUnits() {
|
|
return this._options.unitConversionEnabled ? this
|
|
._availableUnitsObject instanceof Promise || null === this
|
|
._availableUnitsObject ? (null !== this._availableUnitsObject || (this
|
|
._availableUnitsObject = this.chartApi().availableUnits(), this
|
|
._availableUnitsObject.then(e => {
|
|
this._destroyed || (this._availableUnitsObject = e, this
|
|
.lightUpdate())
|
|
}).catch(e => {
|
|
oe.logWarn("An error occurred while getting units config: " + e)
|
|
})), {}) : this._availableUnitsObject : {}
|
|
}
|
|
_getBackgroundColor(e) {
|
|
const t = this._properties.childs().paneProperties.childs();
|
|
if (t.backgroundType.value() === Y.ColorType.Gradient) {
|
|
const i = t.backgroundGradientStartColor.value(),
|
|
s = t.backgroundGradientEndColor.value();
|
|
return e ? i : s
|
|
}
|
|
return t.background.value()
|
|
}
|
|
_updateBackgroundColor() {
|
|
this._backgroundColor.setValue(this._getBackgroundColor()), this._backgroundTopColor
|
|
.setValue(this._getBackgroundColor(!0))
|
|
}
|
|
_syncCrosshair(e) {
|
|
if (!this._isSettingsExternalPosition) {
|
|
const t = this._undoModel.chartWidget(),
|
|
i = this._undoModel.mainSeries(),
|
|
s = i.syncModel(),
|
|
r = this._undoModel.crossHairSource(),
|
|
n = r.pane;
|
|
if (null !== s && null !== n) {
|
|
const o = {
|
|
timeStamp: this._timeScale.points().roughTime(r.index, s.projectTime
|
|
.bind(s)),
|
|
syncModel: s
|
|
};
|
|
n.mainDataSource() === i && (o.price = r.price, o.symbol = i.symbol()), o
|
|
.syncModel = s;
|
|
let a = this._lineBeingCreated || null !== this._linePointBeingEdited ||
|
|
Boolean(this._sourcesBeingMoved.length);
|
|
a = a && Object(F.drawOnAllCharts)().value(), t.chartWidgetCollection()
|
|
.syncCrosshair(o, t, a, e)
|
|
}
|
|
this._phantomSourceContainer.onCursorPositionUpdated()
|
|
}
|
|
}
|
|
_gotoTimeImpl(e, t) {
|
|
const i = this.timeScale(),
|
|
s = this.mainSeries();
|
|
let n;
|
|
if (void 0 !== e) {
|
|
if (this._scrollingState && this._scrollingState.deferred.reject(), n = Object(h
|
|
.createDeferredPromise)(), !s.isDWM()) {
|
|
const t = s.symbolInfo();
|
|
if (null !== t) {
|
|
let i = this.properties().timezone.value();
|
|
"exchange" === i && (i = t.timezone);
|
|
const r = Object(re.cal_to_utc)(Object(re.get_timezone)(i), new Date(
|
|
e)),
|
|
n = Object(ne.createTimeToBarTimeAligner)(s.interval(), t)(r);
|
|
e = Object(re.utc_to_cal)(Object(re.get_timezone)(i), n).getTime()
|
|
}
|
|
}
|
|
this._scrollingState = {
|
|
targetDate: e,
|
|
deferred: n,
|
|
centerIfVisible: t.centerIfVisible
|
|
}
|
|
} else {
|
|
if (!this._scrollingState) return oe.logError(
|
|
"scrollTo called without an argument"), Promise.reject();
|
|
e = this._scrollingState.targetDate, n = this._scrollingState.deferred
|
|
}
|
|
if (void 0 === i.tickMarks().minIndex) return n.resolve(void 0), n.promise;
|
|
let o = ((e, t) => {
|
|
if ((e => Object(r.ensureNotNull)(i.tickMarks().indexToTime(Object(r
|
|
.ensureDefined)(i.tickMarks().minIndex))).valueOf() - e)(t) <
|
|
0) {
|
|
let n = i.tickMarks().nearestIndex(t);
|
|
const o = s.bars().lastIndex();
|
|
if (null === o) return null;
|
|
n = Math.min(n, o);
|
|
let a = Object(r.ensureNotNull)(i.tickMarks().indexToTime(n))
|
|
.valueOf();
|
|
for (; a < t && n < o;) n++, a = Object(r.ensureNotNull)(i
|
|
.tickMarks().indexToTime(n)).valueOf();
|
|
const l = Object(r.ensureNotNull)(i.visibleBarsStrictRange()),
|
|
c = l.lastBar() - l.firstBar();
|
|
return !e && l.contains(n) || i.zoomToBarsRange(n - c / 2, n + c /
|
|
2), {
|
|
timestamp: Object(r.ensureNotNull)(i.indexToTimePoint(n))
|
|
}
|
|
}
|
|
return null
|
|
})(this._scrollingState.centerIfVisible, this._scrollingState.targetDate);
|
|
if (!o) {
|
|
const t = Object(r.ensureDefined)(i.tickMarks().minIndex),
|
|
n = Object(r.ensureNotNull)(i.visibleBarsStrictRange()),
|
|
a = n.lastBar() - n.firstBar();
|
|
if (s.endOfData()) i.zoomToBarsRange(t - a / 2, t + a / 2), o = {
|
|
timestamp: Object(r.ensureNotNull)(i.indexToTimePoint(t)),
|
|
eod: !0
|
|
};
|
|
else {
|
|
const t = i.tickMarks().estimateLeft(e);
|
|
i.requestMoreHistoryPoints(Math.ceil(t + a / 2))
|
|
}
|
|
}
|
|
return o && (this.fullUpdate(), this._scrollingState = null, n.resolve(o)), n
|
|
.promise
|
|
}
|
|
_setCorrectedPositionToCrosshair(e, t, i, s) {
|
|
const n = this.crossHairSource();
|
|
n.setPosition(e, t, s);
|
|
const o = this._timeScale.indexToCoordinate(e),
|
|
a = s.defaultPriceScale().priceToCoordinate(t, Object(r.ensureNotNull)(i));
|
|
n.saveOriginCoords(o, a)
|
|
}
|
|
}
|
|
},
|
|
gQ5K: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "DateFormatter", (function() {
|
|
return n
|
|
}));
|
|
var s = i("iboI"),
|
|
r = i("e1ZQ");
|
|
class n {
|
|
constructor(e = "yyyy-MM-dd") {
|
|
this._dateFormatFunc = r.b[e]
|
|
}
|
|
format(e) {
|
|
return s.customFormatters && s.customFormatters.dateFormatter ? s.customFormatters
|
|
.dateFormatter.format(e) : this._dateFormatFunc(e, !1)
|
|
}
|
|
formatLocal(e) {
|
|
return s.customFormatters.dateFormatter ? s.customFormatters.dateFormatter
|
|
.formatLocal ? s.customFormatters.dateFormatter.formatLocal(e) : s
|
|
.customFormatters.dateFormatter.format(e) : this._dateFormatFunc(e, !0)
|
|
}
|
|
}
|
|
},
|
|
gWrr: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return r
|
|
})), i.d(t, "b", (function() {
|
|
return n
|
|
}));
|
|
const s = new WeakMap;
|
|
|
|
function r(e, t) {
|
|
let i, r;
|
|
return i = null == t ? document.documentElement : 9 === t.nodeType ? t.documentElement : t,
|
|
s && (r = s.get(i)), r || (r = i.ownerDocument.createRange(), r.selectNodeContents(i),
|
|
s && s.set(i, r)), r.createContextualFragment(e)
|
|
}
|
|
|
|
function n(e, t) {
|
|
const i = r(e, t);
|
|
let s;
|
|
if ("firstElementChild" in i) s = i.firstElementChild;
|
|
else {
|
|
s = null;
|
|
for (let e = 0; e < i.childNodes.length; e++) {
|
|
const t = i.childNodes[e];
|
|
if (1 === t.nodeType) {
|
|
s = t;
|
|
break
|
|
}
|
|
}
|
|
}
|
|
return null !== s && i.removeChild(s), s
|
|
}
|
|
},
|
|
gaBL: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "sourceNewCurrencyOnPinningToPriceScale", (function() {
|
|
return r
|
|
}));
|
|
var s = i("/tGj");
|
|
|
|
function r(e, t, i, r) {
|
|
let n = null;
|
|
if (i.currencyConversionEnabled() && Object(s.isSymbolSource)(e)) {
|
|
const s = i.availableCurrencies(),
|
|
o = t.currency(s),
|
|
a = e.currency();
|
|
null !== o && null !== o.selectedCurrency && !o.allCurrenciesAreOriginal && o
|
|
.selectedCurrency !== a && (r && null === a || null !== a && s.convertible(a)) && (
|
|
n = o.selectedCurrency)
|
|
}
|
|
return n
|
|
}
|
|
},
|
|
gf4d: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Eyy1").assert,
|
|
r = i("MSvv").StudyLineDataSource,
|
|
n = i("tqok").INVALID_TIME_POINT_INDEX,
|
|
o = "RegressionTrend@tv-basicstudies";
|
|
|
|
function a(e) {
|
|
return void 0 !== e.startPrice && void 0 !== e.endPrice
|
|
}
|
|
class l extends r {
|
|
constructor(e, t, s) {
|
|
s = s || e.studyMetaInfoRepository().findByIdSync({
|
|
type: "java",
|
|
studyId: o
|
|
});
|
|
var n = t || r._createPropertiesFromStudyMetaInfo(s, e.studyVersioning());
|
|
super(e, s, "linreg_", n), this._trendData = null, i.e("lt-pane-views").then(i.t
|
|
.bind(null, "IMGS", 7)).then(({
|
|
RegressionTrendPaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
formatter() {
|
|
s(!1, "This method should never be called")
|
|
}
|
|
pointsCount() {
|
|
return 2
|
|
}
|
|
clearData() {
|
|
this._trendData = null, super.clearData()
|
|
}
|
|
state(e) {
|
|
var t = r.prototype.state.call(this, e);
|
|
return e ? Object.assign({}, t, {
|
|
nonseriesdata: this._trendData
|
|
}) : t
|
|
}
|
|
restoreData(e) {
|
|
super.restoreData(e), this._trendData = e.nonseriesdata ? e.nonseriesdata : null
|
|
}
|
|
startIndex() {
|
|
if (null === this._trendData || null === this._indexes) return null;
|
|
var e = this._indexes[this._trendData.startIndex];
|
|
return e !== n ? e : null
|
|
}
|
|
endIndex() {
|
|
if (null === this._trendData || null === this._indexes) return null;
|
|
var e = this._indexes[this._trendData.endIndex];
|
|
return e !== n ? e : null
|
|
}
|
|
baseLine() {
|
|
return null === this._trendData ? null : this._trendData.baseLine
|
|
}
|
|
downLine() {
|
|
return null === this._trendData ? null : this._trendData.downLine
|
|
}
|
|
upLine() {
|
|
return null === this._trendData ? null : this._trendData.upLine
|
|
}
|
|
pearsons() {
|
|
return null === this._trendData ? null : this._trendData.pearsons
|
|
}
|
|
recalcStudyIfNeeded() {
|
|
this._onStudyInputsMayChange()
|
|
}
|
|
_studyInputs(e) {
|
|
s(2 === e.length, "all the line tool points should be defined");
|
|
var t = e[0],
|
|
i = e[1];
|
|
if (t.index === i.index) return null;
|
|
const r = this._getPointTime(t.index <= i.index ? t : i, !0),
|
|
n = this._getPointTime(i.index >= t.index ? i : t, !0);
|
|
if (null === r || null === n) return this._subscribeApplyInputsOnSeriesCompleted(),
|
|
null;
|
|
var o = 1e3 * r,
|
|
a = 1e3 * n;
|
|
return {
|
|
"upper diviation": this.properties().inputs["upper diviation"].value(),
|
|
"lower diviation": this.properties().inputs["lower diviation"].value(),
|
|
"use upper diviation": this.properties().inputs["use upper diviation"].value(),
|
|
"use lower diviation": this.properties().inputs["use lower diviation"].value(),
|
|
"first bar time": o,
|
|
"last bar time": a,
|
|
source: this.properties().inputs.source.value()
|
|
}
|
|
}
|
|
_onDataUpdated(e, t, i) {
|
|
null !== t && (t.indexes_replace || (this._trendData = t.data), this._indexes = i,
|
|
super._onDataUpdated(e, t, i))
|
|
}
|
|
_updateAnchorsPrice() {
|
|
!this._trendData || TradingView.isNaN(this._trendData.baseLine.startPrice) ||
|
|
TradingView.isNaN(this._trendData.baseLine.endPrice) || (this._points[0].price =
|
|
this._trendData.baseLine.startPrice, this._points[1].price = this._trendData
|
|
.baseLine.endPrice)
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(61), i.e(62), i.e(
|
|
"study-property-pages-with-definitions")]).then(i.bind(null, "4lou")))
|
|
.RegressionTrendDefinitionsViewModel
|
|
}
|
|
_isReady() {
|
|
return this._trendData && void 0 !== this._trendData.startIndex && void 0 !== this
|
|
._trendData.endIndex && a(this._trendData.upLine) && a(this._trendData
|
|
.baseLine) && a(this._trendData.downLine)
|
|
}
|
|
static createProperties(e) {
|
|
return r._createPropertiesFromStudyIdAndState(o, e)
|
|
}
|
|
static createPropertiesFromStudyMetaInfoAndState(e, t, i, s) {
|
|
return r.createPropertiesFromStudyMetaInfoAndState(e, t, i, s)
|
|
}
|
|
static studyId() {
|
|
return o
|
|
}
|
|
cloneable() {
|
|
return !1
|
|
}
|
|
}
|
|
l.prototype.version = 2, t.LineToolRegressionTrend = l
|
|
},
|
|
gvrv: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return m
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("aIyQ"),
|
|
n = i.n(r),
|
|
o = i("k9/m"),
|
|
a = i("hsV8"),
|
|
l = i("jy4L"),
|
|
c = i("w4Ji"),
|
|
h = i("jenN"),
|
|
u = i("txPx");
|
|
const d = Object(u.getLogger)("Chart.StudyDataSource");
|
|
var p, _;
|
|
! function(e) {
|
|
e[e.Undefined = 0] = "Undefined", e[e.Loading = 1] = "Loading", e[e.Completed = 2] =
|
|
"Completed", e[e.Error = 3] = "Error"
|
|
}(p || (p = {})),
|
|
function(e) {
|
|
e[e.Idle = 0] = "Idle", e[e.AwaitingConnection = 1] = "AwaitingConnection", e[e
|
|
.AwaitingParent = 2] = "AwaitingParent", e[e.AwaitingFirstDataUpdate = 3] =
|
|
"AwaitingFirstDataUpdate", e[e.Active = 4] = "Active"
|
|
}(_ || (_ = {}));
|
|
class m {
|
|
constructor(e, t, i, s) {
|
|
this._inputs = null, this._status = _.Idle, this._studyId = null, this
|
|
._turnaroundCounter = 1, this._studyStatus = {
|
|
type: p.Undefined
|
|
}, this._studyStatusChanged = new n.a, this._graphics = new h.LiveStudyGraphics,
|
|
this._dataCleared = new n.a, this._dataUpdated = new n.a, this
|
|
._boundOnGatewayIsConnectedChanged = this._onGatewayIsConnectedChanged.bind(
|
|
this), this._ongoingDataUpdate = Promise.resolve(), this._gateway = e, this
|
|
._metaInfo = s, this._seriesSource = t, this._turnaroundPrefix = i, this
|
|
._plots = new o.PlotList(Object(c.studyPlotFunctionMap)(s), c
|
|
.studyEmptyPlotValuePredicate), this._gateway.isConnected().subscribe(this
|
|
._boundOnGatewayIsConnectedChanged)
|
|
}
|
|
destroy() {
|
|
this.stop(), this._gateway.isConnected().unsubscribe(this
|
|
._boundOnGatewayIsConnectedChanged), this._dataUpdated.destroy(), this
|
|
._dataCleared.destroy(), this._studyStatusChanged.destroy()
|
|
}
|
|
metaInfo() {
|
|
return this._metaInfo
|
|
}
|
|
inputs() {
|
|
return this._inputs
|
|
}
|
|
setInputs(e) {
|
|
this._inputs = e, null !== this._studyId && (this._turnaroundCounter++, this
|
|
._onStudyStatusChangedTo({
|
|
type: p.Undefined
|
|
}), this._gateway.modifyStudy(this._studyId, this._turnaround(), e, this
|
|
._onMessage.bind(this)), this._status === _.Active && this
|
|
._changeStatusTo(_.AwaitingFirstDataUpdate))
|
|
}
|
|
isStarted() {
|
|
return this._status !== _.Idle
|
|
}
|
|
isActive() {
|
|
return this._status === _.Active
|
|
}
|
|
start() {
|
|
this.isStarted() ? d.logNormal(
|
|
"start: data source is already started, nothing to do") : (Object(s.assert)(
|
|
null !== this._inputs,
|
|
"Inputs should be defined when starting a study data source"), this
|
|
._gateway.isConnected().value() ? this._createStudy() : this
|
|
._changeStatusTo(_.AwaitingConnection))
|
|
}
|
|
stop() {
|
|
this.isStarted() ? (null !== this._studyId && (this._gateway.removeStudy(this
|
|
._studyId), this._studyId = null, this._onStudyStatusChangedTo({
|
|
type: p.Undefined
|
|
})), this._changeStatusTo(_.Idle)) : d.logNormal(
|
|
"stop: data source is already stopped, nothing to do")
|
|
}
|
|
studyId() {
|
|
return this._studyId
|
|
}
|
|
studyStatus() {
|
|
return this._studyStatus
|
|
}
|
|
studyStatusChanged() {
|
|
return this._studyStatusChanged
|
|
}
|
|
plots() {
|
|
return this._plots
|
|
}
|
|
graphics() {
|
|
return this._graphics
|
|
}
|
|
clearData() {
|
|
this._plots.clear(), this._graphics.clear(), this._dataCleared.fire()
|
|
}
|
|
stopAndStealData() {
|
|
Object(s.assert)(this._status === _.Active,
|
|
"Couldn't steal data from non-active data source"), this.stop();
|
|
const e = this._plots,
|
|
t = this._graphics.extract();
|
|
return this._plots = new o.PlotList(Object(c.studyPlotFunctionMap)(this._metaInfo),
|
|
c.studyEmptyPlotValuePredicate), {
|
|
plots: e,
|
|
graphics: t
|
|
}
|
|
}
|
|
dataCleared() {
|
|
return this._dataCleared
|
|
}
|
|
dataUpdated() {
|
|
return this._dataUpdated
|
|
}
|
|
moveData(e) {
|
|
this._ongoingDataUpdate = this._ongoingDataUpdate.then(() => {
|
|
this._plots.move(e)
|
|
})
|
|
}
|
|
_changeStatusTo(e) {
|
|
Object(s.assert)(this._status !== e,
|
|
"Source and destination status should be distinct"), d.logNormal(
|
|
`Status changed from ${_[this._status]} to ${_[e]}`), this._status = e
|
|
}
|
|
_createStudy() {
|
|
const e = this._seriesSource.instanceId();
|
|
null !== e ? this._createStudyUsingParentId(e) : (this._changeStatusTo(_
|
|
.AwaitingParent), this._seriesSource.dataEvents().completed().subscribe(
|
|
this, this._onSeriesCompleted, !0))
|
|
}
|
|
_createStudyUsingParentId(e) {
|
|
Object(s.assert)(this._status !== _.Active,
|
|
'Status should not be "Active" when creating a study'), Object(s.assert)(
|
|
this._studyStatus.type === p.Undefined,
|
|
'Study status should be "Undefined" when creating a study'), Object(s
|
|
.assert)(null === this._studyId,
|
|
"Study id should be empty when creating a study"), this._studyId = Object(l
|
|
.makeNextStudyId)(), this._gateway.createStudy(this._studyId, this
|
|
._turnaround(), e, this._metaInfo.fullId + ("tv-basicstudies" === this
|
|
._metaInfo.packageId ? "" : "!"), Object(s.ensureNotNull)(this._inputs),
|
|
this._onMessage.bind(this)), this._changeStatusTo(_.AwaitingFirstDataUpdate)
|
|
}
|
|
_onGatewayIsConnectedChanged(e) {
|
|
e ? this._onGatewayConnected() : this._onGatewayDisconnected()
|
|
}
|
|
_onGatewayConnected() {
|
|
this._status === _.AwaitingConnection && this._createStudy()
|
|
}
|
|
_onGatewayDisconnected() {
|
|
this._status !== _.Idle && this._status !== _.AwaitingConnection && (this._studyId =
|
|
null, this._changeStatusTo(_.AwaitingConnection), this._studyStatus.type !==
|
|
p.Undefined && this._onStudyStatusChangedTo({
|
|
type: p.Undefined
|
|
})), this._turnaroundCounter = 1
|
|
}
|
|
_onSeriesCompleted() {
|
|
this._status === _.AwaitingParent && this._createStudyUsingParentId(Object(s.ensure)
|
|
(this._seriesSource.instanceId()))
|
|
}
|
|
_onStudyStatusChangedTo(e) {
|
|
const t = this._studyStatus;
|
|
this._studyStatus = e, d.logNormal(
|
|
`Study status type changed from ${p[t.type]} to ${p[e.type]}`), this
|
|
._studyStatusChanged.fire(t, e)
|
|
}
|
|
_onMessage(e) {
|
|
if ("data_update" === e.method) {
|
|
const {
|
|
customId: t,
|
|
turnaround: i,
|
|
plots: r,
|
|
nonseries: n
|
|
} = e.params;
|
|
t === this._studyId && this._checkTurnaround(i) && this._onDataUpdate(r, Object(
|
|
s.ensureDefined)(n))
|
|
} else if ("study_loading" === e.method) {
|
|
const [t, i, s] = e.params;
|
|
t === this._studyId && this._checkTurnaround(i) && this._onStudyLoading(s)
|
|
} else if ("study_completed" === e.method) {
|
|
const [t, i, s] = e.params;
|
|
t === this._studyId && this._checkTurnaround(i) && this._onStudyCompleted(s)
|
|
} else if ("study_error" === e.method) {
|
|
const [t, i, s, r, n] = e.params;
|
|
t === this._studyId && this._checkTurnaround(i) && this._onStudyError(s, r, n)
|
|
} else "clear_data" === e.method && this._checkTurnaround(e.params.turnaround) &&
|
|
this.clearData()
|
|
}
|
|
_onDataUpdate(e, t) {
|
|
const i = Object(a.unpackNonSeriesData)(t.d);
|
|
return this._ongoingDataUpdate = this._ongoingDataUpdate.then(() => i, () => i)
|
|
.then(this._onDataUnpacked.bind(this, e, t.indexes)), this._ongoingDataUpdate
|
|
}
|
|
_onDataUnpacked(e, t, i) {
|
|
this._status !== _.Idle && (this._status === _.AwaitingFirstDataUpdate && (this
|
|
._changeStatusTo(_.Active), this.clearData()), this._mergePlots(e),
|
|
null !== i && (i.indexes_replace ? (Object(s.assert)("nochange" !== t), this
|
|
._graphics.replaceIndexesTo(t)) : ("nochange" !== t && this
|
|
._graphics.replaceIndexesTo(t),
|
|
void 0 !== i.graphicsCmds && this._graphics.processCommands(i
|
|
.graphicsCmds, this._metaInfo.graphics))), this._dataUpdated.fire(e,
|
|
i, t))
|
|
}
|
|
_onStudyLoading(e) {
|
|
this._onStudyStatusChangedTo({
|
|
type: p.Loading,
|
|
startTime: Date.now()
|
|
})
|
|
}
|
|
_onStudyError(e, t, i) {
|
|
this.clearData();
|
|
const s = "string" == typeof e ? {
|
|
error: e.split(":", 2)[0]
|
|
} : e;
|
|
this._onStudyStatusChangedTo({
|
|
type: p.Error,
|
|
errorDescription: s
|
|
})
|
|
}
|
|
_onStudyCompleted(e) {
|
|
this._onStudyStatusChangedTo({
|
|
type: p.Completed
|
|
})
|
|
}
|
|
_mergePlots(e) {
|
|
this._plots.merge(e)
|
|
}
|
|
_turnaround() {
|
|
return `${this._turnaroundPrefix}${this._turnaroundCounter}`
|
|
}
|
|
_checkTurnaround(e) {
|
|
const t = this._turnaround();
|
|
return e === t || e === this._seriesSource.turnaround() || e ===
|
|
`${this._seriesSource.turnaround()}_${t}`
|
|
}
|
|
}
|
|
},
|
|
gyZD: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "PaneRendererLine", (function() {
|
|
return l
|
|
}));
|
|
var s = i("aO4+"),
|
|
r = i("GEp6"),
|
|
n = i("VdBB"),
|
|
o = i("jFln"),
|
|
a = i("Zp/P");
|
|
class l {
|
|
constructor(e) {
|
|
this._data = e
|
|
}
|
|
hitTest(e, t) {
|
|
const i = Object(a.interactionTolerance)().series + this._data.lineWidth / 2;
|
|
let o = 0,
|
|
l = this._data.items.length - 1;
|
|
for (; l - o > 2;) {
|
|
const t = Math.round((l + o) / 2);
|
|
this._data.items[t].x <= e.x ? o = t : l = t
|
|
}
|
|
o = Math.max(1, o - 1), l = Math.min(this._data.items.length - 1, l + 1);
|
|
for (let t = o; t <= l; ++t) {
|
|
const o = this._data.items[t - 1],
|
|
a = this._data.items[t],
|
|
l = o.x,
|
|
c = a.x;
|
|
if (Object(r.distanceToSegment)(new s.Point(l, o.y), new s.Point(c, a.y), new s
|
|
.Point(e.x, e.y)).distance <= i) return this._data.hittest ? this._data
|
|
.hittest : new n.HitTestResult(n.HitTestResult.REGULAR)
|
|
}
|
|
return null
|
|
}
|
|
draw(e, t) {
|
|
e.save(), e.scale(t.pixelRatio, t.pixelRatio), e.lineCap = "square", e.lineJoin =
|
|
"round", e.strokeStyle = this._data.lineColor, e.fillStyle = this._data
|
|
.lineColor, e.lineWidth = this._data.lineWidth, Object(o.setLineStyle)(e, this
|
|
._data.lineStyle), Object(a.setValidLineStyle)(e, this._data.lineStyle),
|
|
this._data.simpleMode ? this._drawSimpleMode(e, t.pixelRatio) : this._drawLines(
|
|
e), e.restore()
|
|
}
|
|
_drawSimpleMode(e, t) {
|
|
if (e.beginPath(), this._walkLine(e, this._data.items, !1, NaN), e.stroke(), this
|
|
._data.withMarkers) {
|
|
e.save(), e.scale(1 / t, 1 / t);
|
|
const i = Math.max(1, Math.floor(t)) % 2 / 2,
|
|
s = (this._data.lineWidth + 2) * t + i,
|
|
r = 2 * Math.PI;
|
|
e.beginPath();
|
|
for (let n = this._data.items.length; n--;) {
|
|
const o = this._data.items[n];
|
|
if (o) {
|
|
const n = Math.round(o.x * t) + i,
|
|
a = o.y * t;
|
|
e.moveTo(n, a), e.arc(n, a, s, 0, r)
|
|
}
|
|
}
|
|
e.fill(), e.restore()
|
|
}
|
|
}
|
|
_walkLine(e, t, i, s) {
|
|
if (!t) return;
|
|
const r = .25 * this._data.barSpacing;
|
|
let n, o, l, c, h;
|
|
const u = a.coordinateIsValid;
|
|
for (let e = 0; e < t.length; e++) {
|
|
const i = t[e];
|
|
if (u(i.y)) {
|
|
o = i, n = e;
|
|
break
|
|
}
|
|
}
|
|
if (void 0 !== n && void 0 !== o)
|
|
for (let o = n; o < t.length; o++) {
|
|
c = t[o], h = t[o + 1] || {};
|
|
const a = Math.round(c.x);
|
|
if (u(c.y))
|
|
if (l && u(l.y)) e.lineTo(a, c.y), i && !u(h.y) && e.lineTo(a, s);
|
|
else if (h && u(h.y)) i ? (o !== n && e.lineTo(a, s), e.lineTo(a, c
|
|
.y)) : e.moveTo(a, c.y);
|
|
else if (i) {
|
|
if (0 === o) continue;
|
|
o !== n && e.lineTo(a - r, s), e.lineTo(a - r, c.y), e.lineTo(a + r, c
|
|
.y), e.lineTo(a + r, s)
|
|
} else e.moveTo(a - r, c.y), e.lineTo(a + r, c.y);
|
|
l = c
|
|
}
|
|
}
|
|
_drawLines(e) {
|
|
if (!this._data.items.length) return;
|
|
let t, i, s;
|
|
const r = .25 * this._data.barSpacing,
|
|
n = a.coordinateIsValid;
|
|
e.beginPath();
|
|
const o = this._data.items[0];
|
|
o && e.moveTo(o.x, o.y);
|
|
let l, c = e.strokeStyle,
|
|
h = e.lineWidth;
|
|
for (let o = 1; o < this._data.items.length; ++o) {
|
|
let _, m, f;
|
|
t = this._data.items[o - 1], i = this._data.items[o], s = this._data.items[o +
|
|
1], i.style && !this._data.forceLineColor ? (_ = i.style.color, m = i
|
|
.style.width, f = i.style.style) : (_ = this._data.lineColor, m = this
|
|
._data.lineWidth, f = this._data.lineStyle), this._data
|
|
.ignorePaletteLineWidth && (m = this._data.lineWidth);
|
|
(_ !== c || m !== h || f !== l) && (c = _, h = m, l = f, e.stroke(), e
|
|
.beginPath(), e.strokeStyle = _, e.lineWidth = m, Object(a
|
|
.setValidLineStyle)(e, f), e.moveTo(t.x, t.y)), u = t, p = s, n((d = i)
|
|
.y) && (n(u.y) ? e.lineTo(d.x, d.y) : p && n(p.y) ? e.moveTo(d.x, d.y) :
|
|
(e.moveTo(d.x - r, d.y), e.lineTo(d.x + r, d.y)))
|
|
}
|
|
var u, d, p;
|
|
e.stroke()
|
|
}
|
|
}
|
|
},
|
|
gzUS: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "PointsetsManager", (function() {
|
|
return o
|
|
}));
|
|
var s = i("LxhU"),
|
|
r = i("txPx");
|
|
const n = Object(r.getLogger)("ChartApi.PointsetsManager");
|
|
class o {
|
|
constructor() {
|
|
this._pointsetsDataBySymbol = new Map
|
|
}
|
|
destroy() {
|
|
this._pointsetsDataBySymbol.clear()
|
|
}
|
|
createPointset(e, t, i, s, r) {
|
|
let o = this._pointsetsDataBySymbol.get(t);
|
|
void 0 === o && (o = new Map, this._pointsetsDataBySymbol.set(t, o));
|
|
const a = [];
|
|
for (const t of s) {
|
|
const [i, s] = t;
|
|
"number" != typeof i || Number.isNaN(i) ? n.logWarn(
|
|
`Pointset time is invalid: id=${e}, ${i} of type ${typeof i}`) : a
|
|
.push({
|
|
point: t,
|
|
extrapolation: r.extrapolateTimeWithOffsetToTime(1e3 * i, s)
|
|
})
|
|
}
|
|
s.length === a.length && o.set(e, {
|
|
resolution: i,
|
|
points: a
|
|
})
|
|
}
|
|
removePointset(e) {
|
|
const t = [];
|
|
this._pointsetsDataBySymbol.forEach((i, s) => {
|
|
i.delete(e), 0 === i.size && t.push(s)
|
|
});
|
|
for (const e of t) this._pointsetsDataBySymbol.delete(e)
|
|
}
|
|
invalidatePointsetsForSymbol(e, t) {
|
|
const i = this._pointsetsDataBySymbol.get(e);
|
|
void 0 !== i && i.forEach((e, i) => {
|
|
if (s.Interval.isEqual(e.resolution, t))
|
|
for (const t of e.points) null !== t.extrapolation && t
|
|
.extrapolation.exact && (t.extrapolation.exact = !1)
|
|
})
|
|
}
|
|
getUpdatesForSymbol(e, t, i, s) {
|
|
const r = new Map,
|
|
n = this._pointsetsDataBySymbol.get(e);
|
|
return void 0 !== n && n.forEach((e, n) => {
|
|
const o = this._refreshPointsetData(e, t, i, s);
|
|
null !== o && r.set(n, o)
|
|
}), r
|
|
}
|
|
_refreshPointsetData(e, t, i, r) {
|
|
if (s.Interval.isEqual(e.resolution, t))
|
|
for (let t = 0; t < e.points.length; ++t) {
|
|
const s = e.points[t];
|
|
if (null !== s.extrapolation && s.extrapolation.exact) continue;
|
|
const [r, n] = s.point;
|
|
s.extrapolation = i.extrapolateTimeWithOffsetToTime(1e3 * r, n)
|
|
}
|
|
const o = [];
|
|
for (let i = 0; i < e.points.length; ++i) {
|
|
const s = e.points[i];
|
|
if (null === s.extrapolation) return null;
|
|
const a = r.indexOfTime(s.extrapolation.timeMs);
|
|
if (null === a) return n.logWarn(
|
|
`Cannot get index of time: time=${s.extrapolation.timeMs}, ${e.resolution} -> ${t}`
|
|
), null;
|
|
o.push({
|
|
index: i,
|
|
value: [a.index, a.timeMs / 1e3]
|
|
})
|
|
}
|
|
return o
|
|
}
|
|
}
|
|
},
|
|
h24c: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Kxc7"),
|
|
r = i("pPtI"),
|
|
n = i("PT1i"),
|
|
o = i("LxhU");
|
|
i.d(t, "d", (function() {
|
|
return a
|
|
})), i.d(t, "c", (function() {
|
|
return l
|
|
})), i.d(t, "a", (function() {
|
|
return c
|
|
})), i.d(t, "b", (function() {
|
|
return h
|
|
}));
|
|
new RegExp("^quandl", "i");
|
|
|
|
function a(e) {
|
|
let t;
|
|
t = /^[,\s]*(\d*)\s*([hdwmst]?)\s*$/i;
|
|
const i = t.exec(e) || [],
|
|
s = ~~i[1],
|
|
r = i[2] && i[2].toUpperCase() || null,
|
|
n = {
|
|
qty: !s && r ? 1 : s,
|
|
unit: r
|
|
};
|
|
return n.error = !s && !r, n.intraday = !(n.error || n.unit && "H" !== n.unit && "S" !== n
|
|
.unit && "T" !== n.unit), n
|
|
}
|
|
|
|
function l(e) {
|
|
if (s.enabled("allow_supported_resolutions_set_only")) {
|
|
const t = o.Interval.normalize(e);
|
|
return null !== t && Object(r.isAvailable)(t)
|
|
} {
|
|
const t = a(e);
|
|
if (t.error) return !1;
|
|
if (t.intraday) return n.linking.intraday.value(); {
|
|
const e = n.linking.supportedResolutions.value();
|
|
return !e || null !== t.unit && !!~e.indexOf(t.unit)
|
|
}
|
|
}
|
|
}
|
|
|
|
function c() {
|
|
let e = !1;
|
|
return s.enabled("show_spread_operators") && (e = !0), e
|
|
}
|
|
|
|
function h(e) {
|
|
return !e.ctrlKey && (!e.metaKey && (!!e.charCode && (!(!e.which || e.which <= 32) && (
|
|
null === e.target || !/^(input|textarea)$/i.test(e.target.tagName)))))
|
|
}
|
|
},
|
|
hBTJ: function(e, t, i) {
|
|
"use strict";
|
|
Object.defineProperty(t, "__esModule", {
|
|
value: !0
|
|
}), t.intersectPolygons = t.intersectPolygonAndHalfplane = t.intersectRayAndBox = t
|
|
.intersectLineAndBox = t.intersectLineSegments = t.intersectLines = t
|
|
.intersectLineSegmentAndBox = void 0;
|
|
var s = i("Eyy1"),
|
|
r = i("aO4+"),
|
|
n = i("GEp6"),
|
|
o = i("f6yo");
|
|
|
|
function a(e, t) {
|
|
var i = e.A,
|
|
s = t.A,
|
|
n = e.B,
|
|
o = t.B,
|
|
a = e.C,
|
|
l = t.C,
|
|
c = i * o - s * n;
|
|
if (Math.abs(c) < 1e-6) return null;
|
|
var h = (n * l - o * a) / c,
|
|
u = (s * a - i * l) / c;
|
|
return new r.Point(h, u)
|
|
}
|
|
|
|
function l(e, t, i, s) {
|
|
var r = function(e, t, i, s) {
|
|
var r = t.subtract(e),
|
|
n = s.subtract(i),
|
|
o = r.x * n.y - r.y * n.x;
|
|
if (Math.abs(o) < 1e-6) return null;
|
|
var a = e.subtract(i);
|
|
return (a.y * n.x - a.x * n.y) / o
|
|
}(e, t, i, s);
|
|
if (null === r) return null;
|
|
var o = t.subtract(e).scaled(r).add(e),
|
|
a = n.distanceToSegment(i, s, o);
|
|
return Math.abs(a.distance) < 1e-6 ? r : null
|
|
}
|
|
|
|
function c(e, t) {
|
|
for (var i = 0, s = e; i < s.length; i++) {
|
|
var n = s[i];
|
|
if (r.equalPoints(n, t)) return !1
|
|
}
|
|
return e.push(t), !0
|
|
}
|
|
|
|
function h(e, t) {
|
|
return !(e.length > 0 && (r.equalPoints(e[e.length - 1], t) || r.equalPoints(e[0], t))) && (
|
|
e.push(t), !0)
|
|
}
|
|
|
|
function u(e, t) {
|
|
for (var i = [], s = 0; s < e.length; ++s) {
|
|
var n = e[s],
|
|
l = e[(s + 1) % e.length],
|
|
c = r.lineThroughPoints(n, l);
|
|
if (o.pointInHalfplane(n, t)) {
|
|
if (h(i, n), !o.pointInHalfplane(l, t)) null !== (u = a(c, t.edge)) && h(i, u)
|
|
} else if (o.pointInHalfplane(l, t)) {
|
|
var u;
|
|
null !== (u = a(c, t.edge)) && h(i, u)
|
|
}
|
|
}
|
|
return i.length >= 3 ? i : null
|
|
}
|
|
t.intersectLineSegmentAndBox = function(e, t) {
|
|
var i = e[0].x,
|
|
s = e[0].y,
|
|
n = e[1].x,
|
|
o = e[1].y,
|
|
a = t.min.x,
|
|
l = t.min.y,
|
|
c = t.max.x,
|
|
h = t.max.y;
|
|
|
|
function u(e, t, i, s, r, n) {
|
|
var o = 0;
|
|
return e < i ? o |= 1 : e > r && (o |= 2), t < s ? o |= 4 : t > n && (o |= 8), o
|
|
}
|
|
for (var d = u(i, s, a, l, c, h), p = u(n, o, a, l, c, h), _ = !1, m = 0;;) {
|
|
if (m > 1e3) throw new Error("Cohen - Sutherland algorithm: infinity loop");
|
|
if (m++, !(d | p)) {
|
|
_ = !0;
|
|
break
|
|
}
|
|
if (d & p) break;
|
|
var f = d || p,
|
|
g = void 0,
|
|
b = void 0;
|
|
8 & f ? (g = i + (n - i) * (h - s) / (o - s), b = h) : 4 & f ? (g = i + (n - i) * (
|
|
l - s) / (o - s), b = l) : 2 & f ? (b = s + (o - s) * (c - i) / (n - i), g =
|
|
c) : (b = s + (o - s) * (a - i) / (n - i), g = a), f === d ? d = u(i = g,
|
|
s = b, a, l, c, h) : p = u(n = g, o = b, a, l, c, h)
|
|
}
|
|
return _ ? r.equalPoints(r.point(i, s), r.point(n, o)) ? r.point(i, s) : r.lineSegment(r
|
|
.point(i, s), r.point(n, o)) : null
|
|
}, t.intersectLines = a, t.intersectLineSegments = l, t.intersectLineAndBox = function(e,
|
|
t) {
|
|
var i = t.min.x,
|
|
n = t.min.y,
|
|
o = t.max.x,
|
|
a = t.max.y;
|
|
if (0 === e.A) {
|
|
var l = -e.C / e.B;
|
|
return n <= l && l <= a ? r.lineSegment(r.point(i, l), r.point(o, l)) : null
|
|
}
|
|
if (0 === e.B) {
|
|
var h = -e.C / e.A;
|
|
return i <= h && h <= o ? r.lineSegment(r.point(h, n), r.point(h, a)) : null
|
|
}
|
|
var u = [],
|
|
d = function(t) {
|
|
var i = function(e, t) {
|
|
return -(e.C + e.A * t) / e.B
|
|
}(e, t);
|
|
n <= i && i <= a && c(u, new r.Point(t, i))
|
|
},
|
|
p = function(t) {
|
|
var s = function(e, t) {
|
|
return -(e.C + e.B * t) / e.A
|
|
}(e, t);
|
|
i <= s && s <= o && c(u, new r.Point(s, t))
|
|
};
|
|
switch (d(i), p(n), d(o), p(a), u.length) {
|
|
case 0:
|
|
return null;
|
|
case 1:
|
|
return u[0];
|
|
case 2:
|
|
return r.equalPoints(u[0], u[1]) ? u[0] : r.lineSegment(u[0], u[1])
|
|
}
|
|
return s.assert(!1, "We should have at most two intersection points"), null
|
|
}, t.intersectRayAndBox = function(e, t, i) {
|
|
var s = l(e, t, i.min, new r.Point(i.max.x, i.min.y)),
|
|
n = l(e, t, new r.Point(i.max.x, i.min.y), i.max),
|
|
a = l(e, t, i.max, new r.Point(i.min.x, i.max.y)),
|
|
c = l(e, t, new r.Point(i.min.x, i.max.y), i.min),
|
|
h = [];
|
|
if (null !== s && s >= 0 && h.push(s), null !== n && n >= 0 && h.push(n), null !== a &&
|
|
a >= 0 && h.push(a), null !== c && c >= 0 && h.push(c), 0 === h.length) return null;
|
|
h.sort((function(e, t) {
|
|
return e - t
|
|
}));
|
|
var u = o.pointInBox(e, i) ? h[0] : h[h.length - 1];
|
|
return e.addScaled(t.subtract(e), u)
|
|
}, t.intersectPolygonAndHalfplane = u, t.intersectPolygons = function(e, t) {
|
|
for (var i = e, s = 0; s < t.length && null !== i; ++s) {
|
|
var n = t[s],
|
|
o = t[(s + 1) % t.length],
|
|
a = t[(s + 2) % t.length],
|
|
l = r.lineThroughPoints(n, o);
|
|
i = u(i, r.halfplaneThroughPoint(l, a))
|
|
}
|
|
return i
|
|
}
|
|
},
|
|
hGf4: function(e, t, i) {
|
|
"use strict";
|
|
(function(e, t) {
|
|
var s = i("UXvI").default,
|
|
r = i("hbEN").default,
|
|
n = i("kcTO").PriceFormatter;
|
|
const {
|
|
uniq: o
|
|
} = i("L6rT");
|
|
var a, l = i("e3/o"),
|
|
c = i("i/Bj").parseUpdateMode,
|
|
h = i("FIi8").deepExtend;
|
|
|
|
function u(t, i) {
|
|
this.options = Object.assign({
|
|
throttleTimeout: 125
|
|
}, i), this._connected = !1, this._symbol_data = {}, this._subscriptions = {},
|
|
this.onConnect = new e, this.onDisconnect = new e, this._quoteApi = new a(window
|
|
.ChartApiInstance), this._type = t || "full", this._delayUpdateFastSymbols =
|
|
r(this._updateFastSymbols, 250), this._throttledSymbolData = {}, this
|
|
._formatterValuesCache = {}, this._waitingForFormatters = {}, this
|
|
._snapshotValuesCache = {}, this._waitingForSnapshot = {}, this.connect()
|
|
}
|
|
a = i("wi9r"), u.prototype.destroy = function() {
|
|
this._quoteApi.destroy(), this._quoteApi = null, this._connected = !1, this
|
|
.onDisconnect.fire()
|
|
}, u.prototype.typeFields = {}, u.prototype.typeFields.simple = [
|
|
"base-currency-logoid", "ch", "chp", "currency-logoid", "currency_code",
|
|
"current_session", "description", "exchange", "format", "fractional",
|
|
"is_tradable", "language", "local_description", "logoid", "lp", "lp_time",
|
|
"minmov", "minmove2", "original_name", "pricescale", "pro_name", "short_name",
|
|
"type", "update_mode", "volume"
|
|
], u.prototype.typeFields.simpleDetailed = [].concat(u.prototype.typeFields.simple,
|
|
["ask", "bid", "fundamentals", "high_price", "is_tradable", "low_price",
|
|
"open_price", "prev_close_price", "rch", "rchp", "rtc", "rtc_time",
|
|
"status", "basic_eps_net_income", "beta_1_year",
|
|
"earnings_per_share_basic_ttm", "industry", "market_cap_basic",
|
|
"price_earnings_ttm", "sector", "volume", "dividends_yield", "timezone"
|
|
]), u.prototype.typeFields.full = [], u.prototype.typeFields.watchlist = []
|
|
.concat(u.prototype.typeFields.simple, ["rchp", "rtc", "country_code",
|
|
"provider_id"
|
|
]), u.prototype.typeFields.portfolio = ["pro_name", "short_name",
|
|
"exchange", "description", "sector", "type", "currency_code", "currency_id",
|
|
"ch", "chp", "logoid", "currency-logoid", "base-currency-logoid",
|
|
"earnings_per_share_forecast_next_fq", "earnings_release_next_date",
|
|
"earnings_release_date", "earnings_per_share_fq", "lp", "volume",
|
|
"average_volume", "market_cap_basic", "total_revenue",
|
|
"earnings_per_share_basic_ttm", "price_earnings_ttm", "beta_1_year",
|
|
"dps_common_stock_prim_issue_fy", "dividends_yield"
|
|
], u.prototype.connect = function(e) {
|
|
this._quoteApi.connect(this.quoteHandler.bind(this))
|
|
},
|
|
u.prototype.quoteHandler = function(e) {
|
|
var t = e.method,
|
|
i = e.params;
|
|
switch (t) {
|
|
case "connected":
|
|
this._connected || (this._connected = !0, this.onConnected());
|
|
break;
|
|
case "quote_list_fields":
|
|
break;
|
|
case "quote_symbol_data":
|
|
this._connected && this.onSymbolData(i[0]);
|
|
break;
|
|
case "quote_completed":
|
|
this._connected && this.onSymbolData({
|
|
symbolname: i[0],
|
|
complete: performance.now(),
|
|
values: {}
|
|
});
|
|
break;
|
|
case "disconnected":
|
|
this._connected && (this._connected = !1, this.onDisconnect.fire())
|
|
}
|
|
}, u.prototype.onConnected = function() {
|
|
this.setFields();
|
|
var e = Object.keys(this._symbol_data);
|
|
e.length && (this._quoteApi.quoteAddSymbols(e, {
|
|
forcePermission: !0
|
|
}), this._delayUpdateFastSymbols()), this.onConnect.fire()
|
|
}, u.prototype.setFields = function() {
|
|
var e = u.prototype.typeFields[this._type];
|
|
e && e.length && this._quoteApi.quoteSetFields(e)
|
|
}, u.prototype.onSymbolData = function(e) {
|
|
var t = e.symbolname,
|
|
i = this._throttledSymbolData[t];
|
|
i || (i = this._throttledSymbolData[t] = {
|
|
fnDispatch: s(this.dipatchSymbolData.bind(this), this.options
|
|
.throttleTimeout)
|
|
}), i.cache ? h(i.cache, e) : i.cache = e, i.fnDispatch(t)
|
|
}, u.prototype._parseUpdateMode = function(e) {
|
|
var t = c(e.update_mode);
|
|
null !== t && (e.update_mode = t.mode, e.update_mode_seconds = t.interval)
|
|
}, u.prototype.dipatchSymbolData = function(e) {
|
|
var t = this._symbol_data[e],
|
|
i = this._throttledSymbolData[e].cache;
|
|
if (delete this._throttledSymbolData[e].cache, this._symbol_data[e])
|
|
for (var s in h(t, i), t.values && this._parseUpdateMode(t.values), this
|
|
._subscriptions) {
|
|
var r = this._subscriptions[s];
|
|
r.has(e) && r.get(e).forEach((function(e) {
|
|
e(t, i)
|
|
}))
|
|
}
|
|
}, u.prototype.subscribe = function(e, t, i) {
|
|
this._subscriptions[e] = this._subscriptions[e] || new Map;
|
|
var s = this._subscriptions[e];
|
|
t = [].concat(t);
|
|
var r = [];
|
|
t.forEach((function(e) {
|
|
this._symbol_data[e] ? s && s.has(e) || this._symbol_data[e]
|
|
.subscribers_count++ : (this._symbol_data[e] = {
|
|
subscribers_count: 1
|
|
}, r.push(e)), s.has(e) || s.set(e, []), s.get(e).push(i), s
|
|
.get(e).fast = !0, this._symbol_data[e] && this
|
|
._symbol_data[e].values && i(this._symbol_data[e], this
|
|
._symbol_data[e])
|
|
}), this), r.length && this._connected && (this._quoteApi.quoteAddSymbols(
|
|
r, {
|
|
forcePermission: !0
|
|
}), this._delayUpdateFastSymbols())
|
|
}, u.prototype.unsubscribe = function(e, t, i) {
|
|
t = [].concat(t);
|
|
for (var s = this._subscriptions[e], r = [], n = 0; n < t.length; n++) {
|
|
var o = t[n];
|
|
if (s)
|
|
if (s.has(o) && i) {
|
|
var a = s.get(o).indexOf(i);
|
|
~a && s.get(o).splice(a, 1), s.get(o).length || s.delete(o)
|
|
} else s.delete(o);
|
|
s && 0 === s.size && delete this._subscriptions[e], this._symbol_data
|
|
.hasOwnProperty(o) && (s && !s.has(o) && this._symbol_data[o]
|
|
.subscribers_count--, this._symbol_data[o].subscribers_count || (
|
|
delete this._symbol_data[o], r.push(o)))
|
|
}
|
|
r.length && this._connected && (this._quoteApi.quoteRemoveSymbols(r), this
|
|
._delayUpdateFastSymbols())
|
|
}, u.prototype.setFastSymbols = function(e, t) {
|
|
if (this._subscriptions[e])
|
|
for (var i = this._subscriptions[e], s = Array.from(i.keys()), r = 0; r < s
|
|
.length; ++r) {
|
|
var n = s[r];
|
|
i.get(n).fast = -1 !== t.indexOf(n)
|
|
}
|
|
this._delayUpdateFastSymbols()
|
|
}, u.prototype._updateFastSymbols = function() {
|
|
if (this._connected) {
|
|
var e = this._fastSymbols();
|
|
0 === e.length ? this._quoteApi.quoteHibernateAll() : this._quoteApi
|
|
.quoteFastSymbols(e)
|
|
}
|
|
},
|
|
u.prototype._delayUpdateFastSymbols = u.prototype._updateFastSymbols, u.prototype
|
|
._fastSymbols = function() {
|
|
var e = [];
|
|
for (var t in this._subscriptions)
|
|
for (var i = this._subscriptions[t], s = Array.from(i.keys()), r = 0; r < s
|
|
.length; ++r) {
|
|
var n = s[r];
|
|
i.get(n).fast && e.push(n)
|
|
}
|
|
return e = o(e)
|
|
}, u.prototype.formatter = function(e, t) {
|
|
var i = this;
|
|
if (this._waitingForFormatters[e]) return this._waitingForFormatters[e];
|
|
|
|
function s(e) {
|
|
var i = t && !e.fractional ? 1 : e.minmov;
|
|
return new n(e.pricescale, i, e.fractional, e.minmove2)
|
|
}
|
|
var r = new Promise((function(t, r) {
|
|
if (i._formatterValuesCache[e]) t(s(i._formatterValuesCache[
|
|
e]));
|
|
else {
|
|
var n = l.guid();
|
|
i.subscribe(n, [e], (function(o) {
|
|
"error" === o.status && (i
|
|
._waitingForFormatters[e] = null, r(
|
|
"Quotes snapshot is not received"
|
|
)),
|
|
function(e) {
|
|
return e && null != e.pricescale &&
|
|
null != e.minmov
|
|
}(o.values) && (i._waitingForFormatters[
|
|
e] = null, i
|
|
._formatterValuesCache[e] = o
|
|
.values, t(s(o.values)), i
|
|
.unsubscribe(n, e))
|
|
}))
|
|
}
|
|
}));
|
|
return this._waitingForFormatters[e] = r, r
|
|
}, u.prototype.snapshot = function(e) {
|
|
var t = this;
|
|
if (this._waitingForSnapshot[e]) return this._waitingForSnapshot[e];
|
|
var i = new Promise((function(i, s) {
|
|
if (t._snapshotValuesCache[e]) i(t._snapshotValuesCache[e]);
|
|
else {
|
|
var r = l.guid();
|
|
t.subscribe(r, [e], (function(n) {
|
|
"error" === n.status && (t
|
|
._waitingForSnapshot[e] = null, s(
|
|
"Quotes snapshot is not received"
|
|
));
|
|
var o = n.values;
|
|
o && o.minmov && o.pricescale && o
|
|
.description && (t._waitingForSnapshot[
|
|
e] = null, t
|
|
._snapshotValuesCache[e] = o, i(o),
|
|
t.unsubscribe(r, e))
|
|
}))
|
|
}
|
|
}));
|
|
return this._waitingForSnapshot[e] = i, i
|
|
}, TradingView.QuoteSessionMultiplexer = u, t && t.exports && (t.exports = u)
|
|
}).call(this, i("aIyQ"), i("YuTi")(e))
|
|
},
|
|
hOqT: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "getTranslatedSymbolDescription", (function() {
|
|
return s
|
|
}));
|
|
i("YFKU");
|
|
|
|
function s(e) {
|
|
return e.description || ""
|
|
}
|
|
},
|
|
hP9j: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineToolPolyline", (function() {
|
|
return l
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("aO4+"),
|
|
n = i("Ocx9"),
|
|
o = i("Zp/P"),
|
|
a = i("Ss5c");
|
|
class l extends a.LineDataSource {
|
|
constructor(e, t) {
|
|
const s = t || l.createProperties();
|
|
super(e, s), i.e("lt-pane-views").then(i.bind(null, "C2CE")).then(t => {
|
|
this._setPaneViews([new t.PolylinePaneView(this, e)])
|
|
})
|
|
}
|
|
pointsCount() {
|
|
return -1
|
|
}
|
|
properties() {
|
|
return super.properties()
|
|
}
|
|
name() {
|
|
return "Polyline"
|
|
}
|
|
hasEditableCoordinates() {
|
|
return !1
|
|
}
|
|
addPoint(e, t, i) {
|
|
var n;
|
|
const a = Object(s.ensureNotNull)(this.priceScale()),
|
|
l = this._model.timeScale().indexToCoordinate(e.index),
|
|
c = e.price,
|
|
h = Object(s.ensure)(null === (n = this.ownerSource()) || void 0 === n ?
|
|
void 0 : n.firstValue()),
|
|
u = a.priceToCoordinate(c, h),
|
|
d = Object(o.interactionTolerance)().minDistanceBetweenPoints;
|
|
if (this._points.length > 0) {
|
|
const e = this._points[this._points.length - 1],
|
|
t = this._model.timeScale().indexToCoordinate(e.index),
|
|
i = e.price,
|
|
s = a.priceToCoordinate(i, h);
|
|
if (new r.Point(l, u).subtract(new r.Point(t, s)).length() < d) return this
|
|
._lastPoint = null, this.normalizePoints(), this
|
|
.createServerPoints(), !0;
|
|
const n = this._points[0],
|
|
o = this._model.timeScale().indexToCoordinate(n.index),
|
|
c = n.price,
|
|
p = a.priceToCoordinate(c, h);
|
|
if (new r.Point(l, u).subtract(new r.Point(o, p)).length() < d) return this
|
|
.properties().childs().filled.setValue(!0), this._lastPoint = null,
|
|
this.normalizePoints(), this.createServerPoints(), !0
|
|
}
|
|
return super.addPoint(e, t, i)
|
|
}
|
|
setPoint(e, t, i) {
|
|
var n;
|
|
super.setPoint(e, t, i);
|
|
const a = this.priceScale();
|
|
if (!(this._model.timeScale().isEmpty() || null === a || a.isEmpty() || e !==
|
|
this._points.length - 1 && 0 !== e)) {
|
|
const i = Object(s.ensure)(null === (n = this.ownerSource()) || void 0 ===
|
|
n ? void 0 : n.firstValue()),
|
|
l = this._model.timeScale().indexToCoordinate(t.index),
|
|
c = a.priceToCoordinate(t.price, i),
|
|
h = e === this._points.length - 1 ? this._points[0] : this._points[this
|
|
._points.length - 1],
|
|
u = this._model.timeScale().indexToCoordinate(h.index),
|
|
d = a.priceToCoordinate(h.price, i);
|
|
new r.Point(l, c).subtract(new r.Point(u, d)).length() < Object(o
|
|
.interactionTolerance)().minDistanceBetweenPoints && this
|
|
.properties().childs().filled.setValue(!0)
|
|
}
|
|
}
|
|
static createProperties(e) {
|
|
const t = new n.DefaultProperty("linetoolpolyline", e);
|
|
return l._configureProperties(t), t
|
|
}
|
|
_getPropertyDefinitionsViewModelClass() {
|
|
return Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "91EF")).then(
|
|
e => e.PolylinesDefinitionsViewModel)
|
|
}
|
|
static _configureProperties(e) {
|
|
a.LineDataSource._configureProperties(e), e.addExclusion("filled")
|
|
}
|
|
}
|
|
},
|
|
hXqA: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("c7G1");
|
|
class r {
|
|
constructor() {
|
|
this.isUpdate = !1, this.graphicsCmds = new s.c, this._offsetsChanged = !1, this
|
|
._disableGraphicsAndData = !1
|
|
}
|
|
isNaN() {
|
|
return this.graphicsCmds.isNaN()
|
|
}
|
|
primitiveData(e) {
|
|
const t = {};
|
|
if (!this._disableGraphicsAndData) {
|
|
const i = this.graphicsCmds.primitiveData(e);
|
|
null !== i && (t.graphicsCmds = i)
|
|
}
|
|
return this.isUpdate && (t.isUpdate = !0), void 0 === t.graphicsCmds ? void 0 : t
|
|
}
|
|
disable() {
|
|
this._disableGraphicsAndData = !0
|
|
}
|
|
checkForChangeAndResetChangedState(e) {
|
|
const t = this._offsetsChanged,
|
|
i = this.graphicsCmds.isModified();
|
|
this.graphicsCmds.setModified(!1), this._offsetsChanged = !1;
|
|
return i || t || 0 !== e.length
|
|
}
|
|
}
|
|
var n = i("ogJP"),
|
|
o = i("dhFz");
|
|
|
|
function a(e) {
|
|
return Boolean(e.isPosted)
|
|
}
|
|
class l {
|
|
isIgnoredObj(e, t) {
|
|
return l.isIgnoredObjDefault(e, t)
|
|
}
|
|
static isIgnoredObjDefault(e, t) {
|
|
if (void 0 === t) return l.isIgnoredObjNaNable(e);
|
|
const i = e[t];
|
|
return l.isIgnoredByGeneralRules(e, t) || l.isIgnoredObjNaNable(i) || l
|
|
.isIgnoredObjListOfNaNables(i)
|
|
}
|
|
static isIgnoredObjNaNable(e) {
|
|
return Object(o.a)(e) && e.isNaN()
|
|
}
|
|
static isIgnoredObjListOfNaNables(e) {
|
|
if (!Object(n.isArray)(e)) return !1;
|
|
let t = !0;
|
|
for (const i of e)
|
|
if (!Object(o.a)(i) || !i.isNaN()) {
|
|
t = !1;
|
|
break
|
|
} return t
|
|
}
|
|
static isIgnoredObjPosted(e) {
|
|
return a(e) && e.isPosted()
|
|
}
|
|
static isIgnoredObjErased(e) {
|
|
return a(e) && e.isErased()
|
|
}
|
|
static isIgnoredByGeneralRules(e, t) {
|
|
const i = e[t];
|
|
return Object(n.isArray)(i) && 0 === i.length
|
|
}
|
|
}
|
|
class c {
|
|
isIgnoredObj(e, t) {
|
|
if (void 0 === t) return l.isIgnoredObjDefault(e) || l.isIgnoredObjErased(e);
|
|
const i = e[t];
|
|
return l.isIgnoredObjDefault(e, t) || l.isIgnoredObjErased(i)
|
|
}
|
|
}
|
|
class h {
|
|
isIgnoredObj(e, t) {
|
|
if (void 0 === t) return l.isIgnoredObjDefault(e) || l.isIgnoredObjErased(e) || l
|
|
.isIgnoredObjPosted(e);
|
|
const i = e[t];
|
|
return l.isIgnoredObjDefault(e, t) || l.isIgnoredObjErased(i) || l
|
|
.isIgnoredObjPosted(i)
|
|
}
|
|
}
|
|
i.d(t, "a", (function() {
|
|
return u
|
|
}));
|
|
class u extends class extends class {
|
|
constructor(e) {
|
|
this._dataObj = new r, this._isDirty = !1, this._eraseCmds = [],
|
|
this._enableCmdDataStudy = e
|
|
}
|
|
init(e) {
|
|
this._dataObj.graphicsCmds.setCreate(e), this.update(!0)
|
|
}
|
|
dataObj() {
|
|
return this._dataObj
|
|
}
|
|
setEraseCmds(e) {
|
|
this._eraseCmds = e
|
|
}
|
|
resetDirtyState() {
|
|
this._isDirty = !1
|
|
}
|
|
disable() {
|
|
this._dataObj.disable()
|
|
}
|
|
} {
|
|
constructor(e) {
|
|
super(e), this._snapshotPredicate = new c, this._dataSnapShot = {}
|
|
}
|
|
getData() {
|
|
return this._dataSnapShot
|
|
}
|
|
getUpdate() {
|
|
return this._isDirty ? this._dataSnapShot : {}
|
|
}
|
|
update(e) {
|
|
(this._dataObj.checkForChangeAndResetChangedState(this._eraseCmds) || e) && (
|
|
null !== this._dataObj.graphicsCmds.create && (this._dataObj.graphicsCmds.create
|
|
.deleteErasedObjs(), this._dataObj.graphicsCmds.erase = [new s.a]), this
|
|
._makeSnapshot(), this._isDirty = !0)
|
|
}
|
|
_makeSnapshot() {
|
|
this._json = this._dataObj.primitiveData(this._snapshotPredicate), this
|
|
._dataSnapShot = {
|
|
json: this._json
|
|
}
|
|
}
|
|
} {
|
|
constructor(e) {
|
|
super(e), this._updatePredicate = new h, this._sendShapshotOnly = !0, this
|
|
._isFirstNotForcedUpdate = !0
|
|
}
|
|
update(e) {
|
|
(this._dataObj.checkForChangeAndResetChangedState(this._eraseCmds) || e) && (
|
|
null !== this._dataObj.graphicsCmds.create && (this._dataObj.graphicsCmds
|
|
.erase = [new s.a]), this._dataObj.isUpdate = !0, this._makeSnapshot(),
|
|
null !== this._dataObj.graphicsCmds.create && (this._dataObj.graphicsCmds
|
|
.erase = this._eraseCmds), this._dataObj.isUpdate = !0, this._jsonUpdate =
|
|
this._dataObj.primitiveData(this._updatePredicate), null !== this._dataObj
|
|
.graphicsCmds.create && this._dataObj.graphicsCmds.create
|
|
.deleteErasedAndMarkPostedObjs(), this._sendShapshotOnly = e || this
|
|
._isFirstNotForcedUpdate, this._isFirstNotForcedUpdate = Boolean(e), this
|
|
._isDirty = !0)
|
|
}
|
|
getUpdate() {
|
|
return this._isDirty ? this._enableCmdDataStudy ? {
|
|
json: this._sendShapshotOnly ? this._json : void 0,
|
|
jsonUpdate: this._sendShapshotOnly ? void 0 : this._jsonUpdate
|
|
} : {
|
|
json: this._json,
|
|
jsonUpdate: this._sendShapshotOnly ? void 0 : this._jsonUpdate
|
|
} : {}
|
|
}
|
|
}
|
|
},
|
|
hY0g: function(e, t, i) {
|
|
"use strict";
|
|
(function(e) {
|
|
var t = i("txPx").getLogger("Common.WatchedValue");
|
|
|
|
function s() {}
|
|
|
|
function r(e) {
|
|
if (!(this instanceof r)) return new r(e);
|
|
arguments.length > 0 && (this._value = e), this._listeners = []
|
|
}
|
|
r.prototype.value = function() {
|
|
return this._owner ? this._owner._value : this._value
|
|
}, r.prototype.setValue = function(e, i) {
|
|
var s = this._owner ? this._owner : this;
|
|
if ("function" == typeof s.hook && (e = s.hook(e)), s.writeLock) return s
|
|
._value;
|
|
var r = s._value === e || Number.isNaN(s._value) && Number.isNaN(e);
|
|
if (!i && r && s.hasOwnProperty("_value")) return e;
|
|
s._value = e;
|
|
for (var n = s._listeners.slice(), o = 0, a = 0; a < n.length; a++) {
|
|
n[a].once && (s._listeners.splice(a - o, 1), o++);
|
|
try {
|
|
n[a].cb(e)
|
|
} catch (e) {
|
|
t.logError(e.stack || e.message)
|
|
}
|
|
}
|
|
return e
|
|
}, r.prototype.deleteValue = function() {
|
|
var e = this._owner ? this._owner : this;
|
|
if (e.hasOwnProperty("_value")) {
|
|
if (e.writeLock) return e._value;
|
|
delete e._value;
|
|
for (var i = e._listeners.slice(), s = 0, r = 0; r < i.length; r++) {
|
|
i[r].once && (e._listeners.splice(r - s, 1), s++);
|
|
try {
|
|
i[r].cb()
|
|
} catch (e) {
|
|
t.logError(e.stack || e.message)
|
|
}
|
|
}
|
|
}
|
|
}, r.prototype.subscribe = function(e, i) {
|
|
if ("function" != typeof e) throw new TypeError("callback must be a function");
|
|
var s = !!i && !!i.once,
|
|
r = !!i && !!i.callWithLast,
|
|
n = this._owner ? this._owner : this;
|
|
if (r && n.hasOwnProperty("_value")) {
|
|
try {
|
|
e(n._value)
|
|
} catch (e) {
|
|
t.logError(e.stack || e.message)
|
|
}
|
|
if (s) return
|
|
}
|
|
n._listeners.push({
|
|
cb: e,
|
|
owner: this,
|
|
once: !!i && !!i.once
|
|
})
|
|
}, r.prototype.unsubscribe = function(e) {
|
|
var t = this._owner ? this._owner : this;
|
|
void 0 === e && (e = null);
|
|
for (var i = t._listeners, s = i.length; s--;) i[s].owner !== this && t !==
|
|
this || i[s].cb !== e && null !== e || i.splice(s, 1)
|
|
}, r.prototype.listeners = function() {
|
|
return (this._owner ? this._owner : this)._listeners
|
|
}, r.prototype.readonly = function() {
|
|
if (this._readonlyInstance) return this._readonlyInstance;
|
|
var e = this._readonlyInstance = new s;
|
|
return e.subscribe = this.subscribe.bind(this), e.unsubscribe = this.unsubscribe
|
|
.bind(this), e.value = this.value.bind(this), e.when = this.when.bind(this),
|
|
e.spawn = function() {
|
|
return this.spawn().readonly()
|
|
}.bind(this), this.destroy && (e.destroy = this.destroy.bind(this)), e
|
|
}, r.prototype.spawn = function(e) {
|
|
var i = new r;
|
|
return delete i._listeners, i._owner = this._owner || this, i.destroy =
|
|
function() {
|
|
if ("function" == typeof e) try {
|
|
e()
|
|
} catch (e) {
|
|
t.logError(e.stack || e.message)
|
|
}
|
|
this.unsubscribe(), delete this._owner
|
|
}, i
|
|
}, r.prototype.when = function(e) {
|
|
var i = this;
|
|
if (this.value()) try {
|
|
e()
|
|
} catch (e) {
|
|
t.logError(e.stack || e.message)
|
|
} else {
|
|
var s = function(t) {
|
|
t && (i.unsubscribe(s), e())
|
|
};
|
|
i.subscribe(s)
|
|
}
|
|
}, r.prototype.opposite = function() {
|
|
if (!this._opposite) {
|
|
var e = this,
|
|
t = new r(!this.value());
|
|
this.subscribe((function(e) {
|
|
t.setValue(!e)
|
|
})), t.subscribe((function(t) {
|
|
e.setValue(!t)
|
|
})), this._opposite = t
|
|
}
|
|
return this._opposite
|
|
}, "undefined" != typeof window && (window.WatchedValue = r), e && e.exports && (e
|
|
.exports = r)
|
|
}).call(this, i("YuTi")(e))
|
|
},
|
|
hY3j: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("PAcw").GridRenderer;
|
|
|
|
function r() {
|
|
this._id = "grid", this.visible = !0, this.horzLinesVisible = !0, this.horzLinesColor =
|
|
"white", this.horzLinesStyle = "", this.vertLinesVisible = !0, this.vertLinesColor =
|
|
"white", this.vertLinesStyle = ""
|
|
}
|
|
|
|
function n(e, t) {
|
|
this.source = e, this.pane = t, this._renderer = new s
|
|
}
|
|
r.prototype.id = function() {
|
|
return this._id
|
|
}, r.prototype.paneViews = function(e) {
|
|
return [new n(this, e)]
|
|
}, n.prototype.update = function() {}, n.prototype.renderer = function() {
|
|
var e = {};
|
|
return this.pane.defaultPriceScale().isEmpty() || this.pane.timeScale().isEmpty() ?
|
|
null : (e.horzLinesVisible = !0, e.vertLinesVisible = !0, e.horzLinesColor = this
|
|
.pane._model.properties().paneProperties.horzGridProperties.color.value(), e
|
|
.vertLinesColor = this.pane._model.properties().paneProperties
|
|
.vertGridProperties.color.value(), e.horzLineStyle = this.pane._model
|
|
.properties().paneProperties.horzGridProperties.style.value(), e.vertLineStyle =
|
|
this.pane._model.properties().paneProperties.vertGridProperties.style.value(), e
|
|
.priceMarks = this.pane.defaultPriceScale().marks(), e.timeMarks = this.pane
|
|
.timeScale().marks(), e.w = this.pane.width(), e.h = this.pane.height(), this
|
|
._renderer.setData(e), this._renderer)
|
|
}, t.Grid = r
|
|
},
|
|
hezA: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "StudyPriceAxisView", (function() {
|
|
return r
|
|
}));
|
|
var s = i("KcY8");
|
|
class r extends s.a {
|
|
constructor(e, t) {
|
|
super(), this._model = e.model(), this._source = e, this._data = t
|
|
}
|
|
_updateRendererData(e, t, i) {
|
|
e.visible = !1, t.visible = !1;
|
|
const s = this._source.model(),
|
|
r = this._source.priceScale();
|
|
if (null === r) return;
|
|
if (!s.isPriceScaleVisible(r)) return;
|
|
const n = this._source.lastValueData(this._data.plotIndex, !1);
|
|
if (n.noData) return;
|
|
i.background = n.color;
|
|
let o = n.color;
|
|
"transparent" === o && (o = this._model.properties().scalesProperties
|
|
.backgroundColor.value()), i.textColor = this.generateTextColor(o), i
|
|
.coordinate = n.coordinate, i.floatCoordinate = n.floatCoordinate, this
|
|
._showAxisLabel() && (e.text = n.text, e.visible = !0), this
|
|
._updatePaneRendererData(t)
|
|
}
|
|
_showPaneLabel() {
|
|
return this._model.properties().scalesProperties.showStudyPlotLabels.value()
|
|
}
|
|
_showAxisLabel() {
|
|
return this._model.properties().scalesProperties.showStudyLastValue.value()
|
|
}
|
|
_updatePaneRendererData(e) {
|
|
e.text = "", this._showPaneLabel() && (e.text = this._source.priceLabelText(this
|
|
._data.plotIndex), e.visible = !0)
|
|
}
|
|
}
|
|
},
|
|
hfHJ: function(e, t, i) {
|
|
"use strict";
|
|
Object.defineProperty(t, "__esModule", {
|
|
value: !0
|
|
}), t.transformPoint = t.translationMatrix = t.scalingMatrix = t.rotationMatrix = t
|
|
.multiplyMatrices = t.identityMatrix = void 0;
|
|
var s = i("aO4+");
|
|
t.identityMatrix = function() {
|
|
return [
|
|
[1, 0, 0],
|
|
[0, 1, 0],
|
|
[0, 0, 1]
|
|
]
|
|
}, t.multiplyMatrices = function(e, t) {
|
|
for (var i = [
|
|
[0, 0, 0],
|
|
[0, 0, 0],
|
|
[0, 0, 0]
|
|
], s = 0; s < 3; s++)
|
|
for (var r = 0; r < 3; r++)
|
|
for (var n = 0; n < 3; n++) i[s][r] += e[s][n] * t[n][r];
|
|
return i
|
|
}, t.rotationMatrix = function(e) {
|
|
var t = Math.cos(e),
|
|
i = Math.sin(e);
|
|
return [
|
|
[t, -i, 0],
|
|
[i, t, 0],
|
|
[0, 0, 1]
|
|
]
|
|
}, t.scalingMatrix = function(e, t) {
|
|
return [
|
|
[e, 0, 0],
|
|
[0, t, 0],
|
|
[0, 0, 1]
|
|
]
|
|
}, t.translationMatrix = function(e, t) {
|
|
return [
|
|
[1, 0, e],
|
|
[0, 1, t],
|
|
[0, 0, 1]
|
|
]
|
|
}, t.transformPoint = function(e, t) {
|
|
for (var i = [t.x, t.y, 1], r = [0, 0, 0], n = 0; n < 3; n++)
|
|
for (var o = 0; o < 3; o++) r[n] += i[o] * e[n][o];
|
|
return new s.Point(r[0], r[1])
|
|
}
|
|
},
|
|
hsV8: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "ensureTimePointIndexIndex", (function() {
|
|
return n
|
|
})), i.d(t, "unpackNonSeriesData", (function() {
|
|
return o
|
|
}));
|
|
var s = i("JmuD"),
|
|
r = i("qySK");
|
|
|
|
function n(e) {
|
|
if (e < 0) throw new Error("TimePointIndexIndex should be non-negative integer");
|
|
return e
|
|
}
|
|
async function o(e) {
|
|
if ("" === e) return null;
|
|
const t = JSON.parse(e);
|
|
if (!Object(s.isObject)(t) || "function" == typeof t) throw new Error(
|
|
"Non-object content in the non-series envelope");
|
|
if (Object(s.hasProperty)(t, "indexes_replace")) return {
|
|
indexes_replace: !0
|
|
};
|
|
const i = {
|
|
indexes_replace: !1
|
|
};
|
|
if (Object(s.hasProperty)(t, "offsets") && (i.offsets = t.offsets), Object(s
|
|
.hasProperty)(t, "isUpdate")) {
|
|
if ("boolean" != typeof t.isUpdate) throw new Error(
|
|
'Invalid type of "isUpdate" field');
|
|
i.isUpdate = t.isUpdate
|
|
}
|
|
return Object(s.hasProperty)(t, "data") && (i.data = t.data), Object(s.hasProperty)(t,
|
|
"graphicsCmds") && (i.graphicsCmds = Object(r.b)(t.graphicsCmds)), i
|
|
}
|
|
},
|
|
htUT: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "ChartChangesWatcher", (function() {
|
|
return n
|
|
}));
|
|
var s = i("aIyQ"),
|
|
r = i.n(s);
|
|
class n {
|
|
constructor(e, t, i) {
|
|
this._hasChanges = !1, this._undoHistory = e, this._chartSaver = t, this
|
|
._globalEvents = i, this._onValueChanged = new r.a, this._subscribe()
|
|
}
|
|
destroy() {
|
|
this._unsubscribe(), this._onValueChanged.destroy()
|
|
}
|
|
hasChanges() {
|
|
return this._hasChanges
|
|
}
|
|
getOnChange() {
|
|
return this._onValueChanged
|
|
}
|
|
_subscribe() {
|
|
this._globalEvents.subscribe("chart_loaded", this._handleChartLoaded, this), this
|
|
._undoHistory.undoStack().onChange().subscribe(this, this
|
|
._handleChangeUndoStack), this._chartSaver.chartSaved().subscribe(this, this
|
|
._handleChartSaved)
|
|
}
|
|
_unsubscribe() {
|
|
this._globalEvents.unsubscribe("chart_loaded", this._handleChartLoaded, this), this
|
|
._undoHistory.undoStack().onChange().unsubscribe(this, this
|
|
._handleChangeUndoStack), this._chartSaver.chartSaved().unsubscribe(this,
|
|
this._handleChartSaved)
|
|
}
|
|
_setChanges(e) {
|
|
this._hasChanges !== e && (this._hasChanges = e, this._onValueChanged.fire(e))
|
|
}
|
|
_handleChartLoaded() {
|
|
this._setChanges(!1)
|
|
}
|
|
_handleChangeUndoStack(e) {
|
|
e && !e.customFlag("doesnt_affect_save") && this._setChanges(!0)
|
|
}
|
|
_handleChartSaved(e) {
|
|
e && this._setChanges(!1)
|
|
}
|
|
}
|
|
},
|
|
"hyq/": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "pivotPointsStandardStudyItem", (function() {
|
|
return h
|
|
}));
|
|
var s = i("ocLq"),
|
|
r = i("LxhU");
|
|
class n {
|
|
constructor() {
|
|
this.p = NaN, this.r1 = NaN, this.s1 = NaN, this.r2 = NaN, this.s2 = NaN, this.r3 =
|
|
NaN, this.s3 = NaN, this.r4 = NaN, this.s4 = NaN, this.r5 = NaN, this.s5 = NaN,
|
|
this.startIndex__t = NaN, this.endIndex__t = NaN
|
|
}
|
|
}
|
|
class o {
|
|
constructor() {
|
|
this.pivots = []
|
|
}
|
|
}
|
|
|
|
function a(e, t) {
|
|
e.setUTCMonth(e.getUTCMonth() + t)
|
|
}
|
|
|
|
function l(e, t) {
|
|
if (s.Std.ismonthly(e)) {
|
|
let i = new Date(t);
|
|
return i.getUTCDay() < function(e, t) {
|
|
return new Date(t, e, 0).getDate()
|
|
}(i.getUTCMonth(), i.getUTCFullYear()) ? (a(i, s.Std.interval(e)), i = s.Std
|
|
.add_days_considering_dst("Etc/UTC", i, 1 - i.getUTCDay())) : (i = s.Std
|
|
.add_days_considering_dst("Etc/UTC", i, 1), a(i, s.Std.interval(e))), i
|
|
.valueOf()
|
|
}
|
|
return t + r.Interval.parse(e.symbol.resolution).inMilliseconds(t)
|
|
}
|
|
|
|
function c(e, t) {
|
|
switch (t) {
|
|
case "Auto":
|
|
return function(e) {
|
|
const t = r.Interval.parse(e.symbol.interval + e.symbol.resolution);
|
|
switch (t.kind()) {
|
|
case r.ResolutionKind.Weeks:
|
|
case r.ResolutionKind.Months:
|
|
return "12M";
|
|
case r.ResolutionKind.Days:
|
|
return "1M";
|
|
case r.ResolutionKind.Minutes:
|
|
return t.multiplier() >= 1 && t.multiplier() <= 15 ? "1D" : "1W";
|
|
case r.ResolutionKind.Seconds:
|
|
case r.ResolutionKind.Ticks:
|
|
return "1D"
|
|
}
|
|
throw new Error("Unexpected resolution type: " + e.symbol.resolution)
|
|
}(e);
|
|
case "Daily":
|
|
return "1D";
|
|
case "Weekly":
|
|
return "1W";
|
|
case "Monthly":
|
|
return "1M";
|
|
case "Yearly":
|
|
return "12M";
|
|
default:
|
|
throw new Error("No such pivTimeFrame: " + t)
|
|
}
|
|
}
|
|
const h = {
|
|
name: "Pivot Points Standard",
|
|
metainfo: {
|
|
_metainfoVersion: 44,
|
|
defaults: {
|
|
inputs: {
|
|
kind: "Traditional",
|
|
lookBack: 15,
|
|
pivTimeFrame: "Auto",
|
|
showHistoricalPivots: !0
|
|
},
|
|
precision: "4"
|
|
},
|
|
description: "Pivot Points Standard",
|
|
id: "PivotPointsStandard@tv-basicstudies-80",
|
|
inputs: [{
|
|
defval: "Traditional",
|
|
id: "kind",
|
|
name: "Type",
|
|
options: ["Traditional", "Fibonacci", "Woodie", "Classic", "DeMark",
|
|
"Camarilla"
|
|
],
|
|
type: "text"
|
|
}, {
|
|
defval: !0,
|
|
id: "showHistoricalPivots",
|
|
name: "Show historical pivots",
|
|
type: "bool"
|
|
}, {
|
|
defval: "Auto",
|
|
id: "pivTimeFrame",
|
|
name: "Pivots Timeframe",
|
|
options: ["Auto", "Daily", "Weekly", "Monthly", "Yearly"],
|
|
type: "text"
|
|
}, {
|
|
defval: 15,
|
|
id: "lookBack",
|
|
max: 5e3,
|
|
min: 2,
|
|
name: "Number of Pivots Back",
|
|
type: "integer"
|
|
}],
|
|
is_price_study: !0,
|
|
linkedToSeries: !0,
|
|
shortDescription: "Pivots"
|
|
},
|
|
constructor: class {
|
|
constructor() {
|
|
this._secondaryRes = "1D", this._firstMainSeriesBarTime = NaN
|
|
}
|
|
init(e, t) {
|
|
const i = t(0),
|
|
r = t(1),
|
|
n = t(2),
|
|
a = t(3);
|
|
this._data = new o, this._firstMainSeriesBarTime = NaN, this._kindPP =
|
|
function(e) {
|
|
switch (e) {
|
|
case "Traditional":
|
|
return 0;
|
|
case "Fibonacci":
|
|
return 1;
|
|
case "Woodie":
|
|
return 2;
|
|
case "Classic":
|
|
return 3;
|
|
case "DeMark":
|
|
return 4;
|
|
case "Camarilla":
|
|
return 5;
|
|
default:
|
|
throw new Error("Unknown kind " + e)
|
|
}
|
|
}(i), this._showHistoricalPivots = r, this._historicalPivotsToKeep =
|
|
a, this._pivTimeFrame = n, this._isValidResolution = function(e,
|
|
t) {
|
|
return (!s.Std.isdaily(e) || "Daily" !== t) && ((!s.Std
|
|
.isweekly(e) || "Daily" !== t && "Weekly" !== t) &&
|
|
(!s.Std.ismonthly(e) || "Daily" !== t && "Weekly" !==
|
|
t && "Monthly" !== t))
|
|
}(e, this._pivTimeFrame), this._isValidResolution || s.Std.error(
|
|
"You cannot see this pivot timeframe on this resolution"), this
|
|
._isValidResolution && (this._secondaryRes = c(e, this
|
|
._pivTimeFrame)), e.new_sym(e.symbol.tickerid, this
|
|
._secondaryRes)
|
|
}
|
|
main(e) {
|
|
if (!this._isValidResolution) return null;
|
|
if (e.symbol.time) return isNaN(this._firstMainSeriesBarTime) && (this
|
|
._firstMainSeriesBarTime = e.symbol.time, this
|
|
._removeUnusedPivots()), e.symbol.isLastBar && e.symbol
|
|
.isNewBar ? this._createResponse() : null;
|
|
e.select_sym(1);
|
|
const t = e.new_var(s.Std.open(e)),
|
|
i = e.new_var(s.Std.high(e)),
|
|
r = e.new_var(s.Std.low(e)),
|
|
o = e.new_var(s.Std.close(e)),
|
|
a = e.new_var(s.Std.time(e)),
|
|
c = this._data,
|
|
h = t.get(0),
|
|
u = a.get(0),
|
|
d = t.get(1),
|
|
p = i.get(1),
|
|
_ = r.get(1),
|
|
m = o.get(1),
|
|
f = e.symbol.isLastBar;
|
|
if (0 !== c.pivots.length && e.symbol.isNewBar) {
|
|
const e = c.pivots[c.pivots.length - 1];
|
|
e.endIndex__t !== u && (e.endIndex__t = u)
|
|
}
|
|
if (0 === e.symbol.index || !e.symbol.isNewBar) return e.select_sym(0),
|
|
null;
|
|
const g = function(e, t, i, r, o, a, l, c) {
|
|
const h = new n;
|
|
let u = NaN;
|
|
const d = i - r;
|
|
switch (c) {
|
|
case 0:
|
|
u = (i + r + o) / 3, h.p = u, h.r1 = 2 * u - r, h.s1 =
|
|
2 * u - i, h.r2 = u + (i - r), h.s2 = u - (i - r), h
|
|
.r3 = 2 * u + (i - 2 * r), h.s3 = 2 * u - (2 * i -
|
|
r), h.r4 = 3 * u + (i - 3 * r), h.s4 = 3 * u - (
|
|
3 * i - r), h.r5 = 4 * u + (i - 4 * r), h.s5 =
|
|
4 * u - (4 * i - r);
|
|
break;
|
|
case 1:
|
|
u = (i + r + o) / 3, h.p = u, h.r1 = u + .382 * d, h
|
|
.s1 = u - .382 * d, h.r2 = u + .618 * d, h.s2 = u -
|
|
.618 * d, h.r3 = u + d, h.s3 = u - d;
|
|
break;
|
|
case 2:
|
|
u = (i + r + 2 * e) / 4, h.p = u, h.r1 = 2 * u - r, h
|
|
.s1 = 2 * u - i, h.r2 = u + d, h.s2 = u - d, h.r3 =
|
|
i + 2 * (u - r), h.s3 = r - 2 * (i - u), h.r4 = h
|
|
.r3 + d, h.s4 = h.s3 - d;
|
|
break;
|
|
case 3:
|
|
u = (i + r + o) / 3, h.p = u, h.r1 = 2 * u - r, h.s1 =
|
|
2 * u - i, h.r2 = u + d, h.s2 = u - d, h.r3 = u +
|
|
2 * d, h.s3 = u - 2 * d, h.r4 = u + 3 * d, h.s4 =
|
|
u - 3 * d;
|
|
break;
|
|
case 4:
|
|
let n = NaN;
|
|
n = s.Std.equal(t, o) ? i + r + 2 * o : s.Std.greater(o,
|
|
t) ? 2 * i + r + o : 2 * r + i + o, u = n / 4, h
|
|
.p = u, h.r1 = n / 2 - r, h.s1 = n / 2 - i;
|
|
break;
|
|
case 5:
|
|
u = (i + r + o) / 3, h.p = u, h.r1 = o + 1.1 * d / 12, h
|
|
.s1 = o - 1.1 * d / 12, h.r2 = o + 1.1 * d / 6, h
|
|
.s2 = o - 1.1 * d / 6, h.r3 = o + 1.1 * d / 4, h
|
|
.s3 = o - 1.1 * d / 4, h.r4 = o + 1.1 * d / 2, h
|
|
.s4 = o - 1.1 * d / 2;
|
|
break;
|
|
default:
|
|
throw new Error("Unknown kind")
|
|
}
|
|
return h.startIndex__t = a, h.endIndex__t = l, h
|
|
}(h, d, p, _, m, u, l(e, u), this._kindPP);
|
|
return e.select_sym(0), this._showHistoricalPivots || (c.pivots = []), c
|
|
.pivots.push(g), c.pivots.length > this._historicalPivotsToKeep && c
|
|
.pivots.shift(), f ? this._createResponse() : null
|
|
}
|
|
_createResponse() {
|
|
return 0 === this._data.pivots.length ? null : {
|
|
nonseries: !0,
|
|
type: "non_series_data",
|
|
data: {
|
|
data: this._data
|
|
}
|
|
}
|
|
}
|
|
_removeUnusedPivots() {
|
|
const e = Math.max(this._data.pivots.findIndex(e => e.startIndex__t >
|
|
this._firstMainSeriesBarTime) - 1, 0);
|
|
e > 0 && this._data.pivots.splice(0, e)
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"i/Bj": function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e) {
|
|
if (void 0 === e) return null;
|
|
const t = e.match(/(delayed_streaming)_([\d]{1,4})/);
|
|
return null === t ? null : {
|
|
mode: t[1],
|
|
interval: parseInt(t[2])
|
|
}
|
|
}
|
|
i.r(t), i.d(t, "parseUpdateMode", (function() {
|
|
return s
|
|
}))
|
|
},
|
|
i126: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "StudyColorRotatorFactory", (function() {
|
|
return h
|
|
}));
|
|
var s = i("HGP3"),
|
|
r = i("eJTA"),
|
|
n = i("Tmoa"),
|
|
o = i("3ClC");
|
|
const a = ["color-sky-blue-400", "color-banana-yellow-700", "color-deep-blue-500",
|
|
"color-grapes-purple-a700", "color-iguana-green-500", "color-minty-green-a700",
|
|
"color-ripe-red-a200", "color-berry-pink-200", "color-tv-blue-a100",
|
|
"color-tan-orange-a200", "color-sky-blue-a400", "color-deep-blue-a100",
|
|
"color-grapes-purple-400", "color-iguana-green-a700", "color-minty-green-200",
|
|
"color-ripe-red-200", "color-berry-pink-a200", "color-ripe-red-500",
|
|
"color-grapes-purple-500", "color-deep-blue-400", "color-tv-blue-a200",
|
|
"color-sky-blue-500", "color-iguana-green-400", "color-minty-green-400",
|
|
"color-banana-yellow-600", "color-tan-orange-500", "color-berry-pink-400",
|
|
"color-ripe-red-300", "color-grapes-purple-300", "color-deep-blue-300",
|
|
"color-tv-blue-300", "color-sky-blue-300", "color-iguana-green-300",
|
|
"color-minty-green-300", "color-banana-yellow-400", "color-tan-orange-300",
|
|
"color-berry-pink-300", "color-tan-orange-a700"
|
|
];
|
|
class l {
|
|
constructor(e) {
|
|
this._offset = 0, this._offset = e
|
|
}
|
|
getColor(e) {
|
|
if (0 === this._offset) return e;
|
|
const t = a[(this._offset - 1) % a.length],
|
|
i = s.colorsPalette[t],
|
|
o = Object(n.isHexColor)(e) ? 1 : Object(r.parseRgba)(e)[3];
|
|
return Object(n.generateColor)(i, Object(n.alphaToTransparency)(o))
|
|
}
|
|
}
|
|
class c {
|
|
constructor(e, t) {
|
|
this._offset = e, this._modelStartOffset = t
|
|
}
|
|
getColor(e) {
|
|
if (Object(n.isHexColor)(e)) {
|
|
const t = Object(r.parseRgb)(e);
|
|
return Object(r.rgbToHexString)(Object(r.shiftRgb)(t, this._offset, this
|
|
._modelStartOffset))
|
|
} {
|
|
const t = Object(r.parseRgba)(e);
|
|
return Object(r.rgbaToString)(Object(r.shiftRgba)(t, this._offset, this
|
|
._modelStartOffset))
|
|
}
|
|
}
|
|
}
|
|
class h {
|
|
constructor(e) {
|
|
this._chartModel = e
|
|
}
|
|
getColorRotator(e) {
|
|
const t = Object(o.studyColorRotationMode)(e);
|
|
if (null === t) return null;
|
|
const i = this._calcDefaultColorsOffset(e);
|
|
switch (t) {
|
|
case "loop":
|
|
return new l(i);
|
|
case "shift": {
|
|
const e = this._chartModel.getStudyShiftColorStartOffset();
|
|
return new c(i, e)
|
|
}
|
|
}
|
|
}
|
|
_calcDefaultColorsOffset(e) {
|
|
let t = 0;
|
|
const i = Object(o.useSameColorRotationComparator)(e);
|
|
return this._chartModel.dataSources().filter(o.isStudy).forEach(s => {
|
|
i(e, s.metaInfo()) && t++
|
|
}), t
|
|
}
|
|
}
|
|
},
|
|
i6cO: function(e, t, i) {
|
|
"use strict";
|
|
var s;
|
|
|
|
function r(e) {
|
|
e.lineWidth = void 0, e.lineStyle = void 0;
|
|
for (let t = 0; t < e.colors.length; t++) e.colors[t] = void 0;
|
|
return e
|
|
}
|
|
|
|
function n() {
|
|
return {
|
|
colors: [void 0, void 0, void 0, void 0, void 0, void 0, void 0]
|
|
}
|
|
}
|
|
i.r(t), i.d(t, "ColorerType", (function() {
|
|
return s
|
|
})), i.d(t, "clearStyle", (function() {
|
|
return r
|
|
})), i.d(t, "createEmptyStyle", (function() {
|
|
return n
|
|
})),
|
|
function(e) {
|
|
e[e.Main = 0] = "Main", e[e.Background = 1] = "Background", e[e.Text = 2] = "Text", e[e
|
|
.Border = 3] = "Border", e[e.Wick = 4] = "Wick", e[e.Up = 5] = "Up", e[e.Down =
|
|
6] = "Down"
|
|
}(s || (s = {}))
|
|
},
|
|
i80N: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Ss5c").LineDataSource,
|
|
r = i("Ocx9").DefaultProperty;
|
|
class n extends s {
|
|
constructor(e, t) {
|
|
super(e, t || n.createProperties()), i.e("lt-pane-views").then(i.t.bind(null,
|
|
"8MBc", 7)).then(({
|
|
FibSpiralPaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
pointsCount() {
|
|
return 2
|
|
}
|
|
name() {
|
|
return "Fib Spiral"
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "nBUU")))
|
|
.FibSpiralDefinitionsViewModel
|
|
}
|
|
static createProperties(e) {
|
|
var t = new r("linetoolfibspiral", e);
|
|
return n._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
s._configureProperties(e)
|
|
}
|
|
}
|
|
t.LineToolFibSpiral = n
|
|
},
|
|
iDOr: function(e, t, i) {
|
|
"use strict";
|
|
(function(e) {
|
|
var s = i("Y7w9").moveToHead,
|
|
r = i("704P").ExecutionsPositionController,
|
|
n = i("Ss5c").LineDataSource,
|
|
o = i("7ktv").PriceDataSource,
|
|
a = i("CW80").isLineTool,
|
|
l = i("1Wlv").PriceScale,
|
|
c = i("MWAT").createPriceScaleSelectionStrategy,
|
|
h = i("yfAl").PaneBase,
|
|
u = i("s1Gx").sortSources;
|
|
class d extends h {
|
|
constructor(t, i, s, r) {
|
|
super(t, i, s, r), this.m_timeScale = t, this.m_height = 0, this.m_width =
|
|
0, this.m_mainDataSource = null, this._properties = i, this._model = s,
|
|
this._destroyed = new e, s.properties().priceScaleSelectionStrategyName
|
|
.listeners().subscribe(null, function(e) {
|
|
this._priceScaleSelectionStrategy = c(e.value()), this
|
|
._priceScaleSelectionStrategy.apply(this)
|
|
}.bind(this)), this.m_timeScale.barSpacingChanged().subscribe(this,
|
|
function() {
|
|
this.m_mainDataSource === this._model.mainSeries() && this
|
|
._recalculatePriceScaleByScaleRatio(this.m_mainDataSource
|
|
.priceScale())
|
|
}.bind(this)), i.topMargin.listeners().subscribe(this, d.prototype
|
|
._updateMargins), i.bottomMargin.listeners().subscribe(this, d
|
|
.prototype._updateMargins), this._updateMargins(), this
|
|
._maximized = !1
|
|
}
|
|
destroy() {
|
|
this._properties.topMargin.listeners().unsubscribe(this, d.prototype
|
|
._updateMargins), this._properties.bottomMargin.listeners()
|
|
.unsubscribe(this, d.prototype._updateMargins), this._model.properties()
|
|
.priceScaleSelectionStrategyName.listeners().unsubscribeAll(this), this
|
|
.m_timeScale.barSpacingChanged().unsubscribeAll(this), this
|
|
._leftPriceScales.concat(this._rightPriceScales).forEach((function(e) {
|
|
e.modeChanged().unsubscribeAll(this), e.priceRangeChanged()
|
|
.unsubscribeAll(this), e.internalHeightChanged()
|
|
.unsubscribeAll(this)
|
|
}), this);
|
|
for (var e = 0; e < this.m_dataSources.length; e++) {
|
|
var t = this.m_dataSources[e];
|
|
this.removeSourceFromPriceScale(t), t.destroy && t.destroy()
|
|
}
|
|
this._destroyed.fire()
|
|
}
|
|
model() {
|
|
return this._model
|
|
}
|
|
width() {
|
|
return this.m_width
|
|
}
|
|
height() {
|
|
return this.m_height
|
|
}
|
|
setWidth(e) {
|
|
this.m_width = e, this.updateAllViews()
|
|
}
|
|
setHeight(e) {
|
|
this.m_height = e, this._leftPriceScales.forEach((function(t) {
|
|
t.setHeight(e)
|
|
})), this._rightPriceScales.forEach((function(t) {
|
|
t.setHeight(e)
|
|
}));
|
|
for (var t = 0; t < this.m_dataSources.length; t++) {
|
|
var i = this.m_dataSources[t];
|
|
this.isOverlay(i) && i.priceScale() && i.priceScale().setHeight(e)
|
|
}
|
|
this.updateAllViews()
|
|
}
|
|
leftPriceScales() {
|
|
return this._leftPriceScales
|
|
}
|
|
rightPriceScales() {
|
|
return this._rightPriceScales
|
|
}
|
|
visibleLeftPriceScales() {
|
|
var e = this._model.priceScaleSlotsCount();
|
|
if (this._leftPriceScales.length > e.left) {
|
|
var t = s(this._leftPriceScales, this.mainDataSource().priceScale());
|
|
return t.splice(e.left), t
|
|
}
|
|
return this._leftPriceScales
|
|
}
|
|
visibleRightPriceScales() {
|
|
var e = this._model.priceScaleSlotsCount();
|
|
if (this._rightPriceScales.length > e.right) {
|
|
var t = s(this._rightPriceScales, this.mainDataSource().priceScale());
|
|
return t.splice(e.right), t
|
|
}
|
|
return this._rightPriceScales
|
|
}
|
|
timeScale() {
|
|
return this.m_timeScale
|
|
}
|
|
_processMainSourceChange() {
|
|
var e;
|
|
if (null === this.m_mainDataSource)
|
|
for (var t = 0; t < this.m_dataSources.length; t++) {
|
|
if ((r = this.m_dataSources[t]) instanceof o && !this.isOverlay(
|
|
r) && (!r.properties().linkedToSeries || !r.properties()
|
|
.linkedToSeries.value())) {
|
|
this.m_mainDataSource = r, e = !0;
|
|
break
|
|
}
|
|
}
|
|
if (this.m_mainDataSource && e) {
|
|
var i = [];
|
|
for (t = 0; t < this.m_dataSources.length; t++) {
|
|
(r = this.m_dataSources[t]) instanceof n && i.push(r)
|
|
}
|
|
i = u(i);
|
|
for (t = 0; t < i.length; t++) this.move(i[t], this.m_mainDataSource
|
|
.priceScale(), !0)
|
|
} else if (!this.m_mainDataSource || this.isOverlay(this
|
|
.m_mainDataSource) && 0 === this.nonOverlayPricesSourcesCount()) {
|
|
var s = null;
|
|
if (this.m_dataSources.includes(this._model.mainSeries())) s = this
|
|
._model.mainSeries();
|
|
else
|
|
for (t = 0; t < this.m_dataSources.length; t++) {
|
|
var r;
|
|
if ((r = this.m_dataSources[t]) instanceof o && this.isOverlay(
|
|
r) && r.showInObjectTree()) {
|
|
s = r;
|
|
break
|
|
}
|
|
}
|
|
if (null !== s) {
|
|
var a = this.m_mainDataSource === s;
|
|
this.m_mainDataSource = s;
|
|
var l = this.createNewPriceScaleIfPossible();
|
|
if (a && s === this._model.mainSeries()) {
|
|
var c = s.priceScale();
|
|
this._model.children(s, !0).forEach(e => {
|
|
this.removeSourceFromPriceScale(e), l.addDataSource(
|
|
e), e.setPriceScale(l)
|
|
}), this.removePriceScale(c)
|
|
}
|
|
this.move(s, l, !0), this.recalculatePriceScale(s.priceScale())
|
|
}
|
|
}
|
|
}
|
|
startScrollPrice(e, t) {
|
|
e.startScroll(t)
|
|
}
|
|
scrollPriceTo(e, t) {
|
|
e.scrollTo(t), this.updateAllViews()
|
|
}
|
|
endScrollPrice(e) {
|
|
e.endScroll()
|
|
}
|
|
setPriceAutoScale(e, t) {
|
|
e.setMode({
|
|
autoScale: t
|
|
}), this.timeScale().isEmpty() || this.recalculatePriceScale(e)
|
|
}
|
|
defaultPriceScale() {
|
|
var e = this.m_mainDataSource ? this.m_mainDataSource.priceScale() : null;
|
|
return null === e && (e = new l(this._model.properties().scalesProperties)),
|
|
e
|
|
}
|
|
_priceScaleIsPrice(e) {
|
|
var t = e.mainSource();
|
|
return !!t && (!!TradingView.isInherited(t.constructor, TradingView
|
|
.Series) || !!TradingView.isInherited(t.constructor, TradingView
|
|
.Study) && t.metaInfo().is_price_study)
|
|
}
|
|
findSuitableScale(e, t, i) {
|
|
return this._priceScaleSelectionStrategy.findSuitableScale(this, e, t, i)
|
|
}
|
|
createNewPriceScaleIfPossible() {
|
|
return this._priceScaleSelectionStrategy.createNewPriceScaleIfPossible(this)
|
|
}
|
|
canCreateNewPriceScale() {
|
|
return this._priceScaleSelectionStrategy.canCreateNewPriceScale(this)
|
|
}
|
|
mainDataSource() {
|
|
return this.m_mainDataSource
|
|
}
|
|
recalculate() {
|
|
this.recalculatePriceScale(this.m_rightPriceScale), this
|
|
.recalculatePriceScale(this.m_leftPriceScale);
|
|
for (var e = 0; e < this.m_dataSources.length; e++) {
|
|
var t = this.m_dataSources[e];
|
|
this.isOverlay(t) && !a(t) && this.recalculatePriceScale(t.priceScale())
|
|
}
|
|
this.updateAllViews(), this._model.updatePane(this)
|
|
}
|
|
createDrawingsCaches() {
|
|
r.recreateOrderedByBarsSourcesCache(this)
|
|
}
|
|
clearDrawingCaches() {
|
|
r.clearOrderedByBarsSourcesCache()
|
|
}
|
|
_invalidateSourcesCache() {
|
|
this._cachedOrderedSources.clear(), this._leftPriceScales.forEach((function(
|
|
e) {
|
|
e.invalidateSourcesCache()
|
|
})), this._rightPriceScales.forEach((function(e) {
|
|
e.invalidateSourcesCache()
|
|
}))
|
|
}
|
|
onDestroyed() {
|
|
return this._destroyed
|
|
}
|
|
clearSeries(e) {
|
|
for (var t = this.m_dataSources.length - 1; t >= 0; t--) TradingView
|
|
.isInherited(this.m_dataSources[t].constructor, TradingView.Series) &&
|
|
this._removeSourceFromCollections(t, e)
|
|
}
|
|
nonOverlayPricesSourcesCount() {
|
|
return this.m_dataSources.filter((function(e) {
|
|
return (!e.properties().linkedToSeries || !e.properties()
|
|
.linkedToSeries.value()) && (TradingView
|
|
.isInherited(e.constructor, o) && e
|
|
.showInObjectTree() && !this.isOverlay(e))
|
|
}), this).length
|
|
}
|
|
canHaveMoreNoScaleSources() {
|
|
return this.nonOverlayPricesSourcesCount() > 1
|
|
}
|
|
actionNoScaleIsEnabled(e) {
|
|
return !(!this.isOverlay(e) && TradingView.isInherited(e.constructor, o)) ||
|
|
this.canHaveMoreNoScaleSources()
|
|
}
|
|
executionsPositionController() {
|
|
return this._executionsPositionController || (this
|
|
._executionsPositionController = new r(this, this._model
|
|
.timeScale())), this._executionsPositionController
|
|
}
|
|
setMaximized(e) {
|
|
this._maximized = e
|
|
}
|
|
isMaximized() {
|
|
return this._maximized
|
|
}
|
|
properties() {
|
|
return this._properties
|
|
}
|
|
priceScaleRatio() {
|
|
return this._currentPriceScaleRatio
|
|
}
|
|
getPriceScaleById(e) {
|
|
var t = this.m_dataSources.find((function(t) {
|
|
return null !== t.priceScale() && t.priceScale().id() === e
|
|
}));
|
|
return void 0 === t ? null : t.priceScale()
|
|
}
|
|
setPriceScaleSelectionStrategy(e) {
|
|
this._priceScaleSelectionStrategy = e, e.apply(this)
|
|
}
|
|
priceScaleIndex(e, t) {
|
|
switch (t) {
|
|
case "left":
|
|
return this.leftPriceScales().indexOf(e);
|
|
case "right":
|
|
return this.rightPriceScales().indexOf(e)
|
|
}
|
|
}
|
|
}
|
|
d.DEFAULT_STRETCH_FACTOR = 1e3, d.PANE_ANIMATION_DURATION = 500, t.Pane = d
|
|
}).call(this, i("aIyQ"))
|
|
},
|
|
iPBr: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "TimeAxisWidget", (function() {
|
|
return y
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("XlJ7"),
|
|
n = i("S8xo"),
|
|
o = i("ikwP"),
|
|
a = i("H0vP"),
|
|
l = i("ogJP"),
|
|
c = i("u+0B"),
|
|
h = i("zDbI"),
|
|
u = i("aIyQ"),
|
|
d = i.n(u),
|
|
p = i("mE5r"),
|
|
_ = i("8OdW"),
|
|
m = i("7KDR"),
|
|
f = i("3/8U"),
|
|
g = i("GxN8"),
|
|
b = i("JWMC"),
|
|
v = i("5VQP");
|
|
i("xrEm");
|
|
const S = {
|
|
contextMenuEnabled: !0,
|
|
timezoneMenuEnabled: !0,
|
|
pressedMouseMoveScale: !0
|
|
};
|
|
class y {
|
|
constructor(e, t, i, s, r) {
|
|
this._rendererOptions = null, this._onLabelHovered = new d.a, this._mousedown = !1,
|
|
this._currentCursorClassName = "invalid", this._options = Object(l.merge)(
|
|
Object(l.clone)(S), t || {}), this.chart = e, this._properties = e
|
|
.properties().childs().scalesProperties, this._element = document.createElement(
|
|
"tr"), this._backgroundBasedTheme = r;
|
|
const a = () => this.backgroundColor(),
|
|
c = () => {
|
|
throw new Error("Time axis does not support real price scales")
|
|
},
|
|
h = {
|
|
titlesProvider: i,
|
|
stubContextMenuProvider: (e, t) => {
|
|
const i = this.getContextMenuActions(!0);
|
|
let r = s(e, t);
|
|
if (r[r.length - 1] === this.chart.actions().scalesProperties) {
|
|
const e = [new m.Separator].concat(i);
|
|
Array.prototype.splice.apply(r, [r.length - 2, 0, ...e])
|
|
} else r.push(new m.Separator), r = r.concat(i);
|
|
return r
|
|
},
|
|
backgroundBasedTheme: r,
|
|
rendererOptionsProvider: e.model().model().rendererOptionsProvider(),
|
|
getBackgroundTopColor: a,
|
|
getBackgroundBottomColor: a,
|
|
showHorizontalBorder: !0
|
|
};
|
|
this._lhsStubContainer = new p.a(this._properties, "left", c, h, this._options
|
|
.priceAxisLabelsOptions), this._lhsStubContainer.onLabelHovered().subscribe(
|
|
this, (e, t) => {
|
|
this._onLabelHovered.fire(e, t)
|
|
}), this._rhsStubContainer = new p.a(this._properties, "right", c, h, this
|
|
._options.priceAxisLabelsOptions),
|
|
this._rhsStubContainer.onLabelHovered().subscribe(this, (e, t) => {
|
|
this._onLabelHovered.fire(e, t)
|
|
}), this._element.appendChild(this._lhsStubContainer.getElement()), this._cell =
|
|
document.createElement("td"), this._element.appendChild(this._cell), this._cell
|
|
.classList.add("chart-markup-table", "time-axis"), this._cell.style.height =
|
|
"25px", this._dv = document.createElement("div"), this._dv.style.width = "100%",
|
|
this._dv.style.height = "100%", this._dv.style.position = "relative", this._dv
|
|
.style.overflow = "hidden", this._cell.appendChild(this._dv), this
|
|
._canvasConfiguredHandler = () => this.chart.model().model().lightUpdate(), this
|
|
._canvasBinding = Object(o.createBoundCanvas)(this._dv, new o.Size(16, 16)),
|
|
this._canvasBinding.subscribeCanvasConfigured(this._canvasConfiguredHandler);
|
|
const u = this._canvasBinding.canvas;
|
|
u.style.position = "absolute", u.style.zIndex = "1", u.style.left = "0", u.style
|
|
.top = "0", this._topCanvasConfiguredHandler = () => this.chart.model().model()
|
|
.lightUpdate(), this._topCanvasBinding = Object(o.createBoundCanvas)(this._dv,
|
|
new o.Size(16, 16)), this._topCanvasBinding.subscribeCanvasConfigured(this
|
|
._topCanvasConfiguredHandler);
|
|
const f = this._topCanvasBinding.canvas;
|
|
f.style.position = "absolute", f.style.zIndex = "2", f.style.left = "0", f.style
|
|
.top = "0", this._element.appendChild(this._rhsStubContainer.getElement()), this
|
|
.restoreDefaultCursor(), this.update(), this._minVisibleSpan = _.MINUTE_SPAN,
|
|
this._mouseEventHandler = new n.MouseEventHandler(this._topCanvasBinding.canvas,
|
|
this, {
|
|
treatVertTouchDragAsPageScroll: !0,
|
|
treatHorzTouchDragAsPageScroll: !1
|
|
}), this.size = new o.Size(0, 0)
|
|
}
|
|
destroy() {
|
|
this._mouseEventHandler.destroy(), this._topCanvasBinding
|
|
.unsubscribeCanvasConfigured(this._topCanvasConfiguredHandler), this
|
|
._topCanvasBinding.destroy(), this._canvasBinding.unsubscribeCanvasConfigured(
|
|
this._canvasConfiguredHandler), this._canvasBinding.destroy(), this
|
|
._rhsStubContainer.onLabelHovered().unsubscribeAll(this), this._lhsStubContainer
|
|
.onLabelHovered().unsubscribeAll(this), this._lhsStubContainer.destroy(), this
|
|
._rhsStubContainer.destroy(), this.chart.properties().childs().paneProperties
|
|
.childs().background.unsubscribeAll(this)
|
|
}
|
|
setCursor(e) {
|
|
let t = "";
|
|
"grabbing" !== e && "ew-resize" !== e || (t = "time-axis--cursor-" + e), this
|
|
._currentCursorClassName !== t && (this._currentCursorClassName && this._cell
|
|
.classList.remove(this._currentCursorClassName), t && this._cell.classList
|
|
.add(t), this._currentCursorClassName = t, this._cell.style.cursor)
|
|
}
|
|
restoreDefaultCursor() {
|
|
this.setCursor("")
|
|
}
|
|
getElement() {
|
|
return this._element
|
|
}
|
|
optimalHeight() {
|
|
const e = this.rendererOptions();
|
|
return Math.ceil(e.borderSize + e.offsetSize + e.fontSize + e.paddingTop + e
|
|
.paddingBottom + e.labelBottomOffset)
|
|
}
|
|
setSizes(e, t, i) {
|
|
this.size && this.size.equals(e) || (this.size = e, this._canvasBinding
|
|
.resizeCanvas({
|
|
width: e.w,
|
|
height: e.h
|
|
}), this._topCanvasBinding.resizeCanvas({
|
|
width: e.w,
|
|
height: e.h
|
|
}), this._cell.style.width = e.w + "px", this._cell.style.height = e.h +
|
|
"px"), this._lhsStubContainer.setSizes(e.h, t), this._rhsStubContainer
|
|
.setSizes(e.h, i)
|
|
}
|
|
hardResetCanvas() {
|
|
this.size && (Object(o.hardResizeCanvas)(this._canvasBinding, this.size),
|
|
Object(o.hardResizeCanvas)(this._topCanvasBinding, this.size))
|
|
}
|
|
rendererOptions() {
|
|
if (!this._rendererOptions || this._rendererOptions.fontSize !== this.fontSize()) {
|
|
const e = this.fontSize();
|
|
this._rendererOptions = {
|
|
borderSize: 1,
|
|
offsetSize: 5,
|
|
fontSize: e,
|
|
font: Object(r.makeFont)(e, h.CHART_FONT_FAMILY, ""),
|
|
widthCache: new c.TextWidthCache,
|
|
paddingTop: 3 * e / 12,
|
|
paddingBottom: 3 * e / 12,
|
|
paddingHorizontal: 9 * e / 12,
|
|
labelBottomOffset: 4 * e / 12
|
|
}
|
|
}
|
|
return this._rendererOptions
|
|
}
|
|
backgroundColor() {
|
|
return this.chart.model().model().backgroundColor().value()
|
|
}
|
|
lineColor() {
|
|
return this._properties.childs().lineColor.value()
|
|
}
|
|
textColor() {
|
|
return this._properties.childs().textColor.value()
|
|
}
|
|
fontSize() {
|
|
return this._properties.childs().fontSize.value()
|
|
}
|
|
baseFont() {
|
|
return Object(r.makeFont)(this.fontSize(), h.CHART_FONT_FAMILY)
|
|
}
|
|
baseBoldFont() {
|
|
return Object(r.makeFont)(this.fontSize(), h.CHART_FONT_FAMILY, "", "bold")
|
|
}
|
|
hasCanvas(e) {
|
|
return this._canvasBinding.canvas === e || this._topCanvasBinding.canvas === e
|
|
}
|
|
onLabelHovered() {
|
|
return this._onLabelHovered
|
|
}
|
|
getScreenshotData() {
|
|
return {
|
|
content: this._canvasBinding.canvas.toDataURL(),
|
|
canvas: this._canvasBinding.canvas,
|
|
contentWidth: this.size.w,
|
|
contentHeight: this.size.h,
|
|
lhsStub: this._lhsStubContainer.getScreenshotData(),
|
|
rhsStub: this._rhsStubContainer.getScreenshotData()
|
|
}
|
|
}
|
|
getContextMenuActions(e) {
|
|
const t = this.chart;
|
|
t.updateActions();
|
|
const i = t.actions(),
|
|
s = [];
|
|
return e || s.push(i.timeScaleReset, new m.Separator), this._options
|
|
.timezoneMenuEnabled && s.push(i.applyTimeZone), s.push(i.sessionBreaks), s
|
|
}
|
|
update() {
|
|
if (!this.chart.hasModel()) return;
|
|
const e = this.chart.model().timeScale().marks();
|
|
if (e) {
|
|
this._minVisibleSpan = _.YEAR_SPAN;
|
|
for (const t of e) this._minVisibleSpan = Math.min(t.span, this._minVisibleSpan)
|
|
}
|
|
}
|
|
updatePriceAxisStubs() {
|
|
const e = this.chart.model().model(),
|
|
t = this.chart.isMaximizedPane() ? Object(s.ensureNotNull)(this.chart
|
|
.maximizedPaneWidget()).state() : e.paneForSource(e.mainSeries());
|
|
if (!t) return;
|
|
const i = e.priceScaleSlotsCount();
|
|
this._lhsStubContainer.setScales([], i.left, t.leftPriceScales().length, i.left + i
|
|
.right), this._rhsStubContainer.setScales([], i.right, t.rightPriceScales()
|
|
.length, i.left + i.right)
|
|
}
|
|
paint(e) {
|
|
if (e === a.InvalidationLevel.None) return;
|
|
const t = Object(o.getContext2D)(this._topCanvasBinding.canvas);
|
|
if (e > a.InvalidationLevel.Cursor) {
|
|
const i = Object(o.getContext2D)(this._canvasBinding.canvas),
|
|
s = this._canvasBinding.pixelRatio;
|
|
this.drawBackground(i, s), this.chart.hasModel() && (this.drawBorder(i, s), this
|
|
.drawTickMarks(i, s), this.drawBackLabels(i, s), this
|
|
.drawCrossHairLabel(t, s)), this._lhsStubContainer.paintStubs(e), this
|
|
._rhsStubContainer.paintStubs(e)
|
|
}
|
|
this.drawCrossHairLabel(t, this._topCanvasBinding.pixelRatio)
|
|
}
|
|
drawBackground(e, t) {
|
|
if (Object(o.clearRect)(e, 0, 0, Math.ceil(this.size.w * t) + 1, Math.ceil(this.size
|
|
.h * t) + 1, this.backgroundColor()), !this.chart.hasModel()) return;
|
|
const i = this.chart.model();
|
|
if (!i.timeScale().isEmpty()) {
|
|
const s = i.model().selection().lineDataSources().reduce((e, t) => {
|
|
const i = t.timeAxisPoints();
|
|
return 0 === i.length ? e : e.concat(i)
|
|
}, []);
|
|
s.length > 0 && this._hightlightBackground(e, s, t)
|
|
}
|
|
const s = i.model().crossHairSource();
|
|
s.startMeasurePoint() && this._hightlightBackground(e, s.measurePoints(), t)
|
|
}
|
|
drawBorder(e, t) {
|
|
e.save(), e.fillStyle = this.lineColor();
|
|
const i = Math.max(1, Math.floor(this.rendererOptions().borderSize * t)),
|
|
s = Math.ceil(this.size.w * t);
|
|
e.fillRect(0, 0, s + 1, i), e.restore()
|
|
}
|
|
drawTickMarks(e, t) {
|
|
const i = this.chart.model().timeScale().marks();
|
|
if (!i || 0 === i.length) return;
|
|
let s = i.reduce((e, t) => e.span > t.span ? e : t, i[0]).span;
|
|
s > 30 && s < 40 && (s = 30), e.save(), e.strokeStyle = this.lineColor();
|
|
const r = this.rendererOptions(),
|
|
n = r.borderSize + r.offsetSize + r.paddingTop + r.fontSize / 2;
|
|
e.textAlign = "center", e.textBaseline = "middle", e.fillStyle = this.textColor(),
|
|
Object(o.drawScaled)(e, t, () => {
|
|
e.font = this.baseFont();
|
|
for (let t = 0; t < i.length; t++) {
|
|
const r = i[t];
|
|
r.span < s && e.fillText(r.label, r.coord, n)
|
|
}
|
|
e.font = this.baseBoldFont();
|
|
for (let t = 0; t < i.length; t++) {
|
|
const r = i[t];
|
|
r.span >= s && e.fillText(r.label, r.coord, n)
|
|
}
|
|
}), e.restore()
|
|
}
|
|
drawBackLabels(e, t) {
|
|
var i;
|
|
e.save();
|
|
const s = new Set,
|
|
r = this.chart.model().model();
|
|
let n = r.dataSources();
|
|
const o = r.selection().allSources();
|
|
for (const e of o) s.add(e);
|
|
r.hoveredSource() && s.add(r.hoveredSource());
|
|
for (const e of r.sourcesBeingMoved()) s.add(e);
|
|
const a = r.customSourceBeingMoved();
|
|
null !== a && s.add(a);
|
|
const l = null !== (i = r.lineBeingEdited()) && void 0 !== i ? i : r
|
|
.lineBeingCreated();
|
|
l && s.add(l), s.add(this.chart.model().crossHairSource()), n = n.concat(r
|
|
.customSources());
|
|
const c = this.rendererOptions();
|
|
for (let i = 0; i < n.length; i++) {
|
|
const r = n[i];
|
|
if (!s.has(r) && r.timeAxisViews) {
|
|
const i = r.timeAxisViews();
|
|
if (i)
|
|
for (let s = 0; s < i.length; s++) i[s].renderer().draw(e, c, t)
|
|
}
|
|
}
|
|
e.restore()
|
|
}
|
|
drawCrossHairLabel(e, t) {
|
|
var i;
|
|
e.save(), e.clearRect(0, 0, Math.ceil(this.size.w * t) + 1, Math.ceil(this.size.h *
|
|
t) + 1);
|
|
const s = this.chart.model().model(),
|
|
r = [],
|
|
n = null !== (i = s.lineBeingEdited()) && void 0 !== i ? i : s
|
|
.lineBeingCreated();
|
|
if (n && n.timeAxisViews) {
|
|
const e = n.timeAxisViews();
|
|
e && e.length && r.push(e)
|
|
}
|
|
const o = s.customSourceBeingMoved();
|
|
this._addViewsOrMaxMin(null === o ? [] : [o], r), this._addViewsOrMaxMin(s
|
|
.sourcesBeingMoved(), r), this._addViewsOrMaxMin(s.selection().allSources(),
|
|
r);
|
|
const a = s.hoveredSource();
|
|
if (a && Object(g.a)(a) && !s.selection().isSelected(a) && a.timeAxisViews) {
|
|
const e = a.timeAxisViews();
|
|
e && e.length && r.push(e)
|
|
}
|
|
const l = s.crossHairSource(),
|
|
c = l.timeAxisViews && l.timeAxisViews();
|
|
c && c.length && r.push(c);
|
|
const h = this.rendererOptions();
|
|
for (const i of r)
|
|
for (const s of i) e.save(), s.renderer().draw(e, h, t), e.restore();
|
|
e.restore()
|
|
}
|
|
mouseDownEvent(e) {
|
|
this._mouseDownOrTouchStartEvent(e)
|
|
}
|
|
touchStartEvent(e) {
|
|
this._mouseOrTouchEnterEvent(e), this._mouseDownOrTouchStartEvent(e)
|
|
}
|
|
mouseDownOutsideEvent() {
|
|
this._zoomAvailable() && this._mousedown && (this._mousedown = !1, this.chart
|
|
.model().endScaleTime(), this.restoreDefaultCursor())
|
|
}
|
|
pressedMouseMoveEvent(e) {
|
|
this._pressedMouseOrTouchMoveEvent(e)
|
|
}
|
|
touchMoveEvent(e) {
|
|
this._pressedMouseOrTouchMoveEvent(e)
|
|
}
|
|
mouseUpEvent(e) {
|
|
this._mouseUpOrTouchEndEvent(e)
|
|
}
|
|
touchEndEvent(e) {
|
|
this._mouseUpOrTouchEndEvent(e), this._mouseOrTouchLeaveEvent(e)
|
|
}
|
|
contextMenuEvent(e) {
|
|
this._contextMenuOrTouchContextMenuEvent(e)
|
|
}
|
|
touchContextMenuEvent(e) {
|
|
this._contextMenuOrTouchContextMenuEvent(e)
|
|
}
|
|
mouseEnterEvent(e) {
|
|
this._mouseOrTouchEnterEvent(e)
|
|
}
|
|
mouseLeaveEvent(e) {
|
|
this._mouseOrTouchLeaveEvent(e)
|
|
}
|
|
mouseDoubleClickEvent(e) {
|
|
this._mouseDoubleClickOrDoubleTapEvent(e)
|
|
}
|
|
doubleTapEvent(e) {
|
|
this._mouseDoubleClickOrDoubleTapEvent(e)
|
|
}
|
|
_hightlightBackground(e, t, i) {
|
|
const s = this.chart.model().timeScale();
|
|
let r = t[0].index,
|
|
n = t[0].index;
|
|
for (let e = 1; e < t.length; e++) r = Math.min(r, t[e].index), n = Math.max(n, t[e]
|
|
.index);
|
|
const a = Math.floor(s.indexToCoordinate(r) * i),
|
|
l = Math.ceil(s.indexToCoordinate(n) * i);
|
|
Object(o.fillRect)(e, a, 0, l - a, Math.ceil(this.size.h * i) + 1, f.a)
|
|
}
|
|
_addViewsOrMaxMin(e, t) {
|
|
if (e.length <= 1) {
|
|
for (const i of e)
|
|
if (i.timeAxisViews) {
|
|
const e = i.timeAxisViews();
|
|
e && e.length && t.push(e)
|
|
}
|
|
} else t.push(this._minMaxViews(e))
|
|
}
|
|
_minMaxViews(e) {
|
|
const t = [];
|
|
let i = 1 / 0,
|
|
s = -1 / 0,
|
|
r = null,
|
|
n = null;
|
|
for (const t of e)
|
|
if (t.timeAxisViews) {
|
|
const e = t.timeAxisViews();
|
|
if (e && e.length)
|
|
for (let t = 0; t < e.length; ++t) {
|
|
const o = e[t],
|
|
a = o.coordinate();
|
|
a >= s && (s = a, n = o), a <= i && (i = a, r = o)
|
|
}
|
|
} return n && t.push(n), r && t.push(r), t
|
|
}
|
|
_zoomAvailable() {
|
|
return !this.chart.model().timeScale().isEmpty() && this.chart.model().model()
|
|
.zoomEnabled() && this._options.pressedMouseMoveScale
|
|
}
|
|
_mouseDownOrTouchStartEvent(e) {
|
|
if (this._mousedown || !this._zoomAvailable()) return;
|
|
this._mousedown = !0;
|
|
const t = this.chart.model();
|
|
t.timeScale().isEmpty() || t.startScaleTime(e.localX)
|
|
}
|
|
_pressedMouseOrTouchMoveEvent(e) {
|
|
this._zoomAvailable() && this.chart.model().scaleTimeTo(e.localX)
|
|
}
|
|
_mouseUpOrTouchEndEvent(e) {
|
|
this._zoomAvailable() && (this._mousedown = !1, this.chart.model().endScaleTime(),
|
|
this.restoreDefaultCursor())
|
|
}
|
|
_contextMenuOrTouchContextMenuEvent(e) {
|
|
this._options.contextMenuEnabled && this._createContextMenu().then(t => t.show(e))
|
|
}
|
|
_mouseOrTouchEnterEvent(e) {
|
|
this._zoomAvailable() && this.setCursor("ew-resize")
|
|
}
|
|
_mouseOrTouchLeaveEvent(e) {
|
|
this.restoreDefaultCursor()
|
|
}
|
|
_mouseDoubleClickOrDoubleTapEvent(e) {
|
|
Object(b.trackEvent)("GUI", "Double click time scale"), this.chart.model()
|
|
.resetTimeScale()
|
|
}
|
|
_createContextMenu() {
|
|
return v.ContextMenuManager.createMenu(this.getContextMenuActions(), {
|
|
statName: "TimeScaleContextMenu"
|
|
})
|
|
}
|
|
}
|
|
},
|
|
iR50: function(e) {
|
|
e.exports = JSON.parse(
|
|
'{"color-white":"#ffffff","color-black":"#000000","color-cold-gray-50":"#F8F9FD","color-cold-gray-100":"#F0F3FA","color-cold-gray-150":"#E0E3EB","color-cold-gray-200":"#D1D4DC","color-cold-gray-250":"#C1C4CD","color-cold-gray-300":"#B2B5BE","color-cold-gray-350":"#A3A6AF","color-cold-gray-400":"#9598A1","color-cold-gray-450":"#868993","color-cold-gray-500":"#787B86","color-cold-gray-550":"#6A6D78","color-cold-gray-600":"#5D606B","color-cold-gray-650":"#50535E","color-cold-gray-700":"#434651","color-cold-gray-750":"#363A45","color-cold-gray-800":"#2A2E39","color-cold-gray-850":"#1E222D","color-cold-gray-900":"#131722","color-cold-gray-950":"#0C0E15","color-ripe-red-50":"#FFEBEE","color-ripe-red-100":"#FFCDD2","color-ripe-red-200":"#ef9a9a","color-ripe-red-300":"#E57373","color-ripe-red-400":"#EF5350","color-ripe-red-500":"#F44336","color-ripe-red-600":"#E53935","color-ripe-red-700":"#D32F2F","color-ripe-red-800":"#C62828","color-ripe-red-900":"#B71C1C","color-ripe-red-a200":"#FF5252","color-ripe-red-a700":"#862226","color-ripe-red-a800":"#5B1E24","color-ripe-red-a900":"#351E25","color-tan-orange-50":"#FFF3E0","color-tan-orange-100":"#FFE0B2","color-tan-orange-200":"#FFCC80","color-tan-orange-300":"#ffb74d","color-tan-orange-400":"#FFA726","color-tan-orange-500":"#FF9800","color-tan-orange-600":"#FB8C00","color-tan-orange-700":"#F57C00","color-tan-orange-800":"#EF6C00","color-tan-orange-900":"#e65100","color-tan-orange-a200":"#ffab40","color-tan-orange-a400":"#ff9100","color-tan-orange-a700":"#FF6D00","color-iguana-green-100":"#C8E6C9","color-iguana-green-200":"#A5D6A7","color-iguana-green-300":"#81c784","color-iguana-green-400":"#66BB6A","color-iguana-green-500":"#4caf50","color-iguana-green-600":"#43a047","color-iguana-green-700":"#388e3c","color-iguana-green-800":"#2E7D32","color-iguana-green-900":"#1B5E20","color-iguana-green-a700":"#00c853","color-banana-yellow-100":"#FFF9C4","color-banana-yellow-200":"#FFF59D","color-banana-yellow-300":"#FFF176","color-banana-yellow-400":"#ffee58","color-banana-yellow-500":"#ffeb3b","color-banana-yellow-600":"#fdd835","color-banana-yellow-700":"#fbc02d","color-banana-yellow-800":"#f9a825","color-banana-yellow-900":"#F57F17","color-banana-yellow-a400":"#ffea00","color-banana-yellow-a700":"#ffd600","color-tv-blue-50":"#E3EFFD","color-tv-blue-100":"#BBD9FB","color-tv-blue-200":"#90BFF9","color-tv-blue-300":"#5B9CF6","color-tv-blue-400":"#3179F5","color-tv-blue-500":"#2962FF","color-tv-blue-600":"#1E53E5","color-tv-blue-700":"#1848CC","color-tv-blue-800":"#143EB3","color-tv-blue-900":"#0C3299","color-tv-blue-a100":"#82b1ff","color-tv-blue-a200":"#448aff","color-tv-blue-a400":"#2979ff","color-tv-blue-a600":"#2962FF","color-tv-blue-a700":"#143A87","color-tv-blue-a800":"#142E61","color-tv-blue-a900":"#132042","color-deep-blue-100":"#D1C4E9","color-deep-blue-200":"#B39DDB","color-deep-blue-300":"#9575cd","color-deep-blue-400":"#7e57c2","color-deep-blue-500":"#673ab7","color-deep-blue-700":"#512da8","color-deep-blue-800":"#4527A0","color-deep-blue-900":"#311B92","color-deep-blue-a100":"#b388ff","color-deep-blue-a700":"#6200EA","color-minty-green-50":"#E0F2F1","color-minty-green-100":"#B2DFDB","color-minty-green-200":"#80cbc4","color-minty-green-300":"#4db6ac","color-minty-green-400":"#26a69a","color-minty-green-500":"#009688","color-minty-green-600":"#00897b","color-minty-green-700":"#00796b","color-minty-green-800":"#00695C","color-minty-green-900":"#004D40","color-minty-green-a400":"#1de9b6","color-minty-green-a700":"#00BFA5","color-grapes-purple-50":"#F3E5F5","color-grapes-purple-100":"#E1BEE7","color-grapes-purple-200":"#CE93D8","color-grapes-purple-300":"#ba68c8","color-grapes-purple-400":"#ab47bc","color-grapes-purple-500":"#9c27b0","color-grapes-purple-600":"#8e24aa","color-grapes-purple-700":"#7b1fa2","color-grapes-purple-800":"#6A1B9A","color-grapes-purple-900":"#4A148C","color-grapes-purple-a200":"#E040FB","color-grapes-purple-a400":"#D500F9","color-grapes-purple-a700":"#aa00ff","color-berry-pink-100":"#F8BBD0","color-berry-pink-200":"#f48fb1","color-berry-pink-300":"#f06292","color-berry-pink-400":"#ec407a","color-berry-pink-500":"#e91e63","color-berry-pink-600":"#D81B60","color-berry-pink-700":"#C2185B","color-berry-pink-800":"#AD1457","color-berry-pink-900":"#880E4F","color-berry-pink-a100":"#ff80ab","color-berry-pink-a200":"#ff4081","color-sky-blue-100":"#B2EBF2","color-sky-blue-200":"#80DEEA","color-sky-blue-300":"#4dd0e1","color-sky-blue-400":"#26c6da","color-sky-blue-500":"#00bcd4","color-sky-blue-600":"#00acc1","color-sky-blue-700":"#0097A7","color-sky-blue-800":"#00838F","color-sky-blue-900":"#006064","color-sky-blue-a400":"#00e5ff","color-sky-blue-a700":"#00B8D4","color-deep-blue-600":"#5E35B1","color-facebook":"#1877F2","color-deep-facebook":"#1564CA","color-twitter":"#1DA1F2","color-deep-twitter":"#188CD3","color-youtube":"#FF0000","color-linkedin":"#007BB5","color-aqua-spring":"#ebf9f5","color-army-green":"#3d2c12","color-army-green-2":"#31230d","color-athens-gray-1":"#f2f3f5","color-athens-gray-2":"#f7f8fa","color-athens-gray-3":"#eceff2","color-black-180":"#b4b4b4","color-blue-dianne":"#21384d","color-bluish":"#2185cc","color-bright-gray":"#363c4e","color-brownish-grey":"#8d6e63","color-carnation":"#f04561","color-catskill-white":"#e1ecf2","color-charade":"#2f3241","color-charcoal-grey":"#323337","color-curious-blue":"#299dcd","color-dark-blue-grey":"#123440","color-darkness-blue-grey":"#12213b","color-dark-grey":"#292a2d","color-dark-grey-blue":"#28415a","color-dark-sky-blue":"#37a6ef","color-deep-sea-blue":"#016087","color-ebony-clay":"#262b3e","color-foam":"#d7f0fb","color-gull-gray":"#9db2bd","color-humming-bird":"#d3eef9","color-keppel-1":"#37bc9b","color-keppel-2":"#34b293","color-lavender-blush":"#ffedf0","color-lightish-purple":"#a75ee8","color-loblolly":"#c5cbce","color-manatee":"#878ca8","color-mandy":"#eb4d5c","color-medium-blue":"#2e7bb2","color-milk-chocolate":"#6f2626","color-mirage-1":"#131722","color-mirage-2":"#171b29","color-mirage-3":"#1c2030","color-mischka":"#d6d8e0","color-morning-glory":"#9addcc","color-oslo-gray":"#8b8e95","color-pale":"#fff2cf","color-pale-grey-1":"#f9fafb","color-pale-grey-2":"#e7ebee","color-pale-sky":"#6b7988","color-picton-blue-1":"#3bb3e4","color-puerto-rico":"#3bc2a1","color-purple-brown":"#4e2934","color-purple-brown-2":"#3d2028","color-radical-red":"#ff4a68","color-regent-gray":"#8797a5","color-scooter":"#38acdb","color-silver-tree":"#53b987","color-slate-gray":"#758696","color-sundown":"#ffa4b3","color-sunglow":"#ffca3b","color-tan-hide":"#ff9850","color-trout-1":"#4c525e","color-trout-2":"#4f5966","color-violet-1":"#332738","color-violet-2":"#271d2b","color-white-ice":"#ebf7fc","color-wild-watermelon":"#ff5773","color-readonly-input":"#b4b4b4","color-brand-dark":"#2a2c39","color-seeking-alpha-brand":"#ff7200"}'
|
|
)
|
|
},
|
|
iboI: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "customFormatters", (function() {
|
|
return s
|
|
}));
|
|
const s = {
|
|
dateFormatter: null,
|
|
timeFormatter: null,
|
|
tickMarkFormatter: null
|
|
}
|
|
},
|
|
icPo: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineToolIcon", (function() {
|
|
return o
|
|
}));
|
|
var s = i("Ocx9"),
|
|
r = i("Ss5c"),
|
|
n = i("j3hX");
|
|
class o extends r.LineDataSource {
|
|
constructor(e, t) {
|
|
super(e, t || o.createProperties()), this._sizeScale = NaN, this.version = 1,
|
|
document.fonts && document.fonts.check && document.fonts.load && !document
|
|
.fonts.check("12px FontAwesome") && document.fonts.load("12px FontAwesome",
|
|
"☺").then(() => {
|
|
this._isDestroyed || e.updateSource(this)
|
|
}), i.e("lt-pane-views").then(i.bind(null, "8GeE")).then(t => {
|
|
this._setPaneViews([new t.IconPaneView(this, e)])
|
|
})
|
|
}
|
|
pointsCount() {
|
|
return 1
|
|
}
|
|
name() {
|
|
return "Icon"
|
|
}
|
|
hasEditableCoordinates() {
|
|
return !1
|
|
}
|
|
getAnchorLimit() {
|
|
return 80
|
|
}
|
|
applyTemplate(e) {
|
|
delete e.icon, super.applyTemplate(e)
|
|
}
|
|
startChanging(e, t) {
|
|
super.startChanging(e, t);
|
|
const i = this.properties().childs();
|
|
i.size.value() < 80 ? this._sizeScale = i.size.value() / 80 : this._sizeScale =
|
|
1
|
|
}
|
|
getChangePointForSync(e) {
|
|
return null
|
|
}
|
|
setPoint(e, t, i) {
|
|
const s = Object.assign({}, t),
|
|
r = this.pointToScreenPoint(this.points()[0])[1],
|
|
n = this.pointToScreenPoint(s)[1],
|
|
o = this.properties().childs();
|
|
if (0 === e || 1 === e) {
|
|
const t = n.subtract(r).normalized(),
|
|
i = -t.x;
|
|
let s = Math.acos(i);
|
|
Math.asin(t.y) > 0 && (s = 2 * Math.PI - s), 0 === e && (s += Math.PI), o
|
|
.angle.setValue(s)
|
|
} else {
|
|
let e = 2 * n.subtract(r).length();
|
|
e *= this._sizeScale, o.size.setValue(e), o.scale.setValue(1)
|
|
}
|
|
}
|
|
endChanging(e, t) {
|
|
const i = super.endChanging(e, t);
|
|
return this._sizeScale = NaN, i
|
|
}
|
|
properties() {
|
|
return super.properties()
|
|
}
|
|
getSourceIcon() {
|
|
return {
|
|
type: "text",
|
|
text: String.fromCharCode(this.properties().childs().icon.value())
|
|
}
|
|
}
|
|
static createProperties(e) {
|
|
const t = new s.DefaultProperty("linetoolicon", e);
|
|
return o._configureProperties(t), t
|
|
}
|
|
_getPropertyDefinitionsViewModelClass() {
|
|
return Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "XCOO")).then(
|
|
e => e.IconsDefinitionsViewModel)
|
|
}
|
|
static _configureProperties(e) {
|
|
r.LineDataSource._configureProperties(e), e.addChild("backgroundsColors", new n
|
|
.LineToolColorsProperty([e.childs().color])), e.addExclusion("angle"), e
|
|
.addExclusion("scale")
|
|
}
|
|
}
|
|
},
|
|
ijBy: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "SetChartLayoutCommand", (function() {
|
|
return n
|
|
}));
|
|
var s = i("RDU5"),
|
|
r = i("VNzU");
|
|
class n extends s.UndoCommand {
|
|
constructor(e, t) {
|
|
super("Change Chart Layout to " + r.layouts[t].title), this
|
|
._chartWidgetCollection = e, this._newLayoutType = t, this._oldLayoutType =
|
|
e.layout.value()
|
|
}
|
|
redo() {
|
|
this._chartWidgetCollection.setLayout(this._newLayoutType)
|
|
}
|
|
undo() {
|
|
this._chartWidgetCollection.setLayout(this._oldLayoutType)
|
|
}
|
|
}
|
|
},
|
|
ikwP: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "Size", (function() {
|
|
return o
|
|
})), i.d(t, "getCanvasDevicePixelRatio", (function() {
|
|
return a
|
|
})), i.d(t, "getContext2D", (function() {
|
|
return l
|
|
})), i.d(t, "getPrescaledContext2D", (function() {
|
|
return c
|
|
})), i.d(t, "getPretransformedContext2D", (function() {
|
|
return h
|
|
})), i.d(t, "hardResizeCanvas", (function() {
|
|
return u
|
|
})), i.d(t, "resizeCanvasPreservingContent", (function() {
|
|
return d
|
|
})), i.d(t, "fillRect", (function() {
|
|
return p
|
|
})),
|
|
i.d(t, "clearRect", (function() {
|
|
return _
|
|
})), i.d(t, "drawScaled", (function() {
|
|
return m
|
|
})), i.d(t, "createDisconnectedCanvas", (function() {
|
|
return f
|
|
})), i.d(t, "createDisconnectedBoundCanvas", (function() {
|
|
return g
|
|
})), i.d(t, "createBoundCanvas", (function() {
|
|
return v
|
|
})), i.d(t, "calcTextHorizontalShift", (function() {
|
|
return S
|
|
})), i.d(t, "disableSelection", (function() {
|
|
return y
|
|
}));
|
|
var s = i("f2KN"),
|
|
r = i("Eyy1"),
|
|
n = i("Ialn");
|
|
class o {
|
|
constructor(e, t) {
|
|
this.w = e, this.h = t
|
|
}
|
|
equals(e) {
|
|
return this.w === e.w && this.h === e.h
|
|
}
|
|
}
|
|
|
|
function a(e) {
|
|
var t, i;
|
|
return Math.max(1, (null === (i = null === (t = e.ownerDocument) || void 0 === t ? void 0 :
|
|
t.defaultView) || void 0 === i ? void 0 : i.devicePixelRatio) || 1)
|
|
}
|
|
|
|
function l(e) {
|
|
const t = Object(r.ensureNotNull)(e.getContext("2d"));
|
|
return t.setTransform(1, 0, 0, 1, 0, 0), t
|
|
}
|
|
|
|
function c(e) {
|
|
const t = Object(r.ensureNotNull)(e.getContext("2d")),
|
|
i = a(e);
|
|
return t.setTransform(i, 0, 0, i, 0, 0), t
|
|
}
|
|
|
|
function h(e, t) {
|
|
const i = Object(r.ensureNotNull)(e.canvas.getContext("2d"));
|
|
return i.setTransform(e.pixelRatio, 0, 0, e.pixelRatio, 0, 0), t || i.translate(.5, .5), i
|
|
}
|
|
|
|
function u(e, t) {
|
|
e.resizeCanvas({
|
|
width: 0,
|
|
height: 0
|
|
}), e.resizeCanvas({
|
|
width: t.w,
|
|
height: t.h
|
|
})
|
|
}
|
|
|
|
function d(e, t) {
|
|
const i = g(document, t),
|
|
s = c(i.canvas);
|
|
return s.save(), s.setTransform(1, 0, 0, 1, 0, 0), s.drawImage(e.canvas, 0, 0, e.canvasSize
|
|
.width * e.pixelRatio, e.canvasSize.height * e.pixelRatio), s.restore(), i
|
|
}
|
|
|
|
function p(e, t, i, s, r, n) {
|
|
e.save(), e.translate(-.5, -.5), e.fillStyle = n, e.fillRect(t, i, s, r), e.restore()
|
|
}
|
|
|
|
function _(e, t, i, s, r, n) {
|
|
e.save(), e.translate(-.5, -.5), e.globalCompositeOperation = "copy", e.fillStyle = n, e
|
|
.fillRect(t, i, s, r), e.restore()
|
|
}
|
|
|
|
function m(e, t, i) {
|
|
e.save(), e.scale(t, t), i(), e.restore()
|
|
}
|
|
|
|
function f(e, t, i) {
|
|
const s = b(e);
|
|
return void 0 === i && (i = a(s)), s.width = t.w * i, s.height = t.h * i, s
|
|
}
|
|
|
|
function g(e, t) {
|
|
const i = b(e),
|
|
r = Object(s.a)(i, {
|
|
allowDownsampling: !1
|
|
});
|
|
return r.resizeCanvas({
|
|
width: t.w,
|
|
height: t.h
|
|
}), r
|
|
}
|
|
|
|
function b(e) {
|
|
const t = e.createElement("canvas");
|
|
return y(t), t
|
|
}
|
|
|
|
function v(e, t) {
|
|
const i = b(Object(r.ensureNotNull)(e.ownerDocument));
|
|
e.appendChild(i);
|
|
const n = Object(s.a)(i, {
|
|
allowDownsampling: !1
|
|
});
|
|
return n.resizeCanvas({
|
|
width: t.w,
|
|
height: t.h
|
|
}), n
|
|
}
|
|
|
|
function S(e, t) {
|
|
return "center" === e.textAlign ? 0 : Object(n.isRtl)() ? "start" === e.textAlign ||
|
|
"right" === e.textAlign ? t : 0 : "start" === e.textAlign || "left" === e.textAlign ?
|
|
0 : t
|
|
}
|
|
|
|
function y(e) {
|
|
e.style.userSelect = "none", e.style.webkitUserSelect = "none", e.style.msUserSelect =
|
|
"none", e.style.MozUserSelect = "none", e.style.webkitTapHighlightColor = "transparent"
|
|
}
|
|
},
|
|
isVH: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Ss5c").LineDataSource,
|
|
r = i("Ocx9").DefaultProperty,
|
|
n = i("j3hX").LineToolColorsProperty;
|
|
class o extends s {
|
|
constructor(e, t) {
|
|
super(e, t || o.createProperties()), i.e("lt-pane-views").then(i.t.bind(null,
|
|
"D4q4", 7)).then(({
|
|
TrianglePaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
pointsCount() {
|
|
return 3
|
|
}
|
|
name() {
|
|
return "Triangle"
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "Zd1D")))
|
|
.GeneralFiguresDefinitionsViewModel
|
|
}
|
|
static createProperties(e) {
|
|
var t = new r("linetooltriangle", e);
|
|
return o._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
s._configureProperties(e), e.addChild("linesColors", new n([e.childs().color]))
|
|
}
|
|
}
|
|
t.LineToolTriangle = o
|
|
},
|
|
it7y: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "StudyDataWindowView", (function() {
|
|
return n
|
|
}));
|
|
var s = i("4miz"),
|
|
r = i("EYFt");
|
|
class n extends s.b {
|
|
constructor(e, t) {
|
|
super(), this._invalidated = !0, this._study = e, this._model = t, this
|
|
._valueProvider = this._createValuesProvider(e, t), this._items = this
|
|
._valueProvider.getItems().map(e => new s.a(e.title, "")), this.update()
|
|
}
|
|
update() {
|
|
this._invalidated = !0
|
|
}
|
|
items() {
|
|
return this._invalidated && (this._updateImpl(), this._invalidated = !1), this
|
|
._items
|
|
}
|
|
study() {
|
|
return this._study
|
|
}
|
|
_updateImpl() {
|
|
this._header = this._study.title(!0), this._title = this._study.title();
|
|
const e = this._valueProvider.getValues(this._currentIndex());
|
|
for (let t = 0; t < e.length; ++t) {
|
|
const i = e[t],
|
|
s = this._items[t];
|
|
s.setValue(i.value), s.setVisible(i.visible), s.setColor(i.color)
|
|
}
|
|
}
|
|
_currentIndex() {
|
|
const e = this._model.crossHairSource().lockedIndex;
|
|
return void 0 !== e ? e : null !== this._model.crossHairSource().pane ? this
|
|
._model.crossHairSource().appliedIndex() : null
|
|
}
|
|
_createValuesProvider(e, t) {
|
|
return new r.a(e, t)
|
|
}
|
|
}
|
|
},
|
|
iu9X: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "b", (function() {
|
|
return r
|
|
})), i.d(t, "a", (function() {
|
|
return n
|
|
}));
|
|
var s = i("Eyy1");
|
|
class r {
|
|
constructor() {
|
|
this._horizlines = [], this._hhists = [], this._polygons = [], this._vertlines = [],
|
|
this._containersCache = [], this._containerNamesCache = [], this
|
|
._containersMapCache = new Map, this._addToCache("horizlines", this
|
|
._horizlines), this._addToCache("hhists", this._hhists), this._addToCache(
|
|
"polygons", this._polygons), this._addToCache("vertlines", this._vertlines)
|
|
}
|
|
primitiveData(e) {
|
|
const t = {};
|
|
let i = !1;
|
|
for (const s of this._containerNamesCache) {
|
|
const r = [],
|
|
n = this.getObjsContainer(s);
|
|
for (const t of n) {
|
|
if (t.isNaN()) continue;
|
|
const i = t.primitiveData(e);
|
|
i.data.length > 0 && r.push(i)
|
|
}
|
|
r.length > 0 && (t[s] = r, i = !0)
|
|
}
|
|
return i ? t : null
|
|
}
|
|
deleteErasedAndMarkPostedObjs() {
|
|
this.forEachList(e => {
|
|
e.deleteErasedItems(), e.markPostedItems()
|
|
})
|
|
}
|
|
deleteErasedObjs() {
|
|
this.forEachList(e => e.deleteErasedItems())
|
|
}
|
|
getObjsContainer(e) {
|
|
return Object(s.ensureDefined)(this._containersMapCache.get(e))
|
|
}
|
|
forEachList(e) {
|
|
for (const t of this._containersCache)
|
|
for (const i of t) e(i.data)
|
|
}
|
|
_addToCache(e, t) {
|
|
this._containersCache.push(t), this._containerNamesCache.push(e), this
|
|
._containersMapCache.set(e, t)
|
|
}
|
|
}
|
|
class n {
|
|
constructor(e, t) {
|
|
this.styleId = e, this.data = t
|
|
}
|
|
isNaN() {
|
|
return this.data.isNaN()
|
|
}
|
|
primitiveData(e) {
|
|
return {
|
|
styleId: this.styleId,
|
|
data: this.data.primitivesData(e)
|
|
}
|
|
}
|
|
}
|
|
},
|
|
ivNn: function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e) {
|
|
return Math.round(1e10 * e) / 1e10
|
|
}
|
|
Object.defineProperty(t, "__esModule", {
|
|
value: !0
|
|
}), t.alignTo = t.fixComputationError = t.isNaN = t.isInteger = t.isNumber = void 0, t
|
|
.isNumber = function(e) {
|
|
return "number" == typeof e && isFinite(e)
|
|
}, t.isInteger = function(e) {
|
|
return "number" == typeof e && e % 1 == 0
|
|
}, t.isNaN = function(e) {
|
|
return !(e <= 0 || e > 0)
|
|
}, t.fixComputationError = s, t.alignTo = function(e, t) {
|
|
var i = e / t,
|
|
r = Math.floor(i),
|
|
n = i - r;
|
|
return n > 2e-10 ? s(n > .5 ? (r + 1) * t : r * t) : e
|
|
}
|
|
},
|
|
j3hX: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineToolMultiplePropertyBaseImpl", (function() {
|
|
return l
|
|
})), i.d(t, "LineToolCollectedProperty", (function() {
|
|
return c
|
|
})),
|
|
i.d(t, "LineToolWidthsProperty", (function() {
|
|
return h
|
|
})), i.d(t, "LineToolColorsProperty", (function() {
|
|
return u
|
|
})), i.d(t, "MultipleLineWidthsProperty", (function() {
|
|
return p
|
|
})), i.d(t, "MultipleLineColorsProperty", (function() {
|
|
return _
|
|
}));
|
|
var s = i("txPx"),
|
|
r = i("aIyQ"),
|
|
n = i.n(r);
|
|
const o = Object(s.getLogger)("Chart.LineToolCollectedProperty");
|
|
class a {
|
|
applyValue(e, t) {
|
|
e.setValue(t)
|
|
}
|
|
}
|
|
class l {
|
|
constructor(e, t) {
|
|
this._onChange = new n.a, this._properties = e, e.forEach(e => e.subscribe(this,
|
|
() => {
|
|
this._onChange.fire(this)
|
|
})), this._showIfProperty = t
|
|
}
|
|
visible() {
|
|
var e;
|
|
return !this._showIfProperty || (null === (e = this._showIfProperty) || void 0 ===
|
|
e ? void 0 : e.value())
|
|
}
|
|
value() {
|
|
if (0 === this._properties.length) return o.logError(
|
|
"Incorrect call, should not request value of 0 properties"), "mixed";
|
|
const e = this._properties[0].value();
|
|
return 1 === this._properties.length || this._properties.every(t => t.value() ===
|
|
e) ? e : "mixed"
|
|
}
|
|
state() {}
|
|
merge() {}
|
|
destroy() {
|
|
this._properties.forEach(e => e.unsubscribeAll(this))
|
|
}
|
|
subscribe(e, t) {
|
|
this._onChange.subscribe(e, t)
|
|
}
|
|
unsubscribe(e, t) {
|
|
this._onChange.unsubscribe(e, t)
|
|
}
|
|
unsubscribeAll(e) {
|
|
this._onChange.unsubscribeAll(e)
|
|
}
|
|
}
|
|
class c extends l {
|
|
setValue(e, t, i) {
|
|
if ("mixed" === e) return;
|
|
const s = null != i ? i : new a;
|
|
this._properties.forEach(t => s.applyValue(t, e))
|
|
}
|
|
}
|
|
class h extends c {}
|
|
class u extends c {
|
|
firstColor() {
|
|
return this._properties[0].value()
|
|
}
|
|
}
|
|
class d extends l {
|
|
setValue(e, t, i) {
|
|
if ("mixed" === e) return;
|
|
const s = null != i ? i : new a;
|
|
this._properties.forEach(t => t.setValue(e, void 0, s))
|
|
}
|
|
}
|
|
class p extends d {}
|
|
class _ extends d {}
|
|
},
|
|
j8de: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return n
|
|
}));
|
|
var s = i("tc+8"),
|
|
r = i.n(s);
|
|
class n extends r.a {
|
|
constructor(e, t) {
|
|
super(), this._lineSource = e, this._pointIndex = t
|
|
}
|
|
value() {
|
|
return this._lineSource.points()[this._pointIndex].index
|
|
}
|
|
setValue(e) {
|
|
const t = this._lineSource.points()[this._pointIndex];
|
|
t.index = e, this._lineSource.startChanging(this._pointIndex, t), this
|
|
._setPointImpl(t), this._lineSource.model().updateSource(this._lineSource),
|
|
this._listeners.fire(this);
|
|
const i = this._lineSource.endChanging(!0, !1);
|
|
this._lineSource.syncMultichartState(i)
|
|
}
|
|
_setPointImpl(e) {
|
|
this._lineSource.setPoint(this._pointIndex, e)
|
|
}
|
|
}
|
|
},
|
|
jA0t: function(e, t, i) {
|
|
"use strict";
|
|
var s = function() {
|
|
var e = {};
|
|
|
|
function t(e) {
|
|
return e.is_price_study
|
|
}
|
|
|
|
function i(e, t) {
|
|
var i = t.slice(0).toLowerCase();
|
|
if (e) {
|
|
for (var s = 0; s < e.length; ++s)
|
|
if (e[s].description.toLowerCase() === i || e[s].shortDescription
|
|
.toLowerCase() === i) return e[s];
|
|
throw new Error("Can't find metainfo for `" + t + "`")
|
|
}
|
|
throw new Error("There is no studies metainfo at all")
|
|
}
|
|
var s = {
|
|
bool: function(e) {
|
|
return !!e
|
|
},
|
|
integer: function(e) {
|
|
return parseInt(e)
|
|
},
|
|
float: function(e) {
|
|
return parseFloat(e)
|
|
},
|
|
string: function(e) {
|
|
return e
|
|
}
|
|
};
|
|
return e.getStudyRecordFromArray = function(e, r) {
|
|
return function(e, r) {
|
|
var n;
|
|
if (!Array.isArray(e)) return {
|
|
id: (n = i(r.model().studiesMetaData(), e)).id,
|
|
overlay: t(n)
|
|
};
|
|
for (var o, a = e.slice(0), l = a[0], c = t(n = i(r.model()
|
|
.studiesMetaData(), l)), h = n.inputs.map((function(e) {
|
|
return {
|
|
id: e.id,
|
|
type: e.type,
|
|
name: e.name
|
|
}
|
|
})), u = a.splice(1), d = 0; d < u.length; ++d) {
|
|
o || (o = {});
|
|
var p = s[h[d].type] || s.string;
|
|
o[h[d].id] = p(u[d])
|
|
}
|
|
return {
|
|
id: n.id,
|
|
name: l,
|
|
overlay: c,
|
|
inputs: o
|
|
}
|
|
}(e, r)
|
|
},
|
|
e
|
|
}();
|
|
e.exports = s
|
|
},
|
|
jCNj: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("99ZO"),
|
|
r = i("3UA0").tzData;
|
|
|
|
function n(e) {
|
|
this._name = e;
|
|
var t = r[e];
|
|
if (t || (t = {
|
|
time: [],
|
|
offset: []
|
|
}, this._invalid = !0), t.time.length !== t.offset.length && (t = {
|
|
time: [],
|
|
offset: []
|
|
}, this._invalid = !0), !t.time_utc) {
|
|
for (var i = t.time, s = t.offset, n = i.length, o = new Array(n), a = 0; a < n; a++) i[
|
|
a] *= 1e3, s[a] *= 1e3, o[a] = i[a] - s[a];
|
|
t.time_utc = o
|
|
}
|
|
this.tz = t
|
|
}
|
|
|
|
function o(e, t) {
|
|
var i = e.length;
|
|
if (0 === i) return -1;
|
|
if (isNaN(t)) throw Error("Key is NaN");
|
|
for (var s = 0, r = i - 1, n = a((s + r) / 2);;) {
|
|
if (e[n] > t) {
|
|
if ((r = n - 1) < s) return n
|
|
} else if (r < (s = n + 1)) return n < i - 1 ? n + 1 : -1;
|
|
n = a((s + r) / 2)
|
|
}
|
|
}
|
|
n.prototype.offset_utc = function(e) {
|
|
return n._offset(this.tz.time_utc, this.tz.offset, e)
|
|
}, n.prototype.offset_loc = function(e) {
|
|
return n._offset(this.tz.time, this.tz.offset, e)
|
|
}, n.prototype.name = function() {
|
|
return this._name
|
|
}, n.prototype.correction_loc = function(e) {
|
|
var t = this.tz.time,
|
|
i = this.tz.offset,
|
|
s = o(t, e);
|
|
if (s < 1) return 0;
|
|
var r = i[s] - i[s - 1];
|
|
if (r > 0 && e - t[s - 1] <= r) return r;
|
|
return 0
|
|
}, n.prototype.is_valid = function() {
|
|
return !this._invalid
|
|
}, n._offset = function(e, t, i) {
|
|
var s = o(e, i);
|
|
return -1 === s ? 0 : t[s]
|
|
};
|
|
var a = function(e) {
|
|
return 0 | e
|
|
},
|
|
l = function(e) {
|
|
return 60 * e * 1e3
|
|
},
|
|
c = function(e, t) {
|
|
return h(e) - h(t)
|
|
},
|
|
h = function(e) {
|
|
return e < 0 ? a(e / 1e3) - (e % 1e3 != 0 ? 1 : 0) : a(e / 1e3)
|
|
};
|
|
|
|
function u(e) {
|
|
return e % 4 == 0 && (e % 100 != 0 || e % 400 == 0)
|
|
}
|
|
var d = {
|
|
0: 0,
|
|
1: 31,
|
|
2: 59,
|
|
3: 90,
|
|
4: 120,
|
|
5: 151,
|
|
6: 181,
|
|
7: 212,
|
|
8: 243,
|
|
9: 273,
|
|
10: 304,
|
|
11: 334
|
|
},
|
|
p = {
|
|
...s.WeekDays,
|
|
...s.Months,
|
|
YEAR: 1,
|
|
MONTH: 2,
|
|
WEEK_OF_YEAR: 3,
|
|
DAY_OF_MONTH: 5,
|
|
DAY_OF_YEAR: 6,
|
|
DAY_OF_WEEK: 7,
|
|
HOUR_OF_DAY: 11,
|
|
MINUTE: 12,
|
|
SECOND: 13,
|
|
minutesPerDay: 1440,
|
|
millisecondsPerDay: l(1440),
|
|
get_minutes_from_hhmm: function(e) {
|
|
return -1 !== e.indexOf(":") && (e = e.split(":").join("")), e % 100 + 60 * a(
|
|
e / 100)
|
|
},
|
|
get_year: function(e) {
|
|
return e.getUTCFullYear()
|
|
},
|
|
get_month: function(e) {
|
|
return e.getUTCMonth()
|
|
},
|
|
get_hours: function(e) {
|
|
return e.getUTCHours()
|
|
},
|
|
get_minutes: function(e) {
|
|
return e.getUTCMinutes()
|
|
},
|
|
get_seconds: function(e) {
|
|
return e.getUTCSeconds()
|
|
},
|
|
get_day_of_month: function(e) {
|
|
return e.getUTCDate()
|
|
},
|
|
get_day_of_week: function(e) {
|
|
return e.getUTCDay() + 1
|
|
},
|
|
get_day_of_year: function(e) {
|
|
var t = e.getUTCMonth(),
|
|
i = d[t];
|
|
return t > p.JANUARY + 1 && u(e.getUTCFullYear()) && (i += 1), i + e
|
|
.getUTCDate()
|
|
},
|
|
get_week_of_year: function(e) {
|
|
var t = new Date(Date.UTC(e.getUTCFullYear(), 0, 1)).getUTCDay(),
|
|
i = 0 === t ? 1 : 8 - t,
|
|
s = p.get_day_of_year(e) - i;
|
|
return Math.ceil(s / 7) + 1
|
|
},
|
|
get_minutes_from_midnight: function(e) {
|
|
return 60 * p.get_hours(e) + p.get_minutes(e)
|
|
},
|
|
set_hms: function(e, t, i, s, r, n) {
|
|
e.setUTCHours(t), e.setUTCMinutes(i), e.setUTCSeconds(s), e.setUTCMilliseconds(
|
|
r), p.correct_time(e, n)
|
|
},
|
|
correct_time: function(e, t) {
|
|
var i = e.getTime(),
|
|
s = t.correction_loc(i);
|
|
e.setTime(i + s)
|
|
},
|
|
add_days_considering_dst: function(e, t, i) {
|
|
var s = e.offset_utc(t),
|
|
r = this.clone(t);
|
|
this.add_date(r, i);
|
|
var n = e.offset_utc(r);
|
|
return r.setTime(r.getTime() + s - n), r
|
|
},
|
|
add_date: function(e, t) {
|
|
e.setTime(e.getTime() + t * p.millisecondsPerDay)
|
|
},
|
|
add_minutes: function(e, t) {
|
|
e.setTime(e.getTime() + l(t))
|
|
},
|
|
clone: function(e) {
|
|
return new Date(e.getTime())
|
|
},
|
|
get_days_per_year: function(e) {
|
|
var t = e.getUTCFullYear();
|
|
return this.days_per_year(t)
|
|
},
|
|
days_per_year: function(e) {
|
|
return u(e) ? 366 : 365
|
|
},
|
|
get_days_in_month: function(e, t) {
|
|
let i;
|
|
switch (e) {
|
|
case 0:
|
|
case 2:
|
|
case 4:
|
|
case 6:
|
|
case 7:
|
|
case 9:
|
|
case 11:
|
|
i = 31;
|
|
break;
|
|
case 1:
|
|
i = 28, u(t) && i++;
|
|
break;
|
|
default:
|
|
i = 30
|
|
}
|
|
return i
|
|
},
|
|
get_part: function(e, t) {
|
|
switch (t) {
|
|
case p.YEAR:
|
|
return p.get_year(e);
|
|
case p.MONTH:
|
|
return p.get_month(e);
|
|
case p.DAY_OF_MONTH:
|
|
return p.get_day_of_month(e);
|
|
case p.WEEK_OF_YEAR:
|
|
return p.get_week_of_year(e);
|
|
case p.DAY_OF_WEEK:
|
|
return p.get_day_of_week(e);
|
|
case p.HOUR_OF_DAY:
|
|
return p.get_hours(e);
|
|
case p.MINUTE:
|
|
return p.get_minutes(e);
|
|
case p.DAY_OF_YEAR:
|
|
return p.get_day_of_year(e);
|
|
case p.SECOND:
|
|
return p.get_seconds(e);
|
|
default:
|
|
return e.getTime()
|
|
}
|
|
},
|
|
time_minutes: l,
|
|
time_seconds: function(e) {
|
|
return 1e3 * e
|
|
},
|
|
time_minutes_diff: function(e, t) {
|
|
return a(c(e, t) / 60)
|
|
},
|
|
time_seconds_diff: c,
|
|
utc_to_cal: function(e, t) {
|
|
return new Date(p.utc_to_cal_ts(e, t))
|
|
},
|
|
utc_to_cal_ts: function(e, t) {
|
|
return t + e.offset_utc(t)
|
|
},
|
|
get_cal: function(e, t, i, s, r, n, o) {
|
|
var a = new Date(Date.UTC(t, i, s, r || 0, n || 0, o || 0)),
|
|
l = e.offset_utc(+a);
|
|
return new Date(a.valueOf() - l)
|
|
},
|
|
get_cal_from_unix_timestamp_ms: function(e, t) {
|
|
return new Date(t + e.offset_utc(t))
|
|
},
|
|
get_cal_utc: function(e, t, i) {
|
|
return new Date(Date.UTC(e, t, i))
|
|
},
|
|
cal_to_utc: function(e, t) {
|
|
var i = t.getTime();
|
|
return i - e.offset_loc(i)
|
|
},
|
|
get_timezone: function(e) {
|
|
return new n(e)
|
|
},
|
|
shift_day: function(e, t) {
|
|
var i = e - 1;
|
|
return (i += t) > 6 ? i %= 7 : i < 0 && (i = (7 + i % 7) % 7), i + 1
|
|
}
|
|
};
|
|
e.exports = p
|
|
},
|
|
jFln: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Hr11"),
|
|
r = s.greaterThan,
|
|
n = s.lessThan,
|
|
o = window.CanvasEx = i("8Uy/");
|
|
o.computeDashPattern = function(e) {
|
|
return [
|
|
[e.lineWidth, 2 * e.lineWidth],
|
|
[5 * e.lineWidth, 6 * e.lineWidth],
|
|
[6 * e.lineWidth, 6 * e.lineWidth],
|
|
[e.lineWidth, 4 * e.lineWidth],
|
|
[2 * e.lineWidth, e.lineWidth]
|
|
][e.lineStyle - 1]
|
|
}, o.drawLine = function(e, t, i, s, r) {
|
|
isFinite(t) && isFinite(s) && isFinite(i) && isFinite(r) && (e.lineStyle !== o
|
|
.LINESTYLE_SOLID ? o.drawDashedLine(e, t, i, s, r) : o.drawSolidLine(e, t, i, s,
|
|
r))
|
|
}, o.drawArrow = function(e, t, i, s, r, n) {
|
|
if (isFinite(t) && isFinite(s) && isFinite(i) && isFinite(r)) {
|
|
var o = Math.round(n / 2),
|
|
a = t + o,
|
|
l = s + o;
|
|
e.beginPath(), e.moveTo(l, r), e.lineTo(a, i), e.moveTo(t, i + o), e.lineTo(a, i), e
|
|
.lineTo(t + n, i + o), e.stroke()
|
|
}
|
|
}, o.drawSolidLine = function(e, t, i, s, r) {
|
|
e.beginPath(), e.moveTo(t, i), e.lineTo(s, r), e.stroke()
|
|
}, o.setLineStyle = function(e, t) {
|
|
e.lineStyle = t;
|
|
var i = [];
|
|
t !== o.LINESTYLE_SOLID && (i = o.computeDashPattern(e)), o.setLineDash(e, i)
|
|
}, o.setLineDash = function(e, t) {
|
|
"function" == typeof e.setLineDash ? e.setLineDash(t) : void 0 !== e.mozDash ? e
|
|
.mozDash = t : void 0 !== e.webkitLineDash && (e.webkitLineDash = t)
|
|
}, o.drawPoly = function(e, t, i) {
|
|
e.beginPath(), e.moveTo(t[0].x, t[0].y);
|
|
for (var s = 0; s < t.length; s++) {
|
|
var r = t[s];
|
|
e.lineTo(r.x, r.y)
|
|
}
|
|
e.closePath(), e.stroke(), i && e.fill()
|
|
}, o.drawDashedLine = function(e, t, i, s, r) {
|
|
e.save();
|
|
var n = o.computeDashPattern(e);
|
|
if (e.beginPath(), "function" == typeof e.setLineDash) e.setLineDash(n);
|
|
else if (void 0 !== e.mozDash) e.mozDash = n;
|
|
else {
|
|
if (void 0 === e.webkitLineDash) return o.dashedLineTo(e, t, i, s, r, n), e
|
|
.stroke(), void e.restore();
|
|
e.webkitLineDash = n
|
|
}
|
|
e.moveTo(t, i), e.lineTo(s, r), e.stroke(), e.restore()
|
|
}, o.drawDashedLineHorizontal = function(e, t, i, s) {
|
|
e.save();
|
|
var r = o.computeDashPattern(e),
|
|
n = 0,
|
|
a = e.lineWidth,
|
|
l = a / 2;
|
|
e.translate(-l, -l);
|
|
for (var c = !0, h = t + s; t < h;) {
|
|
var u = r[n];
|
|
c && e.fillRect(t, i, u, a), c = !c, t += u,
|
|
n = n === r.length - 1 ? 0 : n + 1
|
|
}
|
|
e.restore()
|
|
}, o.drawDashedLineVertical = function(e, t, i, s) {
|
|
e.save();
|
|
var r = o.computeDashPattern(e),
|
|
n = 0,
|
|
a = e.lineWidth,
|
|
l = a / 2;
|
|
e.translate(-l, -l);
|
|
for (var c = !0, h = i + s; i < h;) {
|
|
var u = r[n];
|
|
c && e.fillRect(t, i, a, u), c = !c, i += u, n = n === r.length - 1 ? 0 : n + 1
|
|
}
|
|
e.restore()
|
|
}, o.dashedLineTo = function(e, t, i, s, o, a) {
|
|
var l = {
|
|
thereYet: r,
|
|
cap: Math.min
|
|
},
|
|
c = {
|
|
thereYet: r,
|
|
cap: Math.min
|
|
};
|
|
i - o > 0 && (c.thereYet = n, c.cap = Math.max), t - s > 0 && (l.thereYet = n, l.cap =
|
|
Math.max), e.moveTo(t, i);
|
|
for (var h = t, u = i, d = 0, p = !0; !l.thereYet(h, s) || !c.thereYet(u, o);) {
|
|
var _ = Math.atan2(o - i, s - t),
|
|
m = a[d];
|
|
h = l.cap(s, h + Math.cos(_) * m), u = c.cap(o, u + Math.sin(_) * m), p ? e.lineTo(
|
|
h, u) : e.moveTo(h, u), d = (d + 1) % a.length, p = !p
|
|
}
|
|
}, o.setFont = function(e, t) {
|
|
if (e.font !== t) try {
|
|
e.font = t
|
|
} catch (e) {}
|
|
}, "undefined" != typeof CanvasRenderingContext2D && (CanvasRenderingContext2D.prototype
|
|
.setFont = function(e) {
|
|
o.setFont(this, e)
|
|
}, CanvasRenderingContext2D.prototype.lineStyle = o.LINESTYLE_SOLID), e.exports = o
|
|
},
|
|
jJ9X: function(e, t, i) {},
|
|
jRfx: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "c", (function() {
|
|
return o
|
|
})), i.d(t, "a", (function() {
|
|
return a
|
|
})), i.d(t, "b", (function() {
|
|
return l
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("3u3j");
|
|
class n extends r.a {
|
|
constructor(e, t, i) {
|
|
super(e, t, i), this._restorePane = !1
|
|
}
|
|
redo() {
|
|
const e = this._chartModel.panes().length,
|
|
t = this._chartModel.panes()[this._targetPaneIndex()],
|
|
i = Object(s.ensureNotNull)(this._chartModel.dataSourceForId(this
|
|
._sourceId)),
|
|
r = Object(s.ensureNotNull)(this._chartModel.paneForSource(i)),
|
|
n = this._chartModel.children(i, !0);
|
|
r.bulkActionMacro(() => {
|
|
n.forEach(e => this._chartModel.detachSource(e)), this
|
|
._restorePane = this._chartModel.detachSource(i)
|
|
});
|
|
const o = "overlay" === this._initialPriceScalePosition ? this
|
|
._initialPriceScalePosition : void 0,
|
|
a = t.findSuitableScale(i, void 0, o),
|
|
l = 0 === a.dataSources().length;
|
|
if (t.bulkActionMacro(() => {
|
|
t.addDataSource(i, a, !1), n.forEach(e => t.addDataSource(e, a, !1))
|
|
}), i === this._chartModel.mainSeries()) {
|
|
const e = t.priceScalePosition(a);
|
|
t.movePriceScale(a, e, 0)
|
|
}
|
|
if (l) {
|
|
Object(s.ensureNotNull)(i.priceScale()).restoreState(this
|
|
._newPriceScaleState(t.isOverlay(i)))
|
|
}
|
|
this._chartModel.fullUpdate(), e !== this._chartModel.panes().length && this
|
|
._chartModel.setShouldBeSavedEvenIfHidden(!0)
|
|
}
|
|
undo() {
|
|
let e;
|
|
e = this._restorePane ? this._chartModel.createPane(this._initialPaneIndex) :
|
|
this._chartModel.panes()[this._initialPaneIndex];
|
|
const t = Object(s.ensureNotNull)(this._chartModel.dataSourceForId(this
|
|
._sourceId)),
|
|
i = Object(s.ensureNotNull)(this._chartModel.paneForSource(t)),
|
|
r = this._chartModel.children(t, !0);
|
|
i.bulkActionMacro(() => {
|
|
r.forEach(e => this._chartModel.detachSource(e)), this._chartModel
|
|
.detachSource(t)
|
|
});
|
|
let n = e.getPriceScaleById(this._initialPriceScaleId);
|
|
null === n && (n = e.createPriceScaleAtPosition(this._initialPriceScalePosition,
|
|
this._initialPriceScaleIndex)), e.bulkActionMacro(() => {
|
|
e.addDataSource(t, n, !0), r.forEach(t => e.addDataSource(t, n, !1))
|
|
}), Object(s.ensureNotNull)(t.priceScale()).restoreState(this
|
|
._originalPriceScaleState()), this._chartModel.fullUpdate()
|
|
}
|
|
}
|
|
class o extends n {
|
|
constructor(e, t, i) {
|
|
super(e, t, i)
|
|
}
|
|
_targetPaneIndex() {
|
|
return this._initialPaneIndex - 1
|
|
}
|
|
}
|
|
class a extends n {
|
|
constructor(e, t, i) {
|
|
super(e, t, i)
|
|
}
|
|
_targetPaneIndex() {
|
|
return this._initialPaneIndex + 1
|
|
}
|
|
}
|
|
class l extends n {
|
|
constructor(e, t, i, s) {
|
|
super(e, t, s), this._targetPane = i
|
|
}
|
|
_targetPaneIndex() {
|
|
return this._targetPane
|
|
}
|
|
}
|
|
},
|
|
jTis: function(e, t, i) {
|
|
"use strict";
|
|
var s;
|
|
i.r(t), i.d(t, "CalloutConsts", (function() {
|
|
return s
|
|
})),
|
|
function(e) {
|
|
e[e.RoundRadius = 8] = "RoundRadius", e[e.TextMargins = 2] = "TextMargins", e[e
|
|
.MinWidth = 100] = "MinWidth"
|
|
}(s || (s = {}))
|
|
},
|
|
jeZR: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "AppliedTimeFrame", (function() {
|
|
return r
|
|
}));
|
|
var s = i("QfUd");
|
|
class r {
|
|
constructor(e) {
|
|
this._appliedTimeFrame = new s.a(null), this._appliedTimeFrameInfo = null, this
|
|
._appliedTimeFrameChangedBound = this._appliedTimeFrameChanged.bind(this), this
|
|
._model = e, e.mainSeries().dataEvents().seriesTimeFrame().subscribe(this, this
|
|
._onSeriesTimeFrame), this._appliedTimeFrame.subscribe(this
|
|
._appliedTimeFrameChangedBound)
|
|
}
|
|
destroy() {
|
|
this._appliedTimeFrame.unsubscribe(this._appliedTimeFrameChangedBound), this._model
|
|
.timeScale().logicalRangeChanged().unsubscribeAll(this), this._model
|
|
.mainSeries().dataEvents().seriesTimeFrame().unsubscribeAll(this)
|
|
}
|
|
appliedTimeFrame() {
|
|
return this._appliedTimeFrame
|
|
}
|
|
_appliedTimeFrameChanged() {
|
|
this._model.timeScale().logicalRangeChanged().unsubscribe(this, this
|
|
._invalidateAppliedTimeFrame)
|
|
}
|
|
_onSeriesTimeFrame(e, t, i, s) {
|
|
if (s) {
|
|
const e = this._model.timeScale();
|
|
this._appliedTimeFrameInfo = {
|
|
logicalRange: e.logicalRange(),
|
|
baseIndex: e.baseIndex()
|
|
}, e.logicalRangeChanged().subscribe(this, this._invalidateAppliedTimeFrame)
|
|
}
|
|
}
|
|
_invalidateAppliedTimeFrame() {
|
|
if (null === this._appliedTimeFrameInfo) return;
|
|
const e = this._model.timeScale(),
|
|
t = e.logicalRange(),
|
|
i = e.baseIndex(),
|
|
s = this._appliedTimeFrameInfo.logicalRange,
|
|
r = this._appliedTimeFrameInfo.baseIndex;
|
|
(null === t || null === s || Math.abs(i - t.left() - (r - s.left())) >= .01 || Math
|
|
.abs(i - t.right() - (r - s.right())) >= .01) && this._appliedTimeFrame
|
|
.setValue(null)
|
|
}
|
|
}
|
|
},
|
|
jenN: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("txPx"),
|
|
r = i("7Fue"),
|
|
n = i("xWfy"),
|
|
o = i("qySK"),
|
|
a = i("KcY8");
|
|
class l extends a.a {
|
|
constructor(e, t) {
|
|
super(), this._source = e, this._data = t
|
|
}
|
|
_updateRendererData(e, t, i) {
|
|
e.visible = !1;
|
|
const s = this._source.priceScale(),
|
|
r = this._source.properties().visible.value();
|
|
if (!s || s.isEmpty() || !r) return;
|
|
const n = this._source.properties().graphics[this._data.lineType][this._data
|
|
.styleId
|
|
];
|
|
if (!(n.visible && n.visible.value() && n.showPrice && n.showPrice.value()))
|
|
return;
|
|
const o = this._source.firstValue();
|
|
if (null === o) return;
|
|
const a = this._data.line.level,
|
|
l = n.color.value();
|
|
i.background = l, i.textColor = this.generateTextColor(l), i.coordinate = s
|
|
.priceToCoordinate(a, o), e.text = s.formatPrice(a, o), e.visible = !0
|
|
}
|
|
}
|
|
i.d(t, "createGraphicsPaneViews", (function() {
|
|
return d
|
|
})), i.d(t, "createGraphicsPriceAxisViews", (function() {
|
|
return _
|
|
})), i.d(t, "isStudyGraphicsEmpty", (function() {
|
|
return r.a
|
|
})), i.d(t, "StaticStudyGraphics", (function() {
|
|
return n.a
|
|
})), i.d(t, "emptyStudyGraphics", (function() {
|
|
return n.b
|
|
})), i.d(t, "loadStudyGraphics", (function() {
|
|
return n.c
|
|
})), i.d(t, "saveStudyGraphics", (function() {
|
|
return n.d
|
|
})), i.d(t, "LiveStudyGraphics", (function() {
|
|
return o.a
|
|
}));
|
|
const c = Object(s.getLogger)("Chart.StudyGraphics"),
|
|
h = new Set(["dwgtablecells"]);
|
|
async function u(e, t, s, r) {
|
|
switch (e) {
|
|
case "hhists":
|
|
return new((await i.e("study-pane-views").then(i.bind(null, "Gj0v")))
|
|
.HHistPaneView)(t, s, r);
|
|
case "horizlines":
|
|
return new((await i.e("study-pane-views").then(i.bind(null, "1sos")))
|
|
.HorizLinePaneView)(t, s, r);
|
|
case "vertlines":
|
|
return new((await i.e("study-pane-views").then(i.bind(null, "psYU")))
|
|
.VertLinePaneView)(t, s, r);
|
|
case "polygons":
|
|
return new((await i.e("study-pane-views").then(i.bind(null, "BJvp")))
|
|
.PolygonPaneView)(t, s, r)
|
|
}
|
|
return null
|
|
}
|
|
async function d(e, t, i) {
|
|
const s = [],
|
|
r = Object.keys(e.graphicsInfo());
|
|
r.sort((e, t) => p(e) - p(t));
|
|
for (const n of r) {
|
|
const r = await u(n, e, t, i);
|
|
null !== r ? s.push(r) : h.has(n) || c.logWarn(n +
|
|
" is not supported by this build of graphics subsystem, skipping")
|
|
}
|
|
return s
|
|
}
|
|
|
|
function p(e) {
|
|
switch (e) {
|
|
case "polygons":
|
|
return -100;
|
|
case "trendchannels":
|
|
return -90;
|
|
default:
|
|
return 0
|
|
}
|
|
}
|
|
|
|
function _(e) {
|
|
const t = Object.keys(e.graphicsInfo()),
|
|
i = [];
|
|
for (const s of t) switch (s) {
|
|
case "hlines":
|
|
e.graphics().hlines().forEach((t, r) => {
|
|
t.forEach(t => {
|
|
void 0 !== t.level && i.push(new l(e, {
|
|
line: {
|
|
level: t.level
|
|
},
|
|
styleId: r,
|
|
lineType: s
|
|
}))
|
|
})
|
|
});
|
|
break;
|
|
case "horizlines":
|
|
e.graphics().horizlines().forEach((t, r) => {
|
|
t.forEach(t => {
|
|
void 0 !== t.level && i.push(new l(e, {
|
|
line: {
|
|
level: t.level
|
|
},
|
|
styleId: r,
|
|
lineType: s
|
|
}))
|
|
})
|
|
})
|
|
}
|
|
return i
|
|
}
|
|
},
|
|
jkoZ: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("XlJ7").makeFont,
|
|
r = i("XlJ7").parseFont,
|
|
n = (0, i("txPx").getLogger)("Model.ChartTradingUtils"),
|
|
o = {
|
|
_fontHeightCache: {},
|
|
_parsedColorCache: {},
|
|
_parseColor: function(e) {
|
|
if (this._parsedColorCache[e]) return this._parsedColorCache[e];
|
|
var t = document.createElement("div");
|
|
t.style.color = e;
|
|
var i = t.style.color.match(
|
|
/^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i) || t.style.color
|
|
.match(
|
|
/^rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d*\.?\d+)\s*\)$/i),
|
|
s = {
|
|
r: i[1],
|
|
g: i[2],
|
|
b: i[3],
|
|
a: i[4] || "1"
|
|
};
|
|
return this._parsedColorCache[e] = s, s
|
|
},
|
|
getColorFromProperties: function(e, t) {
|
|
var i = 1 - t.value() / 100,
|
|
s = this._parseColor(e.value());
|
|
return "rgba(" + s.r + "," + s.g + "," + s.b + "," + i + ")"
|
|
},
|
|
setColorToProperties: function(e, t, i) {
|
|
var s = this._parseColor(e);
|
|
t.setValue("rgb(" + s.r + "," + s.g + "," + s.b + ")");
|
|
var r = 100 * (1 - s.a);
|
|
i.setValue(Math.max(0, Math.min(r, 100)))
|
|
},
|
|
getFontFromProperties: function(e, t, i, r) {
|
|
return s(t.value(), e.value(), r.value() ? "italic" : "", i.value() ? "bold" :
|
|
"")
|
|
},
|
|
setFontToProperties: function(e, t, i, s, o) {
|
|
var a = r(e);
|
|
null !== a ? (a.family.length > 0 && t.setValue(a.family), i.setValue(a.size), s
|
|
.setValue(a.bold), o.setValue(a.italic)) : n.logError("Invalid font: " +
|
|
e)
|
|
},
|
|
fontHeight: function(e) {
|
|
if (!this._fontHeightCache[e]) {
|
|
var t = document.createElement("span");
|
|
t.appendChild(document.createTextNode("height")), document.body.appendChild(
|
|
t), t.style.cssText = "font: " + e +
|
|
"; white-space: nowrap; display: inline;";
|
|
var i = t.offsetHeight;
|
|
document.body.removeChild(t), this._fontHeightCache[e] = Math.ceil(i)
|
|
}
|
|
return this._fontHeightCache[e]
|
|
},
|
|
drawPolyHoverOrPress: function(e, t, i, s) {
|
|
s ? (e.save(), e.fillStyle = "rgba(0, 0, 0, 0.15)", CanvasEx.drawPoly(e, t, !0),
|
|
e.restore()) : i && (e.save(), e.fillStyle = "rgba(0, 0, 0, 0.1)",
|
|
CanvasEx.drawPoly(e, t, !0), e.restore())
|
|
},
|
|
repaint: function(e) {
|
|
e.lightUpdate()
|
|
},
|
|
roundToMinTick: function(e, t) {
|
|
var i = 1 / e.mainSource().base();
|
|
return i * Math.round(t / i)
|
|
}
|
|
};
|
|
e.exports = o
|
|
},
|
|
jofe: function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s() {
|
|
let e, t;
|
|
return {
|
|
promise: new Promise((i, s) => {
|
|
e = i, t = s
|
|
}),
|
|
reject: t,
|
|
resolve: e
|
|
}
|
|
}
|
|
i.r(t), i.d(t, "createDeferredPromise", (function() {
|
|
return s
|
|
}))
|
|
},
|
|
jpZi: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return o
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = (i("YFKU"), i("HbRj"), i("RDU5"));
|
|
const n = window.t("Exclude line tools from group {group}");
|
|
class o extends r.UndoCommand {
|
|
constructor(e, t, i) {
|
|
super(n.format({
|
|
group: t.name()
|
|
})), this._model = e, this._groupId = t.id, this._groupName = t.name(), this
|
|
._lineToolsIds = i.map(e => e.id())
|
|
}
|
|
redo() {
|
|
const e = Object(s.ensureNotNull)(this._model.lineToolsGroupModel().groupForId(
|
|
this._groupId)),
|
|
t = this._lineToolsIds.map(e => this._model.dataSourceForId(e));
|
|
e.excludeLineTools(t), 0 === e.lineTools().length && this._model
|
|
.lineToolsGroupModel().removeGroup(e)
|
|
}
|
|
undo() {
|
|
const e = this._lineToolsIds.map(e => this._model.dataSourceForId(e)),
|
|
t = this._model.lineToolsGroupModel().groupForId(this._groupId);
|
|
null !== t ? t.addLineTools(e) : this._model.lineToolsGroupModel().createGroup(
|
|
e, this._groupName, this._groupId)
|
|
}
|
|
}
|
|
},
|
|
jvrd: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "g", (function() {
|
|
return n
|
|
})), i.d(t, "e", (function() {
|
|
return a
|
|
})), i.d(t, "d", (function() {
|
|
return l
|
|
})), i.d(t, "c", (function() {
|
|
return c
|
|
})), i.d(t, "f", (function() {
|
|
return h
|
|
})), i.d(t, "a", (function() {
|
|
return u
|
|
})), i.d(t, "b", (function() {
|
|
return d
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("k9/m");
|
|
|
|
function n(e, t, i) {
|
|
const s = e.barFunction();
|
|
switch (e.style()) {
|
|
case 3:
|
|
case 10:
|
|
case 2:
|
|
return s(t.value);
|
|
default:
|
|
return t.value[-1 === i ? 3 : 2]
|
|
}
|
|
}
|
|
|
|
function o(e) {
|
|
return e >= 0 ? 1 : -1
|
|
}
|
|
|
|
function a(e, t) {
|
|
return -1 === o(e) !== t ? -1 : 1
|
|
}
|
|
|
|
function l(e, t, i, s) {
|
|
const r = Math.min(t, Math.max(0, 1 === s ? i : t - i));
|
|
return i - s * Math.abs(r * e / 100)
|
|
}
|
|
|
|
function c(e, t, i) {
|
|
const s = e.index();
|
|
return null === s ? null : {
|
|
index: s,
|
|
price: t.coordinateToPrice(t.height() / 2, i)
|
|
}
|
|
}
|
|
|
|
function h(e, t) {
|
|
const i = e.data().bars(),
|
|
s = i.first(),
|
|
a = i.last();
|
|
if (null === s || null === a) return null;
|
|
let l;
|
|
const c = t.index();
|
|
if (null === c) {
|
|
if (void 0 === t.time) return null;
|
|
const e = t.time(),
|
|
n = s.value[0],
|
|
o = a.value[0];
|
|
if (e < n - 86400 || e > o) return null;
|
|
l = i.searchByTime(e, r.PlotRowSearchMode.NearestRight, 4)
|
|
} else l = i.search(c);
|
|
return null === l ? null : {
|
|
index: l.index,
|
|
price: n(e, l, o(t.position()))
|
|
}
|
|
}
|
|
|
|
function u(e, t, i) {
|
|
const s = c(e, t, i);
|
|
if (null === s) return null;
|
|
const r = a(e.position(), t.isInverted());
|
|
return {
|
|
index: s.index,
|
|
price: s.price,
|
|
poleStartY: t.height(),
|
|
visualDirection: 1,
|
|
positionPointDirection: r
|
|
}
|
|
}
|
|
|
|
function d(e, t) {
|
|
const i = h(e, t),
|
|
r = e.priceScale(),
|
|
n = Object(s.ensureNotNull)(e.firstValue());
|
|
if (null === i) return u(t, r, n);
|
|
let o = 0;
|
|
const l = e.properties(),
|
|
c = e.model().timeScale(),
|
|
d = r.priceToCoordinate(i.price, n);
|
|
switch (e.style()) {
|
|
case 3:
|
|
o = l.areaStyle.linewidth.value() / 2;
|
|
break;
|
|
case 2:
|
|
o = l.lineStyle.linewidth.value() / 2;
|
|
break;
|
|
case 10:
|
|
const e = Math.abs(100 - l.baselineStyle.baseLevelPercentage.value());
|
|
o = r.height() * e / 100 > d ? l.baselineStyle.topLineWidth.value() / 2 : l
|
|
.baselineStyle.bottomLineWidth.value() / 2;
|
|
break;
|
|
case 1:
|
|
case 9:
|
|
case 8:
|
|
case 12:
|
|
o = 3;
|
|
break;
|
|
case 0:
|
|
o = l.barStyle.thinBars.value() ? 3 : Math.max(3, .25 * c.barSpacing());
|
|
break;
|
|
case 11:
|
|
o = l.rangeStyle.thinBars.value() ? 3 : Math.max(3, .25 * c.barSpacing());
|
|
break;
|
|
case 4:
|
|
case 7:
|
|
o = 3;
|
|
break;
|
|
case 5:
|
|
o = Math.max(4, .25 * c.barSpacing());
|
|
break;
|
|
case 6:
|
|
o = Math.max(5, .25 * c.barSpacing())
|
|
}
|
|
const p = a(t.position(), r.isInverted()),
|
|
_ = d - p * o;
|
|
return {
|
|
index: i.index,
|
|
price: i.price,
|
|
poleStartY: _,
|
|
visualDirection: p,
|
|
positionPointDirection: p
|
|
}
|
|
}
|
|
},
|
|
jy4L: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "makeNextSymbolId", (function() {
|
|
return r
|
|
})), i.d(t, "makeNextStudyId", (function() {
|
|
return o
|
|
}));
|
|
let s = 0;
|
|
|
|
function r() {
|
|
return s++, "ss_" + s
|
|
}
|
|
let n = 0;
|
|
|
|
function o() {
|
|
return n++, "st" + n
|
|
}
|
|
},
|
|
k4w6: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return r
|
|
}));
|
|
var s = i("2ijp");
|
|
class r extends s.a {
|
|
constructor(e) {
|
|
super(), this._series = e, this._model = e.model()
|
|
}
|
|
}
|
|
},
|
|
"k9/m": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "PlotRowSearchMode", (function() {
|
|
return l
|
|
})), i.d(t, "PlotList", (function() {
|
|
return u
|
|
})), i.d(t, "mergeMinMax", (function() {
|
|
return d
|
|
})), i.d(t, "mergePlotRows", (function() {
|
|
return p
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("Y7w9"),
|
|
n = i("tqok"),
|
|
o = i("txPx");
|
|
const a = Object(o.getLogger)("Chart.PlotList");
|
|
var l;
|
|
! function(e) {
|
|
e[e.NearestLeft = -1] = "NearestLeft", e[e.Exact = 0] = "Exact", e[e.NearestRight = 1] =
|
|
"NearestRight"
|
|
}(l || (l = {}));
|
|
|
|
function c(e) {
|
|
return e.index
|
|
}
|
|
|
|
function h(e) {
|
|
return e.value[0]
|
|
}
|
|
class u {
|
|
constructor(e = null, t = null) {
|
|
this._items = [], this._start = 0, this._end = 0, this._shareRead = !1, this
|
|
._minMaxCache = new Map, this._rowSearchCacheByIndex = new Map, this
|
|
._rowSearchCacheByIndexWithoutEmptyValues = new Map, this
|
|
._rowSearchCacheByTime = new Map, this._rowSearchCacheByTimeWithoutEmptyValues =
|
|
new Map, this._plotFunctions = e || new Map, this._emptyValuePredicate = t
|
|
}
|
|
clear() {
|
|
this._items = [], this._start = 0, this._end = 0, this._shareRead = !1, this
|
|
._minMaxCache.clear(), this._invalidateSearchCaches()
|
|
}
|
|
first() {
|
|
return this.size() > 0 ? this._items[this._start] : null
|
|
}
|
|
last() {
|
|
return this.size() > 0 ? this._items[this._end - 1] : null
|
|
}
|
|
firstIndex() {
|
|
return this.size() > 0 ? this._indexAt(this._start) : null
|
|
}
|
|
lastIndex() {
|
|
return this.size() > 0 ? this._indexAt(this._end - 1) : null
|
|
}
|
|
size() {
|
|
return this._end - this._start
|
|
}
|
|
isEmpty() {
|
|
return 0 === this.size()
|
|
}
|
|
contains(e) {
|
|
return null !== this.search(e, l.Exact)
|
|
}
|
|
valueAt(e) {
|
|
const t = this.search(e);
|
|
return null !== t ? t.value : null
|
|
}
|
|
add(e, t) {
|
|
if (this._shareRead) return a.logDebug(
|
|
"add: readonly collection modification attempt"), !1;
|
|
const i = {
|
|
index: e,
|
|
value: t
|
|
},
|
|
s = this._nonCachedSearch(e, l.Exact, c);
|
|
return this._invalidateSearchCaches(), null === s ? (this._items.splice(this
|
|
._lowerbound(e, c), 0, i), this._start = 0, this._end = this._items
|
|
.length, !0) : (this._items[s] = i, !1)
|
|
}
|
|
search(e, t = l.Exact, i) {
|
|
return this._searchImpl(e, t, this._rowSearchCacheByIndex, this
|
|
._rowSearchCacheByIndexWithoutEmptyValues, c, i)
|
|
}
|
|
searchByTime(e, t = l.Exact, i) {
|
|
return this._searchImpl(e, t, this._rowSearchCacheByTime, this
|
|
._rowSearchCacheByTimeWithoutEmptyValues, h, i)
|
|
}
|
|
fold(e, t) {
|
|
let i = t;
|
|
for (let t = this._start; t < this._end; ++t) {
|
|
i = e(this._indexAt(t), this._valueAt(t), i)
|
|
}
|
|
return i
|
|
}
|
|
findFirst(e, t) {
|
|
const i = void 0 !== t && Math.min(this._start + t, this._end) || this._end;
|
|
for (let t = this._start; t < i; ++t) {
|
|
const i = this._indexAt(t),
|
|
s = this._valueAt(t);
|
|
if (e(i, s)) return {
|
|
index: i,
|
|
value: s
|
|
}
|
|
}
|
|
return null
|
|
}
|
|
findLast(e, t) {
|
|
const i = void 0 !== t && Math.max(this._end - t, this._start) || this._start;
|
|
for (let t = this._end - 1; t >= i; --t) {
|
|
const i = this._indexAt(t),
|
|
s = this._valueAt(t);
|
|
if (e(i, s)) return {
|
|
index: i,
|
|
value: s
|
|
}
|
|
}
|
|
return null
|
|
}
|
|
each(e) {
|
|
for (let t = this._start; t < this._end; ++t) {
|
|
if (e(this._indexAt(t), this._valueAt(t))) break
|
|
}
|
|
}
|
|
reduce(e, t) {
|
|
let i = t;
|
|
for (let t = this._start; t < this._end; ++t) {
|
|
i = e(i, this._indexAt(t), this._valueAt(t))
|
|
}
|
|
return i
|
|
}
|
|
range(e, t) {
|
|
const i = new u(this._plotFunctions, this._emptyValuePredicate);
|
|
return i._items = this._items, i._start = this._lowerbound(e, c), i._end = this
|
|
._upperbound(t), i._shareRead = !0, i
|
|
}
|
|
rangeIterator(e, t) {
|
|
const i = this._lowerbound(e, c),
|
|
s = this._upperbound(t);
|
|
if (i === s) return {
|
|
hasNext: () => !1,
|
|
next: () => {
|
|
throw new Error("Invalid operation")
|
|
}
|
|
};
|
|
let r = i - 1;
|
|
return {
|
|
hasNext: () => r < s - 1,
|
|
next: () => (r += 1, this._items[r])
|
|
}
|
|
}
|
|
minMaxOnRangeCached(e, t, i) {
|
|
if (this.isEmpty()) return null;
|
|
let s = null;
|
|
for (const r of i) {
|
|
s = d(s, this._minMaxOnRangeCachedImpl(e - r.offset, t - r.offset, r.name))
|
|
}
|
|
return s
|
|
}
|
|
minMaxOnRange(e, t, i) {
|
|
if (this.isEmpty()) return null;
|
|
let s = null;
|
|
for (const r of i) {
|
|
s = d(s, this._minMaxOnRange(e - r.offset, t - r.offset, r.name))
|
|
}
|
|
return s
|
|
}
|
|
merge(e) {
|
|
return this._shareRead ? (a.logDebug(
|
|
"merge: readonly collection modification attempt"), null) : 0 === e.length ?
|
|
null : this.isEmpty() || e[e.length - 1].index < this._items[0].index ? this
|
|
._prepend(e) : e[0].index > this._items[this._items.length - 1].index ? this
|
|
._append(e) : 1 === e.length && e[0].index === this._items[this._items.length -
|
|
1].index ? (this._updateLast(e[0]), e[0]) : this._merge(e)
|
|
}
|
|
addTail(e, t = !1) {
|
|
let i = 0;
|
|
t && this._end - this._start > 0 && (i = 1, this._items[this._end - this._start - 1]
|
|
.value = e[0].value);
|
|
for (let t = i; t < e.length; ++t) {
|
|
const i = e[t],
|
|
s = this.lastIndex();
|
|
if (null === s) {
|
|
a.logError("Can't add tail to the empty plotlist");
|
|
break
|
|
}
|
|
this.add(s + 1, i.value)
|
|
}
|
|
this._invalidateSearchCaches()
|
|
}
|
|
move(e) {
|
|
if (this._shareRead) return void a.logDebug(
|
|
"move: readonly collection modification attempt");
|
|
if (0 === e.length) return;
|
|
const t = this._items.slice();
|
|
for (const i of e) {
|
|
const e = this._bsearch(i.old, c);
|
|
if (null !== e && void 0 !== t[e])
|
|
if (i.new === n.INVALID_TIME_POINT_INDEX) t[e] = void 0;
|
|
else {
|
|
t[e] = {
|
|
index: i.new,
|
|
value: t[e].value
|
|
};
|
|
const s = this._bsearch(i.new, c);
|
|
if (null !== s) {
|
|
const e = t[s];
|
|
void 0 !== e && e.index === i.new && (t[s] = void 0)
|
|
}
|
|
}
|
|
}
|
|
this._items = t.filter(e => void 0 !== e).sort((e, t) => e.index - t.index), this
|
|
._invalidateSearchCaches(), this._minMaxCache.clear(), this._start = 0, this
|
|
._end = this._items.length
|
|
}
|
|
remove(e) {
|
|
if (this._shareRead) return a.logDebug(
|
|
"remove: readonly collection modification attempt"), null;
|
|
const t = this._nonCachedSearch(e, l.NearestRight, c);
|
|
if (null === t) return null;
|
|
const i = this._items.splice(t);
|
|
return this._end = this._items.length, this._minMaxCache.clear(), this
|
|
._invalidateSearchCaches(), i.length > 0 ? i[0] : null
|
|
}
|
|
state() {
|
|
return {
|
|
start: this._start,
|
|
end: this._end,
|
|
data: this._items,
|
|
shareread: this._shareRead
|
|
}
|
|
}
|
|
restoreState(e) {
|
|
e ? (this._start = e.start, this._end = e.end, this._shareRead = e.shareread, this
|
|
._items = e.data, this._minMaxCache.clear(), this._invalidateSearchCaches()
|
|
) : this.clear()
|
|
}
|
|
_indexAt(e) {
|
|
return this._items[e].index
|
|
}
|
|
_valueAt(e) {
|
|
return this._items[e].value
|
|
}
|
|
_length() {
|
|
return this._items.length
|
|
}
|
|
_searchImpl(e, t, i, s, r, n) {
|
|
const o = void 0 !== n ? i : s,
|
|
a = void 0 !== n ? 1e4 * (t + 1) + n : t;
|
|
let l = o.get(e);
|
|
if (void 0 !== l) {
|
|
const e = l.get(a);
|
|
if (void 0 !== e) return e
|
|
}
|
|
const c = this._nonCachedSearch(e, t, r, n);
|
|
if (null === c) return null;
|
|
const h = {
|
|
index: this._indexAt(c),
|
|
value: this._valueAt(c)
|
|
};
|
|
return void 0 === l && (l = new Map, o.set(e, l)), l.set(a, h), h
|
|
}
|
|
_nonCachedSearch(e, t, i, s) {
|
|
const r = this._lowerbound(e, i),
|
|
n = r === this._end || e !== i(this._items[r]);
|
|
if (n && t !== l.Exact) switch (t) {
|
|
case l.NearestLeft:
|
|
return this._searchNearestLeft(r, s);
|
|
case l.NearestRight:
|
|
return this._searchNearestRight(r, s);
|
|
default:
|
|
throw new TypeError("Unknown search mode")
|
|
}
|
|
if (void 0 === s || n || t === l.Exact) return n ? null : r;
|
|
switch (t) {
|
|
case l.NearestLeft:
|
|
return this._nonEmptyNearestLeft(r, s);
|
|
case l.NearestRight:
|
|
return this._nonEmptyNearestRight(r, s);
|
|
default:
|
|
throw new TypeError("Unknown search mode")
|
|
}
|
|
}
|
|
_nonEmptyNearestRight(e, t) {
|
|
const i = Object(s.ensure)(this._emptyValuePredicate),
|
|
r = Object(s.ensure)(t);
|
|
for (; e < this._end && i(this._valueAt(e), r);) e += 1;
|
|
return e === this._end ? null : e
|
|
}
|
|
_nonEmptyNearestLeft(e, t) {
|
|
const i = Object(s.ensureNotNull)(this._emptyValuePredicate),
|
|
r = Object(s.ensure)(t);
|
|
for (; e >= this._start && i(this._valueAt(e), r);) e -= 1;
|
|
return e < this._start ? null : e
|
|
}
|
|
_searchNearestLeft(e, t) {
|
|
if (e === this._start) return null;
|
|
const i = e - 1,
|
|
s = i !== this._end ? i : null;
|
|
return void 0 !== t && null !== s ? this._nonEmptyNearestLeft(s, t) : s
|
|
}
|
|
_searchNearestRight(e, t) {
|
|
const i = e,
|
|
s = i !== this._end ? i : null;
|
|
return void 0 !== t && null !== s ? this._nonEmptyNearestRight(s, t) : s
|
|
}
|
|
_bsearch(e, t) {
|
|
const i = this._lowerbound(e, t);
|
|
return i !== this._end && e === t(this._items[i]) ? i : null
|
|
}
|
|
_lowerbound(e, t) {
|
|
return Object(r.lowerbound)(this._items, e, (e, i) => t(e) < i, this._start, this
|
|
._end)
|
|
}
|
|
_upperbound(e) {
|
|
return Object(r.upperbound)(this._items, e, (e, t) => t.index > e, this._start, this
|
|
._end)
|
|
}
|
|
_plotMinMax(e, t, i) {
|
|
let s = null;
|
|
const r = this._plotFunctions.get(i);
|
|
if (void 0 === r) throw new Error(`Plot "${i}" is not registered`);
|
|
for (let i = e; i < t; i++) {
|
|
const e = r(this._items[i].value);
|
|
null == e || Number.isNaN(e) || (null === s ? s = {
|
|
min: e,
|
|
max: e
|
|
} : (e < s.min && (s.min = e), e > s.max && (s.max = e)))
|
|
}
|
|
return s
|
|
}
|
|
_invalidateCacheForRow(e) {
|
|
const t = Math.floor(e.index / 30);
|
|
this._minMaxCache.forEach(e => e.delete(t))
|
|
}
|
|
_prepend(e) {
|
|
return Object(s.assert)(!this._shareRead, "collection should not be readonly"),
|
|
Object(s.assert)(0 !== e.length, "plotRows should not be empty"), this
|
|
._invalidateSearchCaches(), this._minMaxCache.clear(), this._items = e.concat(
|
|
this._items), this._start = 0, this._end = this._items.length, e[0]
|
|
}
|
|
_append(e) {
|
|
return Object(s.assert)(!this._shareRead, "collection should not be readonly"),
|
|
Object(s.assert)(0 !== e.length, "plotRows should not be empty"), this
|
|
._invalidateSearchCaches(), this._minMaxCache.clear(), this._items = this._items
|
|
.concat(e), this._start = 0, this._end = this._items.length, e[0]
|
|
}
|
|
_updateLast(e) {
|
|
Object(s.assert)(!this.isEmpty(), "plot list should not be empty");
|
|
const t = this._items[this._end - 1];
|
|
Object(s.assert)(t.index === e.index, "last row index should match new row index"),
|
|
this._invalidateCacheForRow(e), this._invalidateSearchCaches(), this._items[this
|
|
._end - 1] = e
|
|
}
|
|
_merge(e) {
|
|
return Object(s.assert)(0 !== e.length, "plot rows should not be empty"), this
|
|
._invalidateSearchCaches(), this._minMaxCache.clear(), this._items = p(this
|
|
._items, e), this._start = 0, this._end = this._items.length, e[0]
|
|
}
|
|
_minMaxOnRangeCachedImpl(e, t, i) {
|
|
if (this.isEmpty()) return null;
|
|
let r = null;
|
|
const n = Object(s.ensureNotNull)(this.firstIndex()),
|
|
o = Object(s.ensureNotNull)(this.lastIndex()),
|
|
a = Math.max(e, n),
|
|
l = Math.min(t, o),
|
|
c = 30 * Math.ceil(a / 30),
|
|
h = Math.max(c, 30 * Math.floor(l / 30));
|
|
r = d(r, this._minMaxOnRange(a, Math.min(c, t, l), i));
|
|
let u = this._minMaxCache.get(i);
|
|
void 0 === u && (u = new Map, this._minMaxCache.set(i, u));
|
|
for (let e = Math.max(c + 1, a); e < h; e += 30) {
|
|
const t = Math.floor(e / 30);
|
|
let s = u.get(t);
|
|
if (void 0 === s) {
|
|
const e = 30 * t,
|
|
r = 30 * (t + 1) - 1;
|
|
s = this._minMaxOnRange(e, r, i), u.set(t, s)
|
|
}
|
|
r = d(r, s)
|
|
}
|
|
r = d(r, this._minMaxOnRange(h, l, i));
|
|
return r
|
|
}
|
|
_minMaxOnRange(e, t, i) {
|
|
return this._plotMinMax(this._lowerbound(e, c), this._upperbound(t), i)
|
|
}
|
|
_invalidateSearchCaches() {
|
|
this._rowSearchCacheByIndex.clear(), this._rowSearchCacheByIndexWithoutEmptyValues
|
|
.clear(), this._rowSearchCacheByTime.clear(), this
|
|
._rowSearchCacheByTimeWithoutEmptyValues.clear()
|
|
}
|
|
}
|
|
|
|
function d(e, t) {
|
|
if (null === e) return t;
|
|
if (null === t) return e;
|
|
return {
|
|
min: Math.min(e.min, t.min),
|
|
max: Math.max(e.max, t.max)
|
|
}
|
|
}
|
|
|
|
function p(e, t) {
|
|
const i = function(e, t) {
|
|
const i = e.length,
|
|
s = t.length;
|
|
let r = i + s,
|
|
n = 0,
|
|
o = 0;
|
|
for (; n < i && o < s;) e[n].index < t[o].index ? n++ : e[n].index > t[o].index ?
|
|
o++ : (n++, o++, r--);
|
|
return r
|
|
}(e, t),
|
|
s = new Array(i);
|
|
let r = 0,
|
|
n = 0;
|
|
const o = e.length,
|
|
a = t.length;
|
|
let l = 0;
|
|
for (; r < o && n < a;) e[r].index < t[n].index ? (s[l] = e[r], r++) : e[r].index > t[n]
|
|
.index ? (s[l] = t[n], n++) : (s[l] = t[n], r++, n++), l++;
|
|
for (; r < o;) s[l] = e[r], r++, l++;
|
|
for (; n < a;) s[l] = t[n], n++, l++;
|
|
return s
|
|
}
|
|
},
|
|
kIXa: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Ss5c").LineDataSource,
|
|
r = i("Ocx9").DefaultProperty;
|
|
class n extends s {
|
|
constructor(e, t) {
|
|
super(e, t || n.createProperties()), i.e("lt-pane-views").then(i.t.bind(null,
|
|
"am+t", 7)).then(({
|
|
TimeCyclesPaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
pointsCount() {
|
|
return 2
|
|
}
|
|
name() {
|
|
return "Time Cycles"
|
|
}
|
|
setPoint(e, t, i) {
|
|
var s = Object.assign({}, t),
|
|
r = this._points[0],
|
|
n = this._points[1];
|
|
r.price = s.price, n.price = s.price, this._points[e] = s, this.normalizePoints()
|
|
}
|
|
addPoint(e, t, i) {
|
|
var r = s.prototype.addPoint.call(this, e, t, !0);
|
|
if (r) {
|
|
var n = this._points[0];
|
|
this._points[1].price = n.price, i || (this.normalizePoints(), this
|
|
.createServerPoints())
|
|
}
|
|
return r
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "BABJ")))
|
|
.TimeCyclesPatternDefinitionsViewModel
|
|
}
|
|
static createProperties(e) {
|
|
var t = new r("linetooltimecycles", e);
|
|
return n._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
s._configureProperties(e)
|
|
}
|
|
}
|
|
t.LineToolTimeCycles = n
|
|
},
|
|
kNVT: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "setSymbolSearchCompleteOverrideFunction", (function() {
|
|
return r
|
|
})), i.d(t, "getSymbolSearchCompleteOverrideFunction", (function() {
|
|
return n
|
|
}));
|
|
let s = e => Promise.resolve(e);
|
|
|
|
function r(e) {
|
|
s = e
|
|
}
|
|
|
|
function n() {
|
|
return s
|
|
}
|
|
},
|
|
kcTO: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "formatterOptions", (function() {
|
|
return l
|
|
})), i.d(t, "numberToStringWithLeadingZero", (function() {
|
|
return c
|
|
})), i.d(t, "isFormatterHasForexAdditionalPrecision", (function() {
|
|
return h
|
|
})), i.d(t, "PriceFormatter", (function() {
|
|
return u
|
|
}));
|
|
var s = i("YFKU"),
|
|
r = i("ogJP"),
|
|
n = i("Ialn"),
|
|
o = i("txPx");
|
|
const a = Object(o.getLogger)("Chart.PriceFormatter"),
|
|
l = {
|
|
decimalSign: ".",
|
|
decimalSignFractional: "'"
|
|
};
|
|
|
|
function c(e, t) {
|
|
if (!Object(r.isNumber)(e)) return "n/a";
|
|
if (!Object(r.isInteger)(t)) throw new TypeError("invalid length");
|
|
if (t < 0 || t > 16) throw new TypeError("invalid length");
|
|
if (0 === t) return e.toString();
|
|
return ("0000000000000000" + e.toString()).slice(-t)
|
|
}
|
|
|
|
function h(e) {
|
|
return "hasForexAdditionalPrecision" in e
|
|
}
|
|
class u {
|
|
constructor(e, t, i, n) {
|
|
if (this.type = "price", this._formatterErrors = {
|
|
custom: Object(s.t)("Price format is invalid."),
|
|
fraction: Object(s.t)("Fraction part is invalid."),
|
|
secondFraction: Object(s.t)("Second fraction part is invalid.")
|
|
}, t || (t = 1), Object(r.isNumber)(e) && Object(r.isInteger)(e) || (e = 100),
|
|
e < 0) throw new TypeError("invalid base");
|
|
this._priceScale = e, this._minMove = t, this._minMove2 = n, i && void 0 !== n &&
|
|
n > 0 && 2 !== n && 4 !== n && 8 !== n ? a.logDebug("invalid minmove2") : (this
|
|
._fractional = i, this.calculateDecimal())
|
|
}
|
|
isFractional() {
|
|
return !!this._fractional
|
|
}
|
|
state() {
|
|
return {
|
|
fractional: this._fractional,
|
|
fractionalLength: this._fractionalLength,
|
|
minMove: this._minMove,
|
|
minMove2: this._minMove2,
|
|
priceScale: this._priceScale
|
|
}
|
|
}
|
|
calculateDecimal() {
|
|
if (this._fractionalLength = 0, this._priceScale > 0 && this._minMove > 0) {
|
|
let e = this._priceScale;
|
|
for (this._fractional && this._minMove2 && (e /= this._minMove2); e > 1;) e /=
|
|
10, this._fractionalLength++
|
|
}
|
|
}
|
|
format(e, t, i, s = !0, r = !0) {
|
|
let o, a = "";
|
|
return e < 0 ? (a = !1 === s ? "" : "−", e = -e) : e && !0 === t && (a = "+"), o =
|
|
this._fractional ? a + this._formatAsFractional(e, i) : a + this
|
|
._formatAsDecimal(e, i), r ? Object(n.forceLTRStr)(o) : o
|
|
}
|
|
parse(e) {
|
|
return e = (e = Object(n.stripLTRMarks)(e)).replace("−", "-"), this._fractional ?
|
|
this._minMove2 ? this._parseAsDoubleFractional(e) : this
|
|
._parseAsSingleFractional(e) : this._parseAsDecimal(e)
|
|
}
|
|
hasForexAdditionalPrecision() {
|
|
return !this._fractional && 10 === this._minMove2
|
|
}
|
|
static serialize(e) {
|
|
return e.state()
|
|
}
|
|
static deserialize(e) {
|
|
return new u(e.priceScale, e.minMove, e.fractional, e.minMove2)
|
|
}
|
|
_formatAsDecimal(e, t) {
|
|
//格式化价格
|
|
if (this.type == "price") {
|
|
var price = "0.00";
|
|
//如果价格大于1则保留2位小数
|
|
if (e > 1) {
|
|
price = e.toFixed(2)
|
|
} else {
|
|
//否则
|
|
let splitList = e.toString().split(".")
|
|
let num = 0
|
|
if (splitList[1]) {
|
|
for (var i = 0; i < splitList[1].length; i++) {
|
|
if (splitList[1][i] == "0") {
|
|
num++
|
|
} else {
|
|
//如果不为0了 直接中断
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (num >= 4) {
|
|
var last = "" + splitList[1].substring(num, splitList[1].length)
|
|
if (last.length >= 5) {
|
|
if (parseInt(last[4]) >= 5) {
|
|
price = '0.0{' + num + '}' + (parseInt(last[0] + last[1] + last[2] + last[
|
|
3]) + 1)
|
|
} else {
|
|
price = '0.0{' + num + '}' + last[0] + last[1] + last[2] + last[3]
|
|
}
|
|
} else {
|
|
price = '0.0{' + num + '}' + last
|
|
}
|
|
} else {
|
|
price = Number(e).toFixed(5)
|
|
}
|
|
|
|
}
|
|
return price
|
|
} else {
|
|
let i;
|
|
t = t || 0, i = this._fractional ? Math.pow(10, this._fractionalLength || 0) :
|
|
Math
|
|
.pow(10, t) * this._priceScale / this._minMove;
|
|
const s = 1 / i;
|
|
let r;
|
|
if (i > 1) r = Math.floor(e);
|
|
else {
|
|
const t = Math.floor(Math.round(e / s) * s);
|
|
r = 0 === Math.round((e - t) / s) ? t : t + s
|
|
}
|
|
let n = "";
|
|
if (i > 1) {
|
|
let s = +(Math.round(e * i) - r * i).toFixed(this._fractionalLength);
|
|
s >= i && (s -= i, r += 1);
|
|
const o = void 0 !== this._fractionalLength ? this._fractionalLength : NaN;
|
|
n = l.decimalSign + c(+s.toFixed(this._fractionalLength) * this._minMove,
|
|
o +
|
|
t), n = this._removeEndingZeros(n, t)
|
|
}
|
|
return r.toString() + n
|
|
}
|
|
}
|
|
_getFractPart(e, t) {
|
|
const i = [0, 5],
|
|
s = [0, 2, 5, 7];
|
|
return 2 === t ? void 0 === i[e] ? -1 : i[e] : 4 === t ? void 0 === s[e] ? -1 : s[
|
|
e] : e
|
|
}
|
|
_formatAsFractional(e, t) {
|
|
const i = this._priceScale / this._minMove;
|
|
let s = Math.floor(e),
|
|
r = t ? Math.floor(e * i) - s * i : Math.round(e * i) - s * i;
|
|
r === i && (r = 0, s += 1);
|
|
let n = "";
|
|
if (t) {
|
|
let o = (e - s - r / i) * i;
|
|
o = Math.round(o * Math.pow(10, t)), n = c(o, t), n = this._removeEndingZeros(n,
|
|
t)
|
|
}
|
|
if (!this._fractionalLength) throw new Error("_fractionalLength is not calculated");
|
|
let o = "";
|
|
if (this._minMove2) {
|
|
const e = r % this._minMove2;
|
|
r = (r - e) / this._minMove2;
|
|
const t = c(r, this._fractionalLength),
|
|
i = this._getFractPart(e, this._minMove2);
|
|
o = t + l.decimalSignFractional + i
|
|
} else r = this._getFractPart(r, this._priceScale), o = c(r * this._minMove, this
|
|
._fractionalLength);
|
|
return s.toString() + l.decimalSignFractional + o + n
|
|
}
|
|
_removeEndingZeros(e, t) {
|
|
for (let i = 0; i < t && "0" === e[e.length - 1]; i++) e = e.substr(0, e.length -
|
|
1);
|
|
return e
|
|
}
|
|
_parseAsDecimal(e) {
|
|
let t = new RegExp(/^(-?)[0-9]+$/).exec(e);
|
|
if (t) {
|
|
const t = parseFloat(e);
|
|
return {
|
|
value: t,
|
|
res: !0,
|
|
suggest: this.format(t)
|
|
}
|
|
}
|
|
if (t = new RegExp("^(-?)[0-9]+\\" + l.decimalSign + "[0-9]*$").exec(e), t) {
|
|
const t = parseFloat(e.replace(l.decimalSign, "."));
|
|
return {
|
|
value: t,
|
|
res: !0,
|
|
suggest: this.format(t)
|
|
}
|
|
}
|
|
return {
|
|
error: this._formatterErrors.custom,
|
|
res: !1
|
|
}
|
|
}
|
|
_patchFractPart(e, t) {
|
|
const i = {
|
|
0: 0,
|
|
5: 1
|
|
},
|
|
s = {
|
|
0: 0,
|
|
2: 1,
|
|
5: 2,
|
|
7: 3
|
|
};
|
|
return 2 === t ? void 0 === i[e] ? -1 : i[e] : 4 === t ? void 0 === s[e] ? -1 : s[
|
|
e] : e
|
|
}
|
|
_parseAsSingleFractional(e) {
|
|
let t = new RegExp(/^(-?)[0-9]+$/).exec(e);
|
|
if (t) {
|
|
const t = parseFloat(e);
|
|
return {
|
|
value: t,
|
|
res: !0,
|
|
suggest: this.format(t)
|
|
}
|
|
}
|
|
if (t = new RegExp("^(-?)([0-9]+)\\" + l.decimalSignFractional + "([0-9]+)$").exec(
|
|
e), t) {
|
|
const e = !!t[1],
|
|
i = parseInt(t[2]),
|
|
s = this._priceScale,
|
|
r = this._patchFractPart(parseInt(t[3]), s);
|
|
if (r >= s || r < 0) return {
|
|
error: this._formatterErrors.fraction,
|
|
res: !1
|
|
};
|
|
let n = i + r / s;
|
|
return e && (n = -n), {
|
|
value: n,
|
|
res: !0,
|
|
suggest: this.format(n)
|
|
}
|
|
}
|
|
return {
|
|
error: this._formatterErrors.custom,
|
|
res: !1
|
|
}
|
|
}
|
|
_parseAsDoubleFractional(e) {
|
|
let t = new RegExp(/^(-?)[0-9]+$/).exec(e);
|
|
if (t) {
|
|
const t = parseFloat(e);
|
|
return {
|
|
value: t,
|
|
res: !0,
|
|
suggest: this.format(t)
|
|
}
|
|
}
|
|
if (t = new RegExp("^(-?)([0-9]+)\\" + l.decimalSignFractional + "([0-9]+)\\" + l
|
|
.decimalSignFractional + "([0-9]+)$").exec(e), t) {
|
|
const e = !!t[1],
|
|
i = parseInt(t[2]),
|
|
s = void 0 !== this._minMove2 ? this._minMove2 : NaN,
|
|
r = this._priceScale / s,
|
|
n = this._minMove2,
|
|
o = this._patchFractPart(parseInt(t[3]), r),
|
|
a = this._patchFractPart(parseInt(t[4]), n);
|
|
if (o >= r || o < 0) return {
|
|
error: this._formatterErrors.fraction,
|
|
res: !1
|
|
};
|
|
if (void 0 !== n && a >= n || a < 0) return {
|
|
error: this._formatterErrors.secondFraction,
|
|
res: !1
|
|
};
|
|
let l = void 0 !== n ? i + o / r + a / (r * n) : NaN;
|
|
return e && (l = -l), {
|
|
value: l,
|
|
res: !0,
|
|
suggest: this.format(l)
|
|
}
|
|
}
|
|
return {
|
|
error: this._formatterErrors.custom,
|
|
res: !1
|
|
}
|
|
}
|
|
}
|
|
},
|
|
krs7: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("Eyy1"),
|
|
r = i("O+9b"),
|
|
n = i("ocLq"),
|
|
o = i("KG+6"),
|
|
a = i("LxhU"),
|
|
l = i("8LSp"),
|
|
c = i("aR4w"),
|
|
h = i("WYmP");
|
|
class u extends c.a {
|
|
constructor(e, t, i, s, r, n, o, a, l, c, u) {
|
|
super(e, t, i, n, new h.a, o, !0, a, l, () => c, u, s, r, !1), this
|
|
._firstBarTime = s, this._lastBarTime = r
|
|
}
|
|
update(e) {
|
|
this._supplyRowsLayout(this._ctx), this.timeInRequestedRange(e) && super.update(
|
|
e)
|
|
}
|
|
timeInRequestedRange(e) {
|
|
const t = this._timeScale().get(e);
|
|
return this._firstBarTime <= t && t < this._lastBarTime
|
|
}
|
|
}
|
|
var d = i("iu9X"),
|
|
p = i("c7G1"),
|
|
_ = i("hXqA"),
|
|
m = i("WTyR"),
|
|
f = i("rWtV");
|
|
i.d(t, "VolumeProfileVisibleRange", (function() {
|
|
return g
|
|
})), i.d(t, "volumeProfileVisibleRangeStudyItem", (function() {
|
|
return b
|
|
}));
|
|
class g extends r.a {
|
|
constructor() {
|
|
super(...arguments), this._rowsLayout = "Number Of Rows", this._rowSize = 24,
|
|
this._volume = "Up/Down", this._firstBarTime = 0, this._lastBarTime = 0,
|
|
this._vaVolumePercent = 70, this._anInt = 0, this._eraseCmds = []
|
|
}
|
|
nextGraphicsObjId() {
|
|
return ++this._anInt
|
|
}
|
|
pushEraseObjCmd(e, t) {
|
|
this._eraseCmds.push(new p.b(e, t))
|
|
}
|
|
popEraseCmds() {
|
|
const e = this._eraseCmds;
|
|
return this._eraseCmds = [], e
|
|
}
|
|
init(e, t) {
|
|
this._studyDataUpdate = new _.a(!0),
|
|
this._hists = new l.a, this._pocLines = new h.a, this._valueAreaHists =
|
|
new l.a;
|
|
const i = new d.b;
|
|
i.getObjsContainer("hhists").push(new d.a("histBars2", this._hists)), i
|
|
.getObjsContainer("hhists").push(new d.a("histBarsVA", this
|
|
._valueAreaHists)), i.getObjsContainer("horizlines").push(new d.a(
|
|
"pocLines", this._pocLines)), this._studyDataUpdate.init(i), this
|
|
._rowsLayout = t(0), this._rowSize = t(1), this._volume = t(2), this
|
|
._firstBarTime = t(3), this._lastBarTime = t(4), this._vaVolumePercent = t(
|
|
5), this.verifyRowSizeInput(this._rowSize, this._rowsLayout), this
|
|
._originalResolution = a.Interval.parse(e.symbol.interval + e.symbol
|
|
.resolution);
|
|
const n = this._lastBarTime + this._originalResolution.inMilliseconds(this
|
|
._lastBarTime);
|
|
0 === this._firstBarTime && 0 === this._lastBarTime ? this._basicResolution =
|
|
this._originalResolution : this._basicResolution = this
|
|
.findBasicResolutionForFromTo(this._originalResolution, this._firstBarTime,
|
|
n, Object(s.ensureDefined)(e.symbol.info)), this._hasSecondarySymbol = !
|
|
this._originalResolution.isEqualTo(this._basicResolution), this
|
|
._hasSecondarySymbol && e.new_sym(e.symbol.tickerid, this._basicResolution
|
|
.value());
|
|
const o = this._getRowsLayout(this._rowsLayout, this._rowSize);
|
|
this._vbPCheckHaveVolumeExpr = new m.a(this), this._volumeByPriceExpr = new u(
|
|
Object(r.c)(this._volume), e, this, this._firstBarTime, n, this._hists,
|
|
this._pocLines, this._valueAreaHists, this._vaVolumePercent, o, Object(r
|
|
.b)()), this._volumeByPriceExpr.setIdsGeneratorProxy(this), this
|
|
._developingPocSeries = new f.a, this._developingVAHighSeries = new f.a,
|
|
this._developingVALowSeries = new f.a
|
|
}
|
|
main(e, t, i) {
|
|
this._hasSecondarySymbol && e.select_sym(1), this._timeSeries = e
|
|
.new_unlimited_var(), this._openSeries = e.new_unlimited_var(), this
|
|
._highSeries = e.new_unlimited_var(), this._lowSeries = e
|
|
.new_unlimited_var(), this._closeSeries = e.new_unlimited_var(), this
|
|
._volumeSeries = e.new_unlimited_var();
|
|
const r = {
|
|
type: "composite",
|
|
data: []
|
|
};
|
|
if (i && i.period === this._basicResolution.value() && (this._timeSeries.set(n
|
|
.Std.time(e)), this._openSeries.set(n.Std.open(e)), this._highSeries
|
|
.set(n.Std.high(e)), this._lowSeries.set(n.Std.low(e)), this
|
|
._closeSeries.set(n.Std.close(e)), this._volumeSeries.set(n.Std.volume(
|
|
e)), this._developingPocSeries.addHist(n.Std.time(e)), this
|
|
._developingVAHighSeries.addHist(n.Std.time(e)), this
|
|
._developingVALowSeries.addHist(n.Std.time(e)), this
|
|
._vbPCheckHaveVolumeExpr.update(0, e.symbol.isLastBar), this
|
|
._volumeByPriceExpr.update(0), this._developingPocSeries
|
|
.removeLastIfNaN(), this._developingVAHighSeries.removeLastIfNaN(), this
|
|
._developingVALowSeries.removeLastIfNaN(), e.symbol.isLastBar)) {
|
|
this._studyDataUpdate.setEraseCmds(this.popEraseCmds()), this
|
|
._studyDataUpdate.update();
|
|
const e = this._studyDataUpdate.getUpdate();
|
|
e.json && r.data.push({
|
|
nonseries: !0,
|
|
type: "study_graphics",
|
|
data: e.json
|
|
}), e.jsonUpdate && r.data.push({
|
|
nonseries: !0,
|
|
type: "study_graphics",
|
|
data: e.jsonUpdate
|
|
})
|
|
}
|
|
if (this._hasSecondarySymbol && e.select_sym(0), i && i.period === this
|
|
._originalResolution.value()) {
|
|
Object(s.assert)(e.symbol.time === i.time);
|
|
const t = i.time,
|
|
n = t + this._originalResolution.inMilliseconds(t) - 1;
|
|
if (t && t >= this._firstBarTime) {
|
|
const e = this._developingPocSeries.getLeftOrEqual(n),
|
|
t = this._developingVAHighSeries.getLeftOrEqual(n),
|
|
i = this._developingVALowSeries.getLeftOrEqual(n);
|
|
r.data.push([e, t, i])
|
|
} else r.data.push([NaN, NaN, NaN])
|
|
}
|
|
return r
|
|
}
|
|
time() {
|
|
return this._timeSeries
|
|
}
|
|
open() {
|
|
return this._openSeries
|
|
}
|
|
high() {
|
|
return this._highSeries
|
|
}
|
|
low() {
|
|
return this._lowSeries
|
|
}
|
|
close() {
|
|
return this._closeSeries
|
|
}
|
|
volume() {
|
|
return this._volumeSeries
|
|
}
|
|
developingPoc() {
|
|
return this._developingPocSeries
|
|
}
|
|
developingVAHigh() {
|
|
return this._developingVAHighSeries
|
|
}
|
|
developingVALow() {
|
|
return this._developingVALowSeries
|
|
}
|
|
}
|
|
const b = {
|
|
constructor: g,
|
|
name: "Volume Profile Visible Range",
|
|
metainfo: {
|
|
_metainfoVersion: 51,
|
|
id: "VbPVisible@tv-basicstudies-49",
|
|
description: "Volume Profile Visible Range",
|
|
shortDescription: "VPVR",
|
|
format: {
|
|
type: "volume"
|
|
},
|
|
is_price_study: !0,
|
|
linkedToSeries: !0,
|
|
palettes: {},
|
|
inputs: [{
|
|
id: "rowsLayout",
|
|
name: "Rows Layout",
|
|
defval: "Number Of Rows",
|
|
options: ["Number Of Rows", "Ticks Per Row"],
|
|
type: "text"
|
|
}, {
|
|
id: "rows",
|
|
name: "Row Size",
|
|
defval: 24,
|
|
max: 1e6,
|
|
min: 1,
|
|
type: "integer"
|
|
}, {
|
|
id: "volume",
|
|
name: "Volume",
|
|
defval: "Up/Down",
|
|
options: ["Up/Down", "Total"],
|
|
type: "text"
|
|
}, {
|
|
id: "first_visible_bar_time",
|
|
name: "First Visible Bar Time",
|
|
defval: 0,
|
|
isHidden: !0,
|
|
max: 253370764800,
|
|
min: -253370764800,
|
|
type: "time"
|
|
}, {
|
|
id: "last_visible_bar_time",
|
|
name: "Last Visible Bar Time",
|
|
defval: 0,
|
|
isHidden: !0,
|
|
max: 253370764800,
|
|
min: -253370764800,
|
|
type: "time"
|
|
}, {
|
|
id: "vaVolume",
|
|
name: "Value Area Volume",
|
|
defval: 70,
|
|
max: 100,
|
|
min: 0,
|
|
type: "integer"
|
|
}],
|
|
plots: [{
|
|
id: "developingPoc",
|
|
type: "line"
|
|
}, {
|
|
id: "developingVAHigh",
|
|
type: "line"
|
|
}, {
|
|
id: "developingVALow",
|
|
type: "line"
|
|
}],
|
|
graphics: {
|
|
hhists: {
|
|
histBars2: {
|
|
location: o.b.Relative,
|
|
title: "Volume Profile",
|
|
titles: ["Up Volume", "Down Volume"]
|
|
},
|
|
histBarsVA: {
|
|
location: o.b.Relative,
|
|
title: "Value Area",
|
|
titles: ["Value Area Up", "Value Area Down"]
|
|
}
|
|
},
|
|
horizlines: {
|
|
pocLines: {
|
|
name: "POC",
|
|
showPrice: !0
|
|
}
|
|
}
|
|
},
|
|
defaults: {
|
|
graphics: {
|
|
hhists: {
|
|
histBars2: {
|
|
colors: ["#1592e6", "#fbc123"],
|
|
direction: o.a.RightToLeft,
|
|
percentWidth: 30,
|
|
showValues: !1,
|
|
transparencies: [76, 76],
|
|
valuesColor: "#424242",
|
|
visible: !0
|
|
},
|
|
histBarsVA: {
|
|
colors: ["#1592e6", "#fbc123"],
|
|
direction: o.a.RightToLeft,
|
|
percentWidth: 30,
|
|
showValues: !1,
|
|
transparencies: [30, 30],
|
|
valuesColor: "#424242",
|
|
visible: !0
|
|
}
|
|
},
|
|
horizlines: {
|
|
pocLines: {
|
|
color: "#ff0000",
|
|
style: 0,
|
|
visible: !0,
|
|
width: 2
|
|
}
|
|
}
|
|
},
|
|
inputs: {
|
|
first_visible_bar_time: 0,
|
|
last_visible_bar_time: 0,
|
|
rows: 24,
|
|
rowsLayout: "Number Of Rows",
|
|
vaVolume: 70,
|
|
volume: "Up/Down"
|
|
},
|
|
styles: {
|
|
developingPoc: {
|
|
color: "#ff0000",
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 9,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !1
|
|
},
|
|
developingVAHigh: {
|
|
color: "#0000ff",
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 9,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !1
|
|
},
|
|
developingVALow: {
|
|
color: "#0000ff",
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 9,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !1
|
|
}
|
|
}
|
|
},
|
|
styles: {
|
|
developingPoc: {
|
|
histogramBase: 0,
|
|
title: "Developing Poc"
|
|
},
|
|
developingVAHigh: {
|
|
histogramBase: 0,
|
|
title: "Developing VA High"
|
|
},
|
|
developingVALow: {
|
|
histogramBase: 0,
|
|
title: "Developing VA Low"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"l+oz": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "ChartSaverBase", (function() {
|
|
return s
|
|
}));
|
|
class s {
|
|
constructor(e) {
|
|
this._chartWidgetCollection = e
|
|
}
|
|
_getCommonSavingInfo(e) {
|
|
const t = this._chartWidgetCollection,
|
|
i = this._chartWidgetCollection.chartsSymbols(),
|
|
s = i[t.activeChartWidget.value().id()],
|
|
r = {
|
|
...(n = s, {
|
|
...n,
|
|
legs: JSON.stringify(null !== (o = n.legs) && void 0 !== o ? o : [])
|
|
})
|
|
};
|
|
var n, o;
|
|
const a = t.metaInfo;
|
|
return a.id.value() && (r.id = a.id.value()), r.name = a.name.value() || "", r
|
|
.description = a.description.value() || "", r.charts_symbols = function(e) {
|
|
const t = {};
|
|
for (const i of Object.keys(e)) t[i] = {
|
|
symbol: e[i].symbol
|
|
};
|
|
return JSON.stringify(t)
|
|
}(i), r.is_realtime = r.is_realtime = e ? "0" : "1", r
|
|
}
|
|
}
|
|
},
|
|
l4sv: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "HorizontalLineRenderer", (function() {
|
|
return a
|
|
}));
|
|
var s = i("VdBB"),
|
|
r = i("jFln"),
|
|
n = i("gAom"),
|
|
o = i("Zp/P");
|
|
class a {
|
|
constructor() {
|
|
this._data = null, this._hitTest = new s.HitTestResult(s.HitTestResult.REGULAR)
|
|
}
|
|
setData(e) {
|
|
this._data = e
|
|
}
|
|
setHitTest(e) {
|
|
this._hitTest = e
|
|
}
|
|
hitTest(e) {
|
|
if (null === this._data || !1 === this._data.visible) return null;
|
|
const t = Object(o.interactionTolerance)().line,
|
|
i = Math.abs(e.y - this._data.y) <= t + this._data.linewidth / 2,
|
|
s = void 0 === this._data.left || this._data.left - e.x <= t,
|
|
r = void 0 === this._data.right || e.x - this._data.right <= t;
|
|
return i && s && r ? this._hitTest : null
|
|
}
|
|
draw(e, t) {
|
|
if (null === this._data) return;
|
|
if (!1 === this._data.visible) return;
|
|
if (this._data.y < -this._data.linewidth / 2 || this._data.y > t.cssHeight + this
|
|
._data.linewidth / 2) return;
|
|
const i = t.pixelRatio;
|
|
e.lineCap = "butt", e.strokeStyle = this._data.color, e.lineWidth = Math.max(1, Math
|
|
.floor(this._data.linewidth * i)), void 0 !== this._data.linestyle &&
|
|
Object(r.setLineStyle)(e, this._data.linestyle);
|
|
const s = void 0 !== this._data.left ? Math.max(this._data.left, 0) : 0,
|
|
o = void 0 !== this._data.right ? Math.min(this._data.right, t.cssWidth) : t
|
|
.cssWidth,
|
|
a = Math.round(this._data.y * i),
|
|
l = Math.floor(s * i),
|
|
c = Math.ceil(o * i);
|
|
Object(n.drawHorizontalLine)(e, a, l, c)
|
|
}
|
|
}
|
|
},
|
|
l7y7: function(e, t) {
|
|
e.exports =
|
|
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 11" width="22" height="11"><path fill="#2962FF" d="M5 0H0v4h5v7h4V0H5zm7 4a2 2 0 1 0 0-4 2 2 0 0 0 0 4zm5 7h-5l4.5-11h4.99L17 11z"/></svg>'
|
|
},
|
|
lA7n: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("Kxc7"),
|
|
r = i("ulZB");
|
|
class n extends r.b {
|
|
constructor(e, t) {
|
|
super(e, t, "FAVORITE_CHARTS_CHANGED", "loadChartDialog.favorites", {})
|
|
}
|
|
}
|
|
var o = i("zUrt"),
|
|
a = i("FBuY"),
|
|
l = i("Vdly"),
|
|
c = i("/z0S"),
|
|
h = i("sQaR");
|
|
i.d(t, "LoadChartService", (function() {
|
|
return u
|
|
}));
|
|
class u extends h.a {
|
|
constructor(e = null) {
|
|
super(), this._favoriteChartsService = new n(a.TVXWindowEvents, l), this
|
|
._chartWidgetCollection = null, this._promise = null, this._dialog = null,
|
|
this._subscribe = e => {
|
|
this._setVisibility(e)
|
|
}, this._getChartEntry = e => ({
|
|
id: e.id,
|
|
url: e.url,
|
|
title: e.name,
|
|
symbol: e.short_symbol,
|
|
interval: e.interval,
|
|
toolsCount: 0,
|
|
modified: e.modified_iso,
|
|
active: () => this._isActiveChart(e.id),
|
|
openAction: () => o.backend.loadChart(e),
|
|
deleteAction: () => o.backend.removeChart(e.image_url).then(() =>
|
|
this._deleteChart(e.id)),
|
|
favoriteAction: this._updateFavorites
|
|
}), this._updateFavorites = e => this._favoriteChartsService.set(e), this
|
|
._isActiveChart = e => null !== this._chartWidgetCollection && e === this
|
|
._chartWidgetCollection.metaInfo.id.value(), this._deleteChart = e => {
|
|
this._isActiveChart(e) && (s.enabled("saveload_storage_customization") ?
|
|
null !== this._chartWidgetCollection && this
|
|
._chartWidgetCollection.clearChartMetaInfo() : location.href =
|
|
"/chart/" + location.search)
|
|
}, this._chartWidgetCollection = e
|
|
}
|
|
showLoadDialog() {
|
|
Object(c.a)(this._showLoadDialog.bind(this), {
|
|
source: "Load chart",
|
|
sourceMeta: "Chart"
|
|
})
|
|
}
|
|
show() {
|
|
this.showLoadDialog()
|
|
}
|
|
hide() {
|
|
var e, t;
|
|
null === (e = this._dialog) || void 0 === e || e.hide(), null === (t = this
|
|
._dialog) || void 0 === t || t.visible().unsubscribe(this._subscribe)
|
|
}
|
|
_showLoadDialog() {
|
|
(s.enabled("saveload_requires_authentication") && !window.is_authenticated ?
|
|
Promise.resolve([]) : o.backend.getCharts()).then(e => e.map(this
|
|
._getChartEntry)).then(e => {
|
|
const t = this._promise = Promise.all([i.e("redux"), i.e("react"), i
|
|
.e(1), i.e(3), i.e(4), i.e(6), i.e(8), i.e(9), i.e(12),
|
|
i.e(19), i.e(22), i.e(24), i.e(63), i.e(80), i.e(0), i
|
|
.e(2), i.e(5), i.e(7), i.e(10), i.e(18), i.e(20), i.e(
|
|
56), i.e("load-chart-dialog")
|
|
]).then(i.bind(null, "EgWQ")).then(i => {
|
|
if (this._promise === t) {
|
|
this._dialog && (this._dialog.hide(), this._dialog
|
|
.visible().unsubscribe(this._subscribe));
|
|
const t = {
|
|
charts: e,
|
|
favoriteChartsService: this
|
|
._favoriteChartsService,
|
|
chartWidgetCollection: this
|
|
._chartWidgetCollection
|
|
};
|
|
this._dialog = new i.LoadChartDialogRenderer(t),
|
|
this._dialog.visible().subscribe(this
|
|
._subscribe), this._dialog.show()
|
|
}
|
|
})
|
|
})
|
|
}
|
|
}
|
|
},
|
|
lCO3: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "Version", (function() {
|
|
return r
|
|
}));
|
|
var s = i("Eyy1");
|
|
class r {
|
|
constructor(e, t) {
|
|
this._major = e, this._minor = t
|
|
}
|
|
major() {
|
|
return this._major
|
|
}
|
|
minor() {
|
|
return this._minor
|
|
}
|
|
isZero() {
|
|
return 0 === this._major && 0 === this._minor
|
|
}
|
|
toString() {
|
|
return this._major + "." + this._minor
|
|
}
|
|
compareTo(e) {
|
|
return this._major < e._major ? -1 : this._major > e._major ? 1 : this._minor < e
|
|
._minor ? -1 : this._minor > e._minor ? 1 : 0
|
|
}
|
|
isLess(e) {
|
|
return this.compareTo(e) < 0
|
|
}
|
|
isLessOrEqual(e) {
|
|
return this.compareTo(e) <= 0
|
|
}
|
|
isEqual(e) {
|
|
return 0 === this.compareTo(e)
|
|
}
|
|
isGreater(e) {
|
|
return this.compareTo(e) > 0
|
|
}
|
|
isGreaterOrEqual(e) {
|
|
return this.compareTo(e) >= 0
|
|
}
|
|
static parse(e) {
|
|
if (e instanceof r) return new r(e.major(), e.minor());
|
|
if ("number" == typeof e) return Object(s.assert)(Math.floor(e) === e,
|
|
"Version should not be a float number"), new r(e, 0);
|
|
if ("string" == typeof e) {
|
|
const t = e.split(".");
|
|
if (1 === t.length) {
|
|
const i = parseInt(t[0], 10);
|
|
return Object(s.assert)(!isNaN(i), "Bad version string: " + e), new r(i, 0)
|
|
}
|
|
if (2 === t.length) {
|
|
const i = parseInt(t[0], 10);
|
|
Object(s.assert)(!isNaN(i), "Bad version string: " + e);
|
|
const n = parseInt(t[1], 10);
|
|
return Object(s.assert)(!isNaN(n), "Bad version string: " + e), new r(i, n)
|
|
}
|
|
throw new Error("Bad version string (one dot expected): " + e)
|
|
}
|
|
throw new Error("Bad version: " + e)
|
|
}
|
|
}
|
|
r.ZERO = new r(0, 0)
|
|
},
|
|
lJvs: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("aO4+").Point,
|
|
r = i("vAx0").ESDPaneView,
|
|
n = i("fTGZ").BarsMarksContainer,
|
|
o = i("mMWL"),
|
|
a = i("FQhm"),
|
|
l = i("zDbI").CHART_FONT_FAMILY,
|
|
c = i("Tmoa").generateColor,
|
|
h = i("XlJ7").makeFont;
|
|
class u extends r {
|
|
constructor(e, t, i) {
|
|
super(e, t, i), this.source = t, this.stylesCache = {}, this.templatesCache = {},
|
|
this._lollipops = {}, this._lollipopsCounter = 0, this._itemIndexToId = new Map,
|
|
this._createLollipops()
|
|
}
|
|
_createLollipops() {
|
|
var e = this.source._model.timeScale(),
|
|
t = r.prototype._getY.call(this.source),
|
|
i = this.source._model.lastHittestData(),
|
|
n = this.source._model.hoveredSource(),
|
|
o = this;
|
|
Object.keys(this.source._marks).forEach((function(r) {
|
|
var a = this.source._marks[r],
|
|
l = a.id,
|
|
c = a.index;
|
|
if (null !== c) {
|
|
var h = l === o.getLastClickedLollipopId(),
|
|
u = void 0 !== o._lollipops[l] ? o._lollipops[l].itemIndex :
|
|
o._lollipopsCounter++;
|
|
o._itemIndexToId.has(u) || o._itemIndexToId.set(u, l);
|
|
var d = n === this.source && null !== i && i.activeItem === u;
|
|
o._lollipops[l] = {
|
|
id: l,
|
|
itemIndex: u,
|
|
basePoint: new s(e.indexToCoordinate(c) + 1, t),
|
|
hovered: d,
|
|
active: h,
|
|
barY: null,
|
|
label: a.label,
|
|
color: a.color,
|
|
items: a.tooltip,
|
|
visible: !0
|
|
}
|
|
}
|
|
}), this), r.prototype._createRenderers.call(this)
|
|
}
|
|
createTooltipContent(e) {
|
|
return e.items ? {
|
|
title: e.items[0],
|
|
subTitle: e.items[1],
|
|
style: {
|
|
color: e.color
|
|
}
|
|
} : null
|
|
}
|
|
clearCaches() {
|
|
this.clearLastClicked(), this._lollipops = {}, this._lollipopsCounter = 0
|
|
}
|
|
update() {
|
|
this._createLollipops(), this._invalidated = !1
|
|
}
|
|
renderer() {
|
|
return this.update(), r.prototype.renderer.call(this)
|
|
}
|
|
_generateStyle(e, t, i) {
|
|
var s = e + t + i;
|
|
if (!(s in this.stylesCache)) {
|
|
var r = "hovered" === e,
|
|
n = "active" === e,
|
|
o = r || n,
|
|
a = "white";
|
|
n ? a = t : r && (a = c(t, 85)) === t && (n = !0);
|
|
var u = {
|
|
strokeStyle: t,
|
|
lineWidth: 1,
|
|
fillStyle: "white",
|
|
barLine: {
|
|
lineStyle: CanvasEx.LINESTYLE_DASHED
|
|
},
|
|
lollipop: {
|
|
width: 23,
|
|
height: 23,
|
|
lineWidth: 1.5,
|
|
bottom: 2,
|
|
fillStyle: a,
|
|
fillCircle: o,
|
|
strokeStyle: t,
|
|
text: {
|
|
label: i,
|
|
strokeStyle: n ? "white" : t,
|
|
font: h(12, l)
|
|
}
|
|
}
|
|
};
|
|
this.stylesCache[s] = u
|
|
}
|
|
return this.stylesCache[s]
|
|
}
|
|
getStyle(e) {
|
|
var t = e.active ? "active" : e.hovered ? "hovered" : "default";
|
|
return this._generateStyle(t, e.color, e.label)
|
|
}
|
|
createText(e, t) {
|
|
"string" == typeof e.items ? t.addTextLine(e.items) : Array.isArray(e.items) && e
|
|
.items.forEach((function(e) {
|
|
t.addTextLine(e)
|
|
}))
|
|
}
|
|
hasTooltip(e) {
|
|
return e.items && e.items.length
|
|
}
|
|
_getLollipopIdByIndex(e) {
|
|
return this._itemIndexToId.get(e)
|
|
}
|
|
}
|
|
e.exports = class extends n {
|
|
constructor(e) {
|
|
super(e), this.toolname = "UserDefinedTimescaleMarks";
|
|
var t = this;
|
|
o.hideMarksOnBars().subscribe(this, (function() {
|
|
t._properties.visible.setValue(!o.hideMarksOnBars().value())
|
|
})), this._paneView = new u(e, this, this._showTooltip.bind(this)), this
|
|
._requestedPointsets = new Set
|
|
}
|
|
_initialize(e) {
|
|
this._properties.visible.setValue(!0)
|
|
}
|
|
userEditEnabled() {
|
|
return !1
|
|
}
|
|
_plateViewData(e) {
|
|
return {
|
|
text: e.text
|
|
}
|
|
}
|
|
onClicked(e) {
|
|
var t = this._paneView._getLollipopIdByIndex(e.activeItem);
|
|
a.emit("onTimescaleMarkClick", t)
|
|
}
|
|
clearMarks() {
|
|
var e = this._model.chartApi();
|
|
if (e.connected()) {
|
|
var t = this;
|
|
Object.keys(this._marks).forEach((function(i) {
|
|
var s = t._getPointsetId(i);
|
|
e.removePointset(s)
|
|
}))
|
|
}
|
|
this._requestedPointsets.clear(), super.clearMarks(), this._paneView
|
|
.clearCaches(), this.onNeedRepaint.fire()
|
|
}
|
|
_getData(e) {
|
|
var t = this._model.mainSeries().symbolInfo();
|
|
if (t) {
|
|
var i = this.roundRange(this._rangeDifference(e)),
|
|
s = this,
|
|
r = this._model.mainSeries(),
|
|
n = r.seriesSource().symbolInstanceId(),
|
|
o = r.properties().interval.value();
|
|
ChartApiInstance.getTimescaleMarks(t, i.start, i.end, (function(t) {
|
|
var i = s._model.chartApi();
|
|
t.forEach((function(e) {
|
|
e.index = null;
|
|
var t = e.id,
|
|
r = s._getPointsetId(t),
|
|
a = s._marks[t];
|
|
if (a && null !== a.index && (a.tickmark ===
|
|
e.tickmark ? e.index = a.index : s
|
|
._requestedPointsets.has(r) && i
|
|
.connected() && (i.removePointset(
|
|
r), s._requestedPointsets
|
|
.delete(r))), s._marks[t] = e,
|
|
null === e.index && i.connected()) {
|
|
s._requestedPointsets.add(r);
|
|
var l = [
|
|
[e.tickmark, 0]
|
|
];
|
|
i.createPointset(r, "turnaround", n, o,
|
|
l, (function(e) {
|
|
s._onPointsetData(e)
|
|
}))
|
|
}
|
|
}), s), s._loadedRange = s._rangeUnion(e, s
|
|
._loadedRange), s.onNeedRepaint.fire()
|
|
}), o)
|
|
}
|
|
}
|
|
_getPointsetId(e) {
|
|
return "pointsetMark_" + e
|
|
}
|
|
_onPointsetData(e) {
|
|
var t = e.params.customId.split("_")[1],
|
|
i = this._marks[t],
|
|
s = e.params.plots;
|
|
i && 1 === s.length && (i.index = s[0].value[0])
|
|
}
|
|
updatePlateData(e, t) {
|
|
return t.barWidth = this.barWidth(), t.text = e.text, t.tooltipMargin = -1 *
|
|
Math.max(e.minSize / 2, .4 * this.barWidth()), t
|
|
}
|
|
hasContextMenu() {
|
|
return !1
|
|
}
|
|
paneViews() {
|
|
return this._properties.visible.value() ? [this._paneView] : []
|
|
}
|
|
_showTooltip(e, t) {
|
|
var s = t();
|
|
if (s) {
|
|
var r = this._model.timeScale(),
|
|
n = [r.onScroll(), r.barSpacingChanged(), this._model.mainSeries()
|
|
.onSymbolIntervalChanged()
|
|
],
|
|
o = this.onClickOutside.bind(this);
|
|
return Promise.all([i.e("react"), i.e(6), i.e(11), i.e(90), i.e(0), i.e(5),
|
|
i.e("lollipop-tooltip-renderer")
|
|
]).then(i.bind(null, "qKHM")).then((function({
|
|
showLollipopTooltip: t
|
|
}) {
|
|
t({
|
|
items: s,
|
|
position: e,
|
|
customCloseSubscriptions: n,
|
|
onClose: o,
|
|
onClickOutside: o
|
|
})
|
|
}))
|
|
}
|
|
}
|
|
onClickOutside(e) {
|
|
this._paneView.onClickOutside(e)
|
|
}
|
|
}
|
|
},
|
|
"lNN+": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineToolTrianglePattern", (function() {
|
|
return o
|
|
}));
|
|
var s = i("Ocx9"),
|
|
r = i("Ss5c"),
|
|
n = i("j3hX");
|
|
class o extends r.LineDataSource {
|
|
constructor(e, t) {
|
|
const s = t || o.createProperties();
|
|
super(e, s), i.e("lt-pane-views").then(i.bind(null, "Jej9")).then(t => {
|
|
this._setPaneViews([new t.LineToolTrianglePatternPaneView(this, e)])
|
|
})
|
|
}
|
|
pointsCount() {
|
|
return 4
|
|
}
|
|
name() {
|
|
return "Triangle Pattern"
|
|
}
|
|
properties() {
|
|
return super.properties()
|
|
}
|
|
static createProperties(e) {
|
|
const t = new s.DefaultProperty("linetooltrianglepattern", e);
|
|
return o._configureProperties(t), t
|
|
}
|
|
_getPropertyDefinitionsViewModelClass() {
|
|
return Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "/HOw")).then(
|
|
e => e.PatternWithBackgroundDefinitionViewModel)
|
|
}
|
|
static _configureProperties(e) {
|
|
r.LineDataSource._configureProperties(e), e.addChild("linesColors", new n
|
|
.LineToolColorsProperty([e.childs().color])), e.addChild("textsColors",
|
|
new n.LineToolColorsProperty([e.childs().textcolor])), e.addChild(
|
|
"backgroundsColors", new n.LineToolColorsProperty([e.childs()
|
|
.backgroundColor
|
|
]))
|
|
}
|
|
}
|
|
},
|
|
lReN: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineToolsGroupControllerApi", (function() {
|
|
return o
|
|
}));
|
|
var s = i("s1Gx"),
|
|
r = i("Eyy1"),
|
|
n = i("CW80");
|
|
class o {
|
|
constructor(e, t) {
|
|
this._controller = e, this._model = t
|
|
}
|
|
createGroupFromSelection() {
|
|
return this._controller.createGroupFromSelection().id
|
|
}
|
|
removeGroup(e) {
|
|
const t = Object(r.ensureDefined)(this._groupById(e));
|
|
this._controller.removeGroup(t)
|
|
}
|
|
groups() {
|
|
return this._controller.groups().map(e => e.id)
|
|
}
|
|
shapesInGroup(e) {
|
|
const t = Object(r.ensureDefined)(this._groupById(e));
|
|
return Object(s.sortSources)(t.lineTools()).map(e => e.id())
|
|
}
|
|
excludeShapeFromGroup(e, t) {
|
|
const i = Object(r.ensureDefined)(this._groupById(e)),
|
|
s = Object(r.ensureNotNull)(this._model.dataSourceForId(t));
|
|
Object(r.assert)(Object(n.isLineTool)(s), "Passed shapeId is not a line tool"), this
|
|
._controller.excludeLineToolFromGroup(i, s)
|
|
}
|
|
availableZOrderOperations(e) {
|
|
const t = Object(r.ensureDefined)(this._groupById(e));
|
|
return this._controller.availableZOrderOperations(t)
|
|
}
|
|
bringToFront(e) {
|
|
const t = Object(r.ensureDefined)(this._groupById(e));
|
|
this._controller.bringToFront(t)
|
|
}
|
|
bringForward(e) {
|
|
const t = Object(r.ensureDefined)(this._groupById(e));
|
|
this._controller.bringForward(t)
|
|
}
|
|
sendBackward(e) {
|
|
const t = Object(r.ensureDefined)(this._groupById(e));
|
|
this._controller.sendBackward(t)
|
|
}
|
|
sendToBack(e) {
|
|
const t = Object(r.ensureDefined)(this._groupById(e));
|
|
this._controller.sendToBack(t)
|
|
}
|
|
insertAfter(e, t) {
|
|
const i = Object(r.ensureDefined)(this._groupById(e)),
|
|
s = Object(r.ensureNotNull)(this._groupById(t) || this._model.dataSourceForId(
|
|
t));
|
|
this._controller.insertAfter(i, s)
|
|
}
|
|
insertBefore(e, t) {
|
|
const i = Object(r.ensureDefined)(this._groupById(e)),
|
|
s = Object(r.ensureNotNull)(this._groupById(t) || this._model.dataSourceForId(
|
|
t));
|
|
this._controller.insertBefore(i, s)
|
|
}
|
|
groupVisibility(e) {
|
|
return Object(r.ensureDefined)(this._groupById(e)).visibility()
|
|
}
|
|
setGroupVisibility(e, t) {
|
|
const i = Object(r.ensureDefined)(this._groupById(e));
|
|
this._controller.setGroupVisibility(i, t)
|
|
}
|
|
groupLock(e) {
|
|
return Object(r.ensureDefined)(this._groupById(e)).locked()
|
|
}
|
|
setGroupLock(e, t) {
|
|
const i = Object(r.ensureDefined)(this._groupById(e));
|
|
this._controller.setGroupLock(i, t)
|
|
}
|
|
getGroupName(e) {
|
|
return Object(r.ensureDefined)(this._groupById(e)).name()
|
|
}
|
|
setGroupName(e, t) {
|
|
const i = Object(r.ensureDefined)(this._groupById(e));
|
|
this._controller.setGroupName(i, t)
|
|
}
|
|
canBeGroupped(e) {
|
|
const t = e.map(e => Object(r.ensureNotNull)(this._model.dataSourceForId(e)));
|
|
return !t.some(e => !Object(n.isLineTool)(e)) && this._controller.canBeGroupped(t)
|
|
}
|
|
_groupById(e) {
|
|
return this._controller.groups().find(t => t.id === e)
|
|
}
|
|
}
|
|
},
|
|
lUQk: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("Eyy1"),
|
|
r = i("qFKp"),
|
|
n = i("JWMC"),
|
|
o = i("FQhm"),
|
|
a = i("txPx"),
|
|
l = i("7ktv"),
|
|
c = i("XPit"),
|
|
h = i("tc+8"),
|
|
u = i.n(h),
|
|
d = i("n5al"),
|
|
p = i("kcTO"),
|
|
_ = i("dfhE"),
|
|
m = i("nBJD"),
|
|
f = i("YFKU"),
|
|
g = i("Kxc7"),
|
|
b = i.n(g),
|
|
v = i("hOqT"),
|
|
S = i("X0WL"),
|
|
y = i("xDuj");
|
|
const w = b.a.enabled("hide_resolution_in_legend");
|
|
|
|
function P(e) {
|
|
const t = "QUANDL" === (e = e || {}).exchange,
|
|
i = {
|
|
symbolDescription: "",
|
|
interval: "",
|
|
exchange: "",
|
|
chartStyle: "",
|
|
sessionDescription: "",
|
|
provider: "",
|
|
ticker: ""
|
|
};
|
|
if (e.description && t)
|
|
if (2 === e.description.split("/").length) i.symbolDescription = e.description.split(
|
|
"/")[1];
|
|
else {
|
|
e.description.split("'").filter(e => e.length).forEach(e => {
|
|
let t = [];
|
|
t = e && ("/" === e[0] || /\d+\/\(?/.test(e)) ? [e] : e.split("/")
|
|
.filter(e => e.length), i.symbolDescription += t[2 === t.length ?
|
|
1 : 0]
|
|
})
|
|
}
|
|
else e.description ? i.symbolDescription = e.description : i.symbolDescription = e.symbol;
|
|
if (e.interval && (i.interval = Object(y.translatedIntervalString)(e.interval)), t && e
|
|
.description) {
|
|
const t = /[\w_]+\/[\w_]+/.exec(e.description);
|
|
t && t[0] ? i.provider = t[0].split("/")[0] : i.provider = e.description.split("/")[0]
|
|
}
|
|
return e.exchange && (i.exchange = e.exchange), i.chartStyle = function(e) {
|
|
return e.inputs, 8 === e.style ? window.t("Heikin Ashi") : ""
|
|
}(e), e.sessionDescription && (i.sessionDescription = e.sessionDescription), e.ticker &&
|
|
(i.ticker = e.ticker), i
|
|
}
|
|
const C = Object(f.t)("Symbol Error"),
|
|
x = g.enabled("hide_unresolved_symbols_in_legend");
|
|
class T extends S.a {
|
|
constructor(e, t, i, s) {
|
|
super(t), this._series = e, this._statusViewProperties = i, this._options = s ||
|
|
{}
|
|
}
|
|
text() {
|
|
return function(e) {
|
|
const t = P(e);
|
|
return (t.symbolDescription + (t.interval ? ", " + t.interval : "") +
|
|
function(e, t = ", ") {
|
|
return (e.provider ? `${t}${e.provider}` : "") + (e
|
|
.exchange ? `${t}${e.exchange}` : "") + (e
|
|
.chartStyle ? `${t}${e.chartStyle}` : "") + (e
|
|
.sessionDescription ?
|
|
`${t}${e.sessionDescription}` : "")
|
|
}(t)).replace(/'/g, "")
|
|
}(this._getTitleGenerationOptions())
|
|
}
|
|
getSplitTitle() {
|
|
return function(e) {
|
|
const t = P(e),
|
|
i = t.symbolDescription.replace(/'/g, ""),
|
|
s = function(e) {
|
|
const t = [];
|
|
e.provider && t.push(e.provider);
|
|
e.exchange && t.push(e.exchange);
|
|
e.chartStyle && t.push(e.chartStyle);
|
|
e.sessionDescription && t.push(e.sessionDescription);
|
|
return t
|
|
}(t).map(e => e.replace(/'/g, "")),
|
|
r = [];
|
|
return t.ticker && r.push(t.ticker), r.push(i), w || r.push(t
|
|
.interval || ""), r.push(...s), r
|
|
}(this._getTitleGenerationOptions())
|
|
}
|
|
bold() {
|
|
return !1
|
|
}
|
|
size() {
|
|
return this._statusViewProperties.childs().fontSize.value() + "px"
|
|
}
|
|
errorStatus() {
|
|
const e = this._series.seriesErrorMessage();
|
|
return null !== e ? {
|
|
error: e,
|
|
title: C
|
|
} : null
|
|
}
|
|
_getTitleGenerationOptions() {
|
|
const e = this._series.symbolInfo(),
|
|
t = this._statusViewProperties.childs().symbolTextSource.value();
|
|
return {
|
|
description: "ticker" === t ? e && e.name || void 0 : Object(v
|
|
.getTranslatedSymbolDescription)({
|
|
pro_name: e && e.pro_name || void 0,
|
|
short_name: e && e.name || void 0,
|
|
description: e && e.description || void 0,
|
|
short_description: e && e.short_description || void 0,
|
|
local_description: e && e.local_description || void 0,
|
|
language: e && e.language || void 0
|
|
}),
|
|
exchange: this._statusViewProperties.childs().showExchange.value() && e && e
|
|
.exchange || void 0,
|
|
symbol: x && null === e ? "" : this._series.symbol(),
|
|
interval: this._statusViewProperties.childs().showInterval.value() && !this
|
|
._options.hideResolution ? this._series.interval() : void 0,
|
|
style: this._series.properties().childs().style.value(),
|
|
inputs: this._series.getInputsProperties().state(),
|
|
boxSize: this._series.data().boxSize,
|
|
reversalAmount: this._series.data().reversalAmount,
|
|
ticker: "ticker-and-description" === t ? e && e.name || void 0 : ""
|
|
}
|
|
}
|
|
}
|
|
class I extends m.a {
|
|
constructor(e, t, i) {
|
|
super(new T(e, t, i)), this._invalidated = !0, this._series = e, this._series
|
|
.onRestarted().subscribe(this, this.update), this._series.dataEvents()
|
|
.symbolResolved().subscribe(this, this.update), this._series.dataEvents()
|
|
.completed().subscribe(this, this.update), this._series.boxSizeValue()
|
|
.subscribe(this.update.bind(this)), i.childs().symbolTextSource.listeners()
|
|
.subscribe(this, this.update)
|
|
}
|
|
getSeriesPrecision() {
|
|
let e = 4;
|
|
const t = this._series.symbolInfo();
|
|
return t && t.pricescale && (e = Math.round(Math.log(t.pricescale) / Math.log(
|
|
10))), e
|
|
}
|
|
round(e) {
|
|
const t = this.getSeriesPrecision(),
|
|
i = Math.round(e * Math.pow(10, t)) / Math.pow(10, t);
|
|
return i ? i.toString() : ""
|
|
}
|
|
update() {
|
|
this._invalidated = !0
|
|
}
|
|
text() {
|
|
return this._updateImpl(), super.text()
|
|
}
|
|
color() {
|
|
return this._updateImpl(), super.color()
|
|
}
|
|
bold() {
|
|
return this._updateImpl(), super.bold()
|
|
}
|
|
size() {
|
|
return this._updateImpl(), super.size()
|
|
}
|
|
getSplitTitle() {
|
|
return this._updateImpl(), this._statusProvider.getSplitTitle()
|
|
}
|
|
_updateImpl() {
|
|
this._invalidated && (this._bold = this._statusProvider.bold(), this._size =
|
|
this._statusProvider.size(), this._text = this._statusProvider.text(),
|
|
this._invalidated = !1)
|
|
}
|
|
}
|
|
var M = i("4miz"),
|
|
O = i("mMWL"),
|
|
L = i("6I19"),
|
|
A = i("CW80");
|
|
const E = r.CheckMobile.any(),
|
|
k = b.a.enabled("hide_resolution_in_legend");
|
|
class D extends M.b {
|
|
constructor(e, t) {
|
|
super(), this._invalidated = !0, this._series = e, this._model = t, this
|
|
._valuesProvider = this._createValuesProvider(e, t), this._items = this
|
|
._valuesProvider.getItems().map(e => new M.a(e.title, "")), this.update()
|
|
}
|
|
update() {
|
|
this._invalidated = !0
|
|
}
|
|
items() {
|
|
return this._invalidated && (this._updateImpl(), this._invalidated = !1), this
|
|
._items
|
|
}
|
|
series() {
|
|
return this._series
|
|
}
|
|
_updateImpl() {
|
|
const e = this._series.symbolInfo();
|
|
if (e) {
|
|
const t = [e.name];
|
|
k || t.push(Object(y.translatedIntervalString)(this._series.interval())), t
|
|
.push(e.exchange), this._header = t.join(", "), this._title = e
|
|
.description
|
|
} else this._header = this._series.symbol();
|
|
const t = this._model.crossHairSource().appliedIndex(),
|
|
i = this._valuesProvider.getValues(t);
|
|
for (let e = 0; e < i.length; ++e) {
|
|
const t = i[e],
|
|
s = this._items[e];
|
|
s.setValue(t.value), s.setVisible(t.visible), s.setColor(t.color)
|
|
}
|
|
}
|
|
_createValuesProvider(e, t) {
|
|
return new L.a(e, t)
|
|
}
|
|
_showLastPriceAndChangeOnly() {
|
|
return E && (null === this._model.crossHairSource().pane || Object(A
|
|
.isLineToolName)(O.tool.value()) || null !== this._model
|
|
.lineBeingEdited())
|
|
}
|
|
}
|
|
const V = {
|
|
open: Object(f.t)("O", {
|
|
context: "in_legend"
|
|
}),
|
|
high: Object(f.t)("H", {
|
|
context: "in_legend"
|
|
}),
|
|
low: Object(f.t)("L", {
|
|
context: "in_legend"
|
|
}),
|
|
close: Object(f.t)("C", {
|
|
context: "in_legend"
|
|
}),
|
|
hl2: Object(f.t)("HL2", {
|
|
context: "in_legend"
|
|
}),
|
|
hlc3: Object(f.t)("HLC3", {
|
|
context: "in_legend"
|
|
}),
|
|
ohlc4: Object(f.t)("OHLC4", {
|
|
context: "in_legend"
|
|
})
|
|
};
|
|
class B extends L.a {
|
|
constructor(e, t) {
|
|
super(e, t), this._showBarChange = t.properties().paneProperties
|
|
.legendProperties.showBarChange, this._showSeriesOHLC = t.properties()
|
|
.paneProperties.legendProperties.showSeriesOHLC, this._seriesStyle = e
|
|
.properties().childs().style, this._emptyValues[0].title = V.open, this
|
|
._emptyValues[1].title = V.high, this._emptyValues[2].title = V.low, this
|
|
._emptyValues[3].title = V.close, this._emptyValues[6].title = "", this
|
|
._emptyValues[4].title = ""
|
|
}
|
|
getValues(e) {
|
|
const t = super.getValues(e),
|
|
i = this._showSeriesOHLC.value(),
|
|
s = this._showBarChange.value(),
|
|
r = 12 === this._series.style(),
|
|
n = t[6];
|
|
if (n.visible = n.visible && s && !r, this._showLastPriceAndChangeOnly()) {
|
|
const e = t[5];
|
|
return e.visible = e.visible && i, t
|
|
}
|
|
const o = Object(d.isPriceSourceStyle)(this._seriesStyle.value()),
|
|
a = i && !o,
|
|
l = i && o;
|
|
return t[0].visible = a && !r, t[1].visible = a, t[2].visible = a, t[3]
|
|
.visible = a && !r, t[4].visible = l, t
|
|
}
|
|
}
|
|
const R = window.t("At close");
|
|
class N extends D {
|
|
constructor(e, t) {
|
|
super(e, t), this._showBarChange = t.properties().paneProperties.legendProperties
|
|
.showBarChange, this._showSeriesOHLC = t.properties().paneProperties
|
|
.legendProperties.showSeriesOHLC, this._showBarChange.subscribe(this, this
|
|
.update), this._showSeriesOHLC.subscribe(this, this.update)
|
|
}
|
|
isValuesVisible() {
|
|
return this._showSeriesOHLC.value() || this._showBarChange.value()
|
|
}
|
|
additional() {
|
|
return null
|
|
}
|
|
marketTitle() {
|
|
const e = this._series.marketStatusModel().status().value();
|
|
return this._showLastPriceAndChangeOnly() && ("pre_market" === e ||
|
|
"post_market" === e) ? R + ":" : ""
|
|
}
|
|
destroy() {
|
|
this._showBarChange.unsubscribeAll(this), this._showSeriesOHLC.unsubscribeAll(this)
|
|
}
|
|
_createValuesProvider(e, t) {
|
|
return new B(e, t)
|
|
}
|
|
}
|
|
var j = i("hY0g"),
|
|
F = i.n(j),
|
|
W = i("x2L+");
|
|
class H {
|
|
constructor(e, t) {
|
|
this._marketStatus = new F.a(null), this._lastMarketStatus = null, W.b.subscribe(
|
|
this, () => this._update()), this._quotesProvider = e, this._quotesProvider
|
|
.quotesUpdate().subscribe(this, this._update.bind(this)), this
|
|
._resetSubscription = t, this._resetSubscription.subscribe(this, this
|
|
._resetStatus)
|
|
}
|
|
destroy() {
|
|
W.b.unsubscribeAll(this), this._quotesProvider.quotesUpdate().unsubscribeAll(this),
|
|
this._resetSubscription.unsubscribeAll(this)
|
|
}
|
|
status() {
|
|
return this._marketStatus
|
|
}
|
|
_resetStatus() {
|
|
this._marketStatus.setValue(null)
|
|
}
|
|
_update(e = {}) {
|
|
void 0 !== e.values && (this._lastMarketStatus = e.values.current_session),
|
|
"market" !== this._lastMarketStatus || W.b.value() ? this._marketStatus
|
|
.setValue(this._lastMarketStatus) : this._resetStatus()
|
|
}
|
|
}
|
|
var U = i("LxhU"),
|
|
z = i("+DwS"),
|
|
G = i("8woN"),
|
|
q = i.n(G);
|
|
const Y = ["DJ", "CBOE", "JSE"];
|
|
var K = i("Cf1E");
|
|
const J = Object(a.getLogger)("Chart.Definitions.Series");
|
|
|
|
function Z(e) {
|
|
const t = [];
|
|
return ! function(e) {
|
|
return "index" === e.type && Y.includes(e.listed_exchange)
|
|
}(e) ? t.push("DelayToRealtime") : t.push("DelayNoRealtime"), t
|
|
}
|
|
|
|
function X(e, t) {
|
|
const i = [];
|
|
return void 0 !== (s = e.delay) && s > 0 ? Z(e) : function(e, t) {
|
|
return q.a.hasEodSymbols(e.full_name) || t === _.STATUS_EOD
|
|
}(e, t) ? (i.push("EOD"), i) : i;
|
|
var s
|
|
}
|
|
class $ {
|
|
constructor(e, t, i) {
|
|
this._dataUpdatedModeStatus = new F.a(null), this._symbolInfo = Object(z.a)(e
|
|
.getter, e.onChange), this._status = Object(z.a)(t.getter, t.onChange), this
|
|
._symbolInfo.subscribe(this._update.bind(this)), this._status.subscribe(this
|
|
._update.bind(this)), this._resetSubscription = i, this._resetSubscription
|
|
.subscribe(this, this._resetStatus)
|
|
}
|
|
destroy() {
|
|
this._symbolInfo.destroy(), this._status.destroy(), this._resetSubscription
|
|
.unsubscribeAll(this)
|
|
}
|
|
status() {
|
|
return this._dataUpdatedModeStatus.readonly()
|
|
}
|
|
symbolName() {
|
|
const e = this._symbolInfo.value();
|
|
return null !== e ? e.name : ""
|
|
}
|
|
time() {
|
|
const e = this._symbolInfo.value(),
|
|
t = null !== e && e.delay && e.delay > 0 ? e.delay : 900;
|
|
return Math.round(t / 60)
|
|
}
|
|
listedExchange() {
|
|
const e = this._symbolInfo.value();
|
|
return null !== e ? e.listed_exchange : ""
|
|
}
|
|
async description() {
|
|
const e = this._symbolInfo.value();
|
|
if (null === e) return "";
|
|
let t = {};
|
|
try {
|
|
t = Object(s.ensureNotNull)(await async function(e) {
|
|
return null
|
|
}())
|
|
} catch (e) {
|
|
J.logWarn("Cannot get exchange " + Object(K.a)(e))
|
|
}
|
|
return t.description || e.listed_exchange
|
|
}
|
|
exchange() {
|
|
const e = this._symbolInfo.value();
|
|
return null !== e ? e.exchange : ""
|
|
}
|
|
firstReplacedByBatsExchange() {
|
|
const e = this._symbolInfo.value();
|
|
return e && null
|
|
}
|
|
_resetStatus() {
|
|
this._dataUpdatedModeStatus.setValue(null)
|
|
}
|
|
_update() {
|
|
const e = this._symbolInfo.value();
|
|
if (null === e) return void this._dataUpdatedModeStatus.setValue(null);
|
|
const t = this._status.value();
|
|
if ("string" == typeof t) return void this._dataUpdatedModeStatus.setValue(null);
|
|
if (t === _.STATUS_LOADING || t === _.STATUS_RESOLVING) return;
|
|
const i = X(e, t);
|
|
0 !== i.length ? this._dataUpdatedModeStatus.setValue(i) : this
|
|
._dataUpdatedModeStatus.setValue(null)
|
|
}
|
|
}
|
|
var Q = i("QfUd"),
|
|
ee = i("ogJP");
|
|
class te {
|
|
constructor(e, t) {
|
|
this._dataProblem = new Q.a(null), this._quotesProvider = e, this._quotesProvider
|
|
.quotesUpdate().subscribe(this, this._update.bind(this)), this
|
|
._resetSubscription = t, this._resetSubscription.subscribe(this, this
|
|
._resetStatus)
|
|
}
|
|
destroy() {
|
|
this._quotesProvider.quotesUpdate().unsubscribeAll(this), this._resetSubscription
|
|
.unsubscribeAll(this)
|
|
}
|
|
status() {
|
|
return this._dataProblem
|
|
}
|
|
_resetStatus() {
|
|
this._dataProblem.setValue(null)
|
|
}
|
|
_update(e) {
|
|
void 0 === e.values || void 0 === e.values.data_problem ? this._resetStatus() : this
|
|
._dataProblem.setValue(Object(ee.clone)(e.values.data_problem))
|
|
}
|
|
}
|
|
var ie = i("wOSo"),
|
|
se = i("Tmoa"),
|
|
re = i("KcY8"),
|
|
ne = i("oXaB");
|
|
|
|
function oe(e) {
|
|
return e < 10 ? "0" + e : e.toString()
|
|
}
|
|
const ae = [0, 1, 2, 3, 9, 8, 10],
|
|
le = g.enabled("force_exchange_as_title"),
|
|
ce = {
|
|
alwaysShowGlobalLast: !1,
|
|
visibleOnHistoryOnly: !1,
|
|
showCountdown: !0,
|
|
showSymbolLabel: !0
|
|
};
|
|
class he extends re.a {
|
|
constructor(e, t, i) {
|
|
super(), this._previousCountdown = "", this._source = e, this._model = t, this
|
|
._options = {
|
|
...ce,
|
|
...i
|
|
}
|
|
}
|
|
updateCountdown() {
|
|
this._countdownText() !== this._previousCountdown && (this.update(), this._model
|
|
.updateSourcePriceScale(this._source))
|
|
}
|
|
_getSource() {
|
|
return this._source
|
|
}
|
|
_getModel() {
|
|
return this._model
|
|
}
|
|
_isCountdownEnabled() {
|
|
return this._options.showCountdown
|
|
}
|
|
_countdownText() {
|
|
const e = U.Interval.parse(this._source.interval());
|
|
if (e.isDWM() || e.isTicks() || e.isSeconds() && 1 === e.multiplier())
|
|
return "";
|
|
const t = this._source.data().bars().last();
|
|
if (null === t) return "";
|
|
const i = 1e3 * Object(s.ensure)(t.value[0]),
|
|
r = U.Interval.parse(this._source.interval()).inMilliseconds(),
|
|
n = i.valueOf() + r;
|
|
let o = Math.round((n - this._currentTime()) / 1e3);
|
|
if (o <= 0) return "";
|
|
o = Math.min(o, r / 1e3);
|
|
let a = null;
|
|
o >= 3600 && (a = oe(Math.floor(o / 3600))), o %= 3600;
|
|
const l = oe(Math.floor(o / 60));
|
|
o %= 60;
|
|
const c = oe(Math.floor(o));
|
|
return null !== a ? `${a}:${l}:${c}` : `${l}:${c}`
|
|
}
|
|
_updateRendererData(e, t, i) {
|
|
if (e.visible = !1, t.visible = !1, !this._source.isVisible()) return;
|
|
const s = this._source.properties().childs();
|
|
if (12 === s.style.value()) return;
|
|
if (this._options.visibleOnHistoryOnly) {
|
|
const e = this._model.timeScale().visibleBarsStrictRange(),
|
|
t = this._source.data().last();
|
|
if (null === e || null === t || e.contains(t.index)) return
|
|
}
|
|
const r = this._model.properties().scalesProperties;
|
|
let n = r.showSeriesLastValue.value(),
|
|
o = this._isCountdownEnabled() && -1 !== ae.indexOf(s.style.value()) && s
|
|
.showCountdown.value(),
|
|
a = this._options.showSymbolLabel && r.showSymbolLabels.value();
|
|
const l = r.seriesLastValueMode.value() === ne.PriceAxisLastValueMode
|
|
.LastPriceAndPercentageValue,
|
|
c = this._source.lastValueData(void 0, this._options.alwaysShowGlobalLast);
|
|
if (c.noData) return;
|
|
const h = 8 === s.style.value();
|
|
if ((n || o || a) && h && s.haStyle.showRealLastPrice.value()) {
|
|
const e = this._source.lastValueData(void 0, !1),
|
|
t = this._source.lastValueData(void 0, !0);
|
|
e.noData || t.noData || e.index !== t.index || (n = !1, o = !1, a = !1)
|
|
}
|
|
if (n || o) {
|
|
const t = this._axisFirstLineText(c, n);
|
|
e.text = t, i.textColor = this.generateTextColor(i.background), e
|
|
.textColor = i.textColor;
|
|
const s = this._source.priceScale().isPercentage(),
|
|
r = n && l ? s ? c.formattedPriceAbsolute : c.formattedPricePercentage :
|
|
"";
|
|
e.secondLine = r, i.secondLineTextColor = i.textColor;
|
|
const a = o ? this._countdownText() : "";
|
|
this._previousCountdown = a, e.thirdLine = a, i.thirdLineTextColor = Object(
|
|
se.generateColor)(i.textColor, 25), 0 === t.length && 0 === r
|
|
.length && 0 === a.length || (e.visible = !0)
|
|
}
|
|
a && (t.text = this._paneText(a), t.visible = t.text.length > 0), i.background =
|
|
this._source.priceLineColor(c.color), i.coordinate = c.coordinate, i
|
|
.floatCoordinate = c.floatCoordinate
|
|
}
|
|
_paneText(e) {
|
|
let t = "";
|
|
const i = this._source.symbolInfo();
|
|
return le ? t = Object(d.displayedSymbolExchange)(i) : e && (t = Object(d
|
|
.displayedSymbolName)(i)), t
|
|
}
|
|
_axisFirstLineText(e, t) {
|
|
return t ? this._source.priceScale().isPercentage() ? e
|
|
.formattedPricePercentage : e.formattedPriceAbsolute : ""
|
|
}
|
|
_currentTime() {
|
|
return Date.now() + 1e3 * this._source.serverTimeOffset()
|
|
}
|
|
}
|
|
var ue = i("TmNs"),
|
|
de = i("k9/m");
|
|
class pe extends he {
|
|
lastPrice() {
|
|
return this._getSource().data().lastProjectionPrice
|
|
}
|
|
_updateRendererData(e, t, i) {
|
|
e.visible = !1, t.visible = !1;
|
|
const r = this._getModel(),
|
|
n = this._getSource(),
|
|
o = n.priceScale(),
|
|
a = r.timeScale(),
|
|
l = this.lastPrice();
|
|
if (a.isEmpty() || o.isEmpty() || void 0 === l) return;
|
|
const c = a.visibleBarsStrictRange();
|
|
if (null === c) return;
|
|
const h = c.firstBar(),
|
|
u = c.lastBar(),
|
|
d = n.data(),
|
|
p = d.search(u, de.PlotRowSearchMode.NearestLeft);
|
|
if (null === p) return;
|
|
const _ = n.nearestIndex(h, de.PlotRowSearchMode.NearestRight);
|
|
if (void 0 === _) return;
|
|
const m = n.model().properties().scalesProperties,
|
|
f = Object(s.ensureNotNull)(d.valueAt(_))[4];
|
|
let g = i.background,
|
|
b = m.showSeriesLastValue.value(),
|
|
v = !1,
|
|
S = !1,
|
|
y = !1;
|
|
const w = n.lastValueData(4, !1),
|
|
P = n.properties();
|
|
if (8 === P.style.value() && P.haStyle.showRealLastPrice.value()) {
|
|
const e = n.lastValueData(4, !0);
|
|
if (e.noData || e.color === i.background || (g = e.color), !e.noData && !w
|
|
.noData) {
|
|
const t = e.index === w.index;
|
|
v = t && m.showSymbolLabels.value(), S = m.seriesLastValueMode.value() ===
|
|
ne.PriceAxisLastValueMode.LastPriceAndPercentageValue, b = b && t, y =
|
|
t && this._isCountdownEnabled() && P.showCountdown.value()
|
|
}
|
|
} else {
|
|
g = n.barColorer().barStyle(p.index, !0).barColor
|
|
}
|
|
if (i.background = g, i.textColor = this.generateTextColor(g), i
|
|
.secondLineTextColor = i.textColor, i.thirdLineTextColor = Object(se
|
|
.generateColor)(i.textColor, 25), i.coordinate = o.priceToCoordinate(l, f),
|
|
e.visible = b || y, !w.noData) {
|
|
w.text = o.formatPrice(l, f), w.formattedPriceAbsolute = o.formatPriceAbsolute(
|
|
l), w.formattedPricePercentage = o.formatPricePercentage(l, f, !0), e
|
|
.text = this._axisFirstLineText(w, b);
|
|
const i = n.priceScale().isPercentage();
|
|
e.secondLine = b && S ? i ? w.formattedPriceAbsolute : w
|
|
.formattedPricePercentage : "", e.thirdLine = y ? this._countdownText() :
|
|
"", t.text = this._paneText(v)
|
|
}
|
|
t.visible = v
|
|
}
|
|
}
|
|
var _e = i("KtbP"),
|
|
me = i("2ijp"),
|
|
fe = i("HGP3"),
|
|
ge = i("8Uy/");
|
|
const be = {
|
|
light: {
|
|
lineStyle: ge.LINESTYLE_DOTTED,
|
|
lineWidth: 1,
|
|
textColor: fe.colorsPalette["color-cold-gray-900"],
|
|
backgroundColor: fe.colorsPalette["color-tv-blue-50"],
|
|
lineColor: fe.colorsPalette["color-cold-gray-500"]
|
|
},
|
|
dark: {
|
|
lineStyle: ge.LINESTYLE_DOTTED,
|
|
lineWidth: 1,
|
|
textColor: fe.colorsPalette["color-white"],
|
|
backgroundColor: fe.colorsPalette["color-tv-blue-a800"],
|
|
lineColor: fe.colorsPalette["color-cold-gray-500"]
|
|
}
|
|
};
|
|
|
|
function ve(e) {
|
|
return e ? be.dark : be.light
|
|
}
|
|
class Se extends me.a {
|
|
constructor(e, t, i) {
|
|
super(), this._model = e, this._isVisible = t, this._getValue = i
|
|
}
|
|
_updateImpl() {
|
|
const e = this._lineRendererData;
|
|
if (e.visible = !1, !this._isVisible.value()) return;
|
|
const t = this._model.mainSeries(),
|
|
i = t.priceScale(),
|
|
s = t.firstValue(),
|
|
r = this._getValue();
|
|
if (null === s || null === r) return;
|
|
const n = ve(this._model.isDark());
|
|
e.visible = !0, e.y = i.priceToCoordinate(r, s), e.linestyle = n.lineStyle, e
|
|
.linewidth = n.lineWidth, e.color = n.lineColor
|
|
}
|
|
}
|
|
class ye extends re.a {
|
|
constructor(e, t, i, s) {
|
|
super(), this._model = e, this._label = t, this._isVisible = i, this._getValue =
|
|
s
|
|
}
|
|
_updateRendererData(e, t, i) {
|
|
if (e.visible = !1, t.visible = !1, !this._isVisible.value()) return;
|
|
const s = this._model.mainSeries(),
|
|
r = s.priceScale(),
|
|
n = s.firstValue(),
|
|
o = this._getValue();
|
|
if (null === n || null === o) return;
|
|
const a = ve(this._model.isDark());
|
|
e.visible = !0, t.visible = !0, e.text = r.formatPriceAbsolute(o), t.text = this
|
|
._label, i.coordinate = r.priceToCoordinate(o, n), i.background = a
|
|
.backgroundColor, i.textColor = a.textColor
|
|
}
|
|
}
|
|
class we extends ue.PriceLineAxisView {
|
|
constructor(e, t, i) {
|
|
super(), this._model = e, this._isLineVisible = t, this._getValue = i
|
|
}
|
|
_isVisible() {
|
|
return this._isLineVisible.value()
|
|
}
|
|
_lineWidth() {
|
|
return ve(this._model.isDark()).lineWidth
|
|
}
|
|
_lineStyle() {
|
|
return ve(this._model.isDark()).lineStyle
|
|
}
|
|
_priceLineColor(e) {
|
|
return ve(this._model.isDark()).lineColor
|
|
}
|
|
_value() {
|
|
const e = this._model.mainSeries(),
|
|
t = e.priceScale(),
|
|
i = e.firstValue(),
|
|
s = this._getValue();
|
|
if (null === i || null === s) return {
|
|
noData: !0
|
|
};
|
|
const r = t.priceToCoordinate(s, i);
|
|
return {
|
|
noData: !1,
|
|
floatCoordinate: r,
|
|
coordinate: r,
|
|
color: "",
|
|
formattedPricePercentage: "",
|
|
formattedPriceAbsolute: "",
|
|
text: "",
|
|
index: 0
|
|
}
|
|
}
|
|
}
|
|
const Pe = Object(f.t)("High"),
|
|
Ce = Object(f.t)("Low"),
|
|
xe = Object(f.t)("Avg");
|
|
|
|
function Te(e, t, i, s, r, n) {
|
|
const o = new Se(e, r, n),
|
|
a = new ye(e, i, s, n);
|
|
return {
|
|
paneView: o,
|
|
panePriceAxisView: new _e.PanePriceAxisView(a, t, e),
|
|
priceAxisView: a,
|
|
priceLineAxisView: new we(e, r, n)
|
|
}
|
|
}
|
|
var Ie = i("aIyQ"),
|
|
Me = i.n(Ie),
|
|
Oe = i("WkOR"),
|
|
Le = i("aO4+");
|
|
class Ae {
|
|
constructor() {
|
|
this._data = null
|
|
}
|
|
setData(e) {
|
|
this._data = e
|
|
}
|
|
data() {
|
|
return this._data
|
|
}
|
|
draw(e, t) {
|
|
const i = this._data;
|
|
if (null === i) return;
|
|
const s = t.pixelRatio;
|
|
e.save();
|
|
const r = Math.max(1, Math.floor(s)),
|
|
n = r % 2 / 2,
|
|
o = Math.round(i.center.x * s) + n,
|
|
a = i.center.y * s;
|
|
e.fillStyle = i.seriesLineColor, e.beginPath();
|
|
const l = Math.max(2, 1.5 * i.seriesLineWidth) * s;
|
|
e.arc(o, a, l, 0, 2 * Math.PI, !1), e.fill(), e.fillStyle = i.fillColor, e
|
|
.beginPath(), e.arc(o, a, i.radius * s, 0, 2 * Math.PI, !1), e.fill(), e
|
|
.lineWidth = r, e.strokeStyle = i.strokeColor, e.beginPath(), e.arc(o, a, i
|
|
.radius * s + r / 2, 0, 2 * Math.PI, !1), e.stroke(), e.restore()
|
|
}
|
|
hitTest(e, t) {
|
|
return null
|
|
}
|
|
}
|
|
|
|
function Ee(e) {
|
|
return e
|
|
}
|
|
const ke = [{
|
|
start: 0,
|
|
end: .25,
|
|
startRadius: 4,
|
|
endRadius: 10,
|
|
startFillAlpha: .25,
|
|
endFillAlpha: 0,
|
|
startStrokeAlpha: .4,
|
|
endStrokeAlpha: .8,
|
|
easing: Ee
|
|
}, {
|
|
start: .25,
|
|
end: .525,
|
|
startRadius: 10,
|
|
endRadius: 14,
|
|
startFillAlpha: 0,
|
|
endFillAlpha: 0,
|
|
startStrokeAlpha: .8,
|
|
endStrokeAlpha: 0,
|
|
easing: Ee
|
|
}, {
|
|
start: .525,
|
|
end: 1,
|
|
startRadius: 14,
|
|
endRadius: 14,
|
|
startFillAlpha: 0,
|
|
endFillAlpha: 0,
|
|
startStrokeAlpha: 0,
|
|
endStrokeAlpha: 0,
|
|
easing: Ee
|
|
}];
|
|
|
|
function De(e, t, i, s) {
|
|
const r = i + (s - i) * t;
|
|
return Object(se.applyTransparency)(e, Object(se.alphaToTransparency)(r))
|
|
}
|
|
|
|
function Ve(e, t) {
|
|
const i = e % 2600 / 2600;
|
|
let s;
|
|
for (const e of ke)
|
|
if (i >= e.start && i <= e.end) {
|
|
s = e;
|
|
break
|
|
} if (void 0 === s) throw new Error("Last price animation internal logic error");
|
|
const r = s.easing((i - s.start) / (s.end - s.start));
|
|
return {
|
|
fillColor: De(t, r, s.startFillAlpha, s.endFillAlpha),
|
|
strokeColor: De(t, r, s.startStrokeAlpha, s.endStrokeAlpha),
|
|
radius: (n = r, o = s.startRadius, a = s.endRadius, o + (a - o) * n)
|
|
};
|
|
var n, o, a
|
|
}
|
|
class Be {
|
|
constructor(e) {
|
|
this._renderer = new Ae, this._invalidated = !0, this._stageInvalidated = !0, this
|
|
._startTime = performance.now(), this._endTime = this._startTime - 1, this
|
|
._series = e
|
|
}
|
|
update(e) {
|
|
if (this._invalidated = !0, e) {
|
|
const e = performance.now(),
|
|
t = this._endTime - e;
|
|
if (t > 0) return void(t < 650 && (this._endTime += 2600));
|
|
this._startTime = e, this._endTime = e + 2600
|
|
}
|
|
}
|
|
invalidateStage() {
|
|
this._stageInvalidated = !0
|
|
}
|
|
animationActive() {
|
|
return performance.now() <= this._endTime
|
|
}
|
|
stopAnimation() {
|
|
this._endTime = this._startTime - 1
|
|
}
|
|
renderer(e, t) {
|
|
return this._invalidated ? (this._updateImpl(e, t), this._invalidated = !1, this
|
|
._stageInvalidated = !1) : this._stageInvalidated && (this
|
|
._updateRendererDataStage(), this._stageInvalidated = !1), this._renderer
|
|
}
|
|
_updateImpl(e, t) {
|
|
this._renderer.setData(null);
|
|
const i = this._series.model().timeScale(),
|
|
s = i.visibleBarsStrictRange(),
|
|
r = this._series.firstValue(),
|
|
n = this._series.lastValueData(void 0, !0, !0);
|
|
if (null === s || null === r || void 0 === n.index || void 0 === n.price || !s
|
|
.contains(n.index)) return;
|
|
const o = new Le.Point(i.indexToCoordinate(n.index), this._series.priceScale()
|
|
.priceToCoordinate(n.price, r)),
|
|
a = n.color,
|
|
l = this._series.properties();
|
|
let c;
|
|
switch (this._series.style()) {
|
|
case 3:
|
|
c = l.areaStyle.linewidth.value();
|
|
break;
|
|
case 10:
|
|
const t = l.baselineStyle,
|
|
i = Math.round(e * (Math.abs(100 - t.baseLevelPercentage.value()) /
|
|
100));
|
|
c = o.y <= i ? t.topLineWidth.value() : t.bottomLineWidth.value();
|
|
break;
|
|
default:
|
|
c = l.lineStyle.linewidth.value()
|
|
}
|
|
const h = Ve(this._duration(), a);
|
|
this._renderer.setData({
|
|
seriesLineColor: a,
|
|
seriesLineWidth: c,
|
|
fillColor: h.fillColor,
|
|
strokeColor: h.strokeColor,
|
|
radius: h.radius,
|
|
center: o
|
|
})
|
|
}
|
|
_updateRendererDataStage() {
|
|
const e = this._renderer.data();
|
|
if (null !== e) {
|
|
const t = Ve(this._duration(), e.seriesLineColor);
|
|
e.fillColor = t.fillColor, e.strokeColor = t.strokeColor, e.radius = t.radius
|
|
}
|
|
}
|
|
_duration() {
|
|
return this.animationActive() ? performance.now() - this._startTime : 2599
|
|
}
|
|
}
|
|
var Re = i("H0vP"),
|
|
Ne = i("BZtw");
|
|
i.d(t, "SeriesBase", (function() {
|
|
return Ue
|
|
}));
|
|
const je = g.enabled("price_scale_always_last_bar_value"),
|
|
Fe = g.enabled("display_data_mode"),
|
|
We = (r.CheckMobile.any(), Object(a.getLogger)("Chart.Series")),
|
|
He = {
|
|
countdownEnabled: !0,
|
|
lastPriceAnimationEnabled: !0
|
|
};
|
|
class Ue extends l.PriceDataSource {
|
|
constructor(e, t, i, r) {
|
|
super(e), this.chartWidgetInitialized = new Me.a, this
|
|
.requestingIntradayWhenNotSupported = new Me.a, this
|
|
.requestingResolutionWhenNotSupported = new Me.a, this._paneView = null,
|
|
this._priceStep = null, this._symbolInfo = null, this._prevSymbolInfo =
|
|
null, this._isPrePostMarketPricesForbiddenProperty = new u.a(!0), this
|
|
._highLowAvgPriceCache = new Map,
|
|
this._prevClosePriceAxisView = null, this._priceScaleChanged = new Me.a,
|
|
this._priceScaleAboutToBeChanged = new Me.a, this._onRestarted = new Me.a,
|
|
this._onStatusChanged = new Me.a, this._extendedHoursChanged = new Me.a,
|
|
this._tagsChanged = new Me.a, this._sessionIdChanged = new Me.a, this
|
|
._currency = null, this._unit = null, this._endOfData = !1, this
|
|
._lineStyleLastPriceCirclePaneView = new Be(this), this
|
|
._prevClosePriceLineView = null, this._dataPoweredBy = null, this
|
|
._loading = !0, this._seriesLoaded = !1, this._status = 0, this
|
|
._boxSizeValue = new F.a, this._base = 100, this._pointValue = 1, this
|
|
._formatter = new p.PriceFormatter(this._base), this
|
|
._ignoreMinMoveFormatter = new p.PriceFormatter(this._base), this
|
|
._ignoreMinMovePriceStep = null, this._lastBarCloseTime = null, this
|
|
._onSessionIdPropertyChangedBound = this._onSessionIdPropertyChanged.bind(
|
|
this), this._ignoreSessionIdProxyPropertyChanges = !1, this
|
|
._lastPriceAnimationActive = !1, this._currentSession = "out_of_session",
|
|
this._onStyleChanged = new Me.a, this._intervalObj = null, this
|
|
._obsoleteZOrder = 0, this._seriesErrorMessage = null, this._seriesSource =
|
|
new Ne.a(e.chartApi(), "s", r);
|
|
const n = this._seriesSource.dataEvents();
|
|
n.symbolResolved().subscribe(this, this._onSymbolResolved), n.symbolError()
|
|
.subscribe(this, this._onSymbolError), n.seriesTimeFrame().subscribe(this,
|
|
this._onSeriesTimeFrame), n.seriesError().subscribe(this, this
|
|
._onSeriesError), n.loading().subscribe(this, this._onSeriesLoading), n
|
|
.completed().subscribe(this, this._onSeriesCompleted), n.dataUpdated()
|
|
.subscribe(this, this._onDataUpdated), n.barReceived().subscribe(this, this
|
|
._onBarReceived), this._quotesProvider = new ie.a, this._quotesProvider
|
|
.quotesUpdate().subscribe(this, this._onQuotesUpdate);
|
|
const o = t.childs();
|
|
if (t.hasChild("extendedHours")) {
|
|
Object(s.ensureDefined)(o.extendedHours).value() && !t.hasChild(
|
|
"sessionId") && t.addChild("sessionId", new u.a("extended")), t
|
|
.removeProperty("extendedHours")
|
|
}
|
|
t.hasChild("sessionId") || t.addChild("sessionId", new u.a("regular")), this
|
|
._setProperties(t), this._sessionIdProxyProperty = new u.a(o.sessionId
|
|
.value()), o.sessionId.subscribe(this, () => this
|
|
._updateSessionIdProxyProperty()), this._sessionIdProxyProperty
|
|
.subscribe(this, this._onSessionIdProxyPropertyChanged), this._options =
|
|
Object(ee.merge)(Object(ee.clone)(He), i), this._prevChartStyle = o.style
|
|
.value();
|
|
const a = new he(this, e, {
|
|
alwaysShowGlobalLast: !0,
|
|
showCountdown: i.countdownEnabled
|
|
});
|
|
this._priceAxisView = a;
|
|
let l = null;
|
|
je || (l = new he(this, e, {
|
|
visibleOnHistoryOnly: !0,
|
|
showSymbolLabel: !1,
|
|
showCountdown: !1,
|
|
alwaysShowGlobalLast: !1
|
|
})), this._priceLinePriceAxisView = new ue.SeriesPriceLineAxisView(this),
|
|
this._priceLineAxisViews = [this._priceLinePriceAxisView];
|
|
const c = new pe(this, e, {
|
|
showCountdown: i.countdownEnabled
|
|
});
|
|
this._priceAxisViews = [a, c], null !== l && this._priceAxisViews.push(l), this
|
|
._panePriceAxisView = new _e.PanePriceAxisView(a, this, e), this
|
|
._historyPricePanePriceAxisView = null !== l ? new _e.PanePriceAxisView(l,
|
|
this, e) : null, this._projectionPriceAxisView = new _e
|
|
.PanePriceAxisView(c, this, e), this._labelPaneViews = [this
|
|
._panePriceAxisView, this._projectionPriceAxisView
|
|
],
|
|
null !== this._historyPricePanePriceAxisView && this._labelPaneViews.push(
|
|
this._historyPricePanePriceAxisView), this._highLowAvgPaneViews = [],
|
|
this._createHighLowAvgViews(), this._subscribeRestartToSessionIdChange();
|
|
const h = this.properties();
|
|
h.visible.subscribe(this, this._updateLastPriceAnimationActive), this
|
|
._updateLastPriceAnimationActive(), this._dataWindowView = new D(this, e),
|
|
this._legendView = new N(this, e), this._statusView = new I(this, this
|
|
._model.properties().scalesProperties.textColor, h.statusViewStyle),
|
|
this._marketStatusModel = new H(this._quotesProvider, h.symbol.listeners()),
|
|
this._dataUpdatedModeModel = Fe ? new $({
|
|
getter: this.symbolInfo.bind(this),
|
|
onChange: n.symbolResolved()
|
|
}, {
|
|
getter: this.status.bind(this),
|
|
onChange: this._onStatusChanged
|
|
}, h.symbol.listeners()) : null, this._dataProblemModel = new te(this
|
|
._quotesProvider, h.symbol.listeners())
|
|
}
|
|
seriesErrorMessage() {
|
|
return this._seriesErrorMessage
|
|
}
|
|
destroy() {
|
|
this._quotesProvider.quotesUpdate().unsubscribeAll(this), this._model
|
|
.timeScale().visibleBarsStrictRangeChanged().unsubscribeAll(this), this
|
|
._unsubscribeRestartToSessionIdChange()
|
|
}
|
|
zorder() {
|
|
return 0
|
|
}
|
|
quotesProvider() {
|
|
return this._quotesProvider
|
|
}
|
|
currentSession() {
|
|
return this._currentSession
|
|
}
|
|
labelPaneViews() {
|
|
return this._labelPaneViews
|
|
}
|
|
topPaneViews() {
|
|
if (this._lastPriceAnimationActive) {
|
|
const e = this._lineStyleLastPriceCirclePaneView;
|
|
return e.animationActive() && setTimeout(() => this._model.invalidate(Re
|
|
.InvalidationMask.cursor()), 0), e.invalidateStage(), [e]
|
|
}
|
|
return null
|
|
}
|
|
priceAxisViews(e, t) {
|
|
return e.findTargetPriceAxisViews(this, t, this._priceAxisViews, this
|
|
._priceLineAxisViews)
|
|
}
|
|
clearHighLowAvgPriceCache() {
|
|
this._highLowAvgPriceCache.clear()
|
|
}
|
|
priceScaleChanged() {
|
|
return this._priceScaleChanged
|
|
}
|
|
priceScaleAboutToBeChanged() {
|
|
return this._priceScaleAboutToBeChanged
|
|
}
|
|
isStatusBad() {
|
|
return 12 === this.status() || 4 === this.status() || 10 === this.status()
|
|
}
|
|
isStatusError() {
|
|
return 12 === this.status()
|
|
}
|
|
actualSymbol() {
|
|
return Object(d.actualSymbol)(this.symbolInfo(), this.symbol())
|
|
}
|
|
proSymbol() {
|
|
return Object(d.proSymbol)(this.symbolInfo(), this.symbol())
|
|
}
|
|
onStyleChanged() {
|
|
return this._onStyleChanged
|
|
}
|
|
style() {
|
|
return this.properties().style.value()
|
|
}
|
|
symbolSameAsCurrent(e) {
|
|
return Object(Oe.b)(e, this.m_symbol, this.symbolInfo())
|
|
}
|
|
symbolInfo() {
|
|
return this._symbolInfo
|
|
}
|
|
symbolResolved() {
|
|
return this.dataEvents().symbolResolved()
|
|
}
|
|
formatter(e = !0) {
|
|
return e ? this._formatter : this._ignoreMinMoveFormatter
|
|
}
|
|
priceStep(e = !0) {
|
|
return e ? this._priceStep : this._ignoreMinMovePriceStep
|
|
}
|
|
interval() {
|
|
return this.properties().interval.value()
|
|
}
|
|
intervalObj() {
|
|
const e = this.interval();
|
|
if (null !== this._intervalObj && this._intervalObj.resolutionString === e)
|
|
return this._intervalObj.interval;
|
|
const t = U.Interval.parse(e);
|
|
return this._intervalObj = {
|
|
resolutionString: e,
|
|
interval: t
|
|
}, t
|
|
}
|
|
prevClose() {
|
|
const e = this.priceScale();
|
|
if (e.isEmpty() || this.data().isEmpty()) return null;
|
|
const t = this.quotes(),
|
|
i = this.firstValue();
|
|
if (null === t || null === i) return null;
|
|
const s = t.prev_close_price;
|
|
return void 0 === s ? null : {
|
|
coordinate: e.priceToCoordinate(s, i),
|
|
floatCoordinate: e.priceToCoordinate(s, i),
|
|
formattedPricePercentage: e.formatPricePercentage(s, i, !0),
|
|
formattedPriceAbsolute: e.formatPriceAbsolute(s)
|
|
}
|
|
}
|
|
hasClosePrice() {
|
|
return 12 !== this.properties().style.value()
|
|
}
|
|
isDWM() {
|
|
return this.intervalObj().isDWM()
|
|
}
|
|
nearestValue(e, t, i) {
|
|
const s = this.nearestData(e, i);
|
|
return s ? s.value[t] : void 0
|
|
}
|
|
onStatusChanged() {
|
|
return this._onStatusChanged
|
|
}
|
|
onRestarted() {
|
|
return this._onRestarted
|
|
}
|
|
onExtendedHoursChanged() {
|
|
return this._extendedHoursChanged
|
|
}
|
|
sessionId() {
|
|
return this.properties().sessionId.value()
|
|
}
|
|
sessionIdChanged() {
|
|
return this._sessionIdChanged
|
|
}
|
|
autoScaleInfo(e, t) {
|
|
const i = this.priceRange(e, t);
|
|
if (null === this._paneView) return {
|
|
range: i
|
|
};
|
|
const s = this._paneView;
|
|
return {
|
|
range: i,
|
|
topPixelMargin: s.topPixelMargin ? s.topPixelMargin() : void 0,
|
|
bottomPixelMargin: s.bottomPixelMargin ? s.bottomPixelMargin() : void 0
|
|
}
|
|
}
|
|
onChartStyleChanged() {
|
|
this._updateBarFunction(), this.isNeedRestart() && (this.data().clear(), this
|
|
.model().timeScale().scrollToRealtime(!1), this.restart());
|
|
const e = this.properties();
|
|
this._prevChartStyle = e.style.value(), this._onStyleChanged.fire(e.style
|
|
.value()), this.invalidateBarStylesCache(), this
|
|
._updateLastPriceAnimationActive()
|
|
}
|
|
sessionIdProxyProperty() {
|
|
return this._sessionIdProxyProperty
|
|
}
|
|
isPrePostMarketPricesForbiddenProperty() {
|
|
return this._isPrePostMarketPricesForbiddenProperty
|
|
}
|
|
quotes() {
|
|
return this.data().isEmpty() ? null : this._quotesProvider.quotes()
|
|
}
|
|
base() {
|
|
return this._base
|
|
}
|
|
pointValue() {
|
|
return this._pointValue
|
|
}
|
|
barCloseTime() {
|
|
return this._lastBarCloseTime
|
|
}
|
|
barFunction() {
|
|
return this._barFunction
|
|
}
|
|
setSymbolCurrencyUnit(e, t, i) {
|
|
const s = this.properties(),
|
|
r = void 0 !== e && e !== s.symbol.value(),
|
|
n = void 0 !== t && t !== s.currencyId.value(),
|
|
o = void 0 !== i && i !== s.unitId.value();
|
|
r && s.symbol.setValueSilently(e), n && s.currencyId.setValueSilently(t), o && s
|
|
.unitId.setValueSilently(i), r && s.symbol.listeners().fire(s.symbol), n &&
|
|
s.currencyId.listeners().fire(s.currencyId), o && s.unitId.listeners().fire(
|
|
s.unitId)
|
|
}
|
|
setSymbol(e) {
|
|
this.setSymbolCurrencyUnit(e)
|
|
}
|
|
currency() {
|
|
return this.properties().currencyId.value() || null
|
|
}
|
|
setCurrency(e) {
|
|
this.setSymbolCurrencyUnit(void 0, e)
|
|
}
|
|
isConvertedToOtherCurrency() {
|
|
return Object(d.isConvertedToOtherCurrency)(this.symbolInfo())
|
|
}
|
|
unit() {
|
|
return this.properties().unitId.value() || null
|
|
}
|
|
setUnit(e) {
|
|
this.properties().unitId.setValue(e)
|
|
}
|
|
isConvertedToOtherUnit() {
|
|
return Object(d.isConvertedToOtherUnit)(this.symbolInfo())
|
|
}
|
|
symbolSource() {
|
|
return this
|
|
}
|
|
title() {
|
|
return this.symbolTitle()
|
|
}
|
|
symbolTitle(e, t) {
|
|
let i = this.properties().symbol.value();
|
|
const s = this.symbolInfo();
|
|
return null !== s && (i = Object(d.symbolTitle)(s, e)), t ? i :
|
|
`${i}, ${Object(y.translatedIntervalString)(this.properties().interval.value())}`
|
|
}
|
|
setObsoleteZOrder(e) {
|
|
this._obsoleteZOrder = e
|
|
}
|
|
obsoleteZOrder() {
|
|
return this._obsoleteZOrder
|
|
}
|
|
valuesProvider() {
|
|
return new B(this, this.model())
|
|
}
|
|
statusProvider(e) {
|
|
return new T(this, this._model.properties().scalesProperties.textColor, this
|
|
.properties().statusViewStyle, e)
|
|
}
|
|
open(e) {
|
|
const t = this.data().valueAt(e);
|
|
return t && t[1]
|
|
}
|
|
high(e) {
|
|
const t = this.data().valueAt(e);
|
|
return t && t[2]
|
|
}
|
|
low(e) {
|
|
const t = this.data().valueAt(e);
|
|
return t && t[3]
|
|
}
|
|
close(e) {
|
|
const t = this.data().valueAt(e);
|
|
return t && t[4]
|
|
}
|
|
moveItem(e, t, i) {
|
|
if (10 === this.style() && 0 === t) {
|
|
const t = this.priceScale(),
|
|
i = this.properties().baselineStyle,
|
|
s = t.height(),
|
|
r = 100 - e.y / s * 100,
|
|
n = r < 0 ? 0 : Math.round(10 * r) / 10;
|
|
i.baseLevelPercentage.setValue(Math.max(Math.min(n, 100), 0))
|
|
}
|
|
}
|
|
endOfData() {
|
|
return this._endOfData
|
|
}
|
|
dataPoweredBy() {
|
|
return null
|
|
}
|
|
boxSizeValue() {
|
|
return this._boxSizeValue
|
|
}
|
|
isUserDeletable() {
|
|
return !1
|
|
}
|
|
changeSymbol() {
|
|
this.setSymbolIntervalCurrencyDelayed(), this.model().checkLineToolSelection()
|
|
}
|
|
changeInterval() {
|
|
this.setSymbolIntervalCurrencyDelayed()
|
|
}
|
|
changeTimeFrame() {
|
|
Object(n.trackEvent)("GUI", "Change timeframe")
|
|
}
|
|
onTagsChanged() {
|
|
return this._tagsChanged
|
|
}
|
|
_updateBarFunction() {
|
|
if (12 === this.properties().style.value()) this._barFunction = Object(c
|
|
.barFunction)("low");
|
|
else {
|
|
const e = this.priceSource() || "close";
|
|
this._barFunction = Object(c.barFunction)(e)
|
|
}
|
|
}
|
|
_setProperties(e) {
|
|
e.hasChild("timeframe") || e.merge({
|
|
timeframe: ""
|
|
}), e.hasChild("shortName") || e.merge({
|
|
shortName: ""
|
|
}), e.hasChild("currencyId") || e.addChild("currencyId", new u.a(null)), e
|
|
.hasChild("unitId") || e.addChild("unitId", new u.a(null)), this
|
|
._properties = e;
|
|
const t = e.childs();
|
|
t.symbol.listeners().subscribe(this, this.changeSymbol), t.interval.listeners()
|
|
.subscribe(this, this.changeInterval), t.currencyId.listeners().subscribe(
|
|
this, this._changeCurrency), t.unitId.listeners().subscribe(this, this
|
|
._changeUnit), t.timeframe.listeners().subscribe(this, this
|
|
.changeTimeFrame), e.subscribe(this, this._onPropertiesChanged)
|
|
}
|
|
_updateSessionIdProxyProperty(e) {
|
|
const t = this._properties.childs().sessionId.value();
|
|
let i = t;
|
|
if (e) {
|
|
const e = this.symbolInfo();
|
|
null !== e && (i = e.subsession_id || t)
|
|
}
|
|
this._ignoreSessionIdProxyPropertyChanges = !0, this._sessionIdProxyProperty
|
|
.setValue(i), this._ignoreSessionIdProxyPropertyChanges = !1
|
|
}
|
|
_onSessionIdProxyPropertyChanged() {
|
|
this._ignoreSessionIdProxyPropertyChanges || this._properties.childs().sessionId
|
|
.setValue(this._sessionIdProxyProperty.value()), this
|
|
._updateLastPriceAnimationActive()
|
|
}
|
|
_onSeriesLoading(e) {
|
|
this._loading = !0, this._setStatus(2)
|
|
}
|
|
_onDataUpdated(e, t) {
|
|
if (this.hasDelayedSymbolIntervalChange()) {
|
|
if (this._willSymbolIntervalCurrencyChanged()) return void We.logNormal(
|
|
"command comes during symbol/interval changing");
|
|
We.logNormal(
|
|
"data_update comes when symbol interval delay present but symbol/interval should not be changed"
|
|
)
|
|
}
|
|
t ? this._endOfData = !1 : this._lastPriceAnimationActive && this
|
|
._seriesLoaded && this._lineStyleLastPriceCirclePaneView.update(!0), this
|
|
._lastBarCloseTime = e && e.closeTime || null, this._boxSizeValue.setValue(
|
|
this.data().boxSize), this._statusView.update(), this
|
|
.clearHighLowAvgPriceCache();
|
|
const i = this.model(),
|
|
r = Object(s.ensureNotNull)(i.paneForSource(this));
|
|
i.recalculatePane(r), i.updateSource(this), i.updateLineTools()
|
|
}
|
|
_setStatus(e) {
|
|
this._status = e, this._statusView.update(), this.model().updateSource(this),
|
|
this._onStatusChanged.fire()
|
|
}
|
|
_willSymbolIntervalCurrencyChanged() {
|
|
const e = this.properties(),
|
|
t = this._checkIntervalWillChanged(e.interval.value()),
|
|
i = this._checkSymbolWillChanged(e.symbol.value()),
|
|
s = this._checkCurrencyWillChanged(e.currencyId.value()),
|
|
r = this._checkUnitWillChanged(e.unitId.value());
|
|
return i || t || s || r
|
|
}
|
|
_checkSymbolWillChanged(e) {
|
|
return !this.symbolSameAsCurrent(e)
|
|
}
|
|
_checkIntervalWillChanged(e) {
|
|
return !U.Interval.isEqual(this.m_interval, e)
|
|
}
|
|
_recreateFormatter() {
|
|
this._formatter = Object(d.createSeriesFormatter)(this.symbolInfo(), this
|
|
.properties().minTick.value()), this._ignoreMinMoveFormatter = Object(d
|
|
.createSeriesFormatter)(this.symbolInfo(), this.properties().minTick
|
|
.value(), !0), this.priceScale() && this.priceScale().updateFormatter(),
|
|
this._formatterChanged.fire()
|
|
}
|
|
_recreatePriceStep() {
|
|
const {
|
|
minMove: e,
|
|
priceScale: t
|
|
} = Object(d.getSeriesPriceFormattingState)(this.symbolInfo()), i = e / t;
|
|
this._ignoreMinMovePriceStep = 1 / t, this._priceStep !== i && (this
|
|
._priceStep = i, this._priceStepChanged.fire())
|
|
}
|
|
_recreatePriceFormattingDependencies() {
|
|
this._recreateFormatter(), this._recreatePriceStep()
|
|
}
|
|
_onQuotesUpdate(e, t) {
|
|
e.values.current_session !== this._currentSession && (this._currentSession = e
|
|
.values.current_session, this._updateLastPriceAnimationActive())
|
|
}
|
|
_updateIsPrePostMarketPricesForbiddenProperty() {
|
|
const e = !this.isDWM() && !Object(d.isRegularSessionId)(this
|
|
.sessionIdProxyProperty().value());
|
|
this._isPrePostMarketPricesForbiddenProperty.setValue(e)
|
|
}
|
|
_getSymbolForApi() {
|
|
return Object(d.symbolForApi)(this.symbolInfo() || this._prevSymbolInfo, this
|
|
.symbol())
|
|
}
|
|
_getSymbolObject() {
|
|
const e = this._getExtendedSymbolObject();
|
|
if (_.SYMBOL_STRING_DATA.hasOwnProperty(this.properties().style.value())) {
|
|
return {
|
|
symbol: e,
|
|
type: this.styleStudyInfo(this.getStyleShortName() + "Style").studyId +
|
|
"!",
|
|
inputs: this.getInputsProperties().state()
|
|
}
|
|
}
|
|
return e
|
|
}
|
|
_getExtendedSymbolObject() {
|
|
const e = {
|
|
symbol: this._getSymbolForApi()
|
|
};
|
|
null !== this.currency() && (e["currency-id"] = this.currency());
|
|
const t = this.unit();
|
|
return null !== t && (e["unit-id"] = t), e
|
|
}
|
|
_changeCurrency() {
|
|
this.setSymbolIntervalCurrencyDelayed(), this.model().checkLineToolSelection(),
|
|
this._currencyChanged.fire()
|
|
}
|
|
_changeUnit() {
|
|
this.setSymbolIntervalCurrencyDelayed(), this.model().checkLineToolSelection(),
|
|
this._unitChanged.fire()
|
|
}
|
|
_checkCurrencyWillChanged(e) {
|
|
return this._currency !== e
|
|
}
|
|
_checkUnitWillChanged(e) {
|
|
return this._unit !== e
|
|
}
|
|
_createHighLowAvgViews() {
|
|
const e = this.properties().highLowAvgPrice,
|
|
t = this._getHighLowAvgPrice.bind(this),
|
|
i = function(e, t, i, s) {
|
|
const r = i.childs(),
|
|
n = Te(e, t, Pe, r.highLowPriceLabelsVisible, r
|
|
.highLowPriceLinesVisible, () => s(0)),
|
|
o = Te(e, t, Ce, r.highLowPriceLabelsVisible, r
|
|
.highLowPriceLinesVisible, () => s(1)),
|
|
a = Te(e, t, xe, r.averageClosePriceLabelVisible, r
|
|
.averageClosePriceLineVisible, () => s(2));
|
|
return {
|
|
paneViews: [n.paneView, o.paneView, a.paneView],
|
|
panePriceAxisViews: [n.panePriceAxisView, o.panePriceAxisView, a
|
|
.panePriceAxisView
|
|
],
|
|
priceAxisViews: [n.priceAxisView, o.priceAxisView, a.priceAxisView],
|
|
priceLineAxisViews: [n.priceLineAxisView, o.priceLineAxisView, a
|
|
.priceLineAxisView
|
|
]
|
|
}
|
|
}(this._model, this, e, t);
|
|
this._highLowAvgPaneViews.push(...i.paneViews), this._labelPaneViews.push(...i
|
|
.panePriceAxisViews), this._priceAxisViews.push(...i.priceAxisViews),
|
|
this._priceLineAxisViews.push(...i.priceLineAxisViews)
|
|
}
|
|
_getHighLowAvgPrice(e) {
|
|
if (!this._highLowAvgPriceCache.has(e)) {
|
|
const t = this._model.timeScale().visibleBarsStrictRange();
|
|
if (null === t) return null;
|
|
const i = this._model.mainSeries().bars(),
|
|
s = t.firstBar(),
|
|
r = t.lastBar();
|
|
if (2 === e) {
|
|
const e = function(e, t, i) {
|
|
const s = Object(c.barFunction)("close");
|
|
let r = 0,
|
|
n = 0;
|
|
for (let o = t; o <= i; o++) {
|
|
const t = e.valueAt(o);
|
|
null !== t && (r += s(t), n++)
|
|
}
|
|
return n ? r / n : null
|
|
}(i, s, r);
|
|
if (null === e) return null;
|
|
this._highLowAvgPriceCache.set(2, e)
|
|
} else {
|
|
const e = function(e, t, i) {
|
|
return e.minMaxOnRangeCached(t, i, [{
|
|
name: "low",
|
|
offset: 0
|
|
}, {
|
|
name: "high",
|
|
offset: 0
|
|
}])
|
|
}(i, s, r);
|
|
if (null === e) return null;
|
|
this._highLowAvgPriceCache.set(1, e.min), this._highLowAvgPriceCache
|
|
.set(0, e.max)
|
|
}
|
|
}
|
|
return this._highLowAvgPriceCache.get(e)
|
|
}
|
|
_onSessionIdPropertyChanged() {
|
|
this._sessionIdChanged.fire(), this.isDWM() || (this.restart(), this
|
|
._updateLastPriceAnimationActive())
|
|
}
|
|
_subscribeRestartToSessionIdChange() {
|
|
this.properties().sessionId.subscribe(this, this
|
|
._onSessionIdPropertyChangedBound)
|
|
}
|
|
_unsubscribeRestartToSessionIdChange() {
|
|
this.properties().sessionId.unsubscribe(this, this
|
|
._onSessionIdPropertyChangedBound)
|
|
}
|
|
_updateLastPriceAnimationActive() {
|
|
if (!this._options.lastPriceAnimationEnabled) return;
|
|
const e = this._lastPriceAnimationActive,
|
|
t = this.properties(),
|
|
i = t.style.value();
|
|
if (this._model.isSnapshot() || !t.visible.value() || 3 !== i && 10 !== i &&
|
|
2 !== i) this._lastPriceAnimationActive = !1;
|
|
else {
|
|
const e = this.currentSession(),
|
|
t = !Object(d.isRegularSessionId)(this.sessionIdProxyProperty()
|
|
.value()) && !this.isDWM();
|
|
this._lastPriceAnimationActive = "market" === e || t && ("pre_market" ===
|
|
e || "post_market" === e)
|
|
}
|
|
this._lastPriceAnimationActive && e !== this._lastPriceAnimationActive && this
|
|
.model().invalidate(Re.InvalidationMask.cursor())
|
|
}
|
|
_onPropertiesChanged(e) {
|
|
const t = this._properties.childs();
|
|
e !== t.symbol && e !== t.interval && e !== t.timeframe && (this._tagsChanged
|
|
.fire(), this.createPaneView(), this.updateAllViews(), this.model()
|
|
.updateSource(this), Object(o.emit)("series_properties_changed", this
|
|
._id))
|
|
}
|
|
}
|
|
},
|
|
"lW/c": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
i("YFKU");
|
|
var s = i("hY0g"),
|
|
r = i.n(s),
|
|
n = i("HySD");
|
|
class o {
|
|
constructor(e) {
|
|
this._document = e, this.isFullscreen = new r.a;
|
|
const t = () => {
|
|
const e = ["fullscreenElement", "webkitFullscreenElement",
|
|
"mozFullscreenElement", "mozFullScreenElement",
|
|
"msFullscreenElement"
|
|
];
|
|
for (let t = 0; t < e.length; t++) {
|
|
const i = e[t];
|
|
if (i in this._document) {
|
|
this.isFullscreen.setValue(!!this._document[i]);
|
|
break
|
|
}
|
|
}
|
|
};
|
|
t();
|
|
for (const i of ["fullscreenchange", "webkitfullscreenchange",
|
|
"mozfullscreenchange", "MSFullscreenChange"
|
|
]) e.addEventListener(i, t, !1)
|
|
}
|
|
enter() {
|
|
const e = this._document.documentElement;
|
|
for (const t of ["requestFullscreen", "mozRequestFullScreen",
|
|
"webkitRequestFullscreen", "msRequestFullscreen"
|
|
])
|
|
if ("function" == typeof e[t]) {
|
|
e[t]();
|
|
break
|
|
} this.isFullscreen.setValue(!0)
|
|
}
|
|
exit() {
|
|
const e = this._document;
|
|
for (const t of ["exitFullscreen", "mozCancelFullScreen", "mozExitFullscreen",
|
|
"webkitExitFullscreen", "msExitFullscreen"
|
|
])
|
|
if ("function" == typeof e[t]) {
|
|
e[t]();
|
|
break
|
|
} this.isFullscreen.setValue(!1)
|
|
}
|
|
}
|
|
class a {
|
|
constructor(e) {
|
|
let t;
|
|
this.isVisible = new r.a(!0);
|
|
let i = null;
|
|
for (const s of ["", "moz", "ms", "webkit"]) {
|
|
const r = s ? s + "Hidden" : "hidden";
|
|
if (r in e) {
|
|
t = s + "visibilitychange", i = () => {
|
|
this.isVisible.setValue(!e[r])
|
|
}, i(), e.addEventListener(t, i, !1);
|
|
break
|
|
}
|
|
}
|
|
this.destroy = () => {
|
|
i && (e.removeEventListener(t, i, !1), i = null)
|
|
}
|
|
}
|
|
}
|
|
var l = i("mNbo"),
|
|
c = i("Eyy1"),
|
|
h = i("qFKp");
|
|
i.d(t, "Root", (function() {
|
|
return u
|
|
}));
|
|
class u {
|
|
constructor(e) {
|
|
this._updateDocumentHeight = e => {
|
|
"visual" === this._viewportType && this._window.document.documentElement
|
|
.style.setProperty("height", e + "px", "important")
|
|
}, this._window = e, this._fullscreenApi = new o(e.document), this
|
|
._viewportType = h.isChrome || Object(l.isOnMobileAppPage)("any") || !this
|
|
._window.visualViewport ? "quirks" : "visual", "visual" === this._viewportType ?
|
|
this._viewport = Object(c.ensureDefined)(this._window.visualViewport) : this
|
|
._viewport = this._window;
|
|
const t = this._layoutSizeSensor = this._window.document.createElement("div");
|
|
t.id = "layout-size-sensor", t.style.position = "fixed", t.style.top = "0", t.style
|
|
.left = "0", t.style.right = "0", t.style.bottom = "0", t.style.pointerEvents =
|
|
"none", t.style.visibility = "hidden", this._initFullscreen()
|
|
}
|
|
allocate() {
|
|
this.free();
|
|
const e = this._window.document,
|
|
t = e.createElement("div");
|
|
t.classList.add("js-rootresizer__contents"), t.style.position = "relative", t.style
|
|
.width = "100%", t.style.height = "100%", e.body.insertAdjacentElement(
|
|
"afterbegin", t), e.body.insertAdjacentElement("afterbegin", this
|
|
._layoutSizeSensor), this._visibilityApi = new a(this._window.document);
|
|
const i = {
|
|
alive: new r.a(!0),
|
|
fullscreenable: new r.a(!0),
|
|
container: new r.a(t),
|
|
width: new r.a,
|
|
height: new r.a,
|
|
availWidth: new r.a,
|
|
availHeight: new r.a,
|
|
visible: this._visibilityApi.isVisible,
|
|
fullscreen: this._fullscreenApi.isFullscreen,
|
|
remove: () => {
|
|
i.alive.setValue(!1)
|
|
},
|
|
attach: () => {
|
|
i.alive.setValue(!1), this._window.close()
|
|
},
|
|
requestFullscreen: () => {
|
|
this._requestFullscreen()
|
|
},
|
|
exitFullscreen: () => {
|
|
this._exitFullscreen()
|
|
}
|
|
};
|
|
return i.alive.subscribe(e => {
|
|
e || i !== this._area || this.free()
|
|
}), this._area = i, this._resizeHandler = () => {
|
|
const e = this._width(i) || 800,
|
|
t = this._height(i) || 600;
|
|
i.availHeight.setValue(t), i.availWidth.setValue(e), i.height.setValue(t), i
|
|
.width.setValue(e)
|
|
}, this._area.height.subscribe(this._updateDocumentHeight, {
|
|
callWithLast: !0
|
|
}), this._resizeHandler(), this._viewport.addEventListener("resize", this
|
|
._resizeHandler), new n.ResizerDetacherState(i).bridge()
|
|
}
|
|
free() {
|
|
if (this._resizeHandler && (this._viewport.removeEventListener("resize", this
|
|
._resizeHandler), this._resizeHandler = void 0), this._visibilityApi && (
|
|
this._visibilityApi.destroy(), this._visibilityApi = void 0), this._area) {
|
|
const e = this._area;
|
|
this._area = void 0, e.height.unsubscribe(this._updateDocumentHeight), e.alive
|
|
.setValue(!1);
|
|
const t = e.container.value(),
|
|
i = null == t ? void 0 : t.parentElement;
|
|
i && (i.removeChild(t), i.removeChild(this._layoutSizeSensor))
|
|
}
|
|
}
|
|
_height(e) {
|
|
if ("visual" === this._viewportType) return this._layoutSizeSensor.clientHeight;
|
|
return e.container.value().clientHeight
|
|
}
|
|
_width(e) {
|
|
return e.container.value().clientWidth
|
|
}
|
|
_requestFullscreen() {
|
|
this._fullscreenApi.enter()
|
|
}
|
|
_exitFullscreen() {
|
|
this._fullscreenApi.exit()
|
|
}
|
|
_initFullscreen() {
|
|
this._fullscreenApi.isFullscreen.subscribe(e => {
|
|
this._resizeHandler && this._resizeHandler()
|
|
})
|
|
}
|
|
}
|
|
},
|
|
ltKl: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "SeriesApi", (function() {
|
|
return l
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("jRfx"),
|
|
n = i("HGup"),
|
|
o = i("/ToI"),
|
|
a = i("GD+X");
|
|
class l {
|
|
constructor(e, t) {
|
|
this._series = e, this._undoModel = t, this._model = t.model()
|
|
}
|
|
isUserEditEnabled() {
|
|
return this._series.userEditEnabled()
|
|
}
|
|
setUserEditEnabled(e) {
|
|
this._series.setUserEditEnabled(e)
|
|
}
|
|
mergeUp() {
|
|
this._model.isMergeUpAvailableForSource(this._series) && new r.c(this._model, this
|
|
._series, "").redo()
|
|
}
|
|
mergeDown() {
|
|
this._model.isMergeDownAvailableForSource(this._series) && new r.a(this._model, this
|
|
._series, "").redo()
|
|
}
|
|
unmergeUp() {
|
|
this._model.isUnmergeAvailableForSource(this._series) && new n.c(this._model, this
|
|
._series, "").redo()
|
|
}
|
|
unmergeDown() {
|
|
this._model.isUnmergeAvailableForSource(this._series) && new n.a(this._model, this
|
|
._series, "").redo()
|
|
}
|
|
detachToRight() {
|
|
new o.b(this._model, this._series, this._pane(), "right", "").redo()
|
|
}
|
|
detachToLeft() {
|
|
new o.b(this._model, this._series, this._pane(), "left", "").redo()
|
|
}
|
|
detachNoScale() {
|
|
new o.b(this._model, this._series, this._pane(), "overlay", "").redo()
|
|
}
|
|
changePriceScale(e) {
|
|
const t = Object(s.ensureNotNull)(this._model.paneForSource(this._series));
|
|
switch (e) {
|
|
case "new-left":
|
|
new o.b(this._model, this._series, t, "left", "").redo();
|
|
break;
|
|
case "new-right":
|
|
new o.b(this._model, this._series, t, "right", "").redo();
|
|
break;
|
|
case "no-scale":
|
|
Object(s.assert)(t.actionNoScaleIsEnabled(this._series),
|
|
"Unable to leave a pane without any non-overlay price scale"), new o
|
|
.b(this._model, this._series, t, "overlay", "").redo();
|
|
break;
|
|
default:
|
|
const i = this._model.dataSourceForId(e);
|
|
if (null === i) throw new Error(`There is no study with entityId='${e}'`);
|
|
const r = this._model.paneForSource(i) === t;
|
|
Object(s.assert)(r, "Study should be on the main pane");
|
|
const n = Object(s.ensureNotNull)(i.priceScale());
|
|
new o.a(this._model, this._series, t, n, "").redo()
|
|
}
|
|
}
|
|
isVisible() {
|
|
return this._series.properties().visible.value()
|
|
}
|
|
setVisible(e) {
|
|
this._series.properties().visible.setValue(e)
|
|
}
|
|
bringToFront() {
|
|
this._model.bringToFront([this._series])
|
|
}
|
|
sendToBack() {
|
|
this._model.sendToBack([this._series])
|
|
}
|
|
entityId() {
|
|
return this._series.id()
|
|
}
|
|
chartStyleProperties(e) {
|
|
return this._series.properties().child(c(e)).state(["inputs", "inputsInfo"])
|
|
}
|
|
setChartStyleProperties(e, t) {
|
|
this._series.properties().child(c(e)).mergeAndFire(t)
|
|
}
|
|
barsCount() {
|
|
return this._series.bars().size()
|
|
}
|
|
symbolSource() {
|
|
return {
|
|
symbol: this._series.symbol(),
|
|
currencyId: this._series.currency(),
|
|
unitId: this._series.unit()
|
|
}
|
|
}
|
|
isLoading() {
|
|
return this._series.isLoading()
|
|
}
|
|
data() {
|
|
return this._series.data()
|
|
}
|
|
priceScale() {
|
|
return new a.a(this._undoModel, this._series.priceScale())
|
|
}
|
|
_pane() {
|
|
return Object(s.ensureNotNull)(this._model.paneForSource(this._series))
|
|
}
|
|
}
|
|
|
|
function c(e) {
|
|
switch (e) {
|
|
case 0:
|
|
return "barStyle";
|
|
case 1:
|
|
return "candleStyle";
|
|
case 2:
|
|
return "lineStyle";
|
|
case 3:
|
|
return "areaStyle";
|
|
case 4:
|
|
return "renkoStyle";
|
|
case 5:
|
|
return "kagiStyle";
|
|
case 6:
|
|
return "pnfStyle";
|
|
case 7:
|
|
return "pbStyle";
|
|
case 8:
|
|
return "haStyle";
|
|
case 9:
|
|
return "hollowCandleStyle";
|
|
case 10:
|
|
return "baselineStyle";
|
|
case 11:
|
|
return "rangeStyle";
|
|
case 12:
|
|
return "hiloStyle";
|
|
default:
|
|
Object(s.ensureNever)(e)
|
|
}
|
|
throw new Error("unsupported chart style: " + e)
|
|
}
|
|
},
|
|
lxNp: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("/3z9"),
|
|
r = i("d700"),
|
|
n = i("hY0g"),
|
|
o = i.n(n);
|
|
var a = i("JWMC");
|
|
class l {
|
|
constructor(e, t) {
|
|
this._group = e, this.hotkey = t.hotkey,
|
|
this.handler = t.handler, this.desc = t.desc, this.element = t.element || null,
|
|
t.isDisabled ? "function" == typeof t.isDisabled ? this.isDisabled = t
|
|
.isDisabled : this.isDisabled = () => !0 : this.isDisabled = () => !1
|
|
}
|
|
destroy() {
|
|
this._group && (this._group.remove(this), this._group = null)
|
|
}
|
|
}
|
|
class c {
|
|
constructor(e, t) {
|
|
this._actions = [], this._manager = e, this.modal = !(!t || !t.modal), t && (this
|
|
.desc = t.desc), t && t.isDisabled ? "function" == typeof t.isDisabled ?
|
|
this.isDisabled = t.isDisabled : this.isDisabled = () => !0 : this.isDisabled =
|
|
() => !1, this._manager.registerGroup(this)
|
|
}
|
|
add(e) {
|
|
const t = new l(this, e);
|
|
return this._actions.push(t), t
|
|
}
|
|
remove(e) {
|
|
for (let t = this._actions.length; t-- > 0;) this._actions[t] === e && this._actions
|
|
.splice(t, 1)
|
|
}
|
|
handleHotkey(e, t) {
|
|
for (let i = this._actions.length; i-- > 0;) {
|
|
const r = this._actions[i];
|
|
if (r.hotkey === e && ((!r.element || t.target && r.element.contains(t
|
|
.target)) && !r.isDisabled())) return r.handler(t), t.preventDefault(),
|
|
Object(a.trackEvent)("Keyboard Shortcuts", Object(s.humanReadableHash)(
|
|
e)), !0
|
|
}
|
|
return !1
|
|
}
|
|
promote() {
|
|
this._manager.promoteGroup(this)
|
|
}
|
|
destroy() {
|
|
this._actions.length = 0, this._manager.unregisterGroup(this)
|
|
}
|
|
}
|
|
i.d(t, "pressedKeys", (function() {
|
|
return u
|
|
})), i.d(t, "createGroup", (function() {
|
|
return d
|
|
})), i.d(t, "registerWindow", (function() {
|
|
return p
|
|
})), i.d(t, "unregisterWindow", (function() {
|
|
return _
|
|
})), i.d(t, "Modifiers", (function() {
|
|
return s.Modifiers
|
|
}));
|
|
const h = new class {
|
|
constructor() {
|
|
this._groups = [], this._pressedKeys = new o.a(0), this._keyDownListener =
|
|
e => {
|
|
if (e.defaultPrevented) return;
|
|
const t = Object(s.hashFromEvent)(e);
|
|
if (this._pressedKeys.setValue(t), !Object(r.a)(t, e.target))
|
|
for (let i = this._groups.length; i-- > 0;) {
|
|
const s = this._groups[i];
|
|
if (!s.isDisabled()) {
|
|
if (s.handleHotkey(t, e)) return;
|
|
if (s.modal) return
|
|
}
|
|
}
|
|
}, this._keyUpListener = e => {
|
|
const t = Object(s.hashFromEvent)(e);
|
|
this._pressedKeys.setValue(t)
|
|
}, this._blurEvent = () => {
|
|
this._pressedKeys.setValue(0)
|
|
}, this._mouseEvent = e => {
|
|
const t = Object(s.modifiersFromEvent)(e),
|
|
i = 255 & this._pressedKeys.value();
|
|
this._pressedKeys.setValue(t | i)
|
|
}
|
|
}
|
|
listen(e) {
|
|
e.addEventListener("keydown", this._keyDownListener), e.addEventListener(
|
|
"keyup", this._keyUpListener), e.addEventListener("blur", this
|
|
._blurEvent), e.addEventListener("mousemove", this._mouseEvent)
|
|
}
|
|
unlisten(e) {
|
|
e.removeEventListener("keydown", this._keyDownListener), e.removeEventListener(
|
|
"keyup", this._keyUpListener), e.removeEventListener("blur", this
|
|
._blurEvent), e.removeEventListener("mousemove", this._mouseEvent)
|
|
}
|
|
registerGroup(e) {
|
|
this._groups.push(e)
|
|
}
|
|
unregisterGroup(e) {
|
|
for (let t = this._groups.length; t--;) this._groups[t] === e && this._groups
|
|
.splice(t, 1)
|
|
}
|
|
promoteGroup(e) {
|
|
let t = this._groups.length - 1;
|
|
for (let i = this._groups.length; i--;) {
|
|
if (this._groups[i] === e) return void(i !== t && (this._groups.splice(i,
|
|
1), this._groups.splice(t, 0, e)));
|
|
this._groups[i].modal && (t = i - 1)
|
|
}
|
|
}
|
|
pressedKeys() {
|
|
return this._pressedKeys
|
|
}
|
|
},
|
|
u = h.pressedKeys();
|
|
|
|
function d(e) {
|
|
return new c(h, e)
|
|
}
|
|
|
|
function p(e) {
|
|
h.listen(e)
|
|
}
|
|
|
|
function _(e) {
|
|
h.unlisten(e)
|
|
}
|
|
p(window)
|
|
},
|
|
"m/3z": function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "d", (function() {
|
|
return d
|
|
})), i.d(t, "c", (function() {
|
|
return p
|
|
})), i.d(t, "b", (function() {
|
|
return _
|
|
})), i.d(t, "a", (function() {
|
|
return m
|
|
}));
|
|
var s = i("lxNp"),
|
|
r = i("/3z9"),
|
|
n = i("d700"),
|
|
o = i("hY0g"),
|
|
a = i.n(o),
|
|
l = i("KnF9");
|
|
const c = new a.a(Boolean(s.pressedKeys.value() & r.Modifiers.Shift)),
|
|
h = new a.a(Boolean(s.pressedKeys.value() & r.Modifiers.Mod)),
|
|
u = new a.a(Boolean(s.pressedKeys.value() & r.Modifiers.Alt));
|
|
|
|
function d() {
|
|
return c
|
|
}
|
|
|
|
function p() {
|
|
return h
|
|
}
|
|
|
|
function _() {
|
|
return new l.a({
|
|
altKey: u.value(),
|
|
ctrlKey: p().value(),
|
|
metaKey: p().value(),
|
|
shiftKey: d().value()
|
|
})
|
|
}
|
|
s.pressedKeys.subscribe(e => {
|
|
c.setValue(Boolean(e & r.Modifiers.Shift)), h.setValue(Boolean(e & r.Modifiers
|
|
.Mod)), u.setValue(Boolean(e & r.Modifiers.Alt))
|
|
});
|
|
class m {
|
|
constructor(e, t) {
|
|
this._pressedKeyCode = null, this._boundKeydownHandler = null, this
|
|
._boundKeyupHandler = null, this._chartWidget = e, this._parent = t, this
|
|
._boundKeydownHandler = this._keydownHandler.bind(this), this
|
|
._boundKeyupHandler = this._keyupHandler.bind(this), this._parent.ownerDocument
|
|
.addEventListener("keydown", this._boundKeydownHandler), this._parent
|
|
.ownerDocument.addEventListener("keyup", this._boundKeyupHandler)
|
|
}
|
|
destroy() {
|
|
null !== this._boundKeydownHandler && (this._parent.ownerDocument
|
|
.removeEventListener("keydown", this._boundKeydownHandler), this
|
|
._boundKeydownHandler = null), null !== this._boundKeyupHandler && (this
|
|
._parent.ownerDocument.removeEventListener("keyup", this
|
|
._boundKeyupHandler), this._boundKeyupHandler = null)
|
|
}
|
|
_keydownHandler(e) {
|
|
this._chartWidget.hasModel() && window.document.activeElement === window.document
|
|
.body && this._chartWidget.isActive() && (this._handleMoveDrawingsKeyDown(e) ||
|
|
this._handleScrollKeyDown(e) || this._handleZoomKeyDown(e)) && e
|
|
.preventDefault()
|
|
}
|
|
_keyupHandler(e) {
|
|
this._chartWidget.hasModel() && this._handleScrollKeyUp(e)
|
|
}
|
|
_handleMoveDrawingsKeyDown(e) {
|
|
const t = 255 & Object(r.hashFromEvent)(e),
|
|
i = this._chartWidget.model();
|
|
switch (t) {
|
|
case 37:
|
|
return i.moveSelectedToolsLeft();
|
|
case 39:
|
|
return i.moveSelectedToolsRight();
|
|
case 38:
|
|
return i.moveSelectedToolsUp();
|
|
case 40:
|
|
return i.moveSelectedToolsDown()
|
|
}
|
|
return !1
|
|
}
|
|
_handleScrollKeyDown(e) {
|
|
if (null !== this._pressedKeyCode) return !1;
|
|
const t = Object(r.hashFromEvent)(e),
|
|
i = 255 & t,
|
|
s = Object(r.modifiersFromEvent)(e);
|
|
let o;
|
|
if (37 === i) o = 1;
|
|
else {
|
|
if (39 !== i) return !1;
|
|
o = -1
|
|
}
|
|
return !(r.isMacKeyboard && s === r.Modifiers.Mod || s !== r.Modifiers.Mod && s !==
|
|
r.Modifiers.Alt && s !== r.Modifiers.None) && (!Object(n.a)(t, e.target) &&
|
|
(this._pressedKeyCode = i, s === r.Modifiers.None ? this._chartWidget
|
|
.scrollHelper().moveByBar(o) : this._chartWidget.scrollHelper().move(o),
|
|
!0))
|
|
}
|
|
_handleScrollKeyUp(e) {
|
|
if (null === this._pressedKeyCode) return !1;
|
|
const t = Object(r.hashFromEvent)(e);
|
|
if (Object(n.a)(t, e.target)) return !1;
|
|
return (255 & t) === this._pressedKeyCode && (this._pressedKeyCode = null, this
|
|
._chartWidget.scrollHelper().stopMove(), !0)
|
|
}
|
|
_handleZoomKeyDown(e) {
|
|
const t = Object(r.hashFromEvent)(e),
|
|
i = 255 & t;
|
|
if (Object(r.modifiersFromEvent)(e) !== r.Modifiers.Mod || Object(n.a)(t, e.target))
|
|
return !1;
|
|
const s = this._chartWidget.model();
|
|
if (38 === i) s.zoomIn();
|
|
else {
|
|
if (40 !== i) return !1;
|
|
s.zoomOut()
|
|
}
|
|
return !0
|
|
}
|
|
}
|
|
},
|
|
"m/cY": function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return n
|
|
}));
|
|
var s = i("tc+8"),
|
|
r = i.n(s);
|
|
|
|
function n(e) {
|
|
return new r.a(e)
|
|
}
|
|
},
|
|
mE5r: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Eyy1"),
|
|
r = i("ikwP"),
|
|
n = i("gAom"),
|
|
o = i("H0vP"),
|
|
a = i("aO4+"),
|
|
l = i("XlJ7"),
|
|
c = i("EsvI"),
|
|
h = i("OsWk"),
|
|
u = i("rL76"),
|
|
d = i("zDbI");
|
|
const p = parseInt(u.labelheight),
|
|
_ = parseInt(u.bottommargin);
|
|
|
|
function m(e) {
|
|
return e / 11
|
|
}
|
|
class f {
|
|
constructor() {
|
|
this._wrapper = document.createElement("div"), this._element = document
|
|
.createElement("div"), this._labelElement = document.createElement("div"), this
|
|
._gearElement = document.createElement("div"), this._currentScale = 1, this
|
|
._info = null, this._mode = "auto", this._wrapper.appendChild(this._element),
|
|
this._wrapper.classList.add(u.wrapper), this._element.classList.add(u.label),
|
|
this._labelElement.className = u.symbol, this._element.appendChild(this
|
|
._labelElement), this._gearElement.className = u.gear, this._gearElement
|
|
.innerHTML = h, this._element.appendChild(this._gearElement)
|
|
}
|
|
getElement() {
|
|
return this._wrapper
|
|
}
|
|
setMode(e) {
|
|
this._mode !== e && (this._mode = e)
|
|
}
|
|
align(e, t) {
|
|
const i = m(t);
|
|
Math.abs(i - this._currentScale) > .1 && (this._currentScale = i, Math.abs(this
|
|
._currentScale - 1) > .1 ? this._element.style.transform =
|
|
`scale(${this._currentScale})` : (this._currentScale = 1, this._element
|
|
.style.transform = ""))
|
|
}
|
|
drawLabelForScreenshot(e, t) {
|
|
if (null === this._info || "gear" === this._mode) return;
|
|
const i = Object(l.makeFont)(t.fontSize, d.CHART_FONT_FAMILY);
|
|
e.fillStyle = c.themes[t.theme].getThemedColor("color-price-axis-label-back"), e
|
|
.globalAlpha = .5, e.beginPath();
|
|
const s = m(t.fontSize) * p / 2,
|
|
r = Object(a.point)(t.offset + t.width / 2, t.height / 2);
|
|
e.arc(r.x, r.y, s, 0, 2 * Math.PI, !0), e.fill(), e.globalAlpha = 1, e.fillStyle = c
|
|
.themes[t.theme].getThemedColor("color-price-axis-label-text"), e.textAlign =
|
|
"center", e.font = i, e.textBaseline = "middle", e.fillText(this._info.label, r
|
|
.x, r.y)
|
|
}
|
|
setAxisNameInfo(e) {
|
|
this._info = e, null !== e && (this._labelElement.textContent = e.label)
|
|
}
|
|
static height(e) {
|
|
return (p + _) * e
|
|
}
|
|
}
|
|
var g = i("aIyQ"),
|
|
b = i.n(g),
|
|
v = i("S8xo"),
|
|
S = i("5VQP"),
|
|
y = i("CPmC");
|
|
const w = {
|
|
enableTooltip: !0,
|
|
showLabels: !0,
|
|
enableMenu: !0,
|
|
enableHighlight: !0
|
|
};
|
|
class P {
|
|
constructor(e, t, i, s, n) {
|
|
this._invalidated = !0, this._size = new r.Size(0, 0), this._offset = 0, this
|
|
._axisInfo = null, this._onLabelHovered = new b.a, this._highlighted = !1, this
|
|
._labelMode = "auto", this._fixedLabelMode = null, this
|
|
._canvasConfiguredHandler = () => this.update(), this._isLeft = "left" === e,
|
|
this._rendererOptionsProvider = s.rendererOptionsProvider, this
|
|
._sourcesTitlesProvider = s.sourcesTitlesProvider, this
|
|
._contextMenuItemsProvider = s.contextMenuItemsProvider, this
|
|
._backgroundBasedTheme = s.backgroundBasedTheme, this._getBackgroundTopColor = s
|
|
.getBackgroundTopColor, this._getBackgroundBottomColor = s
|
|
.getBackgroundBottomColor, this._showHorizontalBorder = Boolean(s
|
|
.showHorizontalBorder), this._properties = t, this._axisInfo = i, this
|
|
._labelOptions = {
|
|
...w,
|
|
...n
|
|
}, this._properties.lineColor.subscribe(this, this._onPropertyChanged), this
|
|
._cell = document.createElement("div"), this._cell.classList.add(u[
|
|
"price-axis-stub"]), this._labelOptions.enableTooltip && this._cell
|
|
.classList.add("apply-common-tooltip"), this._cell.style.width = "25px", this
|
|
._cell.style.height = "100%", this._cell.style.position = "absolute", this._cell
|
|
.style.left = "0", this._cell.style.overflow = "hidden", this._labelOptions
|
|
.showLabels ? (this._label = new f,
|
|
this._label.setAxisNameInfo(this._axisInfo), this._cell.appendChild(this
|
|
._label.getElement()), this._labelOptions.enableTooltip && Object(y.b)(
|
|
this._cell, "text", e => this._tooltipContent())) : this._label = null,
|
|
this._mouseEventHandler = new v.MouseEventHandler(this._cell, this, {
|
|
treatHorzTouchDragAsPageScroll: !0,
|
|
treatVertTouchDragAsPageScroll: !0
|
|
}), this._canvasBinding = Object(r.createBoundCanvas)(this._cell, new r.Size(16,
|
|
16)), this._canvasBinding.subscribeCanvasConfigured(this
|
|
._canvasConfiguredHandler);
|
|
const o = this._canvasBinding.canvas;
|
|
o.style.position = "absolute", o.style.left = "0", o.style.top = "0"
|
|
}
|
|
destroy() {
|
|
this._canvasBinding.unsubscribeCanvasConfigured(this._canvasConfiguredHandler), this
|
|
._canvasBinding.destroy(), this._properties.lineColor.unsubscribe(this, this
|
|
._onPropertyChanged), this._mouseEventHandler.destroy()
|
|
}
|
|
mouseEnterEvent(e) {
|
|
this._mouseOrTouchEnterEvent(e)
|
|
}
|
|
touchStartEvent(e) {
|
|
this._mouseOrTouchEnterEvent(e)
|
|
}
|
|
mouseLeaveEvent(e) {
|
|
this._mouseOrTouchLeaveEvent(e)
|
|
}
|
|
touchEndEvent(e) {
|
|
this._mouseOrTouchLeaveEvent(e)
|
|
}
|
|
mouseClickEvent(e) {
|
|
this._mouseClickOrTapEvent(e)
|
|
}
|
|
tapEvent(e) {
|
|
this._mouseClickOrTapEvent(e)
|
|
}
|
|
update() {
|
|
this._invalidated = !0
|
|
}
|
|
getElement() {
|
|
return this._cell
|
|
}
|
|
onLabelHovered() {
|
|
return this._onLabelHovered
|
|
}
|
|
setSizeAndOffset(e, t) {
|
|
if (e.w < 0 || e.h < 0) throw new Error(
|
|
"Try to set invalid size to PriceAxisStub " + JSON.stringify(e));
|
|
this._size.equals(e) || (this._size = e, this._canvasBinding.resizeCanvas({
|
|
width: e.w,
|
|
height: e.h
|
|
}), this._cell.style.width = e.w + "px", this._cell.style.minWidth = e.w +
|
|
"px", this._cell.style.height = e.h + "px", this._invalidated = !0), this
|
|
._offset !== t && (this._offset = t, this._cell.style.left = t + "px")
|
|
}
|
|
paint(e) {
|
|
if (e < o.InvalidationLevel.Full && !this._invalidated) return;
|
|
if (0 === this._size.w || 0 === this._size.h) return;
|
|
this._invalidated = !1;
|
|
const t = Object(r.getContext2D)(this._canvasBinding.canvas);
|
|
this._drawBackground(t, this._canvasBinding.pixelRatio), this._drawVerticalBorder(t,
|
|
this._canvasBinding.pixelRatio), this._showHorizontalBorder && this
|
|
._drawHorizontalBorder(t, this._canvasBinding.pixelRatio)
|
|
}
|
|
hardResetCanvas() {
|
|
Object(r.hardResizeCanvas)(this._canvasBinding, this._size)
|
|
}
|
|
getWidth() {
|
|
return this._size.w
|
|
}
|
|
getImage() {
|
|
const e = Object(r.createDisconnectedCanvas)(document, this._size),
|
|
t = Object(r.getPrescaledContext2D)(e),
|
|
i = this._getBackgroundTopColor(),
|
|
s = this._getBackgroundBottomColor();
|
|
return i === s ? Object(r.clearRect)(t, 0, 0, this._size.w, this._size.h, i) :
|
|
Object(n.clearRectWithGradient)(t, 0, 0, this._size.w, this._size.h, i, s), t
|
|
.drawImage(this._canvasBinding.canvas, 0, 0, this._size.w, this._size.h),
|
|
null !== this._label && this._label.drawLabelForScreenshot(t, {
|
|
offset: 0,
|
|
width: this._size.w,
|
|
height: this._size.h,
|
|
fontSize: this._properties.fontSize.value(),
|
|
theme: this._backgroundBasedTheme.value()
|
|
}), e
|
|
}
|
|
setLabelMode(e) {
|
|
e !== this._labelMode && (this._labelMode = e, null !== this._label && this._label
|
|
.setMode(e), this._cell.classList.toggle(u["fixed-gear"], "gear" === e),
|
|
this._cell.classList.toggle(u["fixed-symbol"], "symbol" === e), this._cell
|
|
.classList.toggle("apply-common-tooltip", "symbol" !== e && this
|
|
._labelOptions.enableTooltip))
|
|
}
|
|
_setHighlighted(e) {
|
|
this._labelOptions.enableHighlight && (this._onLabelHovered.fire("stubButton", e),
|
|
this._highlighted !== e && (this._highlighted = e, this._invalidated = !0))
|
|
}
|
|
_onPropertyChanged() {
|
|
this._invalidated = !0
|
|
}
|
|
_drawVerticalBorder(e, t) {
|
|
const i = this._size.w;
|
|
e.save(), e.fillStyle = this._properties.lineColor.value();
|
|
const s = Math.max(1, Math.floor(this._rendererOptionsProvider.options()
|
|
.borderSize * t)),
|
|
r = this._isLeft ? Math.floor(i * t) - s : 0,
|
|
n = Math.ceil(this._size.h * t);
|
|
e.fillRect(r, 0, s, n + 1), e.restore()
|
|
}
|
|
_drawHorizontalBorder(e, t) {
|
|
e.save(), e.fillStyle = this._properties.lineColor.value();
|
|
const i = Math.max(1, Math.floor(this._rendererOptionsProvider.options()
|
|
.borderSize * t)),
|
|
s = Math.ceil(this._size.w * t),
|
|
r = this._isLeft ? 0 : i;
|
|
e.fillRect(r, 0, s - i, i), e.restore()
|
|
}
|
|
_drawBackground(e, t) {
|
|
const i = Math.ceil(t * this._size.w),
|
|
s = Math.ceil(t * this._size.h),
|
|
o = this._getBackgroundTopColor(),
|
|
a = this._getBackgroundBottomColor();
|
|
if (o === a ? Object(r.clearRect)(e, 0, 0, i + 1, s + 1, o) : Object(n
|
|
.clearRectWithGradient)(e, 0, 0, i + 1, s + 1, o, a), this._highlighted) {
|
|
const t = c.themes[this._backgroundBasedTheme.value()].getThemedColor(
|
|
"color-price-axis-highlight");
|
|
Object(r.fillRect)(e, 0, 0, i + 1, s + 1, t), e.globalAlpha = 1
|
|
}
|
|
}
|
|
_tooltipContent() {
|
|
return this._sourcesTitlesProvider().join("\n")
|
|
}
|
|
_mouseOrTouchEnterEvent(e) {
|
|
null !== this._label && "symbol" !== this._labelMode && this._labelOptions
|
|
.enableHighlight && this._setHighlighted(!0)
|
|
}
|
|
_mouseOrTouchLeaveEvent(e) {
|
|
"symbol" !== this._labelMode && this._setHighlighted(!1)
|
|
}
|
|
_mouseClickOrTapEvent(e) {
|
|
e.preventDefault(), null === this._fixedLabelMode && "symbol" !== this._labelMode &&
|
|
this._labelOptions.enableMenu && this._labelOptions.showLabels ? (this
|
|
._fixedLabelMode = this._labelMode, this.setLabelMode("gear"), S
|
|
.ContextMenuManager.createMenu(this._contextMenuItemsProvider(), {
|
|
statName: "PriceScaleLabelContextMenu"
|
|
}, () => {
|
|
this.setLabelMode(Object(s.ensureNotNull)(this._fixedLabelMode)),
|
|
this._fixedLabelMode = null
|
|
}).then(e => e.show((e, t) => {
|
|
const i = this._cell.getBoundingClientRect();
|
|
return {
|
|
clientX: this._isLeft ? i.left : i.right - e,
|
|
clientY: i.top - Math.min(t, i.top),
|
|
overrideHeight: i.top < t ? i.top : void 0
|
|
}
|
|
}, this.getElement(), !0))) : S.ContextMenuManager.hideAll()
|
|
}
|
|
}
|
|
var C = i("Daqx");
|
|
i.d(t, "a", (function() {
|
|
return x
|
|
}));
|
|
class x {
|
|
constructor(e, t, i, s, n) {
|
|
this._axises = [], this._stubs = [], this._size = new r.Size(0, 0), this
|
|
._onLabelHovered = new b.a, this._scalesProperties = e, this
|
|
._priceAxisWidgetFactory = i, this._rendererOptionsProvider = s
|
|
.rendererOptionsProvider, this._titlesProvider = s.titlesProvider, this
|
|
._stubContextMenuProvider = s.stubContextMenuProvider, this
|
|
._backgroundBasedTheme = s.backgroundBasedTheme, this._getBackgroundTopColor = s
|
|
.getBackgroundTopColor, this._getBackgroundBottomColor = s
|
|
.getBackgroundBottomColor, this._showHorisontalBorder = Boolean(s
|
|
.showHorizontalBorder), this._labelsOptions = {
|
|
...w,
|
|
...n
|
|
};
|
|
const o = this._scalesProperties.childs();
|
|
this._stubProperties = {
|
|
lineColor: o.lineColor,
|
|
fontSize: o.fontSize
|
|
}, this._side = t, this._cell = document.createElement("td"), this._cell
|
|
.classList.add("chart-markup-table", "price-axis-container"), this._cell.style
|
|
.width = "25px", this._cell.style.position = "relative"
|
|
}
|
|
destroy() {
|
|
this.setScales([], 0, 0, 0)
|
|
}
|
|
onLabelHovered() {
|
|
return this._onLabelHovered
|
|
}
|
|
setScales(e, t, i, r) {
|
|
for (; e.length > this._axises.length && this._axises.length < t;) {
|
|
const e = Object(C.a)(this._side, this._axises.length),
|
|
t = this._priceAxisWidgetFactory(this._side, this._rendererOptionsProvider,
|
|
this._scalesProperties, e, this._backgroundBasedTheme);
|
|
this._axises.push(t), this._cell.appendChild(t.getElement())
|
|
}
|
|
for (; e.length < this._axises.length;) {
|
|
const e = Object(s.ensureDefined)(this._axises.pop());
|
|
this._cell.removeChild(e.getElement()), e.destroy()
|
|
}
|
|
for (let t = 0; t < this._axises.length; ++t) this._axises[t].setPriceScale(e[t]);
|
|
const n = t - e.length,
|
|
o = Math.max(0, n);
|
|
for (; this._stubs.length > o;) {
|
|
const e = Object(s.ensureDefined)(this._stubs.pop());
|
|
e.onLabelHovered().unsubscribeAll(this), this._cell.removeChild(e.getElement()),
|
|
e.destroy()
|
|
}
|
|
for (; this._stubs.length < n;) {
|
|
const e = this._labelsOptions.showLabels ? Object(C.a)(this._side, this._stubs
|
|
.length) : null,
|
|
t = this._stubs.length,
|
|
i = new P(this._side, this._stubProperties, e, this._stubParams(t), this
|
|
._labelsOptions);
|
|
i.onLabelHovered().subscribe(this, (t, i) => {
|
|
this._labelsOptions.showLabels && this._labelsOptions
|
|
.enableHighlight && this._onLabelHovered.fire({
|
|
owner: t,
|
|
axis: Object(s.ensureNotNull)(e)
|
|
}, i)
|
|
}), this._stubs.push(i), this._cell.appendChild(i.getElement())
|
|
}
|
|
const a = this._labelsOptions.enableMenu;
|
|
1 === r ? this._stubs.forEach((e, t) => e.setLabelMode(a ? "gear" : "symbol")) :
|
|
this._stubs.forEach((e, t) => e.setLabelMode(t < i && a ? "auto" : "symbol"))
|
|
}
|
|
getElement() {
|
|
return this._cell
|
|
}
|
|
optimalWidths() {
|
|
return this._axises.map(e => e.optimalWidth())
|
|
}
|
|
setSizes(e, t) {
|
|
this._size = new r.Size(t.reduce((e, t) => e + t, 0), e), this._cell.style.width =
|
|
this._size.w + "px", this._cell.style.minWidth = this._size.w + "px", this._cell
|
|
.style.height = this._size.h + "px", t.length !== this._axises.length + this
|
|
._stubs.length && Object(s.assert)(t.length === this._axises.length + this
|
|
._stubs.length, "Widgets count should be the same as widths one");
|
|
let i = 0;
|
|
this._forEachWidgetFromLeft((s, n) => {
|
|
const o = t[n];
|
|
s.setSizeAndOffset(new r.Size(o, e), i), i += o
|
|
})
|
|
}
|
|
update() {
|
|
this._axises.forEach(e => e.update()), this._stubs.forEach(e => e.update())
|
|
}
|
|
paint(e) {
|
|
this._axises.forEach((t, i) => t.paint(e(i))), this._stubs.forEach((t, i) => t
|
|
.paint(e(i)))
|
|
}
|
|
paintStubs(e) {
|
|
this._stubs.forEach(t => t.paint(e))
|
|
}
|
|
hardResetCanvas() {
|
|
this._axises.forEach(e => e.hardResetCanvas()), this._stubs.forEach(e => e
|
|
.hardResetCanvas())
|
|
}
|
|
restoreDefaultCursor() {
|
|
this._axises.forEach(e => e.restoreDefaultCursor())
|
|
}
|
|
getWidth() {
|
|
return this._size.w
|
|
}
|
|
findAxisWidgetForScale(e) {
|
|
const t = this._axises.find(t => t.priceScale() === e);
|
|
return void 0 === t ? null : t
|
|
}
|
|
getScreenshotData() {
|
|
const e = this._getImage();
|
|
return {
|
|
content: e.toDataURL(),
|
|
canvas: e,
|
|
contentHeight: this._size.h,
|
|
contentWidth: this._size.w
|
|
}
|
|
}
|
|
getImage() {
|
|
return this._getImage()
|
|
}
|
|
slotsCount() {
|
|
return this._axises.length + this._stubs.length
|
|
}
|
|
highlightPriceAxisByLabel(e) {
|
|
this._axises.forEach(t => {
|
|
const i = t.axisInfo();
|
|
t.setHighlighted(null !== i && i.equals(e))
|
|
})
|
|
}
|
|
axes() {
|
|
return this._axises
|
|
}
|
|
_stubParams(e) {
|
|
return {
|
|
rendererOptionsProvider: this._rendererOptionsProvider,
|
|
backgroundBasedTheme: this._backgroundBasedTheme,
|
|
sourcesTitlesProvider: () => this._titlesProvider(this._side, e),
|
|
contextMenuItemsProvider: () => this._stubContextMenuProvider(this._side, e),
|
|
getBackgroundTopColor: this._getBackgroundTopColor,
|
|
getBackgroundBottomColor: this._getBackgroundBottomColor,
|
|
showHorizontalBorder: this._showHorisontalBorder
|
|
}
|
|
}
|
|
_getImage() {
|
|
const e = Object(r.createDisconnectedCanvas)(document, this._size),
|
|
t = Object(r.getPrescaledContext2D)(e);
|
|
let i = 0;
|
|
return this._forEachWidgetFromLeft((e, s) => {
|
|
const r = e.getWidth();
|
|
0 !== r && (t.drawImage(e.getImage(), i, 0, r, this._size.h), i += r)
|
|
}), e
|
|
}
|
|
_forEachWidgetFromLeft(e) {
|
|
const t = [...this._axises, ...this._stubs],
|
|
i = "left" === this._side,
|
|
s = i ? -1 : t.length,
|
|
r = i ? -1 : 1;
|
|
for (let n = i ? t.length - 1 : 0; n !== s; n += r) e(t[n], n, t)
|
|
}
|
|
}
|
|
},
|
|
"mKT+": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("QloM");
|
|
|
|
function r(e, t, s, r, n) {
|
|
return Promise.all([i.e("redux"), i.e("react"), i.e(1), i.e(3), i.e(4), i.e(6), i.e(8), i.e(
|
|
9), i.e(11), i.e(12), i.e(13), i.e(14), i.e(16), i.e(17), i.e(19), i.e(21),
|
|
i.e(22), i.e(23), i.e(26), i.e(29), i.e(33), i.e(34), i.e(35), i.e(36), i.e(39),
|
|
i.e(42), i.e(43), i.e(45), i.e(49), i.e(50), i.e(59), i.e(64), i.e(65), i.e(86),
|
|
i.e(0), i.e(2), i.e(5), i.e(7), i.e(10), i.e(15), i.e(18), i.e(20), i.e(25), i
|
|
.e(27), i.e(30), i.e(31), i.e(32), i.e(37), i.e(40), i.e(44), i.e(47), i.e(46),
|
|
i.e(55), i.e(58), i.e("new-edit-object-dialog")
|
|
]).then(i.bind(null, "Y5hB")).then(i => {
|
|
const s = new(0, i.EditObjectDialogRenderer)(e, t, r, n);
|
|
return s.show(), s
|
|
})
|
|
}
|
|
var n = i("3ClC");
|
|
let o = null;
|
|
var a = i("USzt"),
|
|
l = i("CW80");
|
|
i.d(t, "resolveAndShowEditObjectDialog", (function() {
|
|
return h
|
|
}));
|
|
const c = {
|
|
[s.TabNames.symbol]: "symbol",
|
|
[s.TabNames.legend]: "legend",
|
|
[s.TabNames.scales]: "scales",
|
|
[s.TabNames.trading]: "trading",
|
|
[s.TabNames.events]: "events",
|
|
[s.TabNames.timezoneSessions]: "appearance",
|
|
[s.TabNames.text]: "text",
|
|
[s.TabNames.style]: "style"
|
|
};
|
|
async function h(e, t, s = {}, h, u) {
|
|
const d = h.activeChartWidget.value();
|
|
if (Object(l.isStudyLineTool)(e) && function(e) {
|
|
return [a.a].some(t => e instanceof t)
|
|
}(e)) return d.propertiesDefinitionsForSource(e).then(i => null !== i ? r(e, t, 0,
|
|
u, i) : null);
|
|
if (Object(n.isStudy)(e) && function(e) {
|
|
const {
|
|
shortId: t
|
|
} = e.metaInfo();
|
|
return "Overlay" === t
|
|
}(e) || Object(l.isLineTool)(e)) return d.propertiesDefinitionsForSource(e).then(
|
|
r => {
|
|
if (null !== r) {
|
|
const {
|
|
tabName: n
|
|
} = s;
|
|
return function(e) {
|
|
return Promise.all([i.e("redux"), i.e("react"), i.e(1), i.e(
|
|
3), i.e(4), i.e(6), i.e(8), i.e(9), i.e(11),
|
|
i.e(12), i.e(13), i.e(14), i.e(16), i.e(17), i
|
|
.e(19), i.e(21), i.e(22), i.e(23), i.e(26), i.e(
|
|
33), i.e(34), i.e(35), i.e(36), i.e(39), i
|
|
.e(42), i.e(43), i.e(45), i.e(49), i.e(65), i.e(
|
|
96), i.e(0), i.e(2), i.e(5), i.e(7), i.e(
|
|
10), i.e(15), i.e(18), i.e(20), i.e(25), i
|
|
.e(
|
|
27), i.e(30), i.e(31), i.e(32), i.e(37), i
|
|
.e(
|
|
40), i.e(44), i.e(47), i.e(58), i.e(
|
|
"source-properties-editor")
|
|
]).then(i.bind(null, "CbZh")).then(t => {
|
|
const i = new(0, t
|
|
.SourcePropertiesEditorRenderer)(e);
|
|
return null !== o && o.hide(), i.show(), o = i,
|
|
i
|
|
})
|
|
}({
|
|
propertyPages: r,
|
|
model: t,
|
|
source: e,
|
|
activePageId: n && c[n]
|
|
})
|
|
}
|
|
return null
|
|
});
|
|
if (Object(n.isStudy)(e) && !Object(n.isESDStudy)(e)) return r(e, t, 0, u); {
|
|
const {
|
|
tabName: t
|
|
} = s, i = Object(n.isESDStudy)(e) ? "events" : t && c[t], r = h
|
|
.getChartPropertiesDialogRenderer();
|
|
return r.setActivePage(i), r.show()
|
|
}
|
|
}
|
|
},
|
|
mMWL: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "toolIsCursor", (function() {
|
|
return d
|
|
})),
|
|
i.d(t, "toolIsMeasure", (function() {
|
|
return p
|
|
})), i.d(t, "resetToCursor", (function() {
|
|
return _
|
|
})), i.d(t, "lockTimeAxisTime", (function() {
|
|
return y
|
|
})), i.d(t, "tool", (function() {
|
|
return w
|
|
})), i.d(t, "iconTool", (function() {
|
|
return P
|
|
})), i.d(t, "cursorTool", (function() {
|
|
return C
|
|
})), i.d(t, "isToolCreatingNow", (function() {
|
|
return x
|
|
})), i.d(t, "isToolEditingNow", (function() {
|
|
return T
|
|
})), i.d(t, "isToolMovingNow", (function() {
|
|
return I
|
|
})), i.d(t, "isDirectionalMovementActive", (function() {
|
|
return M
|
|
})), i.d(t, "createdLineTool", (function() {
|
|
return O
|
|
})), i.d(t, "continuedLineTool", (function() {
|
|
return L
|
|
})), i.d(t, "cancelledLineTool", (function() {
|
|
return A
|
|
})), i.d(t, "beenSetLineToolLastPoint", (function() {
|
|
return E
|
|
})), i.d(t, "startedMovingLineTool", (function() {
|
|
return k
|
|
})), i.d(t, "movedLineTool", (function() {
|
|
return D
|
|
})), i.d(t, "finishedMovingLineTool", (function() {
|
|
return V
|
|
})), i.d(t, "startedChangingLineTool", (function() {
|
|
return B
|
|
})), i.d(t, "changedLineTool", (function() {
|
|
return R
|
|
})), i.d(t, "finishedChangingLineTool", (function() {
|
|
return N
|
|
})), i.d(t, "removedLineTool", (function() {
|
|
return j
|
|
})), i.d(t, "finishedLineTool", (function() {
|
|
return F
|
|
})), i.d(t, "changedLineStyle", (function() {
|
|
return W
|
|
})), i.d(t, "copiedLineTool", (function() {
|
|
return H
|
|
})), i.d(t, "restoredLineTool", (function() {
|
|
return U
|
|
})), i.d(t, "restoredLineToolState", (function() {
|
|
return z
|
|
})), i.d(t, "createLineTool", (function() {
|
|
return Y
|
|
})), i.d(t, "continueLineTool", (function() {
|
|
return K
|
|
})), i.d(t, "cancelLineTool", (function() {
|
|
return J
|
|
})), i.d(t, "setLineToolLastPoint", (function() {
|
|
return Z
|
|
})), i.d(t, "startMovingLineTool", (function() {
|
|
return X
|
|
})), i.d(t, "moveLineTool", (function() {
|
|
return $
|
|
})), i.d(t, "finishMovingLineTool", (function() {
|
|
return Q
|
|
})), i.d(t, "startChangingLineTool", (function() {
|
|
return ee
|
|
})), i.d(t, "changeLineTool", (function() {
|
|
return te
|
|
})), i.d(t, "finishChangingLineTool", (function() {
|
|
return ie
|
|
})), i.d(t, "removeLineTool", (function() {
|
|
return se
|
|
})), i.d(t, "finishLineTool", (function() {
|
|
return re
|
|
})), i.d(t, "changeLineStyle", (function() {
|
|
return ne
|
|
})), i.d(t, "copyLineTool", (function() {
|
|
return oe
|
|
})), i.d(t, "restoreLineTool", (function() {
|
|
return ae
|
|
})), i.d(t, "restoreLineToolState", (function() {
|
|
return le
|
|
})), i.d(t, "init", (function() {
|
|
return ue
|
|
})), i.d(t, "runOnDrawingStateReady", (function() {
|
|
return de
|
|
})), i.d(t, "properties", (function() {
|
|
return pe
|
|
})), i.d(t, "hideAllDrawings", (function() {
|
|
return _e
|
|
})), i.d(t, "hideAllIndicators", (function() {
|
|
return me
|
|
})), i.d(t, "lockDrawings", (function() {
|
|
return fe
|
|
})), i.d(t, "hideMarksOnBars", (function() {
|
|
return ge
|
|
})), i.d(t, "drawOnAllCharts", (function() {
|
|
return be
|
|
})), i.d(t, "lockTimeAxis", (function() {
|
|
return ve
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("m/cY"),
|
|
n = i("Ocx9"),
|
|
o = i("hY0g"),
|
|
a = i.n(o),
|
|
l = i("aIyQ"),
|
|
c = i.n(l),
|
|
h = i("Vdly"),
|
|
u = i("FQhm");
|
|
|
|
function d(e) {
|
|
return "cursor" === e || "arrow" === e || "dot" === e
|
|
}
|
|
|
|
function p(e) {
|
|
return "measure" === e
|
|
}
|
|
|
|
function _(e = !1) {
|
|
if (!e && m) {
|
|
if (m.childs().stayInDrawingMode.value()) return
|
|
}
|
|
w.setValue(C.value())
|
|
}
|
|
let m = null,
|
|
f = null,
|
|
g = null,
|
|
b = null,
|
|
v = null,
|
|
S = null;
|
|
const y = new a.a,
|
|
w = new a.a,
|
|
P = new a.a,
|
|
C = new a.a,
|
|
x = new a.a(!1),
|
|
T = new a.a(!1),
|
|
I = new a.a(!1),
|
|
M = new a.a(!1),
|
|
O = new c.a,
|
|
L = new c.a,
|
|
A = new c.a,
|
|
E = new c.a,
|
|
k = new c.a,
|
|
D = new c.a,
|
|
V = new c.a,
|
|
B = new c.a,
|
|
R = new c.a,
|
|
N = new c.a,
|
|
j = new c.a,
|
|
F = new c.a,
|
|
W = new c.a,
|
|
H = new c.a,
|
|
U = new c.a,
|
|
z = new c.a;
|
|
|
|
function G(e, t) {
|
|
const i = t || {
|
|
value: !1
|
|
};
|
|
return t => {
|
|
i.value || (i.value = !0, e.fire(t), i.value = !1)
|
|
}
|
|
}
|
|
const q = {
|
|
value: !1
|
|
},
|
|
Y = G(O, q),
|
|
K = G(L, q),
|
|
J = G(A, q),
|
|
Z = G(E, q),
|
|
X = G(k),
|
|
$ = G(D),
|
|
Q = G(V),
|
|
ee = G(B),
|
|
te = G(R),
|
|
ie = G(N),
|
|
se = G(j),
|
|
re = G(F),
|
|
ne = G(W, q),
|
|
oe = G(H, q),
|
|
ae = G(U),
|
|
le = G(z);
|
|
let ce = !1,
|
|
he = [];
|
|
|
|
function ue() {
|
|
ce || (w.setValue(h.getValue("chart.cursorPreference", "cursor")), w.subscribe(e => d(e) &&
|
|
C.setValue(e), {
|
|
callWithLast: !0
|
|
}), C.subscribe(e => {
|
|
e && h.setValue("chart.cursorPreference", e)
|
|
}), m = new n.DefaultProperty("drawings"), f = Object(r.a)(), g = Object(r.a)(), b =
|
|
Object(r.a)(), v = Object(r.a)(), S = Object(r.a)(), f.setValue(!1), g.setValue(!1),
|
|
b.setValue(!1), v.setValue(!1), S.setValue(!1), w.subscribe(() => {
|
|
Object(u.emit)("onSelectedLineToolChanged")
|
|
}), ce = !0, he.forEach(e => e()), he = [])
|
|
}
|
|
|
|
function de(e) {
|
|
ce ? e() : he.push(e)
|
|
}
|
|
|
|
function pe() {
|
|
return Object(s.ensureNotNull)(m)
|
|
}
|
|
|
|
function _e() {
|
|
return Object(s.ensureNotNull)(f)
|
|
}
|
|
|
|
function me() {
|
|
return Object(s.ensureNotNull)(g)
|
|
}
|
|
|
|
function fe() {
|
|
return Object(s.ensureNotNull)(b)
|
|
}
|
|
|
|
function ge() {
|
|
return Object(s.ensureNotNull)(v)
|
|
}
|
|
|
|
function be() {
|
|
return pe().childs().drawOnAllCharts
|
|
}
|
|
|
|
function ve() {
|
|
return Object(s.ensureNotNull)(S)
|
|
}
|
|
},
|
|
mNbo: function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e, t = !1) {
|
|
return !1
|
|
}
|
|
|
|
function r(e) {
|
|
return e
|
|
}
|
|
i.r(t), i.d(t, "isOnMobileAppPage", (function() {
|
|
return s
|
|
})), i.d(t, "urlWithMobileAppParams", (function() {
|
|
return r
|
|
}))
|
|
},
|
|
mPvX: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineToolsGroupModel", (function() {
|
|
return o
|
|
}));
|
|
var s = i("aIyQ"),
|
|
r = i.n(s),
|
|
n = i("UqOQ");
|
|
class o {
|
|
constructor(e) {
|
|
this._onChanged = new r.a, this._groups = [], this._groups = e || [], this._groups
|
|
.forEach(e => {
|
|
e.onChanged().subscribe(null, t => this._onChanged.fire(e.id, t))
|
|
})
|
|
}
|
|
groups() {
|
|
return this._groups.filter(e => e.isActualSymbol())
|
|
}
|
|
groupsForAllSymbols() {
|
|
return this._groups
|
|
}
|
|
createGroup(e, t, i) {
|
|
t = t || this._generateNextName();
|
|
const s = new n.a(e, t, i);
|
|
this._groups.push(s), s.onChanged().subscribe(null, e => this._onChanged.fire(s.id,
|
|
e));
|
|
const r = {
|
|
visibilityChanged: !1,
|
|
lockedChanged: !1,
|
|
titleChanged: !1,
|
|
isActualIntervalChanged: !1,
|
|
affectedLineTools: e.map(e => e.id())
|
|
};
|
|
return this._onChanged.fire(s.id, r), s
|
|
}
|
|
addGroup(e) {
|
|
this._groups.push(e), e.onChanged().subscribe(null, t => this._onChanged.fire(e.id,
|
|
t)), this._onChanged.fire(e.id)
|
|
}
|
|
removeGroup(e) {
|
|
const t = this._groups.findIndex(t => t.id === e.id);
|
|
this._groups.splice(t, 1), this._onChanged.fire(e.id)
|
|
}
|
|
groupForId(e) {
|
|
return this._groups.find(t => t.id === e) || null
|
|
}
|
|
groupForLineTool(e) {
|
|
return this._groups.find(t => t.containsLineTool(e)) || null
|
|
}
|
|
removeLineTools(e) {
|
|
this._groups.forEach(t => t.excludeLineTools(e));
|
|
this._groups.filter(e => 0 === e.lineTools().length).forEach(e => this.removeGroup(
|
|
e))
|
|
}
|
|
state(e) {
|
|
return {
|
|
groups: (e ? this._groups.filter(e => e.isActualSymbol()) : this._groups).map(
|
|
e => e.state())
|
|
}
|
|
}
|
|
onChanged() {
|
|
return this._onChanged
|
|
}
|
|
fireChangedAll() {
|
|
this._groups.forEach(e => {
|
|
this._onChanged.fire(e.id)
|
|
})
|
|
}
|
|
static fromState(e, t) {
|
|
const i = [];
|
|
for (const s of t.groups) {
|
|
const t = n.a.fromState(e, s);
|
|
null !== t && i.push(t)
|
|
}
|
|
return new o(i)
|
|
}
|
|
_generateNextName() {
|
|
const e = new Set(this.groups().map(e => e.name()));
|
|
for (let t = 1;; t++) {
|
|
const i = "Group " + t,
|
|
s = "Group_" + t;
|
|
if (!e.has(i) && !e.has(s)) return i
|
|
}
|
|
}
|
|
}
|
|
},
|
|
mZrn: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("FBuY"),
|
|
r = i("JWMC"),
|
|
n = i("+6II");
|
|
|
|
function o(e, t = !1) {
|
|
("attachEvent" in document ? "complete" === document.readyState : "loading" !== document
|
|
.readyState) ? t ? setTimeout(() => e(), 1) : e(): document.addEventListener(
|
|
"DOMContentLoaded", () => e())
|
|
}
|
|
new Promise(e => {
|
|
o(e)
|
|
});
|
|
const a = /\b(msie|trident)\b/i.test(navigator.userAgent) ? 1 : 0;
|
|
|
|
function l(e) {
|
|
return e.offsetWidth + a < e.scrollWidth
|
|
}
|
|
o(() => {
|
|
document.addEventListener("mouseenter", e => {
|
|
const t = e.target;
|
|
var i;
|
|
t instanceof HTMLElement && t.matches(".apply-overflow-title") && ((i =
|
|
t).getAttribute("title") || i.offsetWidth + a >= i
|
|
.scrollWidth || i.setAttribute("title", i.textContent || ""))
|
|
}, !0), document.addEventListener("mouseenter", e => {
|
|
const t = e.target;
|
|
if (t instanceof HTMLElement && t.matches(".apply-overflow-tooltip")) {
|
|
if (t.matches(".apply-overflow-tooltip--check-children")) {
|
|
let e = !1;
|
|
const i = t.children;
|
|
for (let t = 0; t < i.length; t++) {
|
|
const s = i[t];
|
|
if (s instanceof HTMLElement && l(s)) {
|
|
e = !0;
|
|
break
|
|
}
|
|
}
|
|
if (!e) return
|
|
} else if (!l(t)) return;
|
|
let e = "";
|
|
e = t.matches && t.matches(".apply-overflow-tooltip--allow-text") ?
|
|
t.textContent || "" : Array.from(t.childNodes).reduce((e, t) =>
|
|
(t.nodeType === Node.TEXT_NODE && e.push(t.textContent ||
|
|
""), e), []).join("").trim(), Object(n.c)(t, {
|
|
text: e
|
|
});
|
|
const i = () => {
|
|
Object(n.a)(), ["mouseleave", "mousedown"].forEach(e => t
|
|
.removeEventListener(e, i))
|
|
};
|
|
["mouseleave", "mousedown"].forEach(e => t.addEventListener(e, i))
|
|
}
|
|
}, !0)
|
|
});
|
|
var c = i("aIyQ"),
|
|
h = i.n(c),
|
|
u = i("VVxS"),
|
|
d = i("FIi8");
|
|
let p;
|
|
|
|
function _(e) {
|
|
window.iframeAuthWidget && !1 === window.user.profile_data_filled && (window
|
|
.iframeAuthWidget.preventClose = !0);
|
|
const t = window.user.available_offers || {};
|
|
window.TVSettings && window.TVSettings.sync(window.user.settings), window.is_authenticated ?
|
|
(e || (initOfferLoginStateChangeButton(), onGoPro() && window.user.is_pro && window
|
|
.location.reload()), !1 === window.user.profile_data_filled && (Object(r
|
|
.trackEvent)("Conversion", "First login"), delete window.user
|
|
.profile_data_filled)) : (Object.keys(t).forEach(e => {
|
|
const i = e;
|
|
t[i].available_for_anons || delete t[i]
|
|
}), window.user = {
|
|
username: "Guest",
|
|
following: "0",
|
|
followers: "0",
|
|
ignore_list: [],
|
|
available_offers: t
|
|
}, u.TVLocalStorage.removeItem("trial_availiable"))
|
|
}
|
|
p = window.loginStateChange ? window.loginStateChange : window.loginStateChange = new h.a, p
|
|
.subscribe(null, _), s.TVXWindowEvents.on("loginStateChange", e => {
|
|
const t = JSON.parse(e);
|
|
window.user = t.user, window.is_authenticated = !!t.is_authenticated, p.fire()
|
|
}), s.TVXWindowEvents.on("signOut", () => {
|
|
! function() {
|
|
if (window.initData.lfs) {
|
|
const e = document.getElementsByClassName("js-admin-warning")[0];
|
|
document.body.removeChild(e)
|
|
}
|
|
let e = !0;
|
|
[/^\/chart\//, /^\/share-your-love\//].forEach(t => {
|
|
t.test(window.location.pathname) && (e = !1)
|
|
}), e && window.location.reload()
|
|
}()
|
|
}), (() => {
|
|
const e = {};
|
|
window.crossTabSyncUserAttr = e => {
|
|
const t = {};
|
|
e instanceof Array ? e.forEach(e => {
|
|
t[e] = window.user[e]
|
|
}) : t[e] = window.user[e],
|
|
s.TVXWindowEvents.emit("user-obj-changed", JSON.stringify(t))
|
|
}, s.TVXWindowEvents.on("user-obj-changed", t => {
|
|
const i = JSON.parse(t);
|
|
let s;
|
|
for (s in i)
|
|
if (i.hasOwnProperty(s)) {
|
|
window.user[s] = i[s];
|
|
(e[s] || []).forEach(e => {
|
|
e.fire(i[s])
|
|
})
|
|
}
|
|
})
|
|
})(), window.TradingView.changeLoginState = e => {
|
|
window.is_authenticated = !!e, s.TVXWindowEvents.emit("loginStateChange", JSON
|
|
.stringify({
|
|
is_authenticated: window.is_authenticated,
|
|
user: window.user
|
|
})), p.fire()
|
|
}, window.loginUser = function(e, t) {
|
|
window.TVDialogs && window.TVDialogs.signModal && window.TVDialogs.signModal.close(),
|
|
window.user = Object(d.deepExtend)({}, e), window.TradingView.changeLoginState(!0),
|
|
"function" == typeof t && window.TVDialogs && window.TVDialogs.signModal ? window
|
|
.TVDialogs.signModal.on("signinSuccess", () => {
|
|
t()
|
|
}) : "function" == typeof t && t()
|
|
}, window.loginRequiredDelegate = new h.a, window.runOrSignIn = (e, t) => {
|
|
t || (t = {}), e()
|
|
}, window.onLoginStateChange = _, window.TradingView.setTrialAvailiable = e => {
|
|
u.TVLocalStorage.setItem("trial_availiable", e ? "1" : "0")
|
|
}, window.TradingView.notificationsChanged = new h.a
|
|
},
|
|
me8f: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineToolBalloon", (function() {
|
|
return h
|
|
}));
|
|
var s = i("YFKU"),
|
|
r = i("Ocx9"),
|
|
n = i("Ss5c"),
|
|
o = i("tc+8"),
|
|
a = i.n(o),
|
|
l = i("j3hX");
|
|
const c = Object(s.t)("Comment");
|
|
class h extends n.LineDataSource {
|
|
constructor(e, t) {
|
|
const s = t || h.createProperties();
|
|
super(e, s), i.e("lt-pane-views").then(i.bind(null, "Hyqq")).then(t => {
|
|
this._setPaneViews([new t.BalloonPaneView(this, e)])
|
|
})
|
|
}
|
|
pointsCount() {
|
|
return 1
|
|
}
|
|
name() {
|
|
return "Balloon"
|
|
}
|
|
properties() {
|
|
return super.properties()
|
|
}
|
|
template() {
|
|
const e = super.template();
|
|
return e.text = this.properties().childs().text.value(), e
|
|
}
|
|
static createProperties(e) {
|
|
const t = new r.DefaultProperty("linetoolballoon", e);
|
|
return h._configureProperties(t), t
|
|
}
|
|
_applyTemplateImpl(e) {
|
|
super._applyTemplateImpl(e), this.properties().childs().text.setValue(e.text)
|
|
}
|
|
_getPropertyDefinitionsViewModelClass() {
|
|
return Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "RhWr")).then(
|
|
e => e.BalloonDefinitionsViewModel)
|
|
}
|
|
static _configureProperties(e) {
|
|
n.LineDataSource._configureProperties(e), e.hasChild("text") || e.addChild(
|
|
"text", new a.a(c)), e.addExclusion("text"), e.addChild("linesColors",
|
|
new l.LineToolColorsProperty([e.childs().borderColor])), e.addChild(
|
|
"textsColors", new l.LineToolColorsProperty([e.childs().color]))
|
|
}
|
|
}
|
|
},
|
|
mf9N: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("Eyy1"),
|
|
r = i("GD+X"),
|
|
n = i("96Yh"),
|
|
o = i("ogJP"),
|
|
a = i("RDU5");
|
|
class l extends a.UndoCommand {
|
|
constructor(e, t, i) {
|
|
super("Change Pane Height"), this._model = e, this._paneIndex = t, this
|
|
._paneHeight = i, this._prevStretchFactors = this._model.panes().map(e => e
|
|
.stretchFactor())
|
|
}
|
|
redo() {
|
|
this._model.changePanesHeight(this._paneIndex, this._paneHeight)
|
|
}
|
|
undo() {
|
|
const e = this._model.panes();
|
|
for (let t = 0; t < e.length; ++t) e[t].setStretchFactor(Object(s.ensureDefined)
|
|
(this._prevStretchFactors[t]));
|
|
this._model.fullUpdate()
|
|
}
|
|
}
|
|
i.d(t, "PaneApi", (function() {
|
|
return c
|
|
}));
|
|
class c {
|
|
constructor(e, t) {
|
|
this._priceScales = new WeakMap, this._pane = e, this._chartWidget = t
|
|
}
|
|
hasMainSeries() {
|
|
return this._pane.containsMainSeries()
|
|
}
|
|
getLeftPriceScales() {
|
|
return this._pane.leftPriceScales().map(this._getPriceScaleApi, this)
|
|
}
|
|
getRightPriceScales() {
|
|
return this._pane.rightPriceScales().map(this._getPriceScaleApi, this)
|
|
}
|
|
getMainSourcePriceScale() {
|
|
const e = this._pane.mainDataSource();
|
|
if (null === e) return null;
|
|
const t = e.priceScale();
|
|
return null === t || this._pane.isOverlay(e) ? null : this._getPriceScaleApi(t)
|
|
}
|
|
setMaximized(e) {
|
|
if (this._pane.isMaximized() !== e)
|
|
for (const e of this._chartWidget.paneWidgets())
|
|
if (e.state() === this._pane) {
|
|
this._chartWidget.toggleMaximizePane(e);
|
|
break
|
|
}
|
|
}
|
|
legendLoaded() {
|
|
const e = this._chartWidget.paneByState(this._pane);
|
|
return Boolean(e && e.statusWidget())
|
|
}
|
|
getAllEntities() {
|
|
const e = this._pane.model();
|
|
return this._pane.sourcesByGroup().allIncludingHidden().map(t => Object(n
|
|
.entityForDataSource)(e, t)).filter(o.notNull).filter(e => null !== e.name)
|
|
}
|
|
getHeight() {
|
|
return this._pane.height()
|
|
}
|
|
setHeight(e) {
|
|
const t = this._chartWidget.model().model(),
|
|
i = t.panes();
|
|
Object(s.assert)(i.length > 1,
|
|
"Unable to change pane's height if there is only one pane");
|
|
const r = i.indexOf(this._pane);
|
|
Object(s.assert)(-1 !== r, "Invalid pane index");
|
|
const n = new l(t, r, e);
|
|
this._chartWidget.model().undoHistory().pushUndoCommand(n)
|
|
}
|
|
moveTo(e) {
|
|
const t = this.paneIndex();
|
|
t !== e && (Object(s.assert)(e >= 0 && e < this._chartWidget.paneWidgets().length,
|
|
"Invalid pane index"), this._chartWidget.model().movePane(t, e))
|
|
}
|
|
paneIndex() {
|
|
return this._chartWidget.model().model().panes().indexOf(this._pane)
|
|
}
|
|
_getPriceScaleApi(e) {
|
|
let t = this._priceScales.get(e);
|
|
return void 0 === t && (t = new r.a(this._chartWidget.model(), e), this._priceScales
|
|
.set(e, t)), t
|
|
}
|
|
}
|
|
},
|
|
mkn5: function(e, t, i) {
|
|
"use strict";
|
|
(function(t, s) {
|
|
i("AE9l"), i("YFKU");
|
|
var r = i("UCjq").PaneWidgetBase,
|
|
n = i("1IXQ").scaleRatioForContextMenuTransformer(7),
|
|
o = i("CW80").isLineToolName,
|
|
a = i("YmeR").ActionBinder,
|
|
l = i("7KDR"),
|
|
c = l.Action,
|
|
h = l.Separator,
|
|
u = i("mMWL"),
|
|
d = i("FQhm"),
|
|
p = i("S8xo").MouseEventHandler;
|
|
e.exports.PaneWidget = class extends r {
|
|
constructor(e, i, s, r) {
|
|
super(e, i, s, r), this.setCursorForTool(), this._mouseEventHandler =
|
|
new p(this._topCanvasBinding.canvas, this, {
|
|
treatVertTouchDragAsPageScroll: !this._options.handleScroll
|
|
.vertTouchDrag,
|
|
treatHorzTouchDragAsPageScroll: !this._options.handleScroll
|
|
.horzTouchDrag
|
|
}), this.actions = [], this.readonlyActions = [], this
|
|
._prevHoveredHittest = null, this._chart.withModel(this, (
|
|
function() {
|
|
var e = this._chartUndoModel();
|
|
e.onSimpleZoomIn().subscribe(this, this
|
|
._updateCrosshairOnZoom), e.onSimpleZoomOut()
|
|
.subscribe(this, this._updateCrosshairOnZoom)
|
|
})), this._highlightedPriceAxis = new t({
|
|
owner: "",
|
|
axis: null
|
|
}), this._highlightedPriceAxis.subscribe(function(e) {
|
|
this._highlightPriceAxisByLabel(e.axis)
|
|
}.bind(this)), this._prevPinchScale = 0, this._isDestroyed = !1
|
|
}
|
|
destroy() {
|
|
for (var e in super.destroy(), this._prevHoveredHittest = null, this
|
|
._mouseEventHandler.destroy(), this._rowElement.parentElement
|
|
.removeChild(this._rowElement), this) delete this[e];
|
|
this._isDestroyed = !0
|
|
}
|
|
_highlightPriceAxisByLabel(e) {
|
|
this._lhsPriceAxisesContainer.highlightPriceAxisByLabel(e), this
|
|
._rhsPriceAxisesContainer.highlightPriceAxisByLabel(e)
|
|
}
|
|
chart() {
|
|
return this._chart
|
|
}
|
|
stretchFactor() {
|
|
return this._state ? this._state._stretchFactor : 0
|
|
}
|
|
setStretchFactor(e) {
|
|
this.hasState() && (this._state._stretchFactor = e)
|
|
}
|
|
hideInplaceEditor() {
|
|
return !!this._inplaceEditor && (this._inplaceEditor.remove(), this
|
|
._inplaceEditor = void 0, !0)
|
|
}
|
|
drawRightThere(e) {
|
|
if (o(e)) {
|
|
var t = this._chartUndoModel(),
|
|
i = t.crossHairSource(),
|
|
s = t.model().magnet().align(i.price, i.index, this._state);
|
|
t.createLineTool(this.state(), {
|
|
index: i.index,
|
|
price: s
|
|
}, e)
|
|
}
|
|
}
|
|
createRemoveMenu() {
|
|
var e = this._chart.actions();
|
|
return new c({
|
|
label: window.t("Remove"),
|
|
statName: "Remove",
|
|
subItems: [e.paneRemoveAllStudies, e
|
|
.paneRemoveAllDrawingTools, e
|
|
.paneRemoveAllStudiesDrawingTools
|
|
]
|
|
})
|
|
}
|
|
_customActions() {
|
|
var e = {
|
|
top: [],
|
|
bottom: [],
|
|
remove: []
|
|
},
|
|
t = this._chartUndoModel().timeScale(),
|
|
i = this._state && this._state.defaultPriceScale();
|
|
if (!s.enabled("custom_items_in_context_menu")) return e;
|
|
var r, n = t.isEmpty() ? void 0 : t.indexToUserTime(t.coordinateToIndex(
|
|
this._contextMenuX));
|
|
if (i && !i.isEmpty()) {
|
|
var o = this._state.mainDataSource().firstValue();
|
|
r = i.coordinateToPrice(this._contextMenuY, o)
|
|
}
|
|
return d.emit("onContextMenu", {
|
|
unixtime: n ? n / 1e3 : void 0,
|
|
price: r,
|
|
callback: function(t) {
|
|
[].concat(t).forEach((function(t) {
|
|
var i;
|
|
t.text && (t.text.length > 1 &&
|
|
"-" === t.text[0] ? e.remove
|
|
.push(t.text.slice(1)) : (
|
|
i = "-" === t.text ?
|
|
new h : new c({
|
|
label: t.text,
|
|
onExecute: t
|
|
.click
|
|
}), t.position &&
|
|
"top" === t.position ? e
|
|
.top.push(i) : e.bottom
|
|
.push(i)))
|
|
}))
|
|
}
|
|
}), e
|
|
}
|
|
update() {
|
|
this._lhsPriceAxisesContainer.update(), this._rhsPriceAxisesContainer
|
|
.update(), null !== this._legendWidget && this._legendWidget
|
|
.update(), this.updateControls()
|
|
}
|
|
createActionLockScale(e) {
|
|
if (!(e instanceof TradingView.Series)) return null;
|
|
var t = n(e.priceScale(), this._chartUndoModel().model()
|
|
.mainSeriesScaleRatio()),
|
|
i = new c({
|
|
checkable: e.priceScale().isLockScale(),
|
|
label: window.t("Lock Scale") + " " + t,
|
|
statName: "LockScale"
|
|
});
|
|
return i._binding = new a(i, e.priceScale().properties().lockScale, this
|
|
._chartUndoModel(), "Lock Scale", (function() {
|
|
var t = {
|
|
lockScale: this.value()
|
|
};
|
|
this._undoModel.setPriceScaleMode(t, e.priceScale(),
|
|
this._undoText)
|
|
})), i
|
|
}
|
|
_updateCrosshairOnZoom() {
|
|
if (u.lockTimeAxis().value()) {
|
|
var e = this._chartUndoModel().crossHairSource();
|
|
e.setPosition(e.index, e.price, this.state())
|
|
}
|
|
}
|
|
highlightedPriceAxis() {
|
|
return this._highlightedPriceAxis
|
|
}
|
|
}
|
|
}).call(this, i("hY0g"), i("Kxc7"))
|
|
},
|
|
n0Bl: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "migrateShortcut", (function() {
|
|
return o
|
|
}));
|
|
var s = i("/3z9");
|
|
|
|
function r(e) {
|
|
if ("number" == typeof e) return e;
|
|
switch (e.toLowerCase()) {
|
|
case "ctrl":
|
|
return s.Modifiers.Control;
|
|
case "shift":
|
|
return s.Modifiers.Shift;
|
|
case "alt":
|
|
return s.Modifiers.Alt;
|
|
default:
|
|
return e.toUpperCase().charCodeAt(0)
|
|
}
|
|
}
|
|
|
|
function n(e) {
|
|
let t = 0;
|
|
for (let i = 0; i < e.length; i++) t |= r(e[i]);
|
|
return t
|
|
}
|
|
|
|
function o(e) {
|
|
return "number" == typeof e ? e : "string" == typeof e ? n(e.split("+")) : Array.isArray(
|
|
e) ? n(e) : 0
|
|
}
|
|
},
|
|
n40Z: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineToolVertLine", (function() {
|
|
return h
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("aO4+"),
|
|
n = i("Ocx9"),
|
|
o = i("tc+8"),
|
|
a = i.n(o),
|
|
l = i("Ss5c"),
|
|
c = i("GmZZ");
|
|
class h extends l.LineDataSource {
|
|
constructor(e, t) {
|
|
const s = t || h.createProperties();
|
|
super(e, s), this._timeAxisView = new c.a(this), this._paneViewFactory = null,
|
|
this.properties().childs().extendLine.subscribe(this, () => e
|
|
.lightUpdate()),
|
|
i.e("lt-pane-views").then(i.bind(null, "BSCN")).then(t => {
|
|
this._paneViewFactory = i => new t.VertLinePaneView(this, e, i),
|
|
this._model.lightUpdate()
|
|
})
|
|
}
|
|
destroy() {
|
|
this.properties().childs().extendLine.unsubscribeAll(this), super.destroy()
|
|
}
|
|
pointsCount() {
|
|
return 1
|
|
}
|
|
properties() {
|
|
return super.properties()
|
|
}
|
|
name() {
|
|
return "Vertical Line"
|
|
}
|
|
timeAxisViews() {
|
|
return this.isSourceHidden() ? null : this.properties().childs().showTime
|
|
.value() ? [this._timeAxisView] : null
|
|
}
|
|
updateAllViews() {
|
|
super.updateAllViews(), this._timeAxisView.update()
|
|
}
|
|
canHasAlert() {
|
|
return !0
|
|
}
|
|
template() {
|
|
const e = super.template();
|
|
return e.text = this.properties().childs().text.value(), e.showLabel = this
|
|
.properties().childs().showLabel.value(), e
|
|
}
|
|
isMultiPaneAvailable() {
|
|
return !0
|
|
}
|
|
isMultiPaneEnabled() {
|
|
return this.properties().childs().extendLine.value()
|
|
}
|
|
paneViews(e) {
|
|
return e = Object(s.ensureDefined)(e), this.isMultiPaneEnabled() || this._model
|
|
.paneForSource(this) === e ? (null === this._getPaneViews(e) && null !==
|
|
this._paneViewFactory && this._setPaneViews([this._paneViewFactory(e)],
|
|
e, !0), super.paneViews(e)) : null
|
|
}
|
|
priceAxisViews() {
|
|
return null
|
|
}
|
|
priceAxisPoints() {
|
|
return []
|
|
}
|
|
pointToScreenPoint(e) {
|
|
const t = this._model.timeScale();
|
|
if (t.isEmpty()) return [new r.Point(0, 0), new r.Point(0, 0)];
|
|
const i = t.indexToCoordinate(e.index),
|
|
s = new r.Point(i, 0);
|
|
return [s, s]
|
|
}
|
|
convertYCoordinateToPriceForMoving(e) {
|
|
return 0
|
|
}
|
|
static createProperties(e) {
|
|
null != e && (void 0 === e.textOrientation && (e.textOrientation =
|
|
"horizontal"), void 0 === e.extendLine && (e.extendLine = !1));
|
|
const t = new n.DefaultProperty("linetoolvertline", e);
|
|
return h._configureProperties(t), t
|
|
}
|
|
_getAlertPlots() {
|
|
const e = this._points[0],
|
|
t = {
|
|
index: e.index,
|
|
price: e.price + 1
|
|
};
|
|
return [this._linePointsToAlertPlot([e, t], null, !0, !0)]
|
|
}
|
|
_getPropertyDefinitionsViewModelClass() {
|
|
return Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "FkpW")).then(
|
|
e => e.VerticalLineDefinitionsViewModel)
|
|
}
|
|
_applyTemplateImpl(e) {
|
|
super._applyTemplateImpl(e), this.properties().childs().text.setValue(e.text ||
|
|
""), this.properties().childs().showLabel.setValue(Boolean(e.showLabel))
|
|
}
|
|
static _configureProperties(e) {
|
|
l.LineDataSource._configureProperties(e), e.hasChild("text") || e.addChild(
|
|
"text", new a.a("")), e.addExclusion("text"), e.addExclusion(
|
|
"showLabel")
|
|
}
|
|
}
|
|
},
|
|
n5al: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "isRequiringRestartSeriesStyles", (function() {
|
|
return v
|
|
})), i.d(t, "isRangeBasedStyle", (function() {
|
|
return S
|
|
})), i.d(t, "isRangeStyle", (function() {
|
|
return y
|
|
})), i.d(t, "isTimeBasedStyle", (function() {
|
|
return w
|
|
})), i.d(t, "isValidStyle", (function() {
|
|
return P
|
|
})), i.d(t, "isSingleValueBasedStyle", (function() {
|
|
return C
|
|
})), i.d(t, "setLastUsedStyle", (function() {
|
|
return x
|
|
})), i.d(t, "getLastUsedStyle", (function() {
|
|
return T
|
|
})), i.d(t, "getDefaultStyle", (function() {
|
|
return I
|
|
})), i.d(t, "getChartStyleByResolution", (function() {
|
|
return M
|
|
})), i.d(t, "chartStyleStudyId", (function() {
|
|
return O
|
|
})), i.d(t, "preparePriceAxisProperties", (function() {
|
|
return L
|
|
})), i.d(t, "hasProjection", (function() {
|
|
return E
|
|
})), i.d(t, "isPriceSourceStyle", (function() {
|
|
return k
|
|
})), i.d(t, "getSeriesPriceFormattingState", (function() {
|
|
return D
|
|
})),
|
|
i.d(t, "createSeriesFormatter", (function() {
|
|
return V
|
|
})), i.d(t, "symbolCurrencyConvertible", (function() {
|
|
return B
|
|
})), i.d(t, "symbolCurrency", (function() {
|
|
return R
|
|
})), i.d(t, "symbolOriginalCurrency", (function() {
|
|
return N
|
|
})), i.d(t, "symbolBaseCurrency", (function() {
|
|
return j
|
|
})), i.d(t, "isConvertedToOtherCurrency", (function() {
|
|
return F
|
|
})), i.d(t, "symbolUnitConvertible", (function() {
|
|
return W
|
|
})), i.d(t, "symbolUnit", (function() {
|
|
return H
|
|
})), i.d(t, "symbolOriginalUnit", (function() {
|
|
return U
|
|
})), i.d(t, "isConvertedToOtherUnit", (function() {
|
|
return z
|
|
})), i.d(t, "symbolUnitConvertibleGroupsIfExist", (function() {
|
|
return G
|
|
})), i.d(t, "symbolCurrentContract", (function() {
|
|
return q
|
|
})), i.d(t, "extractSymbolNameFromSymbolInfo", (function() {
|
|
return Y
|
|
})), i.d(t, "symbolTitle", (function() {
|
|
return K
|
|
})), i.d(t, "displayedSymbolName", (function() {
|
|
return J
|
|
})), i.d(t, "displayedSymbolExchange", (function() {
|
|
return Z
|
|
})), i.d(t, "actualSymbol", (function() {
|
|
return X
|
|
})), i.d(t, "proSymbol", (function() {
|
|
return $
|
|
})), i.d(t, "symbolForApi", (function() {
|
|
return Q
|
|
})), i.d(t, "isRegularSessionId", (function() {
|
|
return ee
|
|
}));
|
|
var s = i("Vdly"),
|
|
r = i("dfhE"),
|
|
n = i("LxhU"),
|
|
o = i("kcTO"),
|
|
a = i("Kxc7"),
|
|
l = i("Eyy1"),
|
|
c = i("nEwK"),
|
|
h = i("GH0z");
|
|
const u = a.enabled("pay_attention_to_ticker_not_symbol"),
|
|
d = a.enabled("uppercase_instrument_names"),
|
|
p = a.enabled("charting_library_single_symbol_request"),
|
|
_ = a.enabled("use_ticker_on_symbol_info_update"),
|
|
m = [4, 5, 6, 7, 8],
|
|
f = [4, 5, 6, 7, 8, 11],
|
|
g = [0, 1, 9, 2, 3, 10],
|
|
b = [2, 10, 3];
|
|
|
|
function v(e) {
|
|
return -1 !== m.indexOf(e)
|
|
}
|
|
|
|
function S(e) {
|
|
return -1 !== f.indexOf(e)
|
|
}
|
|
|
|
function y(e) {
|
|
return 11 === e
|
|
}
|
|
|
|
function w(e) {
|
|
return -1 !== g.indexOf(e)
|
|
}
|
|
|
|
function P(e) {
|
|
return S(e) || w(e)
|
|
}
|
|
|
|
function C(e) {
|
|
switch (e) {
|
|
case 3:
|
|
case 10:
|
|
case 2:
|
|
return !0;
|
|
default:
|
|
return !1
|
|
}
|
|
}
|
|
|
|
function x(e) {
|
|
P(e) && 11 !== e && s.setValue("chart.lastUsedStyle", e)
|
|
}
|
|
|
|
function T() {
|
|
const e = s.getInt("chart.lastUsedStyle");
|
|
return void 0 === e ? 1 : e
|
|
}
|
|
|
|
function I(e) {
|
|
return e ? 11 : 1
|
|
}
|
|
|
|
function M(e, t) {
|
|
const i = y(t),
|
|
s = n.Interval.isRange(e);
|
|
return !i && s ? I(!0) : i && !s ? I(!1) : t
|
|
}
|
|
|
|
function O(e, t) {
|
|
const i = r.SYMBOL_STRING_DATA[e];
|
|
return void 0 === i ? null : t ? `${i.type}-${i.basicStudyVersion}` : i.type
|
|
}
|
|
|
|
function L(e) {
|
|
const t = e.priceAxisProperties,
|
|
i = t.lockScale.value(),
|
|
s = 6 === e.style.value();
|
|
(s || i) && (t.log.setValue(!1), t.percentage.setValue(!1)), t.logDisabled.setValue(!(!s &&
|
|
!i)), t.percentageDisabled.setValue(!(!s && !i))
|
|
}
|
|
const A = [4, 7, 5, 6];
|
|
|
|
function E(e) {
|
|
return -1 !== A.indexOf(e)
|
|
}
|
|
|
|
function k(e) {
|
|
return b.includes(e)
|
|
}
|
|
|
|
function D(e, t = "default", i = !1) {
|
|
let s, r, n = 100,
|
|
o = 1;
|
|
if ("default" === t) null != e && (n = e.pricescale, o = e.minmov, s = e.fractional, r = e
|
|
.minmove2);
|
|
else {
|
|
let e = t.split(",");
|
|
3 !== e.length && (e = ["100", "1", "false"]), n = parseInt(e[0]), o = parseInt(e[1]),
|
|
s = "true" === e[2]
|
|
}
|
|
return i && (o = 1), {
|
|
priceScale: n,
|
|
minMove: o,
|
|
fractional: s,
|
|
minMove2: r
|
|
}
|
|
}
|
|
|
|
function V(e, t, i = !1) {
|
|
if ("default" === t && null != e && ("volume" === e.formatter || "volume" === e.format))
|
|
return new c.VolumeFormatter(2);
|
|
if ("default" === t && null != e && ("percent" === e.formatter || "percent" === e.format))
|
|
return new h.PercentageFormatter;
|
|
const {
|
|
priceScale: s,
|
|
minMove: r,
|
|
fractional: n,
|
|
minMove2: a
|
|
} = D(e, t, i);
|
|
return new o.PriceFormatter(s, r, n, a)
|
|
}
|
|
|
|
function B(e) {
|
|
return null !== e && "spread" !== e.type
|
|
}
|
|
|
|
function R(e, t, i) {
|
|
if (null === e) return null;
|
|
const s = !t || i ? e.currency_id : e.currency_code;
|
|
return void 0 === s || "" === s ? null : s
|
|
}
|
|
|
|
function N(e, t) {
|
|
return (t ? e.original_currency_code : e.original_currency_id) || R(e, t)
|
|
}
|
|
|
|
function j(e) {
|
|
return e.base_currency_id || null
|
|
}
|
|
|
|
function F(e) {
|
|
return !(null === e || !B(e)) && (void 0 !== e.original_currency_id && e
|
|
.original_currency_id !== e.currency_id)
|
|
}
|
|
|
|
function W(e) {
|
|
return null !== e && "spread" !== e.type
|
|
}
|
|
|
|
function H(e) {
|
|
if (null === e) return null;
|
|
const t = e.unit_id;
|
|
return void 0 === t || "" === t ? null : t
|
|
}
|
|
|
|
function U(e) {
|
|
return e.original_unit_id || H(e)
|
|
}
|
|
|
|
function z(e) {
|
|
return !(null === e || !W(e)) && (void 0 !== e.original_unit_id && e.original_unit_id !== e
|
|
.unit_id)
|
|
}
|
|
|
|
function G(e) {
|
|
return null !== e && W(e) ? e.unit_conversion_types || null : []
|
|
}
|
|
|
|
function q(e) {
|
|
return "futures" === e.type && e.front_contract || null
|
|
}
|
|
|
|
function Y(e, t) {
|
|
let i = e && (e.pro_name || e.full_name || e.name);
|
|
return p && t ? i = t : _ && e && e.ticker && (i = e.ticker), d && i && (i = i
|
|
.toUpperCase()), i
|
|
}
|
|
|
|
function K(e, t) {
|
|
return t ? e.name : `${e.name}, ${e.exchange}`
|
|
}
|
|
|
|
function J(e) {
|
|
let t = e && (q(e) || e.name) || "";
|
|
return t.length > 40 && (t = t.substr(0, 37) + "..."), t.trim()
|
|
}
|
|
|
|
function Z(e) {
|
|
const t = e ? e.exchange : "";
|
|
return d ? t.toUpperCase() : t
|
|
}
|
|
|
|
function X(e, t) {
|
|
return null !== e ? e.full_name : t
|
|
}
|
|
|
|
function $(e, t) {
|
|
return null !== e ? e.pro_name : t
|
|
}
|
|
|
|
function Q(e, t) {
|
|
return u && e ? Object(l.ensureDefined)(e.ticker) : X(e, t)
|
|
}
|
|
|
|
function ee(e) {
|
|
return "regular" === e || "us_regular" === e
|
|
}
|
|
},
|
|
nBJD: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return s
|
|
}));
|
|
class s {
|
|
constructor(e) {
|
|
this._text = "", this._color = "", this._size = "13px", this._bold = !1, this
|
|
._statusProvider = e
|
|
}
|
|
text() {
|
|
return this._text
|
|
}
|
|
getSplitTitle() {
|
|
return [this._text]
|
|
}
|
|
color() {
|
|
return this._statusProvider.color()
|
|
}
|
|
bold() {
|
|
return this._bold
|
|
}
|
|
size() {
|
|
return this._size
|
|
}
|
|
}
|
|
},
|
|
nEwK: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "PLACE_HOLDER", (function() {
|
|
return a
|
|
})), i.d(t, "VolumeFormatter", (function() {
|
|
return l
|
|
}));
|
|
var s = i("YFKU"),
|
|
r = i("zXvd"),
|
|
n = i("ogJP"),
|
|
o = i("ivNn");
|
|
const a = "---";
|
|
class l {
|
|
constructor(e) {
|
|
this.type = "volume", this._numericFormatter = new r.NumericFormatter, this
|
|
._fractionalValues = void 0 !== e && e > 0, this._precision = e
|
|
}
|
|
state() {
|
|
return {
|
|
precision: this._precision
|
|
}
|
|
}
|
|
format(e, t) {
|
|
if (!Object(n.isNumber)(e)) return a;
|
|
let i = "";
|
|
return e < 0 ? (i = "−", e = -e) : e > 0 && t && (i = "+"), e >= 1e100 ? Object(s.t)
|
|
("N/A") : (!this._fractionalValues || e >= 995 ? e = Math.round(e) : this
|
|
._fractionalValues && (e = +e.toFixed(this._precision)), e < 995 ? i + this
|
|
._formatNumber(e) : e < 999995 ? i + this._formatNumber(e / 1e3) + "K" : e <
|
|
999999995 ? (e = 1e3 * Math.round(e / 1e3), i + this._formatNumber(e /
|
|
1e6) + "M") : e < 999999999995 ? (e = 1e6 * Math.round(e / 1e6), i +
|
|
this._formatNumber(e / 1e9) + "B") : (e = 1e9 * Math.round(e / 1e9), i +
|
|
this._formatNumber(e / 1e12) + "T"))
|
|
}
|
|
parse(e) {
|
|
if ("---" === e) return {
|
|
error: "not a number",
|
|
res: !1,
|
|
value: NaN
|
|
};
|
|
const t = {
|
|
K: 1e3,
|
|
M: 1e6,
|
|
B: 1e9
|
|
},
|
|
i = e.slice(-1);
|
|
if (t.hasOwnProperty(i)) {
|
|
const s = this._numericFormatter.parse(e.slice(0, -1));
|
|
return Object(n.isNumber)(s) ? {
|
|
res: !0,
|
|
value: s * t[i]
|
|
} : {
|
|
error: "not a number",
|
|
res: !1,
|
|
value: NaN
|
|
}
|
|
} {
|
|
const t = this._numericFormatter.parse(e);
|
|
return Object(n.isNumber)(t) ? {
|
|
res: !0,
|
|
value: t
|
|
} : {
|
|
error: "not a number",
|
|
res: !1,
|
|
value: NaN
|
|
}
|
|
}
|
|
}
|
|
static serialize(e) {
|
|
return e.state()
|
|
}
|
|
static deserialize(e) {
|
|
return new l(e.precision)
|
|
}
|
|
_formatNumber(e) {
|
|
return this._fractionalValues && (e = Object(o.fixComputationError)(e)), this
|
|
._numericFormatter.format(e).replace(/(\.[1-9]*)0+$/, (e, t) => t)
|
|
}
|
|
}
|
|
},
|
|
nW7S: function(e, t, i) {
|
|
"use strict";
|
|
(function(e) {
|
|
var s = i("aO4+").Point,
|
|
r = i("Ss5c").LineDataSource,
|
|
n = i("Ocx9").DefaultProperty;
|
|
class o extends e {
|
|
constructor(e) {
|
|
super(), this._lineSource = e
|
|
}
|
|
value() {
|
|
var e = 180 * this._lineSource._angle / Math.PI;
|
|
return Math.round(e)
|
|
}
|
|
setValue(e) {
|
|
var t = e * Math.PI / 180;
|
|
this._lineSource._angle = t;
|
|
var i = this._lineSource.pointToScreenPoint(this._lineSource.points()[0])[
|
|
0],
|
|
r = Math.cos(this._lineSource._angle),
|
|
n = -Math.sin(this._lineSource._angle),
|
|
o = new s(r, n),
|
|
a = i.addScaled(o, this._lineSource._distance),
|
|
l = this._lineSource.screenPointToPoint(a);
|
|
this._lineSource._points[1] = l, this._lineSource._model.updateSource(this
|
|
._lineSource), this._lineSource.updateAllViews(), this._lineSource
|
|
._model.updateSource(this._lineSource)
|
|
}
|
|
}
|
|
class a extends r {
|
|
constructor(e, t) {
|
|
super(e, t || a.createProperties()), this._properties.addChild("angle",
|
|
new o(this)), i.e("lt-pane-views").then(i.t.bind(null, "XHET", 7))
|
|
.then(({
|
|
TrendAnglePaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
isSynchronizable() {
|
|
return !1
|
|
}
|
|
pointsCount() {
|
|
return 2
|
|
}
|
|
name() {
|
|
return "Trend Angle"
|
|
}
|
|
_calculateAngle() {
|
|
var e = this.pointToScreenPoint(this.points()[0])[0],
|
|
t = this.pointToScreenPoint(this.points()[1])[0],
|
|
i = t.subtract(e);
|
|
i.length() > 0 ? (i = i.normalized(), this._angle = Math.acos(i.x), i.y >
|
|
0 && (this._angle = -this._angle), this._distance = t.subtract(e)
|
|
.length()) : delete this._angle, this.properties().hasOwnProperty(
|
|
"angle") && this.properties().angle.listeners().fire(this
|
|
.properties().angle)
|
|
}
|
|
addPoint(e, t) {
|
|
var i = r.prototype.addPoint.call(this, e, t);
|
|
return i && this._calculateAngle(), i
|
|
}
|
|
setLastPoint(e, t) {
|
|
super.setLastPoint(e, t), this.points().length > 1 && this._calculateAngle()
|
|
}
|
|
axisPoints() {
|
|
if (this.points().length < 2) return [];
|
|
var e = [this.points()[0]],
|
|
t = this.pointToScreenPoint(this.points()[0])[1],
|
|
i = Math.cos(this._angle) * this._distance,
|
|
r = -Math.sin(this._angle) * this._distance,
|
|
n = t.add(new s(i, r)),
|
|
o = this.screenPointToPoint(n);
|
|
return e.push(o), e
|
|
}
|
|
setPoint(e, t, i) {
|
|
super.setPoint(e, t, i), this.points().length > 1 && 1 === e && this
|
|
._calculateAngle()
|
|
}
|
|
restoreData(e) {
|
|
this._angle = e.angle, this._distance = e.distance
|
|
}
|
|
state(e) {
|
|
var t = r.prototype.state.call(this, e);
|
|
return t.angle = this._angle, t.distance = this._distance, t
|
|
}
|
|
cloneData(e) {
|
|
this._angle = e._angle, this._distance = e._distance
|
|
}
|
|
canHasAlert() {
|
|
return !0
|
|
}
|
|
_getAlertPlots() {
|
|
return [this._linePointsToAlertPlot(this._points, null, this.properties()
|
|
.extendLeft.value(), this.properties().extendRight.value())]
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null,
|
|
"o1gc"))).TrendAngleDefinitionsViewModel
|
|
}
|
|
_snapTo45DegreesAvailable() {
|
|
return !0
|
|
}
|
|
static createProperties(e) {
|
|
var t = new n("linetooltrendangle", e);
|
|
return a._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
r._configureProperties(e)
|
|
}
|
|
}
|
|
t.LineToolTrendAngle = a
|
|
}).call(this, i("tc+8"))
|
|
},
|
|
"nd9+": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineToolGannComplex", (function() {
|
|
return h
|
|
}));
|
|
var s = i("aO4+"),
|
|
r = i("Eyy1"),
|
|
n = i("T6Of"),
|
|
o = i("Ss5c"),
|
|
a = i("FaJS"),
|
|
l = i("LAp3"),
|
|
c = i("j3hX");
|
|
class h extends o.LineDataSource {
|
|
constructor(e, t) {
|
|
super(e, t || h.createProperties()), this.version = 2, this
|
|
._scaleRatioFormatter = new n.LimitedPrecisionNumericFormatter(7), i.e(
|
|
"lt-pane-views").then(i.bind(null, "X4Cb")).then(({
|
|
GannComplexPaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this.model())])
|
|
});
|
|
const s = this.properties();
|
|
this._adjustScaleRatio(s), s.subscribe(this, this._adjustScaleRatio), s.childs()
|
|
.scaleRatio.subscribe(this, this._correctFirstPoint), this
|
|
._syncStateExclusions = ["scaleRatio"], s.addExclusion("scaleRatio"), this
|
|
.properties().onRestoreFactoryDefaults().subscribe(this, this
|
|
._handleRestoringFactoryDefaults), this._onTemplateApplying.subscribe(
|
|
this, this._handleTemplateApplying), this._onTemplateApplied.subscribe(
|
|
this, this._correctFirstPoint)
|
|
}
|
|
properties() {
|
|
return super.properties()
|
|
}
|
|
migrateVersion(e, t, i) {
|
|
1 === e && (this._points.length >= this.pointsCount() ? setTimeout(() => this
|
|
._migratePoint()) : this._timePoint.length >= this.pointsCount() &&
|
|
this._pointAdded.subscribe(this, this._migratePoint))
|
|
}
|
|
destroy() {
|
|
const e = this.properties();
|
|
e.unsubscribe(this, this._adjustScaleRatio), e.childs().scaleRatio.unsubscribe(
|
|
this, this._correctFirstPoint), this.properties()
|
|
.onRestoreFactoryDefaults().unsubscribe(this, this
|
|
._handleRestoringFactoryDefaults), this._onTemplateApplying.unsubscribe(
|
|
this, this._handleTemplateApplying), this._onTemplateApplied
|
|
.unsubscribe(this, this._correctFirstPoint), super.destroy()
|
|
}
|
|
pointsCount() {
|
|
return 2
|
|
}
|
|
name() {
|
|
return "Gann Square"
|
|
}
|
|
addPoint(e, t, i) {
|
|
this._points.length > 1 && this._points.pop();
|
|
const s = super.addPoint(e, t, i),
|
|
n = this.priceScale();
|
|
return !Object(r.ensureNotNull)(n).isLog() && s && this._correctFirstPoint(), s
|
|
}
|
|
setPoint(e, t, i) {
|
|
super.setPoint(e, t, i), void 0 !== i && i.shift() ? this._correctPoint(e) :
|
|
this._correctScaleRatio()
|
|
}
|
|
setLastPoint(e, t) {
|
|
const i = this.priceScale();
|
|
Object(r.ensureNotNull)(i).isLog() || (this._points[1] = e, this._correctPoint(
|
|
1)), super.setLastPoint(e, t)
|
|
}
|
|
isReversed() {
|
|
return this.properties().childs().reverse.value()
|
|
}
|
|
levelsCount() {
|
|
return this.properties().childs().levels.childCount()
|
|
}
|
|
levels() {
|
|
const e = [],
|
|
t = this.properties().childs(),
|
|
i = t.levels.childCount();
|
|
for (let s = 0; s < i; s++) {
|
|
const i = t.levels.childs()[s].childs();
|
|
e.push({
|
|
index: s,
|
|
visible: i.visible.value(),
|
|
color: i.color.value(),
|
|
width: i.width.value()
|
|
})
|
|
}
|
|
return e
|
|
}
|
|
fanLinesCount() {
|
|
return this.properties().childs().fanlines.childCount()
|
|
}
|
|
fanLines() {
|
|
const e = [],
|
|
t = this.properties().childs(),
|
|
i = t.fanlines.childCount();
|
|
for (let s = 0; s < i; s++) {
|
|
const i = t.fanlines.childs()[s].childs();
|
|
e.push({
|
|
index: s,
|
|
visible: i.visible.value(),
|
|
x: i.x.value(),
|
|
y: i.y.value(),
|
|
color: i.color.value(),
|
|
width: i.width.value()
|
|
})
|
|
}
|
|
return e
|
|
}
|
|
arcsCount() {
|
|
return this.properties().childs().arcs.childCount()
|
|
}
|
|
arcs() {
|
|
const e = [],
|
|
t = this.properties().childs(),
|
|
i = t.arcs.childCount();
|
|
for (let s = 0; s < i; s++) {
|
|
const i = t.arcs.childs()[s].childs();
|
|
e.push({
|
|
index: s,
|
|
visible: i.visible.value(),
|
|
x: i.x.value(),
|
|
y: i.y.value(),
|
|
color: i.color.value(),
|
|
width: i.width.value()
|
|
})
|
|
}
|
|
return e
|
|
}
|
|
arcsBackgroundTransparency() {
|
|
return this.properties().childs().arcsBackground.childs().transparency.value()
|
|
}
|
|
isArcsBackgroundFilled() {
|
|
return this.properties().childs().arcsBackground.childs().fillBackground.value()
|
|
}
|
|
isLabelsVisible() {
|
|
return this.properties().childs().showLabels.value()
|
|
}
|
|
getLabelsStyle() {
|
|
const e = this.properties().childs(),
|
|
{
|
|
font: t,
|
|
fontSize: i,
|
|
bold: s,
|
|
italic: r
|
|
} = e.labelsStyle.childs(),
|
|
n = e.levels.childCount();
|
|
return {
|
|
textColor: e.levels.childs()[n - 1].childs().color.value(),
|
|
font: t.value(),
|
|
fontSize: i.value(),
|
|
bold: s.value(),
|
|
italic: r.value()
|
|
}
|
|
}
|
|
getScaleRatioStep() {
|
|
return 1e-7
|
|
}
|
|
getScaleRatioFormatter() {
|
|
return this._scaleRatioFormatter
|
|
}
|
|
getPriceDiff() {
|
|
const e = this.points();
|
|
if (e.length < 2) return null;
|
|
const [t, i] = e;
|
|
return i.price - t.price
|
|
}
|
|
getIndexDiff() {
|
|
const e = this.points();
|
|
if (e.length < 2) return null;
|
|
const [t, i] = e;
|
|
return i.index - t.index
|
|
}
|
|
getScaleRatio() {
|
|
const e = this.getPriceDiff(),
|
|
t = this.getIndexDiff();
|
|
return null !== e && null !== t && 0 !== t ? Math.abs(e / t) : null
|
|
}
|
|
static createProperties(e) {
|
|
const t = Object(l.a)("linetoolganncomplex", e);
|
|
return h._configureProperties(t), t
|
|
}
|
|
_getPropertyDefinitionsViewModelClass() {
|
|
return Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "WfUZ")).then(
|
|
e => e.GannComplexAndFixedDefinitionsViewModel)
|
|
}
|
|
static _configureProperties(e) {
|
|
o.LineDataSource._configureProperties(e);
|
|
const t = [],
|
|
i = [],
|
|
s = e.childs(); {
|
|
const e = s.levels.childCount();
|
|
for (let r = 0; r < e; r++) {
|
|
const e = s.levels.childs()[r].childs();
|
|
t.push(e.width), i.push(e.color)
|
|
}
|
|
} {
|
|
const e = s.fanlines.childCount();
|
|
for (let r = 0; r < e; r++) {
|
|
const e = s.fanlines.childs()[r].childs();
|
|
t.push(e.width), i.push(e.color)
|
|
}
|
|
} {
|
|
const e = s.arcs.childCount();
|
|
for (let r = 0; r < e; r++) {
|
|
const e = s.arcs.childs()[r].childs();
|
|
t.push(e.width), i.push(e.color)
|
|
}
|
|
}
|
|
e.addChild("linesColors", new c.LineToolColorsProperty(i)), e.addChild(
|
|
"linesWidths", new c.LineToolWidthsProperty(t))
|
|
}
|
|
_correctScaleRatio() {
|
|
const e = this.properties().childs(),
|
|
t = this.getScaleRatio();
|
|
e.scaleRatio.setValue(t)
|
|
}
|
|
_getAdjustedScaleRatio() {
|
|
const e = this.model().mainSeries().priceScale(),
|
|
t = this.model().timeScale();
|
|
return Object(a.scaleRatio)(t, e)
|
|
}
|
|
_adjustScaleRatio(e) {
|
|
const t = e.scaleRatio.value();
|
|
"" !== t && null !== t || e.scaleRatio.setValue(this._getAdjustedScaleRatio())
|
|
}
|
|
_correctPoint(e) {
|
|
if (this._points.length < 2) return;
|
|
const t = this.getIndexDiff();
|
|
if (null === t) return;
|
|
const i = this.properties().childs().scaleRatio.value();
|
|
if (null !== i) {
|
|
const s = this._points[e],
|
|
r = 0 === e ? this._points[1] : this._points[0],
|
|
n = s.price - r.price > 0,
|
|
o = s.index - r.index > 0;
|
|
let a = n && !o || !n && o ? -1 : 1;
|
|
0 === e && (a = -a), s.price = r.price + a * t * i, this._pointChanged.fire(
|
|
e)
|
|
}
|
|
this.normalizePoints()
|
|
}
|
|
_correctFirstPoint() {
|
|
this._correctPoint(this.isReversed() ? 0 : 1)
|
|
}
|
|
_handleRestoringFactoryDefaults() {
|
|
this.properties().childs().scaleRatio.setValue(this._getAdjustedScaleRatio())
|
|
}
|
|
_handleTemplateApplying(e) {
|
|
"" === e.scaleRatio && (e.scaleRatio = this._getAdjustedScaleRatio())
|
|
}
|
|
_migratePoint() {
|
|
if (this.points().length < this.pointsCount()) return;
|
|
const e = this._getScreenPoints();
|
|
if (null === e) return;
|
|
const t = this.screenPointToPoint(e[1]);
|
|
this.setPoint(1, t), this._pointAdded.unsubscribe(this, this._migratePoint)
|
|
}
|
|
_getScreenPoints() {
|
|
const e = this._calcAngle();
|
|
if (null === e) return null;
|
|
let [t, i] = this.points();
|
|
this.isReversed() && ([t, i] = [i, t]);
|
|
const r = this.pointToScreenPoint(t)[0],
|
|
n = this.pointToScreenPoint(i)[0],
|
|
o = Math.sqrt(Math.pow(r.x - n.x, 2) + Math.pow(r.y - n.y, 2)),
|
|
a = new s.Point(Math.cos(e), -Math.sin(e)),
|
|
l = a.normalized(),
|
|
c = l.x < 0 ? -1 : 1,
|
|
h = l.y < 0 ? -1 : 1;
|
|
return [r.addScaled(a, o), r.add(new s.Point(5 * o * c, 5 * o * h))]
|
|
}
|
|
_calcAngle() {
|
|
const [e, t] = this.points(), i = this.pointToScreenPoint(e)[0];
|
|
let s = this.pointToScreenPoint(t)[0].subtract(i);
|
|
if (s.length() > 0) {
|
|
s = s.normalized();
|
|
let e = Math.acos(s.x);
|
|
return s.y > 0 && (e = -e), e
|
|
}
|
|
return null
|
|
}
|
|
}
|
|
},
|
|
nda6: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "TimeSpanFormatter", (function() {
|
|
return s
|
|
}));
|
|
i("YFKU");
|
|
class s {
|
|
format(e) {
|
|
const t = e < 0;
|
|
e = Math.abs(e);
|
|
const i = Math.floor(e / 86400);
|
|
e -= 86400 * i;
|
|
const s = Math.floor(e / 3600);
|
|
e -= 3600 * s;
|
|
const r = Math.floor(e / 60);
|
|
e -= 60 * r;
|
|
let n = "";
|
|
return i && (n += i + window.t("d", {
|
|
context: "dates"
|
|
}) + " "), s && (n += s + window.t("h", {
|
|
context: "dates"
|
|
}) + " "), r && (n += r + window.t("m", {
|
|
context: "dates"
|
|
}) + " "), e && (n += e + window.t("s", {
|
|
context: "dates"
|
|
}) + " "), t && (n = "-" + n), n.trim()
|
|
}
|
|
}
|
|
},
|
|
"ng+v": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("aO4+"),
|
|
r = i("Eyy1"),
|
|
n = i("FQhm"),
|
|
o = i("txPx"),
|
|
a = i("fgLi"),
|
|
l = i("mMWL"),
|
|
c = i("aIyQ"),
|
|
h = i.n(c),
|
|
u = i("tc+8"),
|
|
d = i.n(u),
|
|
p = i("j3hX");
|
|
class _ extends d.a {
|
|
constructor(e, t) {
|
|
super(), this._lineSource = e, this._pointIndex = t, e.pointAdded().subscribe(
|
|
this, e => {
|
|
this._pointIndex === e && this._listeners.fire(this)
|
|
}), e.pointChanged().subscribe(this, e => {
|
|
this._pointIndex === e && this._listeners.fire(this)
|
|
})
|
|
}
|
|
value() {
|
|
const e = this._lineSource.points()[this._pointIndex].price,
|
|
t = Object(r.ensureNotNull)(this._lineSource.ownerSource()).formatter();
|
|
if (t.parse) {
|
|
const i = t.format(e),
|
|
s = t.parse(i);
|
|
return s.res ? s.value : e
|
|
}
|
|
return e
|
|
}
|
|
setValue(e) {
|
|
const t = this._lineSource.points()[this._pointIndex];
|
|
t.price = parseFloat("" + e), this._lineSource.startChanging(this._pointIndex,
|
|
t), this._lineSource.setPoint(this._pointIndex, t), this._lineSource
|
|
.model().updateSource(this._lineSource), this._listeners.fire(this);
|
|
const i = this._lineSource.endChanging(!0, !1);
|
|
this._lineSource.syncMultichartState(i)
|
|
}
|
|
}
|
|
var m = i("j8de"),
|
|
f = i("LxhU"),
|
|
g = i("dOnf"),
|
|
b = i("Ocx9"),
|
|
v = i("WkOR"),
|
|
S = i("n5al"),
|
|
y = i("hY0g"),
|
|
w = i.n(y),
|
|
P = i("H0vP"),
|
|
C = i("pPtI"),
|
|
x = i("eCE5");
|
|
i.d(t, "LineDataSourceBase", (function() {
|
|
return O
|
|
}));
|
|
const T = Object(o.getLogger)("Chart.LineDataSource");
|
|
class I {
|
|
constructor() {
|
|
this._states = []
|
|
}
|
|
start(e) {
|
|
this._states.push(e)
|
|
}
|
|
finish(e) {
|
|
const t = Object(r.ensureDefined)(this._states.pop());
|
|
return s = t, (i = e).length !== s.length ? {
|
|
indexesChanged: !0,
|
|
pricesChanged: !0
|
|
} : i.reduce((e, t, i) => {
|
|
const r = s[i];
|
|
return e.indexesChanged = e.indexesChanged || t.index !== r.index, e
|
|
.pricesChanged = e.pricesChanged || t.price !== r.price, e
|
|
}, {
|
|
indexesChanged: !1,
|
|
pricesChanged: !1
|
|
});
|
|
var i, s
|
|
}
|
|
isEmpty() {
|
|
return 0 === this._states.length
|
|
}
|
|
}
|
|
let M = 0;
|
|
class O extends a.DataSource {
|
|
constructor(e, t) {
|
|
super(), this._currentPointsetId = null, this._pointChanged = new h.a, this
|
|
._pointAdded = new h.a, this._alertUndoMode = !1, this._priceAxisViews = [],
|
|
this._timeAxisViews = [], this._timePoint = [], this._points = [], this
|
|
._lastPoint = null, this._paneViews = new Map, this
|
|
._normalizedPointsChanged = new h.a,
|
|
this._fixedPointsChanged = new h.a, this._changeStatesStack = new I, this
|
|
._startMovingPoint = null, this._currentMovingPoint = null, this
|
|
._fixedPoints = [], this._isActualSymbol = !1, this._isActualInterval = !1,
|
|
this._isActualCurrency = !1, this._isActualUnit = !1, this
|
|
._onIsActualIntervalChange = new h.a, this._linkKey = new w.a(null), this
|
|
._model = e, this._properties = t, this.localAndServerAlertsMismatch = !1, e
|
|
.mainSeries().symbolResolved().subscribe(this, this
|
|
._onMainSeriesSymbolResolved)
|
|
}
|
|
destroy() {
|
|
this._paneViews.forEach((e, t) => this._destroyPanePaneViews(t)), this._model
|
|
.mainSeries().symbolResolved().unsubscribeAll(this)
|
|
}
|
|
linkKey() {
|
|
return this._linkKey
|
|
}
|
|
boundToSymbol() {
|
|
return !0
|
|
}
|
|
points() {
|
|
const e = [];
|
|
for (let t = 0; t < this._points.length; t++) {
|
|
const i = this._points[t];
|
|
e.push({
|
|
index: i.index,
|
|
price: i.price,
|
|
time: i.time
|
|
})
|
|
}
|
|
return this._lastPoint && e.push({
|
|
index: this._lastPoint.index,
|
|
price: this._lastPoint.price
|
|
}), !this.isFixed() && this._currentMovingPoint && this._startMovingPoint &&
|
|
this._correctPoints(e), e
|
|
}
|
|
timeAxisPoints() {
|
|
return this.points()
|
|
}
|
|
priceAxisPoints() {
|
|
return this.points()
|
|
}
|
|
normalizedPoints() {
|
|
return this._timePoint
|
|
}
|
|
normalizedPointsChanged() {
|
|
return this._normalizedPointsChanged
|
|
}
|
|
fixedPointsChanged() {
|
|
return this._fixedPointsChanged
|
|
}
|
|
widthsProperty() {
|
|
var e;
|
|
return null !== (e = this._properties.childs().linesWidths) && void 0 !== e ?
|
|
e : null
|
|
}
|
|
lineColorsProperty() {
|
|
var e;
|
|
return null !== (e = this._properties.childs().linesColors) && void 0 !== e ?
|
|
e : null
|
|
}
|
|
backgroundColorsProperty() {
|
|
var e;
|
|
return null !== (e = this._properties.childs().backgroundsColors) && void 0 !==
|
|
e ? e : null
|
|
}
|
|
textColorsProperty() {
|
|
var e;
|
|
return null !== (e = this._properties.childs().textsColors) && void 0 !== e ?
|
|
e : null
|
|
}
|
|
pointsProperty() {
|
|
return this._pointsProperty
|
|
}
|
|
startMoving(e, t, i, s) {
|
|
this.isFixed() && this.restoreFixedPoints(), this._startMovingPoint = e
|
|
}
|
|
move(e, t, i, s) {
|
|
if (i && (i.shiftOnly() || i.controlShift()))
|
|
if (this.isFixed()) {
|
|
const t = this._alignScreenPointHorizontallyOrVertically(Object(r
|
|
.ensureDefined)(e.screen));
|
|
this._currentMovingPoint = {
|
|
screen: t
|
|
}
|
|
} else {
|
|
const t = this._alignPointHorizontallyOrVertically(Object(r
|
|
.ensureDefined)(e.logical));
|
|
this._currentMovingPoint = {
|
|
logical: t
|
|
}
|
|
}
|
|
else this._currentMovingPoint = e;
|
|
this.updateAllViews()
|
|
}
|
|
endMoving(e, t) {
|
|
let i = !1,
|
|
s = !1;
|
|
if (this._currentMovingPoint && this._startMovingPoint) {
|
|
if (this.isFixed()) this._correctFixedPoints(this._fixedPoints) && this
|
|
._fixedPointsChanged.fire();
|
|
else {
|
|
const e = Object(r.ensureDefined)(this._currentMovingPoint.logical),
|
|
t = Object(r.ensureDefined)(this._startMovingPoint.logical);
|
|
i = e.index !== t.index, s = e.price !== t.price;
|
|
if (this._correctPoints(this._points)) {
|
|
n.emit("drawing_event", this._id, "move");
|
|
for (let e = 0; e < this._points.length; e++) this._pointChanged
|
|
.fire(e)
|
|
}
|
|
}
|
|
this._startMovingPoint = null, this._currentMovingPoint = null
|
|
}
|
|
const o = {
|
|
indexesChanged: i,
|
|
pricesChanged: s
|
|
};
|
|
return this.isFixed() ? (this.calcPositionPercents(), this.updateAllViews(),
|
|
o) : (this.updateAllViews(), i && !e ? (this._properties.childs()
|
|
.interval
|
|
.setValue(this._model.mainSeries().interval()), this
|
|
.normalizePoints(), this.createServerPoints()) : (this
|
|
._copyPricesWithoutNormalization(), this._normalizedPointsChanged
|
|
.fire()),
|
|
(s || i) && this.synchronizeAlert(!this._alertUndoMode), o)
|
|
}
|
|
startMovingPoint() {
|
|
return this._startMovingPoint ? {
|
|
...this._startMovingPoint
|
|
} : null
|
|
}
|
|
currentMovingPoint() {
|
|
return this._currentMovingPoint ? {
|
|
...this._currentMovingPoint
|
|
} : null
|
|
}
|
|
startChanging(e, t) {
|
|
void 0 !== e && void 0 !== t && (e < this._priceAxisViews.length && this
|
|
._priceAxisViews[e].setActive(!0), e < this._timeAxisViews.length &&
|
|
this._timeAxisViews[e].setActive(!0)), this._changeStatesStack.start(
|
|
this.points())
|
|
}
|
|
endChanging(e, t) {
|
|
const i = this._changeStatesStack.finish(this.points());
|
|
i.indexesChanged && this._changeStatesStack.isEmpty() ? (this._properties
|
|
.childs().interval.setValue(this._model.mainSeries().interval()), this
|
|
.normalizePoints(), t || this.createServerPoints()) : (this
|
|
._copyPricesWithoutNormalization(), this._normalizedPointsChanged.fire()
|
|
);
|
|
for (let e = 0; e < this._priceAxisViews.length; e++) this._priceAxisViews[e]
|
|
.setActive(!1);
|
|
for (let e = 0; e < this._timeAxisViews.length; e++) this._timeAxisViews[e]
|
|
.setActive(!1);
|
|
return this.synchronizeAlert(!e), i
|
|
}
|
|
setPoint(e, t, i, s) {
|
|
if (i && i.shift() && this._snapTo45DegreesAvailable()) {
|
|
const i = 0 === e ? 1 : e - 1;
|
|
this._snapPoint45Degree(t, this.points()[i])
|
|
}
|
|
this._points[e].index === t.index ? (this._points[e].price = t.price, this
|
|
._pointChanged.fire(e)) : (this._points[e] = t, this._pointChanged.fire(
|
|
e))
|
|
}
|
|
getPoint(e) {
|
|
return this.points()[e] || null
|
|
}
|
|
setLastPoint(e, t) {
|
|
this._lastPoint = this._preparePoint(e, t), this.updateAllViews()
|
|
}
|
|
lastPoint() {
|
|
return this._lastPoint
|
|
}
|
|
getChangePointForSync(e) {
|
|
return this.getPoint(e)
|
|
}
|
|
setPoints(e) {
|
|
this._points = e
|
|
}
|
|
clearData() {
|
|
this._points = []
|
|
}
|
|
denormalizeTimePoints() {
|
|
let e = [];
|
|
for (let t = 0; t < this._timePoint.length; t++) {
|
|
const i = this._model.timeScale().denormalizeTimePoint(this._timePoint[t]);
|
|
if (void 0 === i) {
|
|
e = [];
|
|
break
|
|
}
|
|
e.push({
|
|
index: i,
|
|
price: this._timePoint[t].price
|
|
})
|
|
}
|
|
e.length > 0 && (this._points = e)
|
|
}
|
|
restorePoints(e, t, i) {
|
|
this._timePoint = Object(g.deepCopy)(e), this._points = t, i || this
|
|
.denormalizeTimePoints()
|
|
}
|
|
calcIsActualSymbol() {
|
|
if (this._model.mainSeries().hasDelayedSymbolIntervalChange()) return;
|
|
const e = this.ownerSource();
|
|
if (null === e) this._isActualSymbol = !1;
|
|
else {
|
|
const t = Object(r.ensureNotNull)(e.symbolSource());
|
|
this._migrateSymbolProperty();
|
|
const i = this._properties.childs().symbol,
|
|
s = i.value();
|
|
if (this._isActualSymbol = t.symbolSameAsCurrent(s), this._isActualSymbol) {
|
|
const e = t.symbol();
|
|
Object(v.a)(s, e) || (T.logWarn(
|
|
'Possible drawing "migrating" detected from "' + s +
|
|
'" to "' + e + '"'), T.logWarn("Series symbolInfo: " + JSON
|
|
.stringify(t.symbolInfo())), T.logWarn("" + (new Error)
|
|
.stack)), i.setValue(e)
|
|
}
|
|
}
|
|
this.calcIsActualInterval(), this.calcIsActualCurrency(), this
|
|
.calcIsActualUnit(), this._onSourceHiddenMayChange()
|
|
}
|
|
calcIsActualCurrency() {
|
|
const e = this.ownerSource();
|
|
if (null === e) return void(this._isActualCurrency = !1);
|
|
const t = this._properties.childs().currencyId.value();
|
|
if (null !== t) {
|
|
const i = e.symbolSource();
|
|
if (null === i) return;
|
|
this._isActualCurrency = t === Object(S.symbolCurrency)(i.symbolInfo(),
|
|
void 0, !0)
|
|
} else {
|
|
const t = Object(r.ensureNotNull)(e.symbolSource()).symbolInfo();
|
|
this._isActualCurrency = null !== t && Object(S.symbolCurrency)(t) ===
|
|
Object(S.symbolOriginalCurrency)(t)
|
|
}
|
|
this._onSourceHiddenMayChange()
|
|
}
|
|
calcIsActualUnit() {
|
|
const e = this.ownerSource();
|
|
if (null === e) return void(this._isActualUnit = !1);
|
|
const t = this._properties.childs().unitId.value();
|
|
if (null !== t) this._isActualUnit = t === Object(r.ensureNotNull)(e
|
|
.symbolSource()).unit();
|
|
else {
|
|
const t = Object(r.ensureNotNull)(e.symbolSource()).symbolInfo();
|
|
this._isActualUnit = null !== t && Object(S.symbolUnit)(t) === Object(S
|
|
.symbolOriginalUnit)(t)
|
|
}
|
|
this._onSourceHiddenMayChange()
|
|
}
|
|
calcIsActualInterval() {
|
|
const e = this._isActualInterval,
|
|
t = this._properties,
|
|
i = this._model.mainSeries();
|
|
this._isActualInterval = Object(x.a)(f.Interval.parse(i.interval()), t.childs()
|
|
.intervalsVisibilities), !this._isActualInterval && this._model
|
|
.selection().isSelected(this) && this._model.selectionMacro(e => e
|
|
.removeSourceFromSelection(this)), this._isActualInterval !== e && this
|
|
._onIsActualIntervalChange.fire(), this._onSourceHiddenMayChange()
|
|
}
|
|
paneViews(e) {
|
|
if (this.isSourceHidden()) return null;
|
|
const t = this._getPaneViews(this.isMultiPaneAvailable() ? e : void 0);
|
|
if (null === t) return null;
|
|
if (1 === t.length) return [t[0]];
|
|
const i = [];
|
|
for (let e = t.length - 1; e >= 0; --e) i.push(t[e]);
|
|
return i
|
|
}
|
|
detachAlert() {
|
|
const e = this.getAlertSync();
|
|
if (e && this._alertCallbacks) {
|
|
const t = this._alertCallbacks;
|
|
e.off("destroy", t.remove), e.off("change:hovered", t.hovered), e.off(
|
|
"change:selected", t.selected)
|
|
}
|
|
this.hasAlert.setValue(!1), this._alertId = void 0
|
|
}
|
|
start() {
|
|
this.createServerPoints()
|
|
}
|
|
onData(e) {
|
|
"pointset_error" !== e.method ? e.params.customId === this
|
|
._currentPointsetIdWithPrefix() && this._onPointsetUpdated(e.params.plots) :
|
|
T.logError(`Error getting pointset: ${e.params[0]} ${e.params[1]}`)
|
|
}
|
|
isActualSymbol() {
|
|
return this._isActualSymbol
|
|
}
|
|
isActualCurrency() {
|
|
return this._isActualCurrency
|
|
}
|
|
isActualInterval() {
|
|
return this._isActualInterval
|
|
}
|
|
isActualUnit() {
|
|
return this._isActualUnit
|
|
}
|
|
onIsActualIntervalChange() {
|
|
return this._onIsActualIntervalChange
|
|
}
|
|
setOwnerSource(e) {
|
|
null !== this._ownerSource && (this._ownerSource.currencyChanged()
|
|
.unsubscribeAll(this), this._ownerSource.unitChanged().unsubscribeAll(
|
|
this)), super.setOwnerSource(e), e && (this.setPriceScale(e
|
|
.priceScale()), e.currencyChanged().subscribe(this, this
|
|
.calcIsActualCurrency), e.unitChanged().subscribe(this, this
|
|
.calcIsActualUnit), this.calcIsActualSymbol(), this
|
|
._migrateZOrder())
|
|
}
|
|
dataAndViewsReady() {
|
|
return this._paneViews.size > 0
|
|
}
|
|
pointAdded() {
|
|
return this._pointAdded
|
|
}
|
|
pointChanged() {
|
|
return this._pointChanged
|
|
}
|
|
addPoint(e, t, i) {
|
|
const s = this._preparePoint(e, t);
|
|
return this._addPointIntenal(s, t, i)
|
|
}
|
|
updateAllViewsAndRedraw() {
|
|
this.updateAllViews(), this._model.updateSource(this)
|
|
}
|
|
restoreExternalPoints(e, t) {
|
|
if (this._timePoint = Object(g.deepCopy)(e.points), t.indexesChanged) {
|
|
if (this.properties().interval.setValue(e.interval), !this.isActualSymbol())
|
|
return this._clearServerPoints(), void this._normalizedPointsChanged
|
|
.fire();
|
|
this.createServerPoints()
|
|
} else {
|
|
const t = Math.min(this._points.length, e.points.length);
|
|
for (let i = 0; i < t; i++) this._points[i].price = e.points[i].price
|
|
}
|
|
this._normalizedPointsChanged.fire()
|
|
}
|
|
isSourceHidden() {
|
|
return !this._properties.childs().visible.value() || Object(l.hideAllDrawings)()
|
|
.value() && this.canBeHidden() || !this._isActualInterval || !this
|
|
._isActualSymbol || !this._isActualCurrency || !this._isActualUnit
|
|
}
|
|
createServerPoints() {
|
|
if (!this._isActualSymbol) return;
|
|
if (!this._model.chartApi().isConnected().value()) return;
|
|
if (this._clearServerPoints(), this._model.timeScale().isEmpty()) return;
|
|
if (0 === this._timePoint.length && this._points.length > 0 && this
|
|
.normalizePoints(), !this._readyToCreatePointset()) return;
|
|
this._currentPointsetId = ++M;
|
|
const e = Object(r.ensureNotNull)(this._model.mainSeries().seriesSource()
|
|
.symbolInstanceId()),
|
|
t = this._pointsForPointset(),
|
|
i = Object(C.getServerInterval)(this.properties().interval.value());
|
|
this._model.chartApi().createPointset(this._currentPointsetIdWithPrefix(),
|
|
"turnaround", e, i, t, this.onData.bind(this))
|
|
}
|
|
finish() {}
|
|
tryCreateServerPoints() {
|
|
this.isFixed() || this.isSourceHidden() || null === this._currentPointsetId &&
|
|
this.createServerPoints()
|
|
}
|
|
stop() {
|
|
this._clearServerPoints()
|
|
}
|
|
restart() {
|
|
this.isFixed() || (this._currentPointsetId = null, this.createServerPoints())
|
|
}
|
|
isStarted() {
|
|
return null !== this._currentPointsetId
|
|
}
|
|
convertYCoordinateToPriceForMoving(e, t) {
|
|
var i;
|
|
const s = Object(r.ensureNotNull)(this.priceScale());
|
|
if (s.isEmpty()) return null;
|
|
const n = this.ownerSource(),
|
|
o = Object(r.ensure)(null === (i = n || t) || void 0 === i ? void 0 : i
|
|
.firstValue());
|
|
return s.coordinateToPrice(e, o)
|
|
}
|
|
syncMultichartState(e) {
|
|
const t = {
|
|
points: this._timePoint,
|
|
interval: this._model.mainSeries().interval()
|
|
},
|
|
i = this.linkKey().value();
|
|
if (null !== i && this.isSynchronizable()) {
|
|
const s = {
|
|
model: this._model,
|
|
linkKey: i,
|
|
symbol: this._model.mainSeries().symbol(),
|
|
finalState: t,
|
|
changes: e
|
|
};
|
|
Object(l.finishChangingLineTool)(s)
|
|
}
|
|
}
|
|
enableCurrentIntervalVisibility() {
|
|
const e = this.properties().intervalsVisibilities.state();
|
|
Object(x.b)(e, f.Interval.parse(this._model.mainSeries().interval())), this
|
|
.properties().intervalsVisibilities.mergeAndFire(e)
|
|
}
|
|
clonePositionOffset() {
|
|
return this.isFixed() ? {
|
|
barOffset: 0,
|
|
xCoordOffset: 20,
|
|
yCoordOffset: 20
|
|
} : {
|
|
barOffset: 0,
|
|
xCoordOffset: 0,
|
|
yCoordOffset: -40
|
|
}
|
|
}
|
|
_pointsForPointset() {
|
|
return this._timePoint.map(e => [e.time_t, e.offset])
|
|
}
|
|
_snapPoint45Degree(e, t, i) {
|
|
const s = this._model.timeScale(),
|
|
n = s.indexToCoordinate(t.index),
|
|
o = s.indexToCoordinate(e.index) - n,
|
|
a = Object(r.ensureNotNull)(this.priceScale()),
|
|
l = t.price,
|
|
c = e.price,
|
|
h = Object(r.ensureNotNull)(Object(r.ensureNotNull)(this.ownerSource())
|
|
.firstValue()),
|
|
u = a.priceToCoordinate(l, h),
|
|
d = a.priceToCoordinate(c, h) - u,
|
|
p = Math.round(Math.atan2(o, d) / Math.PI * 4);
|
|
if (2 === Math.abs(p)) i || (e.price = l);
|
|
else if (0 === Math.abs(p) || 4 === Math.abs(p)) i || (e.index = t.index);
|
|
else {
|
|
const t = Math.sqrt(o * o + d * d),
|
|
i = o < 0 ? -1 : 1,
|
|
r = d < 0 ? -1 : 1;
|
|
let l = Math.max(Math.abs(d), Math.abs(o));
|
|
l /= l * Math.sqrt(2) / t;
|
|
const c = Math.round(s.coordinateToIndex(n + l * i)),
|
|
p = Math.abs(s.indexToCoordinate(c) - n),
|
|
_ = a.coordinateToPrice(u + p * r, h);
|
|
e.index = c, e.price = _
|
|
}
|
|
}
|
|
normalizePoint(e) {
|
|
return {
|
|
...this._model.timeScale().normalizeBarIndex(e.index),
|
|
price: e.price
|
|
}
|
|
}
|
|
normalizePoints() {
|
|
this._timePoint = [];
|
|
for (let e = 0; e < this._points.length; e++)
|
|
if (void 0 !== this._points[e].index) {
|
|
const t = this.normalizePoint(this._points[e]);
|
|
if (!t.time_t) {
|
|
this._timePoint = [];
|
|
break
|
|
}
|
|
this._timePoint.push(t)
|
|
} this._normalizedPointsChanged.fire()
|
|
}
|
|
_setPaneViews(e, t, i) {
|
|
this._paneViews.set(t, e), void 0 !== t && i && t.onDestroyed().subscribe(this,
|
|
() => this._destroyPanePaneViews(t)), this._model.lightUpdate()
|
|
}
|
|
_getPaneViews(e) {
|
|
return this._paneViews.get(e) || null
|
|
}
|
|
_updateAllPaneViews() {
|
|
this._paneViews.forEach(e => {
|
|
for (const t of e) t.update()
|
|
})
|
|
}
|
|
_alignPointHorizontallyOrVertically(e) {
|
|
const t = this.pointToScreenPoint(e)[1],
|
|
i = Object(r.ensureDefined)(Object(r.ensureNotNull)(this._startMovingPoint)
|
|
.logical),
|
|
s = this.pointToScreenPoint(i)[1],
|
|
n = Math.abs(s.x - t.x),
|
|
o = Math.abs(s.y - t.y);
|
|
if (n < 10 && o < 10) return e;
|
|
return {
|
|
index: n < o ? i.index : e.index,
|
|
price: n < o ? e.price : i.price
|
|
}
|
|
}
|
|
_alignScreenPointHorizontallyOrVertically(e) {
|
|
const t = Object(r.ensureDefined)(Object(r.ensureNotNull)(this
|
|
._startMovingPoint).screen),
|
|
i = Math.abs(t.x - e.x),
|
|
n = Math.abs(t.y - e.y);
|
|
return i < 10 && n < 10 ? e : i < n ? new s.Point(t.x, e.y) : new s.Point(e.x, t
|
|
.y)
|
|
}
|
|
_correctPoints(e) {
|
|
const t = Object(r.ensureDefined)(Object(r.ensureNotNull)(this
|
|
._currentMovingPoint).logical),
|
|
i = Object(r.ensureDefined)(Object(r.ensureNotNull)(this._startMovingPoint)
|
|
.logical),
|
|
s = t.index - i.index,
|
|
n = t.price - i.price;
|
|
if (0 === s && 0 === n) return !1;
|
|
for (let t = 0; t < e.length; t++) {
|
|
const i = e[t];
|
|
i.index = i.index + s, i.price += n, e[t] = i
|
|
}
|
|
return !0
|
|
}
|
|
_correctFixedPoints(e) {
|
|
const t = Object(r.ensureDefined)(Object(r.ensureNotNull)(this
|
|
._currentMovingPoint).screen),
|
|
i = Object(r.ensureDefined)(Object(r.ensureNotNull)(this._startMovingPoint)
|
|
.screen),
|
|
s = t.subtract(i);
|
|
if (s.length() >= 1) {
|
|
for (let t = 0; t < e.length; t++) e[t] = e[t].add(s);
|
|
return !0
|
|
}
|
|
return !1
|
|
}
|
|
_currentPointsetIdWithPrefix() {
|
|
return "pointset_" + this._currentPointsetId
|
|
}
|
|
_clearServerPoints() {
|
|
null !== this._currentPointsetId && this._model.chartApi().isConnected()
|
|
.value() && this._model.chartApi().removePointset(this
|
|
._currentPointsetIdWithPrefix()), this._currentPointsetId = null
|
|
}
|
|
_createPointProperty(e) {
|
|
const t = this._pointsProperty.childs().points;
|
|
t.addProperty("" + e, {});
|
|
const i = t[e];
|
|
i.addChild("price", new _(this, e)), i.addChild("bar", new m.a(this, e))
|
|
}
|
|
_createPointsProperties() {
|
|
this._pointsProperty = new d.a, this._pointsProperty.addChild("points", new d
|
|
.a);
|
|
for (let e = 0; e < this.pointsCount(); e++) this._createPointProperty(e)
|
|
}
|
|
_alignPointToRangeOfActualData(e) {
|
|
const t = Object(r.ensureNotNull)(this._model.mainSeries().bars().firstIndex()),
|
|
i = Object(r.ensureNotNull)(this._model.mainSeries().bars().lastIndex());
|
|
let s = Math.max(e.index, t);
|
|
return s = Math.min(s, i), {
|
|
...e,
|
|
index: s
|
|
}
|
|
}
|
|
_migrateSymbolProperty() {
|
|
const e = this._properties.childs();
|
|
if (e.symbolStateVersion.value() < 2) {
|
|
const t = Object(r.ensureNotNull)(this.ownerSource()),
|
|
i = Object(r.ensureNotNull)(t.symbolSource());
|
|
if (i === this._model.mainSeries()) return void e.symbolStateVersion
|
|
.setValueSilently(2);
|
|
if (null === i.symbolInfo()) return;
|
|
this._model.mainSeries().symbolSameAsCurrent(e.symbol.value()) && e.symbol
|
|
.setValueSilently(i.symbol()), e.symbolStateVersion.setValueSilently(2)
|
|
}
|
|
}
|
|
_migrateZOrder() {
|
|
const e = this._properties.childs();
|
|
e.zOrderVersion.value() < 2 && (this.ownerSource() === this.model()
|
|
.mainSeries() && this.setZorder(this.zorder() - this.model()
|
|
.mainSeries()
|
|
.obsoleteZOrder()), e.zOrderVersion.setValueSilently(2))
|
|
}
|
|
_preparePoint(e, t) {
|
|
const i = e;
|
|
return t && t.shift() && this.points().length >= 2 && this
|
|
._snapTo45DegreesAvailable() && this._snapPoint45Degree(i, this.points()[
|
|
this.points().length - 2]), i
|
|
}
|
|
_addPointIntenal(e, t, i) {
|
|
this._points.push(e);
|
|
const s = this._points.length === this.pointsCount();
|
|
return s ? (this._lastPoint = null, i || (this.normalizePoints(), this
|
|
.createServerPoints())) : this._lastPoint = e, this._pointAdded.fire(
|
|
this._points.length - 1), s
|
|
}
|
|
_onSourceHiddenMayChange() {
|
|
this._model.invalidate(P.InvalidationMask.validateAction(() => {
|
|
this._isDestroyed || this._processHibernate()
|
|
}))
|
|
}
|
|
_processHibernate() {
|
|
this.isSourceHidden() ? this.isStarted() && this.stop() : this.isStarted() ||
|
|
this.start()
|
|
}
|
|
_onPointsetUpdated(e) {
|
|
if (0 === e.length) return;
|
|
for (let t = 0; t < e.length; t++) {
|
|
const i = e[t],
|
|
s = this._timePoint[i.index],
|
|
r = {
|
|
index: i.value[0],
|
|
time: new Date(1e3 * i.value[1]),
|
|
price: s.price
|
|
};
|
|
this._points.length <= i.index ? (this._points.push(r), this._pointAdded
|
|
.fire(this._points.length - 1)) : (this._points[i.index] = r, this
|
|
._pointChanged.fire(i.index))
|
|
}
|
|
const t = this;
|
|
t.checkAlert && t.checkAlert(), this.updateAllViewsAndRedraw()
|
|
}
|
|
_snapTo45DegreesAvailable() {
|
|
return !1
|
|
}
|
|
_onMainSeriesSymbolResolved() {
|
|
const e = this.ownerSource();
|
|
null === e || this._model.mainSeries() === e.symbolSource() || this
|
|
.isSourceHidden() || this.createServerPoints()
|
|
}
|
|
_readyToCreatePointset() {
|
|
return this._timePoint.length > 0
|
|
}
|
|
static _addCollectedProperties(e) {
|
|
e.hasChild("linewidth") && e.addChild("linesWidths", new p
|
|
.LineToolWidthsProperty([Object(r.ensureDefined)(e.child("linewidth"))])
|
|
), e.hasChild("linecolor") && e.addChild("linesColors", new p
|
|
.LineToolColorsProperty([Object(r.ensureDefined)(e.child("linecolor"))])
|
|
), e.hasChild("backgroundColor") && e.addChild("backgroundsColors",
|
|
new p.LineToolColorsProperty([Object(r.ensureDefined)(e.child(
|
|
"backgroundColor"))])), e.hasChild("textColor") && e.addChild(
|
|
"textsColors", new p.LineToolColorsProperty([Object(r.ensureDefined)(e
|
|
.child("textColor"))])), e instanceof b.DefaultProperty && (e
|
|
.addExclusion("linesWidths"), e.addExclusion("linesColors"), e
|
|
.addExclusion("backgroundsColors"), e.addExclusion("textsColors"))
|
|
}
|
|
static _initialSymbolStateVersion() {
|
|
return 1
|
|
}
|
|
static _initialZOrderVersion() {
|
|
return 1
|
|
}
|
|
_destroyPanePaneViews(e) {
|
|
const t = this._paneViews.get(e);
|
|
if (void 0 !== t)
|
|
for (const e of t) e.destroy && e.destroy();
|
|
void 0 !== e && e.onDestroyed().unsubscribeAll(this), this._paneViews.delete(e)
|
|
}
|
|
_copyPricesWithoutNormalization() {
|
|
const e = Math.min(this._points.length, this._timePoint.length);
|
|
for (let t = 0; t < e; t++) this._timePoint[t].price = this._points[t].price
|
|
}
|
|
}
|
|
},
|
|
nqXy: function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e, t) {
|
|
let {
|
|
deltaX: i,
|
|
deltaY: s
|
|
} = e;
|
|
switch (i /= 100, s /= 100, t.deltaMode) {
|
|
case t.DOM_DELTA_PAGE:
|
|
i *= 120, s *= 120;
|
|
break;
|
|
case t.DOM_DELTA_LINE:
|
|
i *= 32, s *= 32
|
|
}
|
|
return {
|
|
deltaX: i,
|
|
deltaY: s
|
|
}
|
|
}
|
|
i.d(t, "a", (function() {
|
|
return r
|
|
}));
|
|
class r {
|
|
constructor() {
|
|
this._totalDeltaX = 0, this._totalDeltaY = 0, this._prevWheelTime = 0
|
|
}
|
|
processWheel(e) {
|
|
e.timeStamp - this._prevWheelTime > 100 && this._reset(),
|
|
this._totalDeltaX += e.deltaX, this._totalDeltaY += e.deltaY, this
|
|
._prevWheelTime = e.timeStamp;
|
|
const t = {
|
|
deltaX: e.deltaX,
|
|
deltaY: e.deltaY
|
|
};
|
|
return 0 === this._totalDeltaX || 0 === this._totalDeltaY || (Math.abs(this
|
|
._totalDeltaX) >= Math.abs(3 * this._totalDeltaY) && (t.deltaY = 0),
|
|
Math.abs(this._totalDeltaY) >= Math.abs(3 * this._totalDeltaX) && (t
|
|
.deltaX = 0)), s(t, e)
|
|
}
|
|
_reset() {
|
|
this._totalDeltaX = 0, this._totalDeltaY = 0
|
|
}
|
|
}
|
|
},
|
|
o2pV: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "SelectionIndexes", (function() {
|
|
return r
|
|
}));
|
|
var s = i("Eyy1");
|
|
class r {
|
|
constructor(e) {
|
|
this._baseIndex = null, this._offsetInBar = null, this._offsetInTime = null, this
|
|
._barsBetweenPoints = null, this._timescale = e
|
|
}
|
|
indexes() {
|
|
const e = this._timescale.visibleBarsStrictRange();
|
|
if (null === e) return [];
|
|
const t = e.firstBar(),
|
|
i = e.lastBar();
|
|
if (null === this._offsetInTime || null === this._barsBetweenPoints) {
|
|
const e = this._timescale.barSpacing();
|
|
this._barsBetweenPoints = Math.floor(120 / e), this._offsetInBar = i % this
|
|
._barsBetweenPoints, this._offsetInTime = this._timescale.indexToTimePoint(
|
|
this._offsetInBar), this._baseIndex = this._timescale.baseIndex()
|
|
}
|
|
const r = this._timescale.baseIndex();
|
|
this._baseIndex !== r && (this._baseIndex = r, this._offsetInBar = Object(s
|
|
.ensureNotNull)(this._timescale.timePointToIndex(this._offsetInTime)));
|
|
const n = Object(s.ensureNotNull)(this._offsetInBar),
|
|
o = [];
|
|
let a = Math.floor((t - n) / this._barsBetweenPoints);
|
|
const l = Math.floor((i - n) / this._barsBetweenPoints);
|
|
for (; a <= l; a++) o.push(n + a * this._barsBetweenPoints);
|
|
return o
|
|
}
|
|
clear() {
|
|
this._offsetInBar = null, this._offsetInTime = null, this._baseIndex = null, this
|
|
._barsBetweenPoints = null
|
|
}
|
|
}
|
|
},
|
|
oIoN: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Ss5c").LineDataSource,
|
|
r = i("Ocx9").DefaultProperty;
|
|
class n extends s {
|
|
constructor(e, t) {
|
|
super(e, t || n.createProperties()), this.version = n.version, i.e("lt-pane-views")
|
|
.then(i.t.bind(null, "pBAL", 7)).then(({
|
|
DisjointChannelPaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
pointsCount() {
|
|
return 3
|
|
}
|
|
name() {
|
|
return "Disjoint Channel"
|
|
}
|
|
hasEditableCoordinates() {
|
|
return !1
|
|
}
|
|
addPoint(e, t) {
|
|
return t && t.shift() && 2 === this.points().length && this._snapPoint45Degree(e,
|
|
this.points()[this.points().length - 2]), s.prototype.addPoint.call(this, e)
|
|
}
|
|
setLastPoint(e, t) {
|
|
return t && t.shift() && 2 === this.points().length && this._snapPoint45Degree(e,
|
|
this.points()[this.points().length - 2]), s.prototype.setLastPoint.call(
|
|
this, e)
|
|
}
|
|
setPoint(e, t, i) {
|
|
var s = .5 * (this._points[1].price + this._points[2].price);
|
|
if (i && i.shift() && 1 === e) {
|
|
this._snapPoint45Degree(t, this.points()[0])
|
|
}
|
|
if (e < 3 && super.setPoint(e, t), 0 !== e && 2 !== e) {
|
|
if (1 === e) {
|
|
var r = this._points[1].price - s;
|
|
this._points[2].price = this._points[1].price - 2 * r
|
|
} else if (3 === e) {
|
|
r = t.price - this._points[2].price;
|
|
this._points[0].price = this._points[1].price - r, this._points[0].index = t
|
|
.index
|
|
}
|
|
this.normalizePoints()
|
|
}
|
|
}
|
|
getPoint(e) {
|
|
if (e < 3) return s.prototype.getPoint.call(this, e);
|
|
var t = this._points[0].price - this._points[2].price;
|
|
return {
|
|
index: this._points[0].index,
|
|
price: this._points[1].price - t
|
|
}
|
|
}
|
|
canHasAlert() {
|
|
return !0
|
|
}
|
|
_getAlertPlots() {
|
|
var e = this._points[0],
|
|
t = this._points[1],
|
|
i = [];
|
|
e.index <= t.index ? (i.push(e), i.push(t)) : (i.push(t), i.push(e));
|
|
var s = this._points[2];
|
|
s.time = t.time, s.index = t.index;
|
|
var r, n, o, a, l = {
|
|
price: s.price + (t.price - e.price),
|
|
time: e.time,
|
|
index: e.index
|
|
},
|
|
c = [];
|
|
s.index <= l.index ? (c.push(s), c.push(l)) : (c.push(l), c.push(s)), i[0].price >
|
|
c[0].price ? (r = i, n = c) : c[0].price > i[0].price || c[1].price > i[1]
|
|
.price ? (r = c, n = i) : (r = i, n = c);
|
|
var h = this.properties().extendLeft.value(),
|
|
u = this.properties().extendRight.value();
|
|
return e.index <= t.index ? (o = h, a = u) : (o = u, a = h), [this
|
|
._linePointsToAlertPlot(r, "Upper", o, a), this._linePointsToAlertPlot(n,
|
|
"Lower", o, a)
|
|
]
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "vm8R")))
|
|
.GeneralTrendFiguresDefinitionsViewModel
|
|
}
|
|
static createProperties(e) {
|
|
var t = new r("linetooldisjointangle", e);
|
|
return n._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
s._configureProperties(e)
|
|
}
|
|
}
|
|
n.version = 1, t.LineToolDisjointChannel = n
|
|
},
|
|
oV8k: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return s
|
|
}));
|
|
class s {
|
|
constructor(e, t) {
|
|
this._id = e, this._model = t
|
|
}
|
|
id() {
|
|
return this._id
|
|
}
|
|
isHoveredEnabled() {
|
|
return !0
|
|
}
|
|
isSelectionEnabled() {
|
|
return !1
|
|
}
|
|
priceScale() {
|
|
return null
|
|
}
|
|
paneViews(e) {
|
|
return []
|
|
}
|
|
labelPaneViews(e) {
|
|
return []
|
|
}
|
|
priceAxisViews(e, t) {
|
|
return []
|
|
}
|
|
updateViewsForPane(e) {
|
|
e.containsMainSeries() && this.updateAllViews()
|
|
}
|
|
}
|
|
},
|
|
oXaB: function(e, t, i) {
|
|
"use strict";
|
|
var s;
|
|
i.r(t), i.d(t, "PriceAxisLastValueMode", (function() {
|
|
return s
|
|
})),
|
|
function(e) {
|
|
e[e.LastPriceAndPercentageValue = 0] = "LastPriceAndPercentageValue", e[e
|
|
.LastValueAccordingToScale = 1] = "LastValueAccordingToScale"
|
|
}(s || (s = {}))
|
|
},
|
|
oamr: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("ocLq");
|
|
class r {
|
|
constructor(e, t, i, s) {
|
|
this._value = e, this._name = t, this._owner = i, this._comparer = void 0 !== s ?
|
|
s : (e, t) => null == e ? null != t : e === t
|
|
}
|
|
getName() {
|
|
return this._name
|
|
}
|
|
set(e) {
|
|
const t = this._comparer(this._value, e);
|
|
return t && this._owner.dirty(), this._value = e, t
|
|
}
|
|
get() {
|
|
return this._value
|
|
}
|
|
}
|
|
class n {
|
|
constructor(e, t, i) {
|
|
this._owner = null, this._value = e, this._name = t, this._owner = i
|
|
}
|
|
getName() {
|
|
return this._name
|
|
}
|
|
set(e) {
|
|
return this._value !== e && (this._value = e, null !== this._owner && this._owner
|
|
.dirty(), !0)
|
|
}
|
|
get() {
|
|
return this._value
|
|
}
|
|
}
|
|
class o extends r {
|
|
constructor(e, t, i, s) {
|
|
super(e, t, i, s)
|
|
}
|
|
}
|
|
class a {
|
|
constructor(e) {
|
|
this._owner = e
|
|
}
|
|
createField(e, t) {
|
|
return new r(e, t, this)
|
|
}
|
|
createDoubleField(e, t) {
|
|
return new r(e, t, this, (e, t) => !s.Std.equal(e, t))
|
|
}
|
|
createDoubleArrayField(e, t) {
|
|
return new o(e, t, this, (e, t) => {
|
|
if (e === t) return !1;
|
|
const i = e.length;
|
|
if (t.length !== i) return !0;
|
|
for (let r = 0; r < i; r++) {
|
|
const i = e[r],
|
|
n = t[r];
|
|
if (!s.Std.equal(i, n)) return !0
|
|
}
|
|
return !1
|
|
})
|
|
}
|
|
createTimeField(e, t) {
|
|
return new n(e, t, this)
|
|
}
|
|
dirty() {
|
|
null !== this._owner && this._owner.dirty()
|
|
}
|
|
setOwner(e) {
|
|
this._owner = e
|
|
}
|
|
}
|
|
i.d(t, "a", (function() {
|
|
return l
|
|
}));
|
|
class l {
|
|
constructor(e) {
|
|
this._mixinJSONObject = new a(this), this._state = 0, this._owner = null, this
|
|
._gen = e, this._id = e.nextGraphicsObjId(), this._id2 = this._mixinJSONObject
|
|
.createField(this.id(), "id")
|
|
}
|
|
dirty() {
|
|
null !== this._owner && this._owner.dirty()
|
|
}
|
|
setOwner(e) {
|
|
this._owner = e
|
|
}
|
|
id() {
|
|
return this._id
|
|
}
|
|
unsetOwner(e) {
|
|
this._owner === e && (this._owner = null)
|
|
}
|
|
state() {
|
|
return this._state
|
|
}
|
|
erase() {
|
|
1 === this._state && this._gen.pushEraseObjCmd(this._id, this.jsonName()), this
|
|
._state = 2, this.dirty()
|
|
}
|
|
markAsPosted() {
|
|
1 !== this._state && (this._state = 1, this.dirty())
|
|
}
|
|
isErased() {
|
|
return 2 === this._state
|
|
}
|
|
isPosted() {
|
|
return 1 === this._state
|
|
}
|
|
isNaN() {
|
|
return !1
|
|
}
|
|
_processObjUpdate() {
|
|
1 === this._state && (this._gen.pushEraseObjCmd(this._id, this.jsonName()), this
|
|
._id = this._gen.nextGraphicsObjId(), this._id2.set(this._id), this._state =
|
|
0), this.dirty()
|
|
}
|
|
}
|
|
},
|
|
ocLq: function(e, t, i) {
|
|
"use strict";
|
|
(function(t) {
|
|
var s = i("5B3K").StudyError,
|
|
r = i("Y7w9"),
|
|
n = i("ogJP").inherit,
|
|
o = i("E6p6").SessionStage,
|
|
a = i("LxhU").Interval,
|
|
l = i("OLhd").createDwmAligner,
|
|
c = i("OLhd").createTimeToBarTimeAligner,
|
|
h = i("5fI3").decodeExtendedSymbol,
|
|
u = i("5fI3").encodeExtendedSymbolOrGetSimpleSymbolString,
|
|
d = function() {
|
|
var e, p = "undefined" != typeof window ? window : t,
|
|
_ = p.PineJsCalendar ? p.PineJsCalendar : i("jCNj"),
|
|
m = i("IiTo"),
|
|
f = i("IDnv").extrapolateBarsFrontToTime,
|
|
g = {};
|
|
|
|
function b(e, t, i, s, r) {
|
|
var n = r,
|
|
o = 0;
|
|
if (isNaN(e.get(t - 1))) return {
|
|
index: NaN,
|
|
value: NaN
|
|
};
|
|
for (var a = 0; a < t; ++a) s(e.get(a), n) && (o = a, n = e.get(a));
|
|
return {
|
|
index: o,
|
|
value: n
|
|
}
|
|
}
|
|
|
|
function v(e, t, i, s, r) {
|
|
this._areaRight = e, this._areaLeft = t, this._pivotType = i, this._series =
|
|
s, this._currentIndex = r.new_var(0), this._currentValue = r.new_var(
|
|
NaN), this._pivotIndex = r.new_var(-1), this._index = g.n(r), this
|
|
._isNewBar = r.symbol.isNewBar;
|
|
var n = this._currentIndex.get(1),
|
|
o = this._currentValue.get(1),
|
|
a = this._pivotIndex.get(1);
|
|
this._index > 1 && (this._currentIndex.set(n), this._currentValue.set(o),
|
|
this._pivotIndex.set(a))
|
|
}
|
|
|
|
function S(e, t, i) {
|
|
this._deviation = e;
|
|
var s = i.new_var(g.high(i)),
|
|
r = i.new_var(g.low(i));
|
|
s.get(2 * t + 1), r.get(2 * t + 1), this._pivotHigh = new v(t, t, v.HIGH, s,
|
|
i), this._pivotLow = new v(t, t, v.LOW, r, i), this._lastVal = i
|
|
.new_var(NaN), this._lastIndex = i.new_var(-1), this._lastType = i
|
|
.new_var(), this._index = g.n(i), this._isNewBar = i.symbol.isNewBar,
|
|
this._isBarClosed = i.symbol.isBarClosed;
|
|
var n = this._lastIndex.get(1),
|
|
o = this._lastVal.get(1),
|
|
a = this._lastType.get(1);
|
|
this._index > 1 && this.addPivot(n, o, a), this.processPivot(this
|
|
._pivotHigh), this.processPivot(this._pivotLow)
|
|
}
|
|
|
|
function y(e) {
|
|
this.symbol = e, this.vars = [], this.vars_index = 0, this.ctx = [], this
|
|
.ctx_index = 0, this.minimumAdditionalDepth = null
|
|
}
|
|
|
|
function w(e) {
|
|
this.mindepth = 0, this.original = NaN, this.modified = !1, this.symbol = e
|
|
}
|
|
|
|
function P(e) {
|
|
w.call(this, e)
|
|
}
|
|
|
|
function C(e, t, i, s, r, n) {
|
|
var o = h(e);
|
|
const l = "string" == typeof o.symbol ? o : o.symbol;
|
|
this.ticker = l.symbol, this.currencyCode = i || l["currency-id"], this
|
|
.unitId = s || l["unit-id"];
|
|
var c = l["currency-id"] !== this.currencyCode || l["unit-id"] !== this
|
|
.unitId;
|
|
l["currency-id"] = this.currencyCode, l["unit-id"] = this.unitId, c && (e =
|
|
u(o)), this.tickerid = e;
|
|
var d = a.parse(t);
|
|
this.resolution = d.letter(), this.interval = d.multiplier(), this.period =
|
|
d.value(), this.index = -1, this.time = NaN, this.open = NaN, this
|
|
.high = NaN, this.low = NaN, this.close = NaN, this.volume = NaN, this
|
|
.updatetime = NaN, this.isNewBar = !1, this.isBarClosed = !1, this
|
|
.session = new m.SessionInfo("Etc/UTC", "24x7"), this.script = r, this
|
|
.isAdditionalDepthAllowed = void 0 === o.type, n && this.set_symbolinfo(
|
|
n)
|
|
}
|
|
|
|
function x(e, t, i, s, r, n, o, a, l, c) {
|
|
this.body = n, this.symbols = [], this.runner = r, this.inputCallback = a,
|
|
this.out = o, this.nonseriesOut = l, this.ctx = new y(this.add_sym(e, t,
|
|
i, s, c)), this.init()
|
|
}
|
|
|
|
function T(e) {
|
|
this.symbols = [], this.barsets = [],
|
|
this.subscription = [], this.host = e, this.isRecalculated = !1, this
|
|
.isStarted = !1, this.start()
|
|
}
|
|
|
|
function I(e) {
|
|
this.runner = new T(e)
|
|
}
|
|
|
|
function M(e, t) {
|
|
this.info = e, this.bars = t || [], this.isBarClosed = !0, this
|
|
.firstLoadedTimeMs = 0 !== this.bars.length ? this.bars[0].time : 1 / 0
|
|
}
|
|
|
|
function O(e, t) {
|
|
this.period = e, this.generateEmptyBars = !!t
|
|
}
|
|
|
|
function L() {}
|
|
return g.max_series_default_size = 10001, g.n = function(e) {
|
|
return e.symbol.index + 1
|
|
}, g.nz = function(e, t) {
|
|
return t = t || 0, isFinite(e) ? e : t
|
|
}, g.na = function(e) {
|
|
return 0 === arguments.length ? NaN : isNaN(e) ? 1 : 0
|
|
}, g.isZero = function(e) {
|
|
return Math.abs(e) <= 1e-10
|
|
}, g.toBool = function(e) {
|
|
return isFinite(e) && !g.isZero(e)
|
|
}, g.eq = function(e, t) {
|
|
return g.isZero(e - t)
|
|
}, g.neq = function(e, t) {
|
|
return !g.eq(e, t)
|
|
}, g.ge = function(e, t) {
|
|
return g.isZero(e - t) || e > t
|
|
}, g.gt = function(e, t) {
|
|
return !g.isZero(e - t) && e > t
|
|
}, g.lt = function(e, t) {
|
|
return !g.isZero(e - t) && e < t
|
|
}, g.le = function(e, t) {
|
|
return g.isZero(e - t) || e < t
|
|
}, g.and = function(e, t) {
|
|
return isNaN(e) || isNaN(t) ? NaN : g.isZero(e) || g.isZero(t) ? 0 : 1
|
|
}, g.or = function(e, t) {
|
|
return isNaN(e) || isNaN(t) ? NaN : g.isZero(e) && g.isZero(t) ? 0 : 1
|
|
}, g.not = function(e) {
|
|
return isNaN(e) ? NaN : g.isZero(e) ? 1 : 0
|
|
}, g.eps = function() {
|
|
return 1e-10
|
|
}, g.greaterOrEqual = function(e, t, i) {
|
|
return t - e < (i || 1e-10)
|
|
}, g.lessOrEqual = function(e, t, i) {
|
|
return e - t < (i || 1e-10)
|
|
}, g.equal = function(e, t, i) {
|
|
return Math.abs(e - t) < (i || 1e-10)
|
|
}, g.greater = function(e, t, i) {
|
|
return e - t > (i || 1e-10)
|
|
}, g.less = function(e, t, i) {
|
|
return t - e > (i || 1e-10)
|
|
}, g.compare = function(e, t, i) {
|
|
return g.equal(e, t, i) ? 0 : g.greater(e, t, i) ? 1 : -1
|
|
}, g.max = Math.max, g.min = Math.min, g.pow = Math.pow, g.abs = Math.abs, g
|
|
.log = Math.log, g.log10 = function(e) {
|
|
return Math.log(e) / Math.LN10
|
|
}, g.sqrt = Math.sqrt, g.sign = function(e) {
|
|
return isNaN(e) ? NaN : g.isZero(e) ? 0 : e > 0 ? 1 : -1
|
|
}, g.exp = Math.exp, g.sin = Math.sin, g.cos = Math.cos, g.tan = Math.tan, g
|
|
.asin = Math.asin, g.acos = Math.acos, g.atan = Math.atan, g.floor = Math
|
|
.floor, g.ceil = Math.ceil, g.round = Math.round, g.avg = function(e, t, i,
|
|
s, r, n) {
|
|
if (2 === arguments.length) return (e + t) / 2;
|
|
for (var o = 0, a = 0; a < arguments.length; a++) o += arguments[a];
|
|
return o / arguments.length
|
|
}, g.open = function(e) {
|
|
return e.symbol.open
|
|
}, g.high = function(e) {
|
|
return e.symbol.high
|
|
}, g.low = function(e) {
|
|
return e.symbol.low
|
|
}, g.close = function(e) {
|
|
return e.symbol.close
|
|
}, g.hl2 = function(e) {
|
|
return (e.symbol.high + e.symbol.low) / 2
|
|
}, g.hlc3 = function(e) {
|
|
return (e.symbol.high + e.symbol.low + e.symbol.close) / 3
|
|
}, g.ohlc4 = function(e) {
|
|
return (e.symbol.open + e.symbol.high + e.symbol.low + e.symbol.close) /
|
|
4
|
|
}, g.volume = function(e) {
|
|
return e.symbol.volume
|
|
}, g.updatetime = function(e) {
|
|
return e.symbol.updatetime
|
|
}, g.time = function(e) {
|
|
return e.symbol.bartime()
|
|
}, g.period = function(e) {
|
|
return e.symbol.period
|
|
}, g.tickerid = function(e) {
|
|
return e.symbol.tickerid
|
|
}, g.currencyCode = function(e) {
|
|
return e.symbol.currencyCode
|
|
}, g.unitId = function(e) {
|
|
return e.symbol.unitId
|
|
}, g.ticker = function(e) {
|
|
return e.symbol.ticker
|
|
}, g.interval = function(e) {
|
|
return e.symbol.interval
|
|
}, g.isdwm = function(e) {
|
|
return e.symbol.isdwm()
|
|
}, g.isintraday = function(e) {
|
|
return !e.symbol.isdwm()
|
|
}, g.isdaily = function(e) {
|
|
return "D" === e.symbol.resolution
|
|
}, g.isweekly = function(e) {
|
|
return "W" === e.symbol.resolution
|
|
}, g.ismonthly = function(e) {
|
|
return "M" === e.symbol.resolution
|
|
},
|
|
g.year = function(e) {
|
|
return g.timepart(e.symbol, _.YEAR, arguments[1])
|
|
}, g.month = function(e) {
|
|
return g.timepart(e.symbol, _.MONTH, arguments[1])
|
|
}, g.weekofyear = function(e) {
|
|
return g.timepart(e.symbol, _.WEEK_OF_YEAR, arguments[1])
|
|
}, g.dayofmonth = function(e) {
|
|
return g.timepart(e.symbol, _.DAY_OF_MONTH, arguments[1])
|
|
}, g.dayofweek = function(e) {
|
|
return g.timepart(e.symbol, _.DAY_OF_WEEK, arguments[1])
|
|
}, g.hour = function(e) {
|
|
return g.timepart(e.symbol, _.HOUR_OF_DAY, arguments[1])
|
|
}, g.minute = function(e) {
|
|
return g.timepart(e.symbol, _.MINUTE, arguments[1])
|
|
}, g.second = function(e) {
|
|
return g.timepart(e.symbol, _.SECOND, arguments[1])
|
|
}, g.add_days_considering_dst = function(e, t, i) {
|
|
return _.add_days_considering_dst(_.get_timezone(e), t, i)
|
|
}, g.selectSessionBreaks = function(e, t) {
|
|
if (g.isdwm(e) || void 0 === e.symbol.session.timezone) return [];
|
|
var i = m.newBarBuilder(e.symbol.period, e.symbol.session),
|
|
s = [],
|
|
r = t.length;
|
|
if (i.moveTo(t[r - 1]), 1 === r && i.startOfBar(0) === t[0]) s.push(t[
|
|
0]);
|
|
else {
|
|
for (var n = r - 2; n >= 0; --n) {
|
|
var o = t[n];
|
|
if (!(o >= i.startOfBar(0))) {
|
|
i.moveTo(o);
|
|
var a = t[n + 1];
|
|
s.push(a)
|
|
}
|
|
}
|
|
s.reverse()
|
|
}
|
|
return s
|
|
}, g.iff = function(e, t, i) {
|
|
return g.not(e) ? i : t
|
|
}, g.rising = function(e, t) {
|
|
for (var i = 1; i < t + 1; ++i)
|
|
if (e.get(i) > e.get(0)) return 0;
|
|
return 1
|
|
}, g.falling = function(e, t) {
|
|
for (var i = 1; i < t + 1; ++i)
|
|
if (e.get(i) < e.get(0)) return 0;
|
|
return 1
|
|
}, g.timepart = function(e, t, i) {
|
|
var s = _.utc_to_cal(e.timezone, i || e.bartime());
|
|
return _.get_part(s, t)
|
|
}, g.rsi = function(e, t) {
|
|
return g.isZero(t) ? 100 : g.isZero(e) ? 0 : 100 - 100 / (1 + e / t)
|
|
}, g.sum = function(e, t, i) {
|
|
var s = i.new_var(),
|
|
r = g.nz(e.get()) + g.nz(s.get(1)) - g.nz(e.get(t));
|
|
return s.set(r), r
|
|
}, g.sma = function(e, t, i) {
|
|
var s = g.sum(e, t, i);
|
|
return g.na(e.get(t - 1)) ? NaN : s / t
|
|
}, g.smma = function(e, t, i) {
|
|
var s = i.new_var(e),
|
|
r = d.Std.sma(s, t, i),
|
|
n = i.new_var(),
|
|
o = (n.get(1) * (t - 1) + e) / t;
|
|
return n.set(d.Std.na(n.get(1)) ? r : o), n.get(0)
|
|
}, g.rma = function(e, t, i) {
|
|
var s = g.sum(e, t, i),
|
|
r = t - 1,
|
|
n = e.get(r),
|
|
o = i.new_var(),
|
|
a = o.get(1),
|
|
l = e.get(),
|
|
c = g.na(n) ? NaN : g.na(a) ? s / t : (l + a * r) / t;
|
|
return o.set(c), c
|
|
}, g.fixnan = function(e, t) {
|
|
var i = t.new_var();
|
|
return isNaN(e) ? i.get(1) : (i.set(e), e)
|
|
}, g.tr = function(e, t) {
|
|
1 === arguments.length && (t = e, e = void 0);
|
|
var i = void 0 !== e && !!e,
|
|
s = t.new_var(g.close(t)),
|
|
r = s.get(1);
|
|
return i && isNaN(r) && (r = g.close(t)), g.max(g.max(g.high(t) - g.low(
|
|
t), g.abs(g.high(t) - r)), g.abs(g.low(t) - r))
|
|
}, g.atr = function(e, t) {
|
|
var i = t.new_var(g.tr(t));
|
|
return g.sma(i, e, t)
|
|
}, g.ema = function(e, t, i) {
|
|
var s = g.sum(e, t, i),
|
|
r = i.new_var(),
|
|
n = e.get(0),
|
|
o = e.get(t - 1),
|
|
a = r.get(1),
|
|
l = g.na(o) ? NaN : g.na(a) ? s / t : 2 * (n - a) / (t + 1) + a;
|
|
return r.set(l), l
|
|
}, g.wma = function(e, t, i) {
|
|
for (var s = 0, r = t = Math.round(t); r >= 0; r--) {
|
|
s += (t - r) * e.get(r)
|
|
}
|
|
return 2 * s / (t * (t + 1))
|
|
}, g.vwma = function(e, t, i) {
|
|
var s = i.new_var(g.volume(i)),
|
|
r = i.new_var(e.get(0) * g.volume(i));
|
|
return g.sma(r, t, i) / g.sma(s, t, i)
|
|
}, g.swma = function(e, t) {
|
|
return (e.get(0) + 2 * e.get(1) + 2 * e.get(2) + e.get(3)) / 6
|
|
}, g.lowestbars = function(e, t, i) {
|
|
return -b(e, t, 0, (function(e, t) {
|
|
return g.lt(e, t)
|
|
}), Number.MAX_VALUE).index
|
|
}, g.lowest = function(e, t, i) {
|
|
return b(e, t, 0, (function(e, t) {
|
|
return g.lt(e, t)
|
|
}), Number.MAX_VALUE).value
|
|
}, g.highestbars = function(e, t, i) {
|
|
return -b(e, t, 0, (function(e, t) {
|
|
return g.gt(e, t)
|
|
}), Number.MIN_VALUE).index
|
|
}, g.highest = function(e, t, i) {
|
|
return b(e, t, 0, (function(e, t) {
|
|
return g.gt(e, t)
|
|
}), Number.MIN_VALUE).value
|
|
}, g.cum = function(e, t) {
|
|
var i = t.new_var(),
|
|
s = g.nz(i.get(1)) + e;
|
|
return i.set(s), s
|
|
}, g.accdist = function(e) {
|
|
var t = g.high(e),
|
|
i = g.low(e),
|
|
s = g.close(e),
|
|
r = g.volume(e);
|
|
return g.cum(s === t && s === i || t === i ? 0 : r * (2 * s - i - t) / (
|
|
t - i), e)
|
|
}, g.correlation = function(e, t, i, s) {
|
|
var r = g.sma(e, i, s),
|
|
n = g.sma(t, i, s),
|
|
o = s.new_var(e.get() * t.get());
|
|
return (g.sma(o, i, s) - r * n) / Math.sqrt(g.variance2(e, r, i) * g
|
|
.variance2(t, n, i))
|
|
}, g.stoch = function(e, t, i, s, r) {
|
|
var n = g.highest(t, s),
|
|
o = g.lowest(i, s);
|
|
return g.fixnan(100 * (e.get() - o) / (n - o), r)
|
|
}, g.tsi = function(e, t, i, s) {
|
|
var r = s.new_var(g.change(e)),
|
|
n = s.new_var(g.abs(g.change(e))),
|
|
o = s.new_var(g.ema(r, i, s)),
|
|
a = s.new_var(g.ema(n, i, s));
|
|
return g.ema(o, t, s) / g.ema(a, t, s)
|
|
}, g.cross = function(e, t, i) {
|
|
if (isNaN(e) || isNaN(t)) return !1;
|
|
var s, r = i.new_var((s = e - t) < 0 ? -1 : 0 === s ? 0 : 1);
|
|
return !isNaN(r.get(1)) && r.get(1) !== r.get()
|
|
}, g.linreg = function(e, t, i) {
|
|
for (var s = 0, r = 0, n = 0, o = 0, a = 0; a < t; ++a) {
|
|
var l = e.get(a),
|
|
c = t - 1 - a + 1;
|
|
s += c, r += l, n += c * c, o += l * c
|
|
}
|
|
var h = (t * o - s * r) / (t * n - s * s);
|
|
return r / t - h * s / t + h + h * (t - 1 - i)
|
|
}, g.sar = function(e, t, i, s) {
|
|
var r = s.new_var(),
|
|
n = s.new_var(),
|
|
o = s.new_var(),
|
|
a = g.high(s),
|
|
l = g.low(s),
|
|
c = g.close(s),
|
|
h = s.new_var(a),
|
|
u = s.new_var(l),
|
|
d = s.new_var(c),
|
|
p = s.new_var(),
|
|
_ = p.get(1),
|
|
m = n.get(1),
|
|
f = o.get(1);
|
|
n.set(m), o.set(f);
|
|
var b = !1,
|
|
v = u.get(1),
|
|
S = u.get(2),
|
|
y = h.get(1),
|
|
w = h.get(2),
|
|
P = d.get(),
|
|
C = d.get(1);
|
|
2 === g.n(s) && (g.greater(P, C) ? (r.set(1), o.set(h.get()), _ = v, f =
|
|
h.get()) : (r.set(-1), o.set(u.get()), _ = y, f = u.get()),
|
|
b = !0, n.set(e), m = e);
|
|
var x = _ + m * (f - _);
|
|
return 1 === r.get() ? g.greater(x, u.get()) && (b = !0, r.set(-1), x =
|
|
Math.max(h.get(), o.get()), o.set(u.get()), n.set(e)) : g.less(
|
|
x, h.get()) && (b = !0, r.set(1), x = Math.min(u.get(), o
|
|
.get()), o.set(h.get()), n.set(e)), b || (1 === r.get() ? g
|
|
.greater(
|
|
h.get(), o.get()) && (o.set(h.get()), n.set(Math.min(n
|
|
.get() + t, i))) : g.less(u.get(), o.get()) && (o.set(u
|
|
.get()),
|
|
n.set(Math.min(n.get() + t, i)))), 1 === r.get() ? (x = Math
|
|
.min(x, v), g.n(s) > 2 && (x = Math.min(x, S))) : (x = Math.max(
|
|
x, y), g.n(s) > 2 && (x = Math.max(x, w))), p.set(x), x
|
|
}, g.alma = function(e, t, i, s) {
|
|
for (var r = Math.floor(i * (t - 1)), n = t / s * (t / s), o = [], a =
|
|
0, l = 0; l < t; ++l) {
|
|
var c = Math.exp(-1 * Math.pow(l - r, 2) / (2 * n));
|
|
a += c, o.push(c)
|
|
}
|
|
for (l = 0; l < t; ++l) o[l] /= a;
|
|
var h = 0;
|
|
for (l = 0; l < t; ++l) h += o[l] * e.get(t - l - 1);
|
|
return h
|
|
}, g.wvap = function(e, t) {
|
|
return e.get() - e.get(1)
|
|
}, g.change = function(e) {
|
|
return e.get() - e.get(1)
|
|
}, g.roc = function(e, t) {
|
|
var i = e.get(t);
|
|
return 100 * (e.get() - i) / i
|
|
}, g.dev = function(e, t, i) {
|
|
var s = g.sma(e, t, i);
|
|
return g.dev2(e, t, s)
|
|
}, g.dev2 = function(e, t, i) {
|
|
for (var s = 0, r = 0; r < t; r++) {
|
|
var n = e.get(r);
|
|
s += g.abs(n - i)
|
|
}
|
|
return s / t
|
|
}, g.stdev = function(e, t, i) {
|
|
var s = g.variance(e, t, i);
|
|
return g.sqrt(s)
|
|
}, g.variance = function(e, t, i) {
|
|
var s = g.sma(e, t, i);
|
|
return g.variance2(e, s, t)
|
|
}, g.variance2 = function(e, t, i) {
|
|
for (var s = 0, r = 0; r < i; r++) {
|
|
var n = e.get(r),
|
|
o = g.abs(n - t);
|
|
s += o * o
|
|
}
|
|
return s / i
|
|
}, g.percentrank = function(e, t) {
|
|
if (g.na(e.get(t - 1))) return NaN;
|
|
for (var i = 0, s = e.get(), r = 1; r < t; r++) {
|
|
var n = e.get(r);
|
|
g.ge(s, n) && i++
|
|
}
|
|
return 100 * i / t
|
|
}, g.createNewSessionCheck = function(e) {
|
|
if (void 0 === e.symbol.session.timezone) return function() {
|
|
return !1
|
|
};
|
|
var t = m.newBarBuilder(e.symbol.period, e.symbol.session);
|
|
return function(e) {
|
|
return t.indexOfBar(e) === o.POST_SESSION && (t.moveTo(e), !0)
|
|
}
|
|
}, g.error = function(e) {
|
|
throw new s(e)
|
|
}, v.LOW = 0, v.HIGH = 1, v.prototype.isPivotFound = function() {
|
|
return -1 !== this._pivotIndex.get()
|
|
}, v.prototype.pivotIndex = function() {
|
|
return this._pivotIndex.get()
|
|
}, v.prototype.currentValue = function() {
|
|
return this._currentValue.get()
|
|
}, v.prototype.pivotType = function() {
|
|
return this._pivotType
|
|
}, v.prototype.reset = function() {
|
|
this._currentValue.set(NaN), this._currentIndex.set(0), this._pivotIndex
|
|
.set(-1)
|
|
}, v.prototype.isRightSideOk = function(e) {
|
|
return e - this._currentIndex.get() === this._areaRight
|
|
}, v.prototype.isViolate = function(e, t) {
|
|
if (e < 1 || isNaN(this._currentValue.get())) return !0;
|
|
var i = this._series.get(this._index - e);
|
|
return !!isNaN(i) || (i === this._currentValue.get() ? t : this
|
|
._pivotType === v.HIGH ? i > this._currentValue.get() : i < this
|
|
._currentValue.get())
|
|
}, v.prototype.processPoint = function(e) {
|
|
this.isViolate(e, !1) && (this._currentValue.set(this._series.get()),
|
|
this._currentIndex.set(e))
|
|
}, v.prototype.isRestartNeeded = function(e) {
|
|
return e - this._currentIndex.get() > this._areaRight
|
|
}, v.prototype.update = function() {
|
|
if (this._isNewBar && this.isPivotFound() && this.reset(), this
|
|
.processPoint(this._index), this.isRightSideOk(this._index)) {
|
|
if (-1 === this._pivotIndex.get()) {
|
|
for (var e = !0, t = 0; t < this._areaLeft; ++t)
|
|
if (this.isViolate(this._currentIndex.get() - 1 - t, !0)) {
|
|
e = !1;
|
|
break
|
|
} e && this._pivotIndex.set(this._currentIndex.get())
|
|
}
|
|
} else -1 !== this._pivotIndex.get() && this._pivotIndex.set(-1);
|
|
if (this.isRestartNeeded(this._index)) {
|
|
this.reset();
|
|
for (t = 0; t <= this._areaRight; ++t) this.processPoint(this
|
|
._index - this._areaRight + t)
|
|
}
|
|
}, S.prototype.addPivot = function(e, t, i) {
|
|
this._lastIndex.set(e), this._lastVal.set(t), this._lastType.set(i)
|
|
}, S.prototype.updatePivot = function(e, t) {
|
|
this._lastIndex.set(e), this._lastVal.set(t)
|
|
}, S.prototype.lastPrice = function() {
|
|
return this._lastVal.get()
|
|
}, S.prototype.lastIndex = function() {
|
|
return this._lastIndex.get()
|
|
}, S.prototype.addPoint = function(e, t, i) {
|
|
if (isNaN(this._lastVal.get())) this.addPivot(e, t, i);
|
|
else {
|
|
var s = this._lastVal.get();
|
|
if (this._lastType.get() !== i) Math.abs(s - t) / t > this
|
|
._deviation && this.addPivot(e, t, i);
|
|
else(i === v.HIGH ? t > s : t < s) && this.updatePivot(e, t)
|
|
}
|
|
}, S.prototype.processPivot = function(e) {
|
|
e.update(), this._isBarClosed && e.isPivotFound() && this.addPoint(e
|
|
.pivotIndex(), e.currentValue(), e.pivotType())
|
|
}, g.zigzag = function(e, t, i) {
|
|
return new S(e, t, i).lastPrice()
|
|
}, g.zigzagbars = function(e, t, i) {
|
|
var s = new S(e, t, i);
|
|
return -1 === s.lastIndex() ? NaN : s.lastIndex() - g.n(i)
|
|
}, y.prototype.new_sym = function(e, t, i, s) {
|
|
return this.symbol.script.add_sym(e, t, i, s)
|
|
}, y.prototype.select_sym = function(e) {
|
|
this.symbol = this.symbol.script.get_sym(e)
|
|
}, y.prototype.new_var = function(e) {
|
|
var t = this.vars;
|
|
t.length <= this.vars_index && t.push(new w(this.symbol));
|
|
var i = t[this.vars_index++];
|
|
return arguments.length > 0 && i.set(e), i
|
|
}, y.prototype.new_unlimited_var = function(e) {
|
|
var t = this.vars;
|
|
t.length <= this.vars_index && t.push(new P(this.symbol));
|
|
var i = t[this.vars_index++];
|
|
return arguments.length > 0 && i.set(e), i
|
|
}, y.prototype.new_ctx = function() {
|
|
return this.ctx.length <= this.ctx_index && this.ctx.push(new y(this
|
|
.symbol)),
|
|
this.ctx[this.ctx_index++]
|
|
}, y.prototype.prepare = function(e) {
|
|
this.ctx_index = 0, this.vars_index = 0;
|
|
for (var t = 0; t < this.vars.length; t++) this.vars[t].prepare(e);
|
|
for (var i = 0; i < this.ctx.length; i++) this.ctx[i].prepare(e)
|
|
}, y.prototype.maxAdditionalDepth = function() {
|
|
if (null !== this.minimumAdditionalDepth) return this
|
|
.minimumAdditionalDepth;
|
|
for (var e = 0, t = 0; t < this.vars.length; t++) {
|
|
var i = this.vars[t].mindepth;
|
|
!isNaN(i) && i > e && (e = i)
|
|
}
|
|
return e
|
|
}, y.prototype.stop = function() {
|
|
this.symbol = null, this.vars = null
|
|
}, y.prototype.setMinimumAdditionalDepth = function(e) {
|
|
this.minimumAdditionalDepth = e
|
|
}, w.prototype.valueOf = function() {
|
|
return this.get(0)
|
|
}, w.prototype.get = function(e) {
|
|
return isNaN(e) && (e = 0), e = e || 0, this.hist ? e >= this.hist
|
|
.length ? (console.error("not enough depth: " + this), NaN) : this
|
|
._get(e) : (this.mindepth = g.max(this.mindepth, e), NaN)
|
|
}, w.prototype._get = function(e) {
|
|
var t = this.hist_pos - e;
|
|
return t < 0 && (t += this.hist.length), this.hist[t]
|
|
}, w.prototype.set = function(e) {
|
|
this.hist && (this.hist[this.hist_pos] = e, this.modified = !0)
|
|
}, w.prototype.prepare = function(e) {
|
|
e === this.symbol && (e.isNewBar ? (this.original = this.get(0), !this
|
|
.modified && this.hist || this.add_hist()) : this.set(this
|
|
.original), this.modified = !1)
|
|
}, w.prototype.add_hist = function() {
|
|
if (!this.hist) {
|
|
var e = g.na(this.mindepth) ? g.max_series_default_size : g.max(this
|
|
.mindepth + 1, 1);
|
|
e = Math.round(e);
|
|
for (var t = new Array(e), i = 0; i < e; i++) t[i] = NaN;
|
|
this.hist = t, this.hist_pos = -1
|
|
}
|
|
this.hist_pos = Math.min(this.hist_pos + 1, this.hist.length), this
|
|
.hist_pos === this.hist.length && (this.hist_pos = this.hist
|
|
.length - 1, this.hist.shift(), this.hist.push(NaN)), this.hist[
|
|
this.hist_pos] = this.original
|
|
}, w.prototype.adopt = function(e, t, i) {
|
|
this.hist || (this.mindepth = NaN);
|
|
var s = t.get(),
|
|
r = e.indexOf(s);
|
|
if (0 !== i) {
|
|
var n = t.get(1);
|
|
if (!g.na(n)) r = r === e.indexOf(n) ? -1 : r
|
|
}
|
|
return r < 0 ? NaN : this._get(r)
|
|
}, w.prototype.indexOf = function(e) {
|
|
if (!this.hist) return this.mindepth = NaN, -1;
|
|
if (g.na(e)) return -1;
|
|
var t = this.hist.length,
|
|
i = this.symbol.index + 1,
|
|
s = Math.min(t, i),
|
|
n = r.upperbound_int(this.hist, e, 0, s);
|
|
return 0 === n ? -1 : s - n
|
|
}, n(P, w), P.prototype.add_hist = function() {
|
|
if (this.hist || (this.hist = new Float64Array(2e3), this.hist_pos = -
|
|
1), this.hist_pos = this.hist_pos + 1, this.hist_pos === this
|
|
.hist
|
|
.length) {
|
|
var e = new Float64Array(2 * this.hist.length);
|
|
e.set(this.hist), this.hist = e
|
|
}
|
|
this.hist[this.hist_pos] = this.original
|
|
}, C.prototype.set_symbolinfo = function(e) {
|
|
e || console.error("WARN: symbolinfo isn't defined for " + this
|
|
.tickerid), this.info = e, this.minTick = e.minmov / e
|
|
.pricescale, this.currencyCode = e.currency_code, this.unitId = e
|
|
.unit_id, this.timezone = _.get_timezone(e.timezone), this.session
|
|
.init(e.timezone, e.session, e.session_holidays, e.corrections)
|
|
}, C.prototype.isdwm = function() {
|
|
return "" !== this.resolution && "S" !== this.resolution && "T" !== this
|
|
.resolution
|
|
}, C.prototype.enable_dwm_aligning = function(e, t) {
|
|
this.dwm_aligner = m.newBarBuilder(this.period, e, t)
|
|
}, C.prototype.bartime = function() {
|
|
var e = this.time;
|
|
if (!this.isdwm() || isNaN(e)) return e;
|
|
var t = _.utc_to_cal(this.timezone, e);
|
|
return this.session.spec.correctTradingDay(t), _.cal_to_utc(this
|
|
.timezone, t)
|
|
}, C.prototype.lastbar = function(e) {
|
|
if (!isNaN(e.time)) {
|
|
var t = e.time;
|
|
this.dwm_aligner && (this.dwm_aligner.moveTo(t), t = this
|
|
.dwm_aligner.startOfBar(0));
|
|
var i = this.time !== t;
|
|
i && this.index >= 0 && !this.isBarClosed && (this.isNewBar = !1,
|
|
this.isBarClosed = !0, this.script.calc(this)), this.time =
|
|
t, this.open = e.open, this.high = e.high, this.low = e.low,
|
|
this.close = e.close, this.volume = e.volume, this.updatetime =
|
|
e.updatetime, this.isNewBar = i, this.isBarClosed = e
|
|
.isBarClosed, this.isLastBar = e.isLastBar, this.isNewBar && (
|
|
this.index++, this.isFirstBar = 0 === this.index), this
|
|
.script.calc(this)
|
|
}
|
|
}, x.prototype.calc = function(e) {
|
|
var t = this.ctx,
|
|
i = this.body;
|
|
t.prepare(e);
|
|
var s = i.main(t, this.inputCallback, e);
|
|
if (s && "composite" === s.type)
|
|
for (let e = 0; e < s.data.length; ++e) this._processResult(s.data[
|
|
e]);
|
|
else this._processResult(s)
|
|
}, x.prototype._processResult = function(e) {
|
|
var t = this.ctx,
|
|
i = this;
|
|
this.out && e && (!isNaN(t.symbol.time) || e.nonseries) && (e
|
|
.nonseries ? ("projection" === e.type && (e.projectionTime = t
|
|
.symbol.time), this.nonseriesOut(t.symbol, e)) : e.bars ? e
|
|
.bars.forEach((function(e) {
|
|
i.out(t.symbol, e)
|
|
})) : this.out(t.symbol, e))
|
|
}, x.prototype.init = function() {
|
|
var e = this.ctx,
|
|
t = this.body;
|
|
t.init && t.init(e, this.inputCallback), t.main(e, this.inputCallback)
|
|
}, x.prototype.add_sym = function(e, t, i, s, r) {
|
|
var n = this.runner.add_sym(e, t, i, s, this, r);
|
|
return this.symbols.push(n), n.isdwm() && this.symbols.length > 1 && n
|
|
.enable_dwm_aligning(this.symbols[0].session, n.session), n
|
|
}, x.prototype.maxAdditionalDepth = function() {
|
|
return this.symbols[0].isAdditionalDepthAllowed ? this.ctx
|
|
.maxAdditionalDepth() : 0
|
|
}, x.prototype.stop = function() {
|
|
this.symbols = null, this.ctx.stop(), this.ctx = null
|
|
}, x.prototype.get_sym = function(e) {
|
|
return this.symbols[e]
|
|
}, T.prototype.add_sym = function(e, t, i, s, r, n) {
|
|
var o = new C(e, t, i, s, r, n);
|
|
return this.symbols.push(o), o
|
|
}, T.prototype.get_sym = function(e) {
|
|
return this.symbols[e]
|
|
}, T.prototype.out = function(e, t) {
|
|
if (this.nonseriesUpdate) {
|
|
var i = Object.assign({}, this.nonseriesUpdate);
|
|
t.splice(0, 0, e.time), i.lastBar = t, this.host.nonseriesOut(e, i)
|
|
} else this.host.out(e, t)
|
|
}, T.prototype.start = function() {
|
|
this.isStarted = !0;
|
|
var e = this.host;
|
|
this._script = new x(e.tickerid, e.period, e.currencyCode, e.unitId,
|
|
this, e.body, this.out.bind(this), e.input, e.nonseriesOut, e
|
|
.symbolInfo);
|
|
var t = this,
|
|
i = [],
|
|
s = this.symbols,
|
|
r = Object.assign({}, e.dataRange, {
|
|
countBack: e.dataRange.countBack + t._script
|
|
.maxAdditionalDepth()
|
|
}),
|
|
n = s[0];
|
|
|
|
function o(t, s, r) {
|
|
i.push(T.feed.subscribe(t.tickerid, t.currencyCode, t.unitId, t
|
|
.period, r, e.onErrorCallback, e.symbolInfo, e
|
|
.sessionId, s, e.forceAlignBars))
|
|
}
|
|
|
|
function h(i, s) {
|
|
"series" === (s.nonseries ? "nonseries" : "series") ? t.update(i,
|
|
s): s.lastBar ? (t.nonseriesUpdate = s, s.lastBar
|
|
.isLastBar = !
|
|
0, t.symbols[0].lastbar(s.lastBar), t.nonseriesUpdate = null
|
|
) : e.nonseriesOut(p, s)
|
|
}
|
|
|
|
function u() {
|
|
return r
|
|
}
|
|
o(n, u, (function(e) {
|
|
!e.nonseries && Number.isFinite(e.firstLoadedTimeMs) &&
|
|
function(e) {
|
|
function i(i, s) {
|
|
var r = c(i, s)(e),
|
|
n = l(i, s);
|
|
return null !== n && (r = n
|
|
.timeToExchangeTradingDay(r)), {
|
|
to: r,
|
|
countBack: t._script
|
|
.maxAdditionalDepth()
|
|
}
|
|
}
|
|
for (var r = 1; r < s.length; r++) {
|
|
var u = s[r],
|
|
d = u.period;
|
|
a.isEqual(d, n.period) || o(u, i.bind(null,
|
|
d), h.bind(null, r))
|
|
}
|
|
}(e.firstLoadedTimeMs), h(0, e)
|
|
}));
|
|
for (var d = 1; d < s.length; d++) {
|
|
var p = s[d];
|
|
a.isEqual(p.period, n.period) && o(p, u, h.bind(null, d))
|
|
}
|
|
this.subscription = i
|
|
}, T.prototype.stop = function() {
|
|
var e = this.subscription;
|
|
if (e || this._script) {
|
|
for (var t = 0; t < e.length; t++) T.feed.unsubscribe(e[t]);
|
|
this.subscription = null, this._script.stop(), this._script = null,
|
|
this.symbols = null, this.isStarted = !1
|
|
} else console.warn("Recurring script engine stop happened.")
|
|
}, T.prototype.update = function(e, t) {
|
|
if (t) {
|
|
var i = this.symbols[e];
|
|
if (this.isRecalculated) {
|
|
var s = t.bar(t.count() - 1);
|
|
s.isBarClosed = t.isLastBarClosed(), s.isLastBar = !0, i
|
|
.lastbar(s)
|
|
} else this.barsets[e] || (this.barsets[e] = t, i.set_symbolinfo(t
|
|
.symbolinfo()), this.recalc())
|
|
} else console.error("Unexpected barset = null")
|
|
}, T.prototype.recalc = function() {
|
|
for (var e = this.symbols, t = 0; t < e.length; t++)
|
|
if (!this.barsets[t]) return;
|
|
try {
|
|
for (var i = e.length - 1; i >= 0; i--)
|
|
for (var s = e[i], r = this.barsets[i], n = r.count(), o =
|
|
0; o < n; o++) {
|
|
var a = r.bar(o);
|
|
a.isLastBar = o === n - 1, a.isBarClosed = !a.isLastBar || r
|
|
.isLastBarClosed(), s.lastbar(a)
|
|
}
|
|
this.isRecalculated = !0, this.barsets[0] && this.barsets[0]
|
|
.endOfData && this.host.setNoMoreData(), this.host.recalc(
|
|
this, {
|
|
endOfData: this.barsets[0].endOfData,
|
|
firstLoadedTimeMs: this.barsets[0].firstLoadedTimeMs
|
|
})
|
|
} catch (e) {
|
|
if (!e.studyError) throw e;
|
|
this.host.onErrorCallback(e.message)
|
|
}
|
|
}, T.feed = {
|
|
subscribe: function(e, t, i, s, r) {
|
|
console.error("must be initialized with setupFeed")
|
|
},
|
|
unsubscribe: function(e) {
|
|
console.error("must be initialized with setupFeed")
|
|
}
|
|
}, I.prototype.stop = function() {
|
|
this.runner.stop()
|
|
}, I.prototype.isStarted = function() {
|
|
return this.runner.isStarted
|
|
}, M.prototype.symbolinfo = function() {
|
|
return this.info
|
|
}, M.prototype.isLastBarClosed = function() {
|
|
return this.isBarClosed
|
|
}, M.prototype.setLastBarClosed = function(e) {
|
|
this.isBarClosed = e
|
|
}, M.prototype.bar = function(e) {
|
|
return this.bars[e]
|
|
}, M.prototype.count = function() {
|
|
return this.bars.length
|
|
}, M.prototype.add = function(e, t) {
|
|
var i = e,
|
|
s = this.bars,
|
|
r = s.length,
|
|
n = i.time,
|
|
o = 0 === r ? NaN : s[r - 1].time;
|
|
0 === r || o < n ? s.push(i) : o === n ? s[r - 1] = i : console.error(
|
|
"time order violation, prev: " + new Date(o).toUTCString() +
|
|
", cur: " + new Date(n).toUTCString()), this.isBarClosed = !!t
|
|
}, O.prototype.init = function(e) {
|
|
this.bb = m.newBarBuilder(this.period, e.symbol.session), this
|
|
.bbEmptyBars = this.generateEmptyBars ? m.newBarBuilder(this.period,
|
|
e.symbol.session) : void 0, e.setMinimumAdditionalDepth(0)
|
|
}, O.prototype.extrapolate = function(e, t) {
|
|
return isNaN(e) || isNaN(t) ? void 0 : f(this.bbEmptyBars, e, t, Number
|
|
.MAX_SAFE_INTEGER, !0).times
|
|
}, O.prototype.main = function(e) {
|
|
var t = e.symbol.time,
|
|
i = this.bb.alignTime(t),
|
|
s = e.new_var(i),
|
|
r = g.na(i),
|
|
n = s.get(1),
|
|
o = g.na(n) ? 1 : g.neq(i, n),
|
|
a = e.new_var(),
|
|
l = e.new_var(),
|
|
c = e.new_var(),
|
|
h = e.new_var(),
|
|
u = a.get(1),
|
|
d = l.get(1),
|
|
p = c.get(1),
|
|
_ = h.get(1),
|
|
m = r ? NaN : o ? g.open(e) : u,
|
|
f = r ? NaN : o ? g.high(e) : g.max(g.high(e), d),
|
|
b = r ? NaN : o ? g.low(e) : g.min(g.low(e), p),
|
|
v = r ? NaN : g.close(e),
|
|
S = r ? NaN : o ? g.volume(e) : g.volume(e) + _,
|
|
y = r ? NaN : t,
|
|
w = e.symbol.isBarClosed && this.bb.isLastBar(0, t),
|
|
P = this.generateEmptyBars && o ? this.extrapolate(n, i) : void 0,
|
|
C = e.new_var(g.close(e)).get(1),
|
|
x = P instanceof Array ? C : NaN;
|
|
return a.set(m), l.set(f), c.set(b), h.set(S), [i, m, f, b, v, S, y, w,
|
|
P, x
|
|
]
|
|
}, L.prototype.main = function(e) {
|
|
return [g.open(e), g.high(e), g.low(e), g.close(e), g.volume(e), g
|
|
.updatetime(e)
|
|
]
|
|
}, {
|
|
Std: g,
|
|
Series: w,
|
|
Symbol: C,
|
|
SymbolInfo: function(e, t) {
|
|
this.timezone = e || "America/New_York", this.session = t ||
|
|
"0000-0000"
|
|
},
|
|
StudyEngine: I,
|
|
BarSet: M,
|
|
OHLCV: L,
|
|
BarBuilder: O,
|
|
setupFeed: function(e) {
|
|
T.feed = e
|
|
},
|
|
getVolumeProfileResolutionForPeriod: function(t, i, s, r) {
|
|
return void 0 !== e ? e(t, i, s, r) : t
|
|
},
|
|
overwriteVolumeProfileResolutionForPeriodGetter: function(t) {
|
|
e = t
|
|
}
|
|
}
|
|
}();
|
|
e.exports = d
|
|
}).call(this, i("yLpj"))
|
|
},
|
|
ocrj: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "RemoveSourcesCommand", (function() {
|
|
return u
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("RDU5"),
|
|
n = i("CW80"),
|
|
o = i("txPx"),
|
|
a = i("pQ+n"),
|
|
l = i("3ClC"),
|
|
c = i("jpZi");
|
|
const h = Object(o.getLogger)("Chart.RemoveSourcesCommand");
|
|
class u extends r.UndoCommand {
|
|
constructor(e, t, i) {
|
|
super(i), this._excludeLineToolsUndoCommands = [], this._initialPriceScaleMode =
|
|
null, this._chartModel = e, this._sourceIds = Object(a.a)(e, t).map(e => e
|
|
.id()), this._sourceStates = [], this._paneIndexes = [], this
|
|
._priceScalePositionIds = [], this._paneStates = [], this
|
|
._restorePanes = [];
|
|
const r = t[0];
|
|
1 === t.length && Object(l.isStudy)(r) && (this._initialPriceScaleMode = Object(
|
|
s.ensureNotNull)(r.priceScale()).mode())
|
|
}
|
|
removedIds() {
|
|
return this._sourceIds
|
|
}
|
|
redo() {
|
|
this._chartModel.panes().length;
|
|
const e = this._sourceIds.map(e => Object(s.ensureNotNull)(this._chartModel
|
|
.dataSourceForId(e)));
|
|
this._sourceStates = e.map(e => Object(s.ensureNotNull)(e.state(!1)));
|
|
const t = e.map(e => Object(s.ensureNotNull)(this._chartModel.paneForSource(
|
|
e)));
|
|
this._paneIndexes = t.map(e => this._chartModel.panes().indexOf(e));
|
|
const i = this._chartModel.lineToolsGroupModel(),
|
|
r = new Map;
|
|
e.forEach(e => {
|
|
if (Object(n.isLineTool)(e)) {
|
|
const t = i.groupForLineTool(e);
|
|
if (null !== t) {
|
|
const i = r.get(t) || [];
|
|
i.push(e), r.set(t, i)
|
|
}
|
|
}
|
|
}), r.forEach((e, t) => {
|
|
const i = new c.a(this._chartModel, t, e);
|
|
i.redo(), this._excludeLineToolsUndoCommands.push(i)
|
|
}), this._priceScalePositionIds = e.map((e, i) => {
|
|
if (Object(n.isLineTool)(e)) return null;
|
|
const s = e.priceScale();
|
|
if (null === s) return null;
|
|
const r = t[i].priceScalePosition(s);
|
|
return {
|
|
id: s.id(),
|
|
position: r,
|
|
priceScaleIndex: t[i].priceScaleIndex(s, r)
|
|
}
|
|
});
|
|
const o = new Set;
|
|
e.forEach((e, t) => {
|
|
Object(n.isLineTool)(e) || o.add(this._paneIndexes[t])
|
|
}), this._paneStates = e.map((e, i) => {
|
|
const s = this._paneIndexes[i];
|
|
return o.has(s) ? t[i].state(!1, !0) : null
|
|
}), this._restorePanes = e.map(e => this._chartModel.removeSource(e))
|
|
}
|
|
undo() {
|
|
const e = [];
|
|
for (let t = this._sourceStates.length - 1; t >= 0; t--) {
|
|
const i = this._chartModel.restoreSource(this._restorePanes[t], this
|
|
._paneIndexes[t], this._paneStates[t], this._sourceStates[t], this
|
|
._priceScalePositionIds[t]);
|
|
i && e.push(i)
|
|
}
|
|
e.some((t, i) => t.id() !== this._sourceIds[e.length - i - 1]) && h.logError(
|
|
"Source was restored improperly - source ids does not match"), null !==
|
|
this._initialPriceScaleMode && Object(s.ensureNotNull)(e[0].priceScale())
|
|
.setMode(this._initialPriceScaleMode), this._excludeLineToolsUndoCommands
|
|
.forEach(e => e.undo())
|
|
}
|
|
}
|
|
},
|
|
odCa: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Ss5c").LineDataSource,
|
|
r = i("fgLi").DataSource,
|
|
n = i("tc+8"),
|
|
o = i("Ocx9").DefaultProperty,
|
|
a = i("jTis").CalloutConsts,
|
|
l = i("j3hX").LineToolColorsProperty;
|
|
class c extends s {
|
|
constructor(e, t) {
|
|
super(e, t || c.createProperties()), this._barOffset = 0, this._timeScale = e
|
|
.timeScale(), i.e("lt-pane-views").then(i.t.bind(null, "B4Hi", 7)).then(({
|
|
CalloutPaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
pointsCount() {
|
|
return 2
|
|
}
|
|
name() {
|
|
return "Callout"
|
|
}
|
|
_correctPoints(e) {
|
|
var t = this._currentMovingPoint.logical.index - this._startMovingPoint.logical
|
|
.index,
|
|
i = this._currentMovingPoint.logical.price - this._startMovingPoint.logical
|
|
.price,
|
|
s = e[1];
|
|
s.index += t, s.price += i, e[1] = s
|
|
}
|
|
addPoint(e) {
|
|
var t = s.prototype.addPoint.call(this, e);
|
|
return t && this._calculateBarOffset(), t
|
|
}
|
|
_calculateBarOffset() {
|
|
this.points().length > 1 && (this._barOffset = this.points()[1].index - this
|
|
.points()[0].index)
|
|
}
|
|
setLastPoint(e) {
|
|
super.setLastPoint(e), 2 === this.points().length && this._calculateBarOffset()
|
|
}
|
|
setPoint(e, t) {
|
|
switch (e) {
|
|
case 0:
|
|
super.setPoint(e, t), this._calculateBarOffset();
|
|
break;
|
|
case 1:
|
|
var i = this.properties();
|
|
if (!i.wordWrapWidth) return;
|
|
var s = this._points,
|
|
r = this._dragStartLeftEdgeIndex,
|
|
n = Math.round((t.index - r) / 2);
|
|
if (isFinite(r) && isFinite(n)) {
|
|
s[1] = {
|
|
index: r + n,
|
|
price: s[1].price
|
|
}, this._calculateBarOffset(), this.normalizePoints();
|
|
var o = this._timeScale.indexToCoordinate(r + 2 * n) - this._timeScale
|
|
.indexToCoordinate(r) - a.RoundRadius - a.TextMargins;
|
|
if (!isFinite(o)) return;
|
|
i.wordWrapWidth.setValue(Math.max(a.MinWidth, o));
|
|
break
|
|
}
|
|
s[1] = t, this._calculateBarOffset(), this.normalizePoints()
|
|
}
|
|
}
|
|
setPoints(e) {
|
|
super.setPoints(e);
|
|
var t = this.properties();
|
|
if (t.wordWrapWidth) {
|
|
var i = this._dragStartLeftEdgeIndex,
|
|
s = Math.round((e[1].index - i) / 2);
|
|
if (this._calculateBarOffset(), this.normalizePoints(), isFinite(i) && isFinite(
|
|
s)) {
|
|
var r = this._timeScale.indexToCoordinate(i + 2 * s) - this._timeScale
|
|
.indexToCoordinate(i) - a.RoundRadius - a.TextMargins;
|
|
if (!isFinite(r)) return;
|
|
t.wordWrapWidth.setValue(Math.max(a.MinWidth, r))
|
|
}
|
|
}
|
|
}
|
|
_onPointsetUpdated(e) {
|
|
super._onPointsetUpdated(e), 0 !== e.length && (this._dragStartLeftEdgeIndex = this
|
|
.points()[1].index)
|
|
}
|
|
move(e, t, i) {
|
|
super.move(e, t, i), this._calculateBarOffset()
|
|
}
|
|
state(e) {
|
|
var t = s.prototype.state.call(this, e);
|
|
return t.barOffset = this._barOffset, t
|
|
}
|
|
restoreData(e) {
|
|
e.barOffset ? this._barOffset = e.barOffset : this._calculateBarOffset(), this
|
|
._calculatePoint2()
|
|
}
|
|
setPriceScale(e) {
|
|
r.prototype.setPriceScale.call(this, e), e && e.priceRange() && this
|
|
._calculatePoint2()
|
|
}
|
|
template() {
|
|
var e = s.prototype.template.call(this);
|
|
return e.text = this.properties().childs().text.value(), e
|
|
}
|
|
_applyTemplateImpl(e) {
|
|
super._applyTemplateImpl(e), this.properties().childs().text.setValue(e.text)
|
|
}
|
|
_calculatePoint2() {
|
|
if (!(this._model.lineBeingEdited() === this || this._model.sourcesBeingMoved()
|
|
.includes(this) || this._points.length < 2)) {
|
|
var e = this.points()[0],
|
|
t = this.points()[1];
|
|
this._points[1] = {
|
|
price: t.price,
|
|
index: e.index + this._barOffset
|
|
}
|
|
}
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "xhf0")))
|
|
.CalloutDefinitionsViewModel
|
|
}
|
|
static createProperties(e) {
|
|
var t = new o("linetoolcallout", e);
|
|
return c._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
s._configureProperties(e), e.hasChild("text") || e.addChild("text", new n(window.t(
|
|
"Text"))),
|
|
e.addExclusion("text"), e.addChild("textsColors", new l([e.childs().color]))
|
|
}
|
|
}
|
|
t.LineToolCallout = c
|
|
},
|
|
oiZD: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("hY0g"),
|
|
r = i.n(s);
|
|
i.d(t, "watchedTheme", (function() {
|
|
return n
|
|
})), i.d(t, "setTheme", (function() {
|
|
return o
|
|
}));
|
|
const n = new r.a;
|
|
|
|
function o(e) {
|
|
n.setValue(e)
|
|
}
|
|
n.subscribe(e => {
|
|
! function(e, t = window) {
|
|
const i = "theme-" + e,
|
|
s = t.document.documentElement.classList;
|
|
for (const e of Array.from(s)) e.startsWith("theme-") && e !== i && s.remove(e);
|
|
s.add(i)
|
|
}(e, window)
|
|
})
|
|
},
|
|
okVO: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "SyncModel", (function() {
|
|
return o
|
|
}));
|
|
var s = i("IiTo"),
|
|
r = i("IDnv");
|
|
let n = 0;
|
|
class o {
|
|
constructor(e, t) {
|
|
this._extrapolatedData = [], this._cacheForFuture = !1, this._modelId = n++, this
|
|
._builderCache = null, this._resolution = t, this._symbolInfo = e, this._valid =
|
|
Boolean(e.timezone) && Boolean(e.session), this._session = new s.SessionInfo(e
|
|
.timezone, e.session, e.session_holidays, e.corrections)
|
|
}
|
|
getSymbolInfo() {
|
|
return this._symbolInfo
|
|
}
|
|
getSession() {
|
|
return this._session
|
|
}
|
|
getResolution() {
|
|
return this._resolution
|
|
}
|
|
uniqueId() {
|
|
return this._modelId
|
|
}
|
|
distance(e, t) {
|
|
if (!this.isValid()) return {
|
|
success: !1
|
|
};
|
|
if (e > t) return {
|
|
success: !1
|
|
};
|
|
if (e === t) return {
|
|
success: !0,
|
|
result: 0
|
|
};
|
|
let i = this._extrapolatedData.length,
|
|
s = 0 !== i ? this._extrapolatedData[0] : null,
|
|
n = null !== s ? this._extrapolatedData[i - 1] : null;
|
|
const o = e < t;
|
|
if (1e3 * e === s && this._cacheForFuture === o || (this._extrapolatedData = [1e3 *
|
|
e
|
|
], i = 1, s = null, n = null), null === s || null !== n && 1e3 * t > n) {
|
|
const s = Object(r.extrapolateBarsFrontToTime)(this._barBuilder(), n || 1e3 * e,
|
|
1e3 * t, 2e3, !0);
|
|
this._extrapolatedData = this._extrapolatedData.concat(s.times), i = this
|
|
._extrapolatedData.length, this._cacheForFuture = o
|
|
}
|
|
if (n = this._extrapolatedData[i - 1], n < 1e3 * t) return {
|
|
success: !1
|
|
};
|
|
const a = this._extrapolatedData.indexOf(1e3 * t);
|
|
return -1 === a ? {
|
|
success: !1
|
|
} : {
|
|
success: !0,
|
|
result: a
|
|
}
|
|
}
|
|
projectTime(e, t) {
|
|
if (!this.isValid()) return e;
|
|
let i = this._extrapolatedData.length,
|
|
s = i > 0 ? this._extrapolatedData[0] : null,
|
|
n = null !== s ? this._extrapolatedData[i - 1] : null;
|
|
const o = t >= 0;
|
|
1e3 * e === s && this._cacheForFuture === o || (this._extrapolatedData = [1e3 * e],
|
|
i = 1, s = null, n = null);
|
|
const a = Math.abs(t);
|
|
if (null === s || a >= i) {
|
|
const s = Object(r.extrapolateBarsFrontByCount)(this._barBuilder(), n || 1e3 *
|
|
e, Math.sign(t) * (a - i + 1), !0);
|
|
this._extrapolatedData = this._extrapolatedData.concat(s.times), i = this
|
|
._extrapolatedData.length, this._cacheForFuture = o
|
|
}
|
|
return i < a ? e : this._extrapolatedData[a] / 1e3
|
|
}
|
|
isValid() {
|
|
return this._valid
|
|
}
|
|
dataSize() {
|
|
return this._extrapolatedData.length
|
|
}
|
|
createNewModelWithResolution(e) {
|
|
return new o(this._symbolInfo, e)
|
|
}
|
|
_barBuilder() {
|
|
return null === this._builderCache && (this._builderCache = Object(s.newBarBuilder)(
|
|
this._resolution, this._session, this._session)), this._builderCache
|
|
}
|
|
}
|
|
},
|
|
onDC: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("Eyy1"),
|
|
r = i("aO4+"),
|
|
n = i("vwKG"),
|
|
o = i("4O8T"),
|
|
a = i.n(o),
|
|
l = i("0YCj"),
|
|
c = i.n(l),
|
|
h = i("txPx");
|
|
const u = window.t("Move All Scales To Left"),
|
|
d = window.t("Move All Scales To Right"),
|
|
p = Object(h.getLogger)("Chart.MergeAllScales");
|
|
var _ = i("MY2c"),
|
|
m = i("RDU5");
|
|
class f extends m.UndoCommand {
|
|
constructor(e, t, i, s, r, n) {
|
|
super(n), this._model = e, this._paneIndex = e.panes().indexOf(t), this
|
|
._targetPosition = s,
|
|
this._targetIndex = r, this._scaleId = i.id(), this._sourcePosition = t
|
|
.priceScalePosition(i), "overlay" !== this._sourcePosition && (this
|
|
._sourceIndex = t.priceScaleIndex(i, this._sourcePosition))
|
|
}
|
|
redo() {
|
|
const e = this._model.panes()[this._paneIndex],
|
|
t = Object(s.ensureNotNull)(e.getPriceScaleById(this._scaleId));
|
|
e.movePriceScale(t, this._targetPosition, this._targetIndex), this._model
|
|
.fullUpdate()
|
|
}
|
|
undo() {
|
|
const e = this._model.panes()[this._paneIndex],
|
|
t = Object(s.ensureNotNull)(e.getPriceScaleById(this._scaleId));
|
|
e.movePriceScale(t, this._sourcePosition, this._sourceIndex), this._model
|
|
.fullUpdate()
|
|
}
|
|
}
|
|
var g = i("CW80");
|
|
class b extends m.UndoCommand {
|
|
constructor(e, t, i, s) {
|
|
super(s), this._createdIds = [], this._model = e, this._withoutShift = i, this
|
|
._origStates = t.map(e => e.state(!0));
|
|
const r = e.lineToolsGroupModel();
|
|
this._origGroups = t.map(e => {
|
|
const t = r.groupForLineTool(e);
|
|
return t && t.id
|
|
})
|
|
}
|
|
redo() {
|
|
const e = this._model.lineToolsGroupModel(),
|
|
t = this._origStates.map((t, i) => {
|
|
const r = Object(s.ensureNotNull)(this._model.dataSourceForId(t
|
|
.id)),
|
|
n = 0 === this._createdIds.length ? void 0 : Object(s
|
|
.ensureDefined)(this._createdIds[i]),
|
|
o = Object(g.cloneLineTool)(this._model, r, !this._withoutShift,
|
|
n),
|
|
a = Object(s.ensureNotNull)(r.priceScale());
|
|
Object(s.ensureNotNull)(this._model.paneForSource(r)).addDataSource(
|
|
o, a, !1);
|
|
const l = this._origGroups[i];
|
|
if (null !== l) {
|
|
const t = e.groupForId(l);
|
|
t && t.addLineTools([o])
|
|
}
|
|
return this._model.updateSource(o), o
|
|
});
|
|
0 === this._createdIds.length && (this._createdIds = t.map(e => e.id())), this
|
|
._model.selectionMacro(e => {
|
|
e.clearSelection(), t.forEach(t => {
|
|
e.addSourceToSelection(t)
|
|
})
|
|
}), this._model.setShouldBeSavedEvenIfHidden(!0)
|
|
}
|
|
undo() {
|
|
const e = this._model.lineToolsGroupModel();
|
|
this._createdIds.forEach(t => {
|
|
const i = Object(s.ensureNotNull)(this._model.dataSourceForId(t)),
|
|
r = e.groupForLineTool(i);
|
|
null !== r && r.excludeLineTool(i), this._model.removeSource(i)
|
|
})
|
|
}
|
|
newIds() {
|
|
return this._createdIds
|
|
}
|
|
}
|
|
var v = i("ocrj"),
|
|
S = i("jpZi"),
|
|
y = i("ogJP");
|
|
class w extends m.UndoCommand {
|
|
constructor(e, t, i, s = !0) {
|
|
super(i, s), this._newStates = [], this._model = e, this._savedStates = t.map(
|
|
e => e.state(!1))
|
|
}
|
|
redo() {
|
|
this._applyState(this._newStates)
|
|
}
|
|
undo() {
|
|
0 === this._newStates.length && this.saveNewState(), this._applyState(this
|
|
._savedStates)
|
|
}
|
|
saveNewState() {
|
|
const e = this._savedStates.filter(y.notNull).map(e => Object(s.ensureNotNull)(
|
|
this._model.dataSourceForId(e.id)));
|
|
this._newStates = e.map(e => e.state(!1))
|
|
}
|
|
_applyState(e) {
|
|
for (const t of e)
|
|
if (null !== t) {
|
|
const e = this._model.dataSourceForId(t.id);
|
|
null !== e && this._model.restoreLineToolState(e, t)
|
|
}
|
|
}
|
|
}
|
|
var P = i("HGup"),
|
|
C = i("jRfx"),
|
|
x = i("s1Gx"),
|
|
T = i("0qMc");
|
|
class I extends m.UndoCommand {
|
|
constructor(e, t, i, s, r = !0) {
|
|
super("Create " + T.lineToolsLocalizedNames[i], !1), this._lineId = null, this
|
|
._lineState = null, this._model = e, this._paneIndex = e.panes().indexOf(t),
|
|
this._lineTool = i, this._ownerSourceId = s.id(), this
|
|
._needCopyToOtherCharts = r
|
|
}
|
|
startCreatingLine(e, t, i) {
|
|
const s = this._model.panes()[this._paneIndex],
|
|
r = this._model.dataSourceForId(this._ownerSourceId),
|
|
n = this._model.createLineTool(s, e, this._lineTool, t, i, r);
|
|
return this._lineId = n.id(), !this._model.lineBeingCreated()
|
|
}
|
|
continueCreatingLine(e, t, i, s) {
|
|
const r = this._model.continueCreatingLine(e, t, i, s);
|
|
return r && this._model.setShouldBeSavedEvenIfHidden(!0), r
|
|
}
|
|
line() {
|
|
return null === this._lineId ? null : this._model.dataSourceForId(this._lineId)
|
|
}
|
|
undo() {
|
|
const e = this.line();
|
|
null !== e && (this._lineState = e.state(!1), this._model.removeSource(e), this
|
|
._lineId = null)
|
|
}
|
|
redo() {
|
|
if (null === this._lineState) return;
|
|
const e = this._model.restoreSource(!1, this._paneIndex, null, Object(s
|
|
.ensureNotNull)(this._lineState), null);
|
|
null !== e && (this._lineId = e.id(), this._lineState = null)
|
|
}
|
|
needCopyToOtherCharts() {
|
|
return this._needCopyToOtherCharts
|
|
}
|
|
}
|
|
var M = i("GVQo");
|
|
class O extends m.UndoCommand {
|
|
constructor(e, t, i) {
|
|
super(i), this._sourcesByPanes = new Map, this._originalState = new Map, this
|
|
._model = e, t.forEach(t => {
|
|
const i = Object(s.ensureNotNull)(e.paneForSource(t)),
|
|
r = e.panes().indexOf(i),
|
|
n = this._sourcesByPanes.get(r) || [];
|
|
n.push(t.id()), this._sourcesByPanes.set(r, n)
|
|
}), Array.from(this._sourcesByPanes.keys()).forEach(t => {
|
|
const i = e.panes()[t],
|
|
s = new Map;
|
|
i.sourcesByGroup().allIncludingHidden().forEach(e => {
|
|
s.set(e.id(), e.zorder())
|
|
}), this._originalState.set(t, s)
|
|
})
|
|
}
|
|
undo() {
|
|
this._originalState.forEach((e, t) => {
|
|
const i = this._model.panes()[t],
|
|
r = new Map;
|
|
e.forEach((e, t) => {
|
|
const n = Object(s.ensureNotNull)(i.dataSourceForId(t));
|
|
r.set(n, e)
|
|
}), i.setZOrders(r)
|
|
})
|
|
}
|
|
redo() {
|
|
this._sourcesByPanes.forEach((e, t) => {
|
|
const i = this._model.panes()[t],
|
|
r = e.map(e => Object(s.ensureNotNull)(i.dataSourceForId(e)));
|
|
this._paneOperation(i, r)
|
|
})
|
|
}
|
|
}
|
|
class L extends O {
|
|
constructor(e, t) {
|
|
super(e, t, `Bring ${t[0].title()} to front`)
|
|
}
|
|
_paneOperation(e, t) {
|
|
e.bringToFront(t)
|
|
}
|
|
}
|
|
class A extends O {
|
|
constructor(e, t) {
|
|
super(e, t, `Send ${t[0].title()} to back`)
|
|
}
|
|
_paneOperation(e, t) {
|
|
e.sendToBack(t)
|
|
}
|
|
}
|
|
class E extends O {
|
|
constructor(e, t, i, s) {
|
|
super(e, t, s), this._targetSource = i
|
|
}
|
|
_paneOperation(e, t) {
|
|
e.insertAfter(t, this._targetSource)
|
|
}
|
|
}
|
|
class k extends E {
|
|
constructor(e, t, i) {
|
|
super(e, t, i, `Insert ${t[0].title()} after ${i.title()}`)
|
|
}
|
|
}
|
|
class D extends O {
|
|
constructor(e, t, i, s) {
|
|
super(e, t, s), this._targetSource = i
|
|
}
|
|
_paneOperation(e, t) {
|
|
e.insertBefore(t, this._targetSource)
|
|
}
|
|
}
|
|
class V extends D {
|
|
constructor(e, t, i) {
|
|
super(e, t, i, `Insert ${t[0].title()} before ${i.title()}`)
|
|
}
|
|
}
|
|
|
|
function B(e, t) {
|
|
const i = t[0],
|
|
s = e.sourcesByGroup().all().filter(e => e.zorder() < i.zorder());
|
|
if (0 === s.length) throw new Error("Cannot move backward source that alreadt on back");
|
|
let r = s[s.length - 1];
|
|
if (Object(g.isLineTool)(r)) {
|
|
const t = e.model().lineToolsGroupModel().groupForLineTool(r);
|
|
null !== t && (r = t.lineTools()[0])
|
|
}
|
|
return r
|
|
}
|
|
class R extends D {
|
|
constructor(e, t, i) {
|
|
super(e, i, B(t, i), `Send ${i[0].title()} backward`)
|
|
}
|
|
}
|
|
|
|
function N(e, t) {
|
|
const i = t[t.length - 1],
|
|
s = e.sourcesByGroup().allExceptSpecialSources().filter(e => e.zorder() > i.zorder());
|
|
if (0 === s.length) throw new Error("Cannot bring forward source that alreadt on back");
|
|
let r = s[0];
|
|
if (Object(g.isLineTool)(r)) {
|
|
const t = e.model().lineToolsGroupModel().groupForLineTool(r);
|
|
if (null !== t) {
|
|
const e = t.lineTools();
|
|
r = e[e.length - 1]
|
|
}
|
|
}
|
|
return r
|
|
}
|
|
class j extends E {
|
|
constructor(e, t, i) {
|
|
super(e, i, N(t, i), `Send ${i[0].title()} backward`)
|
|
}
|
|
}
|
|
|
|
function F(e, t) {
|
|
return Object(s.ensureNotNull)(e.paneForSource(t.lineTools()[0]))
|
|
}
|
|
class W extends D {
|
|
constructor(e, t) {
|
|
super(e, t.lineTools(), B(F(e, t), t.lineTools()),
|
|
`Send Group ${t.name()} backward`)
|
|
}
|
|
}
|
|
class H extends E {
|
|
constructor(e, t) {
|
|
super(e, t.lineTools(), N(F(e, t), t.lineTools()),
|
|
`Bring Group ${t.name()} backward`)
|
|
}
|
|
}
|
|
class U extends m.UndoCommand {
|
|
constructor(e, t, i) {
|
|
super("Rearrange panes"), this._chartModel = e, this._index = t, Object(y
|
|
.isNumber)(i) ? this._dstIndex = i : this._dstIndex = "up" === i ? t -
|
|
1 : t + 1
|
|
}
|
|
redo() {
|
|
this._checkIndices() && this._chartModel.movePane(this._index, this._dstIndex)
|
|
}
|
|
undo() {
|
|
this._checkIndices() && this._chartModel.movePane(this._dstIndex, this._index)
|
|
}
|
|
_checkIndices() {
|
|
const e = this._chartModel.panes().length;
|
|
return this._index >= 0 && this._index < e && this._dstIndex >= 0 && this
|
|
._dstIndex < e
|
|
}
|
|
}
|
|
var z = i("XcdR"),
|
|
G = i("Fixu"),
|
|
q = i("Ocx9"),
|
|
Y = i("n5al"),
|
|
K = i("PT1i"),
|
|
J = i("pPtI");
|
|
class Z extends m.UndoCommand {
|
|
constructor(e, t, i, s, r, n) {
|
|
super(s), this._prevPriceAxisProps = {}, this._property = e, this._mainSeries =
|
|
i, this._value = t, this._model = r, this._chartWidget = n
|
|
}
|
|
redo() {
|
|
const e = this._mainSeries,
|
|
t = e.properties();
|
|
t.style === this._property && e.isNeedRestart(this._value) && this._chartWidget
|
|
.screen.show(), this._prevResolution = t.interval.value(), this._prevValue =
|
|
this._property.value(), this._storePriceAxisProps(), Object(q
|
|
.saveDefaultProperties)(!0);
|
|
const i = t.interval.value(),
|
|
s = this._model.defaultResolutions(),
|
|
r = Object(J.getResolutionByChartStyle)(this._value, i, s);
|
|
K.linking.interval.setValue(r), e.setChartStyleWithIntervalIfNeeded(this._value,
|
|
r), Object(Y.setLastUsedStyle)(this._value), Object(Y
|
|
.preparePriceAxisProperties)(t), Object(q.saveDefaultProperties)(!1),
|
|
this._invalidateModel()
|
|
}
|
|
undo() {
|
|
const e = this._mainSeries;
|
|
e.properties().style === this._property && e.isNeedRestart(this._value) && this
|
|
._chartWidget.screen.show(), Object(q.saveDefaultProperties)(!0), e
|
|
.setChartStyleWithIntervalIfNeeded(this._prevValue, this._prevResolution),
|
|
this._restorePriceAxisProps(), K.linking.interval.setValue(this
|
|
._prevResolution), Object(q.saveDefaultProperties)(!1), this
|
|
._invalidateModel()
|
|
}
|
|
_storePriceAxisProps() {
|
|
const e = this._mainSeries.priceScale();
|
|
this._prevPriceAxisProps = e.mode()
|
|
}
|
|
_restorePriceAxisProps() {
|
|
this._mainSeries.priceScale().setMode(this._prevPriceAxisProps)
|
|
}
|
|
_invalidateModel() {
|
|
this._model && (this._model.recalculateAllPanes(), this._model.lightUpdate())
|
|
}
|
|
}
|
|
var X = i("ufwo"),
|
|
$ = i("LxhU");
|
|
class Q extends m.UndoCommand {
|
|
constructor(e, t) {
|
|
super("Change date range"), this._modelsData = [], this._rangeOptions = t, this
|
|
._modelsData.push({
|
|
model: e,
|
|
prevResolution: e.mainSeries().properties().interval.value(),
|
|
barSpacing: e.timeScale().barSpacing(),
|
|
rightOffset: e.timeScale().rightOffset(),
|
|
rangeOptions: e.appliedTimeFrame().value()
|
|
})
|
|
}
|
|
redo() {
|
|
const e = [];
|
|
for (const t of this._modelsData) {
|
|
const i = t.model.mainSeries(),
|
|
s = i.properties().interval;
|
|
$.Interval.isEqual(this._rangeOptions.res, s.value()) ? i.loadDataTo(this
|
|
._rangeOptions.val) : (e.push(s), i.setDefaultTimeframe(this
|
|
._rangeOptions.val), s.setValueSilently(this._rangeOptions.res))
|
|
}
|
|
for (const t of e) t.listeners().fire(t)
|
|
}
|
|
undo() {
|
|
const e = [];
|
|
for (const t of this._modelsData) {
|
|
const i = t.model.mainSeries(),
|
|
s = i.properties().interval;
|
|
t.prevResolution !== s.value() ? (e.push(s),
|
|
null !== t.rangeOptions && i.setDefaultTimeframe(t.rangeOptions
|
|
.val), s.setValueSilently(t.prevResolution)) : null !== t
|
|
.rangeOptions && i.loadDataTo(t.rangeOptions.val);
|
|
const r = t.model.timeScale();
|
|
r.setBarSpacing(t.barSpacing), r.setRightOffset(t.rightOffset)
|
|
}
|
|
for (const t of e) t.listeners().fire(t)
|
|
}
|
|
canMerge(e) {
|
|
return e instanceof Q && Object(X.rangesAreEqual)(e._rangeOptions, this
|
|
._rangeOptions)
|
|
}
|
|
merge(e) {
|
|
if (!(e instanceof Q)) throw new Error("Invalid command to merge");
|
|
this._modelsData = this._modelsData.concat(e._modelsData)
|
|
}
|
|
}
|
|
var ee = i("//lZ"),
|
|
te = i("UqOQ");
|
|
i("YFKU"), i("HbRj");
|
|
class ie extends m.UndoCommand {
|
|
constructor(e, t, i) {
|
|
super(i), this._model = e, this._groupId = t.id, this._groupName = t.name(),
|
|
this._lineToolsIds = t.lineTools().map(e => e.id())
|
|
}
|
|
redo() {
|
|
const e = Object(s.ensureNotNull)(this._model.lineToolsGroupModel().groupForId(
|
|
this._groupId));
|
|
this._model.lineToolsGroupModel().removeGroup(e)
|
|
}
|
|
undo() {
|
|
const e = this._lineToolsIds.map(e => this._model.dataSourceForId(e)),
|
|
t = new te.a(e, this._groupName, this._groupId);
|
|
this._model.lineToolsGroupModel().addGroup(t)
|
|
}
|
|
}
|
|
const se = window.t("Create line tools group");
|
|
class re extends m.UndoCommand {
|
|
constructor(e, t) {
|
|
super(se), this._groupId = null, this._model = e, this._sourcesIds = t.map(e =>
|
|
e.id())
|
|
}
|
|
redo() {
|
|
const e = this._sourcesIds.map(e => this._model.dataSourceForId(e)),
|
|
t = null === this._groupId ? void 0 : this._groupId;
|
|
this._groupId = this._model.lineToolsGroupModel().createGroup(e, this._title, t)
|
|
.id
|
|
}
|
|
undo() {
|
|
const e = Object(s.ensureNotNull)(this._model.lineToolsGroupModel().groupForId(
|
|
Object(s.ensureNotNull)(this._groupId)));
|
|
this._model.lineToolsGroupModel().removeGroup(e)
|
|
}
|
|
createdGroupId() {
|
|
return this._groupId
|
|
}
|
|
}
|
|
const ne = window.t("Add line tool(s) {lineTool} to group {group}");
|
|
class oe extends m.UndoCommand {
|
|
constructor(e, t, i) {
|
|
super(ne.format({
|
|
group: t.name()
|
|
})), this._model = e, this._groupId = t.id, this._lineToolsIds = i.map(e =>
|
|
e.id())
|
|
}
|
|
redo() {
|
|
const e = Object(s.ensureNotNull)(this._model.lineToolsGroupModel().groupForId(
|
|
this._groupId)),
|
|
t = this._lineToolsIds.map(e => this._model.dataSourceForId(e));
|
|
e.addLineTools(t)
|
|
}
|
|
undo() {
|
|
const e = this._lineToolsIds.map(e => this._model.dataSourceForId(e));
|
|
Object(s.ensureNotNull)(this._model.lineToolsGroupModel().groupForId(this
|
|
._groupId)).excludeLineTools(e)
|
|
}
|
|
}
|
|
var ae = i("bJYc");
|
|
class le extends m.UndoCommand {
|
|
constructor(e, t, i, s) {
|
|
super(s), this._chartModel = e, this._groupId = t.id, this._oldName = t.name(),
|
|
this._newName = i
|
|
}
|
|
redo() {
|
|
Object(s.ensureNotNull)(this._chartModel.lineToolsGroupModel().groupForId(this
|
|
._groupId)).setName(this._newName)
|
|
}
|
|
undo() {
|
|
Object(s.ensureNotNull)(this._chartModel.lineToolsGroupModel().groupForId(this
|
|
._groupId)).setName(this._oldName)
|
|
}
|
|
}
|
|
var ce = i("mMWL");
|
|
const he = window.t("Create line tools group from selection"),
|
|
ue = window.t("Removing line tools group {name}"),
|
|
de = window.t("Add line tool {lineTool} to group {name}"),
|
|
pe = window.t("Make group {group} visible"),
|
|
_e = window.t("Make group {group} invisible"),
|
|
me = window.t("Lock group {group}"),
|
|
fe = window.t("Unlock group {group}"),
|
|
ge = window.t("Rename group {group} to {newName}");
|
|
class be {
|
|
constructor(e) {
|
|
this._environment = e
|
|
}
|
|
createGroupFromSelection() {
|
|
const e = this._environment.model();
|
|
Object(s.assert)(!e.selection().isEmpty(),
|
|
"Cannot create group from empty selection");
|
|
const t = Object(x.sortSources)(e.selection().lineDataSources());
|
|
Object(s.assert)(t.length === e.selection().allSources().length,
|
|
"A group could contain line tools only");
|
|
const i = t.reduce((e, t) => e.zorder() > t.zorder() ? e : t, t[0]);
|
|
let r = i;
|
|
const n = e.lineToolsGroupModel().groupForLineTool(i);
|
|
if (null !== n) {
|
|
const e = n.lineTools();
|
|
r = e[e.length - 1]
|
|
}
|
|
this._environment.beginUndoMacro(he);
|
|
const o = new Map,
|
|
a = new Set;
|
|
t.forEach(t => {
|
|
const i = this._groupForLineTool(t);
|
|
if (null === i) return;
|
|
const r = o.get(i) || [];
|
|
r.push(t), o.set(i, r);
|
|
const n = Object(s.ensureNotNull)(e.paneForSource(t));
|
|
a.add(n)
|
|
}), Object(s.assert)(a.size <= 1,
|
|
"All selected sources should be on the same pane"), o.forEach((t, i) => {
|
|
const s = new S.a(e, i, t);
|
|
this._environment.pushUndoCommand(s)
|
|
});
|
|
const l = new re(e, Object(x.sortSources)(t));
|
|
this._environment.pushUndoCommand(l);
|
|
const c = new k(e, t, r);
|
|
this._environment.pushUndoCommand(c), this._environment.endUndoMacro();
|
|
const h = Object(s.ensureNotNull)(l.createdGroupId());
|
|
return Object(s.ensureNotNull)(e.lineToolsGroupModel().groupForId(h))
|
|
}
|
|
removeGroup(e) {
|
|
const t = this._environment.model(),
|
|
i = e.lineTools();
|
|
this._environment.beginUndoMacro(ue.format({
|
|
name: e.name()
|
|
}));
|
|
const r = new ie(t, e, "");
|
|
this._environment.pushUndoCommand(r);
|
|
const n = new v.RemoveSourcesCommand(t, i, "");
|
|
this._environment.pushUndoCommand(n);
|
|
const o = t.mainSeries().symbol();
|
|
i.forEach(e => {
|
|
null !== e.linkKey().value() && Object(ce.removeLineTool)({
|
|
withUndo: !0,
|
|
model: t,
|
|
symbol: o,
|
|
sourceTitle: e.title(),
|
|
lineToolState: e.state(!1),
|
|
linkKey: Object(s.ensureNotNull)(e.linkKey().value())
|
|
})
|
|
}), this._environment.endUndoMacro()
|
|
}
|
|
groups() {
|
|
return this._environment.model().lineToolsGroupModel().groups()
|
|
}
|
|
excludeLineToolFromGroup(e, t) {
|
|
const i = this._environment.model(),
|
|
s = new S.a(i, e, [t]);
|
|
this._environment.pushUndoCommand(s)
|
|
}
|
|
addLineToolToGroup(e, t) {
|
|
const i = this._environment.model(),
|
|
s = i.lineToolsGroupModel().groupForLineTool(t);
|
|
if (s === e) return;
|
|
const r = de.format({
|
|
lineTool: t.title(),
|
|
name: e.name()
|
|
});
|
|
this._environment.beginUndoMacro(r), null !== s && this._environment
|
|
.pushUndoCommand(new S.a(i, s, [t])), this._environment.pushUndoCommand(new oe(
|
|
i, e, [t])), this._environment.endUndoMacro()
|
|
}
|
|
bringToFront(e) {
|
|
const t = this._environment.model(),
|
|
i = new L(t, e.lineTools());
|
|
this._environment.pushUndoCommand(i), this._environment.emitEvent("changeZOrder", [e
|
|
.lineTools()
|
|
])
|
|
}
|
|
sendToBack(e) {
|
|
const t = this._environment.model(),
|
|
i = new A(t, e.lineTools());
|
|
this._environment.pushUndoCommand(i), this._environment.emitEvent("changeZOrder", [e
|
|
.lineTools()
|
|
])
|
|
}
|
|
bringForward(e) {
|
|
const t = this._environment.model(),
|
|
i = new H(t, e);
|
|
this._environment.pushUndoCommand(i), this._environment.emitEvent("changeZOrder", [e
|
|
.lineTools()
|
|
])
|
|
}
|
|
sendBackward(e) {
|
|
const t = this._environment.model(),
|
|
i = new W(t, e);
|
|
this._environment.pushUndoCommand(i), this._environment.emitEvent("changeZOrder", [e
|
|
.lineTools()
|
|
])
|
|
}
|
|
insertAfter(e, t) {
|
|
const i = this._environment.model();
|
|
let s;
|
|
if (t instanceof te.a) {
|
|
const e = t.lineTools();
|
|
s = e[e.length - 1]
|
|
} else s = t;
|
|
const r = new k(i, e.lineTools(), s);
|
|
this._environment.pushUndoCommand(r), this._environment.emitEvent("changeZOrder", [e
|
|
.lineTools()
|
|
])
|
|
}
|
|
insertBefore(e, t) {
|
|
const i = this._environment.model();
|
|
let s;
|
|
if (t instanceof te.a) {
|
|
s = t.lineTools()[0]
|
|
} else s = t;
|
|
const r = new V(i, e.lineTools(), s);
|
|
this._environment.pushUndoCommand(r), this._environment.emitEvent("changeZOrder", [e
|
|
.lineTools()
|
|
])
|
|
}
|
|
availableZOrderOperations(e) {
|
|
const t = this._environment.model(),
|
|
i = e.lineTools(),
|
|
r = i[0],
|
|
n = i[i.length - 1],
|
|
o = Object(s.ensureNotNull)(t.paneForSource(i[0])).sourcesByGroup()
|
|
.allExceptSpecialSources(),
|
|
a = o[0],
|
|
l = o[o.length - 1];
|
|
return {
|
|
bringForwardEnabled: n !== l,
|
|
bringToFrontEnabled: n !== l,
|
|
sendBackwardEnabled: r !== a,
|
|
sendToBackEnabled: r !== a
|
|
}
|
|
}
|
|
setGroupVisibility(e, t) {
|
|
const i = (t ? pe : _e).format({
|
|
group: e.name()
|
|
}),
|
|
s = this._environment.model();
|
|
this._environment.beginUndoMacro(i), e.lineTools().forEach(e => {
|
|
const i = e.properties().visible,
|
|
r = new ae.SetPropertyUndoCommand(i, t, "", s);
|
|
this._environment.pushUndoCommand(r)
|
|
}), this._environment.endUndoMacro()
|
|
}
|
|
setGroupLock(e, t) {
|
|
const i = (t ? me : fe).format({
|
|
group: e.name()
|
|
}),
|
|
s = this._environment.model();
|
|
this._environment.beginUndoMacro(i), e.lineTools().forEach(e => {
|
|
const i = e.properties().frozen,
|
|
r = new ae.SetPropertyUndoCommand(i, t, "", s);
|
|
this._environment.pushUndoCommand(r)
|
|
}), this._environment.endUndoMacro()
|
|
}
|
|
setGroupName(e, t) {
|
|
const i = this._environment.model(),
|
|
s = ge.format({
|
|
group: e.name(),
|
|
newName: t
|
|
}),
|
|
r = new le(i, e, t, s);
|
|
this._environment.pushUndoCommand(r)
|
|
}
|
|
canBeGroupped(e) {
|
|
const t = this._environment.model();
|
|
return new Set(e.map(e => t.paneForSource(e))).size <= 1
|
|
}
|
|
_groupForLineTool(e) {
|
|
return this._environment.model().lineToolsGroupModel().groups().find(t => t
|
|
.containsLineTool(e)) || null
|
|
}
|
|
}
|
|
var ve = i("3ClC"),
|
|
Se = i("pQ+n"),
|
|
ye = i("Vs8b"),
|
|
we = i("2jby");
|
|
const Pe = window.t("Apply study template {template}");
|
|
class Ce extends m.UndoCommand {
|
|
constructor(e, t, i) {
|
|
super(Pe.format({
|
|
template: i
|
|
})), this._model = e, this._templateContent = t, this._initialState = e
|
|
.studyTemplate(!0, !0, !0), this._initialGroupsState = e
|
|
.lineToolsGroupModel().state()
|
|
}
|
|
redo() {
|
|
const e = this._merge(this._templateContent).filter(g.isLineTool);
|
|
this._model.lineToolsGroupModel().removeLineTools(e), this._model.mainSeries()
|
|
.onChartStyleChanged();
|
|
const t = this._model.mainSeries().properties();
|
|
Object(Y.preparePriceAxisProperties)(t), this._model.recalcVisibleRangeStudies(!
|
|
0), this._model.setShouldBeSavedEvenIfHidden(!0)
|
|
}
|
|
undo() {
|
|
this._merge(this._initialState), this._model.mainSeries().onChartStyleChanged()
|
|
}
|
|
_merge(e) {
|
|
const t = e.version || 0,
|
|
i = this._model,
|
|
r = i.mainSeries(),
|
|
n = r.id();
|
|
if (r.priceScale().properties().childs().lockScale.setValue(!1), this
|
|
._initialState.symbol && e.symbol) {
|
|
const t = r.properties();
|
|
t.currencyId.setValue(e.currency || null), t.unitId.setValue(e.unit ||
|
|
null), t.symbol.setValue(e.symbol)
|
|
}
|
|
if (this._initialState.symbol && e.interval) {
|
|
const t = Object(Y.getChartStyleByResolution)(e.interval, r.properties()
|
|
.style.value());
|
|
r.setChartStyleWithIntervalIfNeeded(t, e.interval)
|
|
}
|
|
const o = i.panes(),
|
|
a = [];
|
|
for (let e = o.length; e--;) {
|
|
const t = o[e],
|
|
i = t.containsMainSeries(),
|
|
s = t.dataSources();
|
|
for (let e = s.length; e--;) {
|
|
const t = s[e];
|
|
(!i || Object(ve.isStudy)(t) && t.isRemovedByStudyTemplates()) && a
|
|
.push(t)
|
|
}
|
|
}
|
|
i.resetDeferredStudies();
|
|
const l = Object(Se.a)(i, a);
|
|
for (let e = 0; e < l.length; ++e) i.removeSource(l[e]);
|
|
const c = e.panes;
|
|
for (let e = 0; e < c.length; e++) {
|
|
let s = -1;
|
|
const r = Object(y.clone)(c[e]);
|
|
r.sources.sort((e, t) => e.zorder - t.zorder);
|
|
for (let e = 0; e < r.sources.length; e++) {
|
|
const t = r.sources[e];
|
|
if (Object(ye.isMainSeriesState)(t)) {
|
|
delete t.state, s = e;
|
|
break
|
|
}
|
|
}
|
|
const n = s > -1,
|
|
a = n ? o[e] : i.createPane(e);
|
|
n && t < 3 && Object(we.reorderDataSourcesStateZOrder)(r.sources), a
|
|
.restoreState(r, !1, t), null !== a.mainDataSource() || i.removePane(a)
|
|
}
|
|
return Object(s.ensureNotNull)(i.paneForSource(r)).changeSourceId(r, n), i
|
|
.syncESD(), r.priceScale().setMode({
|
|
autoScale: !0
|
|
}), i.startNotStartedStudies(), i.recalculateAllPanes(), i.fullUpdate(), l
|
|
}
|
|
}
|
|
var xe = i("e3/o"),
|
|
Te = i("/tGj");
|
|
const Ie = Object(h.getLogger)("Chart.ChartUndoModel");
|
|
class Me extends m.UndoCommand {
|
|
constructor(e, t, i, r, n) {
|
|
super("Paste Drawing"), this._needCopyToOtherCharts = !1, this._sourceState =
|
|
null, this._model = e, this._clipboardData = t, this._paneIndex = this
|
|
._model.panes().indexOf(i || Object(s.ensureNotNull)(this._model
|
|
.paneForSource(this._model.mainSeries()))), this._pasteWithData = !!r,
|
|
this._keepZIndex = !!n
|
|
}
|
|
redo() {
|
|
const e = this._model.panes()[this._paneIndex],
|
|
t = Object(s.ensureNotNull)(e.clipboardLineToolOwnerSource(this
|
|
._clipboardData.source.id));
|
|
null === this._sourceState && (this._sourceState = this._getSourceState(t));
|
|
const i = e.restoreLineTool(this._sourceState, this._pasteWithData, this
|
|
._keepZIndex);
|
|
this._clipboardData.centeredOnChart && i.centerPosition && i.centerPosition();
|
|
const r = Object(s.ensureNotNull)(t.priceScale());
|
|
i.setOwnerSource(t), i.setPriceScale(r), r.addDataSource(i), i
|
|
.restoreFixedPoints(), Object(g.prepareLineToolPropertiesByOwnerSource)(i
|
|
.properties(), t), i.calcIsActualSymbol(), i.createServerPoints();
|
|
const n = Object(Te.isSymbolSource)(t) || t.metaInfo().is_price_study;
|
|
this._needCopyToOtherCharts = Boolean(n && (Object(ce.drawOnAllCharts)()
|
|
.value() || i.linkKey().value() && i.isSynchronizable())), this._model
|
|
.setShouldBeSavedEvenIfHidden(!0)
|
|
}
|
|
undo() {
|
|
if (!this._sourceState) return void Ie.logError(
|
|
"This command was never executed - nothing to undo");
|
|
const e = this.source();
|
|
this._clipboardData.centeredOnChart && (this._clipboardData.centeredOnChart = !
|
|
1, this._sourceState.points = e.normalizedPoints()), this._model
|
|
.removeSource(e)
|
|
}
|
|
source() {
|
|
return Object(s.ensureNotNull)(this._model.dataSourceForId(Object(s
|
|
.ensureNotNull)(this._sourceState).id))
|
|
}
|
|
needCopyToOtherCharts() {
|
|
return this._needCopyToOtherCharts
|
|
}
|
|
_getSourceState(e) {
|
|
const t = Object(y.clone)(this._clipboardData.source);
|
|
delete t.state.symbol, null != t.linkKey && (t.linkKey = Object(xe.randomHash)
|
|
());
|
|
const i = Object(s.ensureNotNull)(e.priceScale()),
|
|
n = this._model;
|
|
let o = !1;
|
|
this._clipboardData.source.state.symbol === Object(s.ensureNotNull)(e
|
|
.symbolSource()).symbol() && (Object(Te.isSymbolSource)(e) ? o = !0 :
|
|
Object(ve.isStudy)(e) && (o = Boolean(e.metaInfo().is_price_study)));
|
|
const a = e => {
|
|
const t = e.x * n.timeScale().width(),
|
|
s = e.y * i.height() - 40;
|
|
return new r.Point(t, s)
|
|
},
|
|
l = Object(s.ensureNotNull)(e.firstValue());
|
|
if (this._model.id() === this._clipboardData.modelId || !o)
|
|
for (let e = 0; e < this._clipboardData.geometry.length; ++e) {
|
|
const s = a(this._clipboardData.geometry[e]),
|
|
r = n.timeScale().coordinateToIndex(s.x),
|
|
c = n.timeScale().normalizeBarIndex(r);
|
|
if (o) {
|
|
const s = i.priceToCoordinate(t.points[e].price, l) + -40;
|
|
c.price = i.coordinateToPrice(s, l)
|
|
} else c.price = i.coordinateToPrice(s.y, l);
|
|
t.points[e] = c
|
|
}
|
|
return t.id = Object(xe.guid)(), t
|
|
}
|
|
}
|
|
var Oe = i("xo8u"),
|
|
Le = i("Yt+L"),
|
|
Ae = i("/ToI");
|
|
class Ee extends m.UndoCommand {
|
|
constructor(e, t, i) {
|
|
super("Change Symbol"), this._sourceId = e.id(), this._newSymbol = t, this
|
|
._prevSymbol = e.symbol(), this._prevCurrency = e.currency(), this
|
|
._prevUnit = e.unit(), this._chartWidget = i, this._showFade = e === i
|
|
.model().mainSeries()
|
|
}
|
|
redo() {
|
|
this._showFade && this._chartWidget.screen.show(), this._symbolSource()
|
|
.setSymbolCurrencyUnit(this._newSymbol, null, null)
|
|
}
|
|
undo() {
|
|
this._showFade && this._chartWidget.screen.show(), this._symbolSource()
|
|
.setSymbolCurrencyUnit(this._prevSymbol, this._prevCurrency, this._prevUnit)
|
|
}
|
|
_symbolSource() {
|
|
return Object(s.ensureNotNull)(this._chartWidget.model().model()
|
|
.dataSourceForId(this._sourceId))
|
|
}
|
|
}
|
|
var ke = i("JWMC"),
|
|
De = i("gaBL");
|
|
const Ve = Object(h.getLogger)("Chart.ChartUndoModel");
|
|
class Be extends m.UndoCommand {
|
|
constructor(e, t, i) {
|
|
super("Paste Indicator"), this._sourceState = null, this._model = e, this
|
|
._clipboardData = t, this._paneId = i
|
|
}
|
|
redo() {
|
|
if (!this._sourceState) {
|
|
const e = Object(y.clone)(this._clipboardData.source);
|
|
e.id = Object(xe.guid)(), this._sourceState = e
|
|
}
|
|
let e, t;
|
|
e = this._paneId ? Object(s.ensureNotNull)(this._model.paneForId(this
|
|
._paneId)) : this._sourceState.metaInfo.is_price_study ? Object(s
|
|
.ensureNotNull)(this._model.paneForSource(this._model.mainSeries())) :
|
|
this._model.createPane();
|
|
const i = !e.mainDataSource();
|
|
this._sourceState.zorder = e.newStudyZOrder();
|
|
const r = e.restoreStudy(this._sourceState, !1);
|
|
this._sourceState.metaInfo.linkedToSeries && r.setOwnerSource(this._model
|
|
.mainSeries()), i || (t = this._sourceState.metaInfo.is_price_study ?
|
|
t = this._model.mainSeries().priceScale() : this._paneId ? e
|
|
.findSuitableScale(r) : e.defaultPriceScale(), t !== r.priceScale() && e
|
|
.move(r, t)), Object(ve.isStudy)(r) && r.start()
|
|
}
|
|
undo() {
|
|
if (null === this._sourceState) return void Ve.logError(
|
|
"This command was never executed - nothing to undo");
|
|
const e = Object(s.ensureNotNull)(this._model.dataSourceForId(this._sourceState
|
|
.id));
|
|
this._model.removeSource(e)
|
|
}
|
|
state() {
|
|
return this._sourceState
|
|
}
|
|
}
|
|
class Re extends m.UndoCommand {
|
|
constructor(e, t, i, s, r) {
|
|
super("", !1), this._model = e, this._paneA = t, this._paneB = i, this
|
|
._prevStretchA = s, this._currStretchA = r
|
|
}
|
|
redo() {
|
|
const e = this._paneA.stretchFactor() + this._paneB.stretchFactor();
|
|
this._paneA.setStretchFactor(this._currStretchA), this._paneB.setStretchFactor(
|
|
e - this._currStretchA), this._model.fullUpdate()
|
|
}
|
|
undo() {
|
|
const e = this._paneA.stretchFactor() + this._paneB.stretchFactor();
|
|
this._paneA.setStretchFactor(this._prevStretchA), this._paneB.setStretchFactor(
|
|
e - this._prevStretchA), this._model.fullUpdate()
|
|
}
|
|
}
|
|
var Ne = i("KnF9");
|
|
class je extends m.UndoCommand {
|
|
constructor(e, t, i, s) {
|
|
super("Move", !1), this._endEvent = null, this._model = e, this._sourceId = t
|
|
.id(), this._itemIndex = i,
|
|
this._startEvent = s
|
|
}
|
|
move(e) {
|
|
this._endEvent = e, this._move(e)
|
|
}
|
|
hasChanges() {
|
|
return null !== this._endEvent
|
|
}
|
|
undo() {
|
|
this._move(this._startEvent)
|
|
}
|
|
redo() {
|
|
this._move(Object(s.ensureNotNull)(this._endEvent))
|
|
}
|
|
_move(e) {
|
|
const t = Object(s.ensureNotNull)(this._model.dataSourceForId(this._sourceId));
|
|
Object(s.assert)(void 0 !== t.moveItem, 'The method "moveItem" is not defined'),
|
|
t.moveItem && t.moveItem(new r.Point(e.localX, e.localY), this._itemIndex,
|
|
new Ne.a(e))
|
|
}
|
|
}
|
|
class Fe extends m.UndoCommand {
|
|
constructor(e, t, i, s, r, n, o, a, l, c, h, u) {
|
|
super(u), this._studyId = null, this._paneState = null, this._chartModel = e,
|
|
this._studyMetaInfo = t, this._props = s, this._addAsOverlay = r, this
|
|
._parentId = null == n ? null : n.id(), this._inputs = i, this
|
|
._targetZOrder = h, this._preferredPriceScale = o, this
|
|
._allowChangeCurrency = a, this._allowChangeUnit = l, this._paneSize = c
|
|
}
|
|
redo() {
|
|
const e = null === this._parentId ? void 0 : this._chartModel.dataSourceForId(
|
|
this._parentId),
|
|
t = this._chartModel.insertStudyWithParams(this._studyMetaInfo, this
|
|
._inputs, this._targetZOrder, this._props, this._addAsOverlay, e, this
|
|
._preferredPriceScale, this._allowChangeCurrency, this._allowChangeUnit,
|
|
this._paneSize, null === this._studyId ? void 0 : this._studyId);
|
|
if (this._studyId = t.id(), t.childStudyByRebind().subscribe(null, () => Object(
|
|
ke.trackEvent)("SOS", "Apply SOS", "Rebind SOS")), this._chartModel
|
|
.setShouldBeSavedEvenIfHidden(!0), null !== this._paneState) {
|
|
Object(s.ensureNotNull)(this._chartModel.paneForSource(t)).restoreState(this
|
|
._paneState, !1, this._chartModel.version()), this._paneState = null
|
|
}
|
|
}
|
|
undo() {
|
|
const e = Object(s.ensureNotNull)(this._chartModel.dataSourceForId(Object(s
|
|
.ensureNotNull)(this._studyId))),
|
|
t = Object(s.ensureNotNull)(this._chartModel.paneForSource(e)).state();
|
|
this._chartModel.removeSource(e) && (this._paneState = t)
|
|
}
|
|
insertedStudy() {
|
|
return this._chartModel.dataSourceForId(Object(s.ensureNotNull)(this._studyId))
|
|
}
|
|
}
|
|
var We = i("pOzK"),
|
|
He = i("cWHH"),
|
|
Ue = i.n(He),
|
|
ze = i("SwuQ"),
|
|
Ge = i("7MWe"),
|
|
qe = i("Kxc7");
|
|
class Ye extends m.UndoCommand {
|
|
constructor(e, t, i, s, r, n) {
|
|
super("Zoom"), this._timeScaleState = null, this._priceScaleState = null, this
|
|
._model = e, this._startBar = t, this._endBar = i, this._startPrice = s,
|
|
this._endPrice = r, this._pane = n
|
|
}
|
|
redo() {
|
|
this._timeScaleState = this._model.timeScale().state(), this._priceScaleState =
|
|
this._pane.defaultPriceScale().state(), this._model.zoomToViewport(this
|
|
._startBar, this._endBar, this._startPrice, this._endPrice, this._pane)
|
|
}
|
|
undo() {
|
|
this._model.timeScale().restoreState(Object(s.ensureNotNull)(this
|
|
._timeScaleState)), this._pane.defaultPriceScale().restoreState(Object(s
|
|
.ensureNotNull)(this._priceScaleState)), this._model
|
|
.recalculateAllPanes(), this._model.lightUpdate()
|
|
}
|
|
}
|
|
const Ke = Object(h.getLogger)("Chart.ChartUndoModel");
|
|
class Je extends m.UndoCommand {
|
|
constructor(e, t, i) {
|
|
super("Zoom"), this._baseCmd = e, this._zoomStack = t, this._inOut = i
|
|
}
|
|
undo() {
|
|
if (this._inOut) {
|
|
if (this._baseCmd !== this._zoomStack.head()) return void Ke.logDebug(
|
|
"zoom stack inconsistency");
|
|
this._baseCmd.undo(), this._zoomStack.pop()
|
|
} else this._baseCmd.redo(), this._zoomStack.push(this._baseCmd)
|
|
}
|
|
redo() {
|
|
if (this._inOut) this._baseCmd.redo(), this._zoomStack.push(this._baseCmd);
|
|
else {
|
|
if (this._baseCmd !== this._zoomStack.head()) return void Ke.logDebug(
|
|
"zoom stack inconsistency");
|
|
this._baseCmd.undo(), this._zoomStack.pop()
|
|
}
|
|
}
|
|
}
|
|
class Ze extends m.UndoCommand {
|
|
constructor(e, t) {
|
|
super("Stop Syncing Drawing"), this._model = e, this._sourceId = t.id(), this
|
|
._linkKey = t.linkKey().value()
|
|
}
|
|
redo() {
|
|
Object(s.ensureNotNull)(this._model.dataSourceForId(this._sourceId)).linkKey()
|
|
.setValue(null)
|
|
}
|
|
undo() {
|
|
Object(s.ensureNotNull)(this._model.dataSourceForId(this._sourceId)).linkKey()
|
|
.setValue(this._linkKey)
|
|
}
|
|
}
|
|
class Xe extends m.UndoCommand {
|
|
constructor(e, t, i = "Restore Defaults") {
|
|
super(i), this._chartModel = e, this._defaultProperty = t, this._state = t
|
|
.state()
|
|
}
|
|
redo() {
|
|
this._chartModel.restoreFactoryDefaults(this._defaultProperty)
|
|
}
|
|
undo() {
|
|
this._defaultProperty.mergeAndFire(this._state), this._chartModel.mainSeries()
|
|
.onChartStyleChanged()
|
|
}
|
|
}
|
|
var $e = i("0C7r");
|
|
class Qe extends Xe {
|
|
redo() {
|
|
this._defaultProperty.hasChild("intervalsVisibilities") && this._defaultProperty
|
|
.childs().intervalsVisibilities.mergeAndFire($e.intervalsVisibilitiesDefaults),
|
|
super.redo()
|
|
}
|
|
}
|
|
var et = i("eCE5");
|
|
i.d(t, "ChartUndoModelBase", (function() {
|
|
return ot
|
|
}));
|
|
const tt = window.t("Send {title} backward"),
|
|
it = window.t("Bring {title} forward"),
|
|
st = window.t("Insert {title} after {target}"),
|
|
rt = window.t("Insert {title} before {target}");
|
|
|
|
function nt(e, t) {
|
|
return {
|
|
bringForwardEnabled: e.bringForwardEnabled || t.bringForwardEnabled,
|
|
bringToFrontEnabled: e.bringToFrontEnabled || t.bringToFrontEnabled,
|
|
sendBackwardEnabled: e.sendBackwardEnabled || t.sendBackwardEnabled,
|
|
sendToBackEnabled: e.sendToBackEnabled || t.sendToBackEnabled
|
|
}
|
|
}
|
|
class ot extends a.a {
|
|
constructor(e, t, i, s, r, n, o, a, l) {
|
|
super(), this._createLineCommand = null, this._initialTimeScrollState = null,
|
|
this._initialTimeScrollPos = null, this._currentSourceMoveCommand = null,
|
|
this._currentLineChangeCommand = null, this._currentCustomMoveCommand =
|
|
null, this._zoomStack = new _.a, this._chartWidget = n, this.m_model =
|
|
new Ue.a(e, t, i, s, r, this, a, l), this._undoHistory = o, this
|
|
._lineToolsGroupController = new be({
|
|
model: this._model.bind(this),
|
|
pushUndoCommand: this._pushUndoCommand.bind(this),
|
|
beginUndoMacro: this._undoHistory.beginUndoMacro.bind(this
|
|
._undoHistory),
|
|
endUndoMacro: this._undoHistory.endUndoMacro.bind(this
|
|
._undoHistory),
|
|
emitEvent: this.emitEvent.bind(this)
|
|
})
|
|
}
|
|
undoHistory() {
|
|
return this._undoHistory
|
|
}
|
|
lineToolsGroupController() {
|
|
return this._lineToolsGroupController
|
|
}
|
|
mergeAllScales(e) {
|
|
! function(e, t) {
|
|
e.beginUndoMacro("left" === t ? u : d), e.model().panes().forEach(i => {
|
|
const s = "left" === t ? i.rightPriceScales() : i
|
|
.leftPriceScales(),
|
|
r = ("left" === t ? i.leftPriceScales() : i
|
|
.rightPriceScales()).concat(s),
|
|
n = "overlay" === i.priceScalePosition(i
|
|
.defaultPriceScale()) ? r[0] : i.defaultPriceScale();
|
|
e.movePriceScale(i, n, t, 0), r.forEach(t => {
|
|
if (t === n) return;
|
|
let s = t.mainSource();
|
|
for (; null !== s;) {
|
|
e.moveToScale(s, i, n, "", !0);
|
|
const r = t.mainSource();
|
|
if (r === s) {
|
|
p.logError(
|
|
"Loop detected while trying to merge scales"
|
|
);
|
|
break
|
|
}
|
|
s = r
|
|
}
|
|
})
|
|
}), e.endUndoMacro(), e.model().fullUpdate()
|
|
}(this, e)
|
|
}
|
|
movePriceScale(e, t, i, s) {
|
|
const r = new f(this._model(), e, t, i, s, window.t("Move scale"));
|
|
this._pushUndoCommand(r)
|
|
}
|
|
createLineTool(e, t, i, r, o, a, l) {
|
|
const c = "Create " + T.lineToolsLocalizedNames[i];
|
|
if (("LineToolRegressionTrend" === i || "LineToolAnchoredVWAP" === i) && !this
|
|
.canCreateStudy()) return Object(n.showTooManyStudiesNotice)(), null;
|
|
this.beginUndoMacro(c);
|
|
const h = !l;
|
|
this._createLineCommand = new I(this._model(), e, i, a || Object(s
|
|
.ensureNotNull)(e.mainDataSource()), h);
|
|
const u = this._createLineCommand.startCreatingLine(t, r, o || null),
|
|
d = Object(s.ensureNotNull)(this._createLineCommand.line());
|
|
let p = null;
|
|
if (u && (h && this.finishLineTool(d), this._pushUndoCommand(this
|
|
._createLineCommand), this._createLineCommand = null, p = {
|
|
points: d.normalizedPoints(),
|
|
interval: this.mainSeries().interval()
|
|
}), h && void 0 === o && Object(ce.drawOnAllCharts)().value() && d
|
|
.isSynchronizable()) {
|
|
const e = Object(s.ensureNotNull)(this.model().externalTimeStamp(t.index)),
|
|
r = {
|
|
point: {
|
|
price: t.price,
|
|
timeStamp: e
|
|
},
|
|
linetool: i,
|
|
properties: d.properties(),
|
|
symbol: this.mainSeries().symbol(),
|
|
model: this.model(),
|
|
linkKey: Object(s.ensureNotNull)(d.linkKey().value()),
|
|
finalState: p
|
|
};
|
|
d.isFixed() && (r.pointPositionPercents = d.calcPositionPercents()[0]),
|
|
Object(ce.createLineTool)(r)
|
|
}
|
|
return this.endUndoMacro(), d
|
|
}
|
|
continueCreatingLine(e, t, i, r) {
|
|
const n = Object(s.ensureNotNull)(this._createLineCommand);
|
|
this.beginUndoMacro(n.text());
|
|
const o = Object(s.ensureNotNull)(this._model().lineBeingCreated()),
|
|
a = n.continueCreatingLine(e, t, i, r);
|
|
let l = null;
|
|
if (a && (this.finishLineTool(o), this._pushUndoCommand(n), this
|
|
._createLineCommand = null, l = {
|
|
points: o.normalizedPoints(),
|
|
interval: this.mainSeries().interval()
|
|
}), n.needCopyToOtherCharts() && Object(ce.drawOnAllCharts)().value() &&
|
|
o.isSynchronizable()) {
|
|
const i = Object(s.ensureNotNull)(this._model().externalTimeStamp(e.index));
|
|
Object(ce.continueLineTool)({
|
|
point: {
|
|
price: e.price,
|
|
timeStamp: i
|
|
},
|
|
envState: t,
|
|
finalState: l,
|
|
model: this._model()
|
|
})
|
|
}
|
|
return this.endUndoMacro(), a
|
|
}
|
|
continueExternalLine(e, t, i) {
|
|
const r = Object(s.ensureNotNull)(this._createLineCommand),
|
|
n = r.continueCreatingLine(e, t, i);
|
|
return n && (this._pushUndoCommand(r), this._createLineCommand = null), n
|
|
}
|
|
finishLineTool(e) {
|
|
this._model().finishLineTool(e)
|
|
}
|
|
pasteImageAsLineTool(e, t, i) {
|
|
return null
|
|
}
|
|
loadRange(e) {
|
|
this._pushUndoCommand(new Q(this._model(), e))
|
|
}
|
|
unlinkLines(e) {
|
|
const t = this.model();
|
|
this.beginUndoMacro("Stop syncing line tool(s)");
|
|
for (const i of e) null !== i.linkKey().value() && Object(ce.removeLineTool)({
|
|
withUndo: !0,
|
|
model: this.model(),
|
|
symbol: i.symbol(),
|
|
linkKey: Object(s.ensureNotNull)(i.linkKey().value()),
|
|
sourceTitle: i.title(),
|
|
lineToolState: i.state(!1)
|
|
}), this._pushUndoCommand(new Ze(t, i));
|
|
this.endUndoMacro()
|
|
}
|
|
zoomFromViewport() {
|
|
const e = new Je(Object(s.ensureDefined)(this._zoomStack.head()), this
|
|
._zoomStack, !1);
|
|
this._pushUndoCommand(e)
|
|
}
|
|
zoomToViewport(e, t, i, s, r) {
|
|
const n = new Ye(this.m_model, e, t, i, s, r),
|
|
o = new Je(n, this._zoomStack, !0);
|
|
this._pushUndoCommand(o)
|
|
}
|
|
zoomStack() {
|
|
return this._zoomStack
|
|
}
|
|
withMacro(e, t) {
|
|
const i = this.beginUndoMacro(e);
|
|
try {
|
|
t()
|
|
} finally {
|
|
this.endUndoMacro()
|
|
}
|
|
return i
|
|
}
|
|
canZoomIn() {
|
|
return this.model().canZoomIn()
|
|
}
|
|
canZoomOut() {
|
|
return this.model().canZoomOut()
|
|
}
|
|
zoomOut() {
|
|
const e = this.timeScale().width();
|
|
if (this.canZoomOut()) {
|
|
try {
|
|
this.beginUndoMacro("Zoom Out")
|
|
} catch (e) {
|
|
return
|
|
}
|
|
Object(ee.doAnimate)({
|
|
to: e / 5,
|
|
onStep: e => {
|
|
this.startScaleTime(0), this.scaleTimeTo(e), this
|
|
.endScaleTime()
|
|
},
|
|
onComplete: () => this.endUndoMacro()
|
|
})
|
|
}
|
|
}
|
|
zoomIn() {
|
|
const e = this.timeScale().width();
|
|
if (this.canZoomIn()) {
|
|
try {
|
|
this.beginUndoMacro("Zoom In")
|
|
} catch (e) {
|
|
return
|
|
}
|
|
Object(ee.doAnimate)({
|
|
to: e / 5,
|
|
onStep: e => {
|
|
this.startScaleTime(e), this.scaleTimeTo(0), this
|
|
.endScaleTime()
|
|
},
|
|
onComplete: () => this.endUndoMacro()
|
|
})
|
|
}
|
|
}
|
|
startMovingSources(e, t, i, s) {
|
|
e.filter(e => e.doesMovingAffectsUndo()).length && (this
|
|
._currentSourceMoveCommand = new w(this.model(), e, "Move Drawing(s)", !
|
|
1)), this.model().startMovingSources(e, t, i, new Map, s)
|
|
}
|
|
moveSources(e, t) {
|
|
this.model().moveSources(e, new Map, t)
|
|
}
|
|
endMovingSource(e) {
|
|
this.model().endMovingSources(e), null !== this._currentSourceMoveCommand && (
|
|
this._currentSourceMoveCommand.saveNewState(), this._pushUndoCommand(
|
|
this._currentSourceMoveCommand)), this._currentSourceMoveCommand =
|
|
null
|
|
}
|
|
startChangingLinetool(e, t, i, s, r) {
|
|
this._currentLineChangeCommand = new w(this.model(), [e], "Change " + i +
|
|
" point", !1), this.model().startChangingLinetool(e, t, i, s, r)
|
|
}
|
|
changeLinePoint(e, t) {
|
|
this.model().changeLinePoint(e, t)
|
|
}
|
|
endChangingLinetool(e) {
|
|
this.model().endChangingLinetool(e), null !== this._currentLineChangeCommand &&
|
|
(this._currentLineChangeCommand.saveNewState(), this._pushUndoCommand(this
|
|
._currentLineChangeCommand)), this._currentLineChangeCommand = null
|
|
}
|
|
setChartStyleProperty(e, t, i) {
|
|
if (e.value() !== t) {
|
|
const s = new Z(e, t, this.mainSeries(), i, this.model(), this
|
|
.chartWidget());
|
|
this._pushUndoCommand(s), this.emitEvent("setChartStyleProperty"), Object(G
|
|
.a)(e.value())
|
|
}
|
|
}
|
|
restorePropertiesForSource(e) {
|
|
Object(g.isLineTool)(e) ? this._restoreLineToolFactoryDefaults(e) : this
|
|
._restoreStudyFactoryDefaults(e)
|
|
}
|
|
restoreState(e, t, i) {
|
|
return this.m_model.restoreState(e, t, i)
|
|
}
|
|
async clipboardCopy(e, t = this.selection().dataSources()) {
|
|
if (!Object(qe.enabled)("datasource_copypaste")) return;
|
|
const i = t.filter(e => e.copiable());
|
|
if (0 === i.length) return;
|
|
for (const e of i)
|
|
if (Object(ve.isStudy)(e) && e.isChildStudy()) throw new Error(
|
|
"Can not copy child study");
|
|
const s = Object(M.a)(this._model().id(), i);
|
|
return null !== s ? e.write({
|
|
app: JSON.stringify(s),
|
|
text: s.title
|
|
}) : void 0
|
|
}
|
|
async clipboardCut(e, t = this.selection().dataSources()) {
|
|
if (!Object(qe.enabled)("datasource_copypaste")) return;
|
|
const i = t.filter(e => e.copiable());
|
|
if (0 === i.length) return;
|
|
await this.clipboardCopy(e, i);
|
|
const s = i.filter(e => e.isUserDeletable());
|
|
if (0 === s.length) return;
|
|
const r = 1 === s.length ? "Cut " + s[0].title : "Cut sources";
|
|
this.beginUndoMacro(r), this.m_model.selectionMacro(() => {
|
|
this.removeSources(s, !1, r)
|
|
}), this.endUndoMacro()
|
|
}
|
|
async clipboardPaste(e, t) {
|
|
let i = null;
|
|
if (Object(qe.enabled)("datasource_copypaste") && (i = i || await e.read(), i
|
|
.app)) {
|
|
const e = JSON.parse(i.app);
|
|
if (null !== this.pasteSourceFromClip(t, e)) return
|
|
}
|
|
await this._processSpecialLineToolsContents(e, i, t)
|
|
}
|
|
applyStudyTemplate(e, t) {
|
|
const i = new Ce(this._model(), e, t);
|
|
this._pushUndoCommand(i)
|
|
}
|
|
startCustomMoving(e, t, i) {
|
|
this._currentCustomMoveCommand = new je(this.model(), e, t, i)
|
|
}
|
|
customMoveBeingProcessed() {
|
|
return null !== this._currentCustomMoveCommand
|
|
}
|
|
processCustomMove(e) {
|
|
Object(s.ensureNotNull)(this._currentCustomMoveCommand).move(e)
|
|
}
|
|
endCustomMoving() {
|
|
null !== this._currentCustomMoveCommand && this._currentCustomMoveCommand
|
|
.hasChanges() && (this._pushUndoCommand(this._currentCustomMoveCommand),
|
|
this._currentCustomMoveCommand = null)
|
|
}
|
|
cloneLineTools(e, t) {
|
|
for (let t = 0; t < Math.min(5, e.length); ++t) Object(G.b)(e[t]);
|
|
this.beginUndoMacro(window.t("Clone line tools"));
|
|
const i = new b(this._model(), e, t, window.t("Clone line tools"));
|
|
if (this._pushUndoCommand(i), Object(ce.drawOnAllCharts)().value()) {
|
|
const e = i.newIds().map(e => Object(s.ensureNotNull)(this.model()
|
|
.dataSourceForId(e)));
|
|
this.copyToOtherCharts(e)
|
|
}
|
|
return this.endUndoMacro(), this.emitEvent("cloneLineTools"), i.newIds()
|
|
}
|
|
removeSource(e, t, i) {
|
|
if (this.lineBeingCreated() === e) return void this.cancelCreatingLine();
|
|
const s = "Remove " + e.title();
|
|
this.removeSources([e], t, s, i)
|
|
}
|
|
removeSelectedSources() {
|
|
const e = this._model().selection().dataSources();
|
|
if (!e.length) return;
|
|
const t = e.length > 1 ? "Remove drawings group" : "Remove " + e[0].title();
|
|
this.removeSources(e, !1, t)
|
|
}
|
|
removeSources(e, t, i, r) {
|
|
r || (e = e.filter(e => e.isUserDeletable()));
|
|
const n = this._model(),
|
|
o = n.lineToolsGroupModel();
|
|
this.beginUndoMacro(i), n.selectionMacro(r => {
|
|
const a = new Map;
|
|
e.forEach(e => {
|
|
if (Object(g.isLineTool)(e)) {
|
|
const t = o.groupForLineTool(e);
|
|
if (null !== t) {
|
|
const i = a.get(t) || [];
|
|
i.push(e), a.set(t, i)
|
|
}
|
|
null !== e.linkKey().value() && Object(ce
|
|
.removeLineTool)({
|
|
withUndo: !0,
|
|
model: this.model(),
|
|
linkKey: Object(s.ensureNotNull)(e
|
|
.linkKey().value()),
|
|
symbol: this.model().mainSeries()
|
|
.symbol(),
|
|
lineToolState: e.state(!1),
|
|
sourceTitle: e.title()
|
|
})
|
|
}
|
|
}), a.forEach((e, t) => {
|
|
const i = new S.a(n, t, e);
|
|
this._pushUndoCommand(i)
|
|
});
|
|
const l = new v.RemoveSourcesCommand(n, e, i),
|
|
c = l.removedIds();
|
|
this._pushUndoCommand(l), !t && c.length > 0 && (1 === c.length ?
|
|
this.emitEvent("removeSource", [c[0]]) : this.emitEvent(
|
|
"removeSources", [c]))
|
|
}), this.endUndoMacro()
|
|
}
|
|
removeUnloadedLineTool(e, t, i, s, r, n) {}
|
|
mergeSourceUp(e) {
|
|
const t = new C.c(this._model(), e, "Merge up");
|
|
this._mergeUnmergeSource(e, t)
|
|
}
|
|
mergeSourceDown(e) {
|
|
const t = new C.a(this._model(), e, "Merge down");
|
|
this._mergeUnmergeSource(e, t)
|
|
}
|
|
mergeToPane(e, t) {
|
|
const i = this._model().panes().indexOf(t),
|
|
s = new C.b(this._model(), e, i, "Merge to pane");
|
|
this._mergeUnmergeSource(e, s)
|
|
}
|
|
unmergeSourceUp(e) {
|
|
const t = new P.c(this._model(), e, "Unmerge up");
|
|
this._mergeUnmergeSource(e, t)
|
|
}
|
|
unmergeSourceDown(e) {
|
|
const t = new P.a(this._model(), e, "Unmerge down");
|
|
this._mergeUnmergeSource(e, t)
|
|
}
|
|
unmergeToNewBottomPane(e) {
|
|
const t = new P.b(this._model(), e, "Unmerge to new bottom pane");
|
|
this._mergeUnmergeSource(e, t)
|
|
}
|
|
availableZOrderOperations(e) {
|
|
const t = this._model().lineToolsGroupModel(),
|
|
i = e.filter(g.isLineTool),
|
|
r = i.map(e => t.groupForLineTool(e));
|
|
Object(s.assert)(new Set(r).size <= 1,
|
|
"Cannot move line tools from different group");
|
|
const n = 0 === r.length ? null : r[0];
|
|
let o = {
|
|
bringForwardEnabled: !1,
|
|
bringToFrontEnabled: !1,
|
|
sendBackwardEnabled: !1,
|
|
sendToBackEnabled: !1
|
|
};
|
|
const a = new Set(i);
|
|
for (const t of Object(x.sortSources)(e)) {
|
|
if (Object(g.isLineTool)(t) && null !== n) {
|
|
const e = Object(x.sortSources)(n.lineTools().filter(e => !a.has(e) ||
|
|
e === t));
|
|
o = nt(o, {
|
|
bringForwardEnabled: t !== e[e.length - 1],
|
|
bringToFrontEnabled: t !== e[e.length - 1],
|
|
sendBackwardEnabled: t !== e[0],
|
|
sendToBackEnabled: t !== e[0]
|
|
});
|
|
continue
|
|
}
|
|
const e = Object(s.ensureNotNull)(this._model().paneForSource(t))
|
|
.sourcesByGroup().allExceptSpecialSources();
|
|
if (0 === e.length) continue;
|
|
const i = t.zorder(),
|
|
r = e[0].zorder(),
|
|
l = e[e.length - 1].zorder();
|
|
o = nt(o, {
|
|
bringForwardEnabled: i !== l,
|
|
bringToFrontEnabled: i !== l,
|
|
sendBackwardEnabled: i !== r,
|
|
sendToBackEnabled: i !== r
|
|
})
|
|
}
|
|
return o
|
|
}
|
|
sendToBack(e) {
|
|
if (!this.availableZOrderOperations(e).sendToBackEnabled) throw new Error(
|
|
"Send to back operation is unavailable");
|
|
let t = null;
|
|
const i = e[0];
|
|
if (Object(g.isLineTool)(i)) {
|
|
const s = this._model().lineToolsGroupModel().groupForLineTool(i);
|
|
if (null !== s) {
|
|
const i = s.lineTools();
|
|
t = new V(this.model(), Object(x.sortSources)(e), i[0])
|
|
}
|
|
}
|
|
null === t && (t = new A(this.model(), Object(x.sortSources)(e))), this
|
|
._pushUndoCommand(t), this.emitEvent("changeZOrder", [e])
|
|
}
|
|
bringToFront(e) {
|
|
if (!this.availableZOrderOperations(e).bringToFrontEnabled) throw new Error(
|
|
"Bring to front operation is unavailable");
|
|
let t = null;
|
|
const i = e[0];
|
|
if (Object(g.isLineTool)(i)) {
|
|
const s = this._model().lineToolsGroupModel().groupForLineTool(i);
|
|
if (null !== s) {
|
|
const i = s.lineTools();
|
|
t = new k(this.model(), Object(x.sortSources)(e), i[i.length - 1])
|
|
}
|
|
}
|
|
null === t && (t = new L(this.model(), Object(x.sortSources)(e))), this
|
|
._pushUndoCommand(t), this.emitEvent("changeZOrder", [e])
|
|
}
|
|
sendBackward(e) {
|
|
if (!this.availableZOrderOperations(e).sendBackwardEnabled) throw new Error(
|
|
"Send backward operation is unavailable");
|
|
const t = tt.format({
|
|
title: e[0].title()
|
|
});
|
|
this._sendBackOrBringForward(t, Object(x.sortSources)(e), (e, t) => new R(this
|
|
.model(), e, t))
|
|
}
|
|
bringForward(e) {
|
|
if (!this.availableZOrderOperations(e).bringForwardEnabled) throw new Error(
|
|
"Bring forward operation is unavailable");
|
|
const t = it.format({
|
|
title: e[0].title()
|
|
});
|
|
this._sendBackOrBringForward(t, Object(x.sortSources)(e), (e, t) => new j(this
|
|
.model(), e, t))
|
|
}
|
|
insertAfter(e, t) {
|
|
e = Object(x.sortSources)(e);
|
|
const i = st.format({
|
|
title: e[0].title(),
|
|
target: t.title()
|
|
});
|
|
this._insertAfterOrBefore(i, e, t, () => new k(this.model(), e, t))
|
|
}
|
|
insertBefore(e, t) {
|
|
e = Object(x.sortSources)(e);
|
|
const i = rt.format({
|
|
title: e[0].title(),
|
|
target: t.title()
|
|
});
|
|
this._insertAfterOrBefore(i, e, t, () => new V(this.model(), e, t))
|
|
}
|
|
detachToRight(e, t) {
|
|
Object(ke.trackEvent)("Chart", "Move to new right scale");
|
|
const i = window.t("Move {title} To New Price Scale").format({
|
|
title: e.title()
|
|
}),
|
|
s = new Ae.b(this.model(), e, t, "right", i);
|
|
this._pushUndoCommand(s), this.emitEvent("moveSource", [e])
|
|
}
|
|
detachToLeft(e, t) {
|
|
Object(ke.trackEvent)("Chart", "Move to new left scale");
|
|
const i = window.t("Move {title} To New Left Scale").format({
|
|
title: e.title()
|
|
}),
|
|
s = new Ae.b(this.model(), e, t, "left", i);
|
|
this._pushUndoCommand(s), this.emitEvent("moveSource", [e])
|
|
}
|
|
detachNoScale(e, t) {
|
|
Object(ke.trackEvent)("Chart", "Make source no scale");
|
|
const i = window.t("Make {title} No Scale (Full Screen)").format({
|
|
title: e.title()
|
|
}),
|
|
s = new Ae.b(this.model(), e, t, "overlay", i);
|
|
this._pushUndoCommand(s), this.emitEvent("moveSource", [e])
|
|
}
|
|
moveToScale(e, t, i, s, r) {
|
|
Object(ke.trackEvent)("Chart", "Move source to target scale"), this
|
|
.beginUndoMacro(s);
|
|
const n = new Ae.a(this.model(), e, t, i, s),
|
|
o = r ? null : Object(De.sourceNewCurrencyOnPinningToPriceScale)(e, i, this
|
|
._model()),
|
|
a = r ? null : Object(ze.sourceNewUnitOnPinningToPriceScale)(e, i, this
|
|
._model());
|
|
this._pushUndoCommand(n), null !== o && this.setPriceScaleCurrency(i, o),
|
|
null !== a && this.setPriceScaleUnit(i, a), this.endUndoMacro(), this
|
|
.emitEvent("moveSource", [e])
|
|
}
|
|
startScrollTime(e) {
|
|
const t = this.timeScale();
|
|
this._initialTimeScrollState = {
|
|
rightOffset: t.rightOffset(),
|
|
barSpacing: t.barSpacing()
|
|
}, this._initialTimeScrollPos = e, this.model().startScrollTime(e)
|
|
}
|
|
scrollTimeTo(e) {
|
|
let t = !1;
|
|
return null !== this._initialTimeScrollPos && null !== this
|
|
._initialTimeScrollState && Math.abs(e - this._initialTimeScrollPos) > 20 &&
|
|
(this._pushUndoCommand(new z.a(this.model(), this._initialTimeScrollState,
|
|
"Scroll Time")), this._initialTimeScrollPos = null, this
|
|
._initialTimeScrollState = null, t = !0), this.model().scrollTimeTo(e),
|
|
t
|
|
}
|
|
endScrollTime() {
|
|
this.model().endScrollTime(), this._initialTimeScrollPos = null, this
|
|
._initialTimeScrollState = null
|
|
}
|
|
startScaleTime(e) {
|
|
const t = this.timeScale(),
|
|
i = {
|
|
rightOffset: t.rightOffset(),
|
|
barSpacing: t.barSpacing()
|
|
};
|
|
this._pushUndoCommand(new z.a(this.model(), i, "Scale Time")), this.model()
|
|
.startScaleTime(e)
|
|
}
|
|
scaleTimeTo(e) {
|
|
this.model().scaleTimeTo(e)
|
|
}
|
|
endScaleTime() {
|
|
this.model().endScaleTime()
|
|
}
|
|
resetTimeScale() {
|
|
const e = this.timeScale(),
|
|
t = {
|
|
rightOffset: e.rightOffset(),
|
|
barSpacing: e.barSpacing()
|
|
};
|
|
this._pushUndoCommand(new z.a(this.model(), t, "Reset Time Scale")), this
|
|
.model().resetTimeScale()
|
|
}
|
|
startScalePrice(e, t, i, s) {
|
|
this._pushUndoCommand(new Ge.PriceScaleChangeUndoCommand(this.model(), e, t, t
|
|
.state(), s)), this.model().startScalePrice(e, t, i)
|
|
}
|
|
scalePriceTo(e, t, i) {
|
|
this.model().scalePriceTo(e, t, i)
|
|
}
|
|
endScalePrice(e, t) {
|
|
this.model().endScalePrice(e, t)
|
|
}
|
|
resetPriceScale(e, t) {
|
|
this._pushUndoCommand(new Ge.PriceScaleChangeUndoCommand(this.m_model, e, t, t
|
|
.state())), this.model().resetPriceScale(e, t)
|
|
}
|
|
rearrangePanes(e, t) {
|
|
const i = new U(this._model(), e, t);
|
|
this._pushUndoCommand(i)
|
|
}
|
|
movePane(e, t) {
|
|
const i = new U(this._model(), e, t);
|
|
this._pushUndoCommand(i)
|
|
}
|
|
pasteSourceFromClip(e, t, i) {
|
|
const r = t;
|
|
if (!r || 0 === r.sources.length) return null;
|
|
const n = e || Object(s.ensureNotNull)(this.model().paneForSource(this
|
|
.mainSeries()));
|
|
if (!r.sources.some(e => "drawing" !== e.type || null !== n
|
|
.clipboardLineToolOwnerSource(e.source.id))) return null;
|
|
this.beginUndoMacro("Paste " + r.title);
|
|
let o = 0;
|
|
const a = [],
|
|
l = [];
|
|
for (const t of r.sources)
|
|
if ("drawing" === t.type && null !== n.clipboardLineToolOwnerSource(t.source
|
|
.id)) {
|
|
Object(et.b)(t.source.state.intervalsVisibilities, $.Interval.parse(this
|
|
.model().mainSeries().interval()));
|
|
const e = this.pasteLineTool(n, t);
|
|
o < 5 && (Object(G.d)(e), o += 1), l.push(e), a.push(e)
|
|
} else "study" === t.type && t.source && t.source.metaInfo && this
|
|
.checkIfFeatureAvailable(new c.a(t.source.metaInfo)) && a.push(this
|
|
.pasteStudy(t, i ? e : void 0));
|
|
return l.length && this.selectionMacro(e => {
|
|
e.clearSelection(), l.forEach(t => {
|
|
e.addSourceToSelection(t, null)
|
|
})
|
|
}), this.endUndoMacro(), a
|
|
}
|
|
pasteLineTool(e, t, i, s) {
|
|
const r = new Me(this.model(), t, e, i, s);
|
|
this._pushUndoCommand(r);
|
|
const n = r.source();
|
|
return r.needCopyToOtherCharts() && this.copyToOtherCharts([n]),
|
|
this.selectionMacro(e => {
|
|
e.clearSelection(), e.addSourceToSelection(n, null)
|
|
}), n
|
|
}
|
|
pasteStudy(e, t) {
|
|
const i = new Be(this.model(), e, null == t ? void 0 : t.id());
|
|
this._pushUndoCommand(i);
|
|
const r = Object(s.ensureNotNull)(i.state()).id;
|
|
return Object(s.ensureNotNull)(this._model().dataSourceForId(r))
|
|
}
|
|
setPriceScaleCurrency(e, t) {
|
|
const i = new Oe.a(e, t, this.chartWidget(), "Change currency");
|
|
this._pushUndoCommand(i)
|
|
}
|
|
setPriceScaleUnit(e, t) {
|
|
const i = new Le.a(e, t, this.chartWidget(), "Change unit");
|
|
this._pushUndoCommand(i)
|
|
}
|
|
setSymbol(e, t) {
|
|
e.symbol() !== t && this._pushUndoCommand(new Ee(e, t, this.chartWidget()))
|
|
}
|
|
copyToOtherCharts(e) {
|
|
const t = this.mainSeries(),
|
|
i = t.syncModel(),
|
|
r = this.timeScale();
|
|
if (i)
|
|
for (const n of e) {
|
|
if (!n.isSynchronizable()) continue;
|
|
const e = n.linkKey().value() || Object(xe.randomHash)();
|
|
n.linkKey().setValue(e);
|
|
const o = n.state(!1),
|
|
a = n.normalizedPoints(),
|
|
l = n.properties().interval.value(),
|
|
c = t.interval();
|
|
let h;
|
|
if ($.Interval.isEqual(l, c)) h = a.map(e => {
|
|
const t = Object(s.ensureNotNull)(r.timePointToIndex(e
|
|
.time_t)) + e.offset;
|
|
return {
|
|
price: e.price,
|
|
timeStamp: Object(s.ensureNotNull)(this.model()
|
|
.externalTimeStamp(t))
|
|
}
|
|
});
|
|
else {
|
|
const e = i.createNewModelWithResolution(l);
|
|
h = a.map(t => ({
|
|
price: t.price,
|
|
timeStamp: 0 === t.offset ? t.time_t : e
|
|
.projectTime(t.time_t, t.offset)
|
|
}))
|
|
}
|
|
const u = {
|
|
...o,
|
|
linkKey: e,
|
|
points: h,
|
|
linetool: n.getType(),
|
|
model: this.model(),
|
|
symbol: t.symbol(),
|
|
finalState: {
|
|
points: a,
|
|
interval: l
|
|
}
|
|
};
|
|
n.isFixed() && (u.pointPositionPercents = n.calcPositionPercents()),
|
|
Object(ce.copyLineTool)(u)
|
|
}
|
|
}
|
|
addPaneStretchFactorUndoCommand(e, t, i, s) {
|
|
const r = new Re(this.model(), e, t, i, s);
|
|
this._pushUndoCommand(r)
|
|
}
|
|
moveSelectedToolsLeft() {
|
|
return this._moveSelectedTools(2)
|
|
}
|
|
moveSelectedToolsUp() {
|
|
return this._moveSelectedTools(0)
|
|
}
|
|
moveSelectedToolsRight() {
|
|
return this._moveSelectedTools(3)
|
|
}
|
|
moveSelectedToolsDown() {
|
|
return this._moveSelectedTools(1)
|
|
}
|
|
insertStudyWithoutCheck(e, t) {
|
|
return this._insertStudy(e, t, {}, !1, void 0, void 0, void 0, void 0, void 0,
|
|
null, void 0)
|
|
}
|
|
saveLineToolState(e, t) {
|
|
this._pushUndoCommand(new w(this.m_model, [e], t))
|
|
}
|
|
resetScales() {
|
|
this.beginUndoMacro("Reset scales"), this.resetTimeScale();
|
|
for (const e of this.m_model.panes()) {
|
|
for (const t of e.leftPriceScales()) this.resetPriceScale(e, t);
|
|
for (const t of e.rightPriceScales()) this.resetPriceScale(e, t)
|
|
}
|
|
this.endUndoMacro(), this.m_model.recalculateAllPanes()
|
|
}
|
|
_mergeUnmergeSource(e, t) {
|
|
this.beginUndoMacro(t.text());
|
|
const i = Object(s.ensureNotNull)(this._model().paneForSource(e)),
|
|
r = new Set(i.sourcesByGroup().lineSources().filter(t => t.ownerSource() ===
|
|
e));
|
|
this._model().lineToolsGroupModel().groups().filter(e => {
|
|
const t = e.lineTools().some(e => r.has(e)),
|
|
i = e.lineTools().some(e => !r.has(e));
|
|
return t && i
|
|
}).forEach(e => {
|
|
this._pushUndoCommand(new S.a(this._model(), e, e.lineTools()))
|
|
}), this._pushUndoCommand(t), this.endUndoMacro()
|
|
}
|
|
_insertStudy(e, t, i, r, n, o, a, l, c, h, u) {
|
|
const d = "Insert " + e.description;
|
|
this.beginUndoMacro(d);
|
|
const p = new Fe(this.model(), e, t, i, r, n, o, a, l, c, h || null, d);
|
|
this._pushUndoCommand(p);
|
|
const _ = p.insertedStudy();
|
|
if (void 0 !== u) {
|
|
const e = new We.SetPriceScaleModeCommand(u, Object(s.ensureNotNull)(_
|
|
.priceScale()), "", this.model());
|
|
this._pushUndoCommand(e)
|
|
}
|
|
return this.endUndoMacro(), _
|
|
}
|
|
async _processSpecialLineToolsContents(e, t, i) {
|
|
0
|
|
}
|
|
_insertAfterOrBefore(e, t, i, r) {
|
|
const n = Object(s.ensureNotNull)(this._model().paneForSource(i));
|
|
if (t.some(e => Object(g.isLineTool)(e) && this._model().paneForSource(e) !==
|
|
n)) throw new Error(
|
|
"Cannot insert line tool after target on another pane");
|
|
this.beginUndoMacro(e), t.forEach(e => {
|
|
Object(s.ensureNotNull)(this.model().paneForSource(e)) !== n && this
|
|
.mergeToPane(e, n)
|
|
});
|
|
const o = r();
|
|
this._pushUndoCommand(o), this.emitEvent("changeZOrder", [t]), this
|
|
.endUndoMacro()
|
|
}
|
|
_sendBackOrBringForward(e, t, i) {
|
|
const r = new Map;
|
|
t.forEach(e => {
|
|
const t = Object(s.ensureNotNull)(this._model().paneForSource(e)),
|
|
i = r.get(t) || [];
|
|
i.push(e), r.set(t, i)
|
|
}), this.beginUndoMacro(e), r.forEach((e, t) => {
|
|
this._pushUndoCommand(i(t, e))
|
|
}), this.endUndoMacro(), this.emitEvent("changeZOrder", [t])
|
|
}
|
|
_moveSelectedTools(e) {
|
|
const t = this.model().selection().lineDataSources();
|
|
if (0 === t.length) return !1;
|
|
if (Object(ce.lockDrawings)().value()) return !0;
|
|
const i = this.timeScale().visibleBarsStrictRange();
|
|
if (null === i) return !1;
|
|
const s = function(e) {
|
|
const t = new Map;
|
|
for (const i of e) {
|
|
const e = i.ownerSource();
|
|
if (null === e) continue;
|
|
let s = t.get(e);
|
|
if (void 0 === s) {
|
|
const i = e.priceScale(),
|
|
r = e.priceStep(),
|
|
n = e.firstValue();
|
|
if (null === i || null === r || null === n) continue;
|
|
const o = i.priceRange();
|
|
if (null === o) continue;
|
|
s = {
|
|
sources: [],
|
|
priceScale: i,
|
|
priceStep: r,
|
|
startPrice: o.minValue(),
|
|
firstValue: n
|
|
}, t.set(e, s)
|
|
}
|
|
s.sources.push(i)
|
|
}
|
|
return t
|
|
}(t);
|
|
if (0 === s.size) return !1;
|
|
this.beginUndoMacro(window.t("Move Drawing(s)"));
|
|
const n = i.firstBar(),
|
|
o = this.timeScale().indexToCoordinate(n),
|
|
a = n + (3 === e ? 1 : 2 === e ? -1 : 0),
|
|
l = this.timeScale().indexToCoordinate(a);
|
|
return ce.isDirectionalMovementActive.setValue(!0), s.forEach(t => {
|
|
const {
|
|
startPrice: i,
|
|
priceStep: s,
|
|
priceScale: c,
|
|
firstValue: h
|
|
} = t, u = i + (0 === e ? s : 1 === e ? -s : 0), d = c
|
|
.priceToCoordinate(i, h), p = c.priceToCoordinate(u, h), _ = {
|
|
logical: {
|
|
index: n,
|
|
price: i
|
|
},
|
|
screen: new r.Point(o, d)
|
|
}, m = {
|
|
logical: {
|
|
index: a,
|
|
price: u
|
|
},
|
|
screen: new r.Point(l, p)
|
|
};
|
|
this.startMovingSources(t.sources, _, null), this.moveSources(m),
|
|
this.endMovingSource(!1)
|
|
}), ce.isDirectionalMovementActive.setValue(!1), this.endUndoMacro(), !0
|
|
}
|
|
_restoreStudyFactoryDefaults(e) {
|
|
const t = new Qe(this.m_model, e.properties());
|
|
this._pushUndoCommand(t)
|
|
}
|
|
_restoreLineToolFactoryDefaults(e) {
|
|
const t = "Load default drawing template";
|
|
this.beginUndoMacro(t), this.saveLineToolState(e, t);
|
|
const i = new Qe(this.m_model, e.properties(), t);
|
|
this._pushUndoCommand(i), this.saveLineToolState(e, t), this.endUndoMacro(),
|
|
this.model().updateSource(e)
|
|
}
|
|
}
|
|
},
|
|
opke: function(e, t) {
|
|
e.exports =
|
|
'<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28"><path fill="currentcolor" d="m13.5 5a1 1 0 0 0 0 19 1 1 0 0 0 0-19m0 1a1 1 0 0 1 0 17 1 1 0 0 1 0-17zm2.31-.6A9.5 9.5 0 0 0 9 14.5a9.5 9.5 0 0 0 6.81 9.1l.99-.78A8.5 8.5 0 0 1 10 14.5a8.5 8.5 0 0 1 6.8-8.32"/></svg>'
|
|
},
|
|
p1SQ: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineToolHorzLinePriceAxisView", (function() {
|
|
return r
|
|
}));
|
|
var s = i("KcY8");
|
|
class r extends s.a {
|
|
constructor(e) {
|
|
super(), this._source = e
|
|
}
|
|
_updateRendererData(e, t, i) {
|
|
e.visible = !1;
|
|
const s = this._source.points(),
|
|
r = this._source.priceScale();
|
|
if (0 === s.length || null === r || r.isEmpty()) return;
|
|
const n = s[0];
|
|
if (!isFinite(n.price)) return;
|
|
const o = this._source.ownerSource(),
|
|
a = null !== o ? o.firstValue() : null;
|
|
if (null === a) return;
|
|
const l = this._source.properties().linecolor.value();
|
|
i.background = l, i.textColor = this.generateTextColor(l), i.coordinate = r
|
|
.priceToCoordinate(n.price, a), e.text = r.formatPrice(n.price, a), e
|
|
.visible = !0
|
|
}
|
|
}
|
|
},
|
|
pJOz: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "drawCircle", (function() {
|
|
return h
|
|
})), i.d(t, "drawArrow", (function() {
|
|
return u
|
|
})), i.d(t, "TrendLineRenderer", (function() {
|
|
return d
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("GEp6"),
|
|
n = i("a7Ha"),
|
|
o = i("VdBB"),
|
|
a = i("jFln"),
|
|
l = i("Zp/P"),
|
|
c = i("gAom");
|
|
|
|
function h(e, t, i, s, r) {
|
|
t.save(), t.fillStyle = "#000000", t.beginPath(), t.arc(e.x * r, e.y * r, i * r, 0, 2 * Math
|
|
.PI, !1), t.fill(), s.strokeWidth && (t.lineWidth = s.strokeWidth, t.stroke()), t
|
|
.restore()
|
|
}
|
|
|
|
function u(e, t, i, s, r) {
|
|
if (t.subtract(e).length() < 1) return;
|
|
const n = Object(l.getArrowPoints)(e, t, s, !1);
|
|
for (let e = 0; e < n.length; ++e) {
|
|
const t = n[e][0],
|
|
s = n[e][1];
|
|
Object(a.drawLine)(i, t.x * r, t.y * r, s.x * r, s.y * r)
|
|
}
|
|
}
|
|
class d {
|
|
constructor() {
|
|
this._data = null, this._hittest = new o.HitTestResult(o.HitTestResult.MOVEPOINT)
|
|
}
|
|
setData(e) {
|
|
this._data = e
|
|
}
|
|
setHitTest(e) {
|
|
this._hittest = e
|
|
}
|
|
draw(e, t) {
|
|
const i = this._data;
|
|
if (null === i) return;
|
|
if ("points" in i && i.points.length < 2) return;
|
|
if ("floatPoints" in i && i.floatPoints.length < 2) return;
|
|
const s = t.pixelRatio;
|
|
e.lineCap = "butt", e.strokeStyle = i.color, e.lineWidth = Math.max(1, Math.floor(i
|
|
.linewidth * s)), Object(a.setLineStyle)(e, i.linestyle);
|
|
const r = "floatPoints" in i ? i.floatPoints : i.points,
|
|
n = r[0],
|
|
o = r[1];
|
|
let l = [];
|
|
i.overlayLineEndings ? l = [n.clone(), o.clone()] : this._drawEnds(e, [n, o], i
|
|
.linewidth, s);
|
|
const h = this._extendAndClipLineSegment(n, o, t);
|
|
null !== h && i.linewidth > 0 && (h[0].x === h[1].x ? Object(c.drawVerticalLine)(e,
|
|
Math.round(h[0].x * s), h[0].y * s, h[1].y * s) : h[0].y === h[1].y ?
|
|
Object(c.drawHorizontalLine)(e, Math.round(h[0].y * s), h[0].x * s, h[1].x *
|
|
s) : Object(a.drawLine)(e, h[0].x * s, h[0].y * s, h[1].x * s, h[1].y *
|
|
s)), i.overlayLineEndings && this._drawEnds(e, l, i.linewidth, s)
|
|
}
|
|
hitTest(e, t) {
|
|
const i = this._data;
|
|
if (null === i) return null;
|
|
if ("points" in i && i.points.length < 2) return null;
|
|
if ("floatPoints" in i && i.floatPoints.length < 2) return null;
|
|
const s = Object(l.interactionTolerance)().line,
|
|
n = "floatPoints" in i ? i.floatPoints : i.points,
|
|
o = n[0],
|
|
a = n[1],
|
|
c = this._extendAndClipLineSegment(o, a, t);
|
|
if (null !== c) {
|
|
if (Object(r.distanceToSegment)(c[0], c[1], e).distance <= s) return this
|
|
._hittest
|
|
}
|
|
return null
|
|
}
|
|
_extendAndClipLineSegment(e, t, i) {
|
|
const r = Object(s.ensureNotNull)(this._data);
|
|
return Object(l.extendAndClipLineSegment)(e, t, i.cssWidth, i.cssHeight, r
|
|
.extendleft, r.extendright)
|
|
}
|
|
_drawEnds(e, t, i, r) {
|
|
const o = t[0],
|
|
a = t[1],
|
|
l = Object(s.ensureNotNull)(this._data);
|
|
switch (l.leftend) {
|
|
case n.LineEnd.Arrow:
|
|
u(a, o, e, i, r);
|
|
break;
|
|
case n.LineEnd.Circle:
|
|
h(o, e, i, Object(s.ensureDefined)(l.endstyle), r)
|
|
}
|
|
switch (l.rightend) {
|
|
case n.LineEnd.Arrow:
|
|
u(o, a, e, i, r);
|
|
break;
|
|
case n.LineEnd.Circle:
|
|
h(a, e, i, Object(s.ensureDefined)(l.endstyle), r)
|
|
}
|
|
}
|
|
}
|
|
},
|
|
pKDv: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineToolABCD", (function() {
|
|
return a
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("Ocx9"),
|
|
n = i("Ss5c"),
|
|
o = i("j3hX");
|
|
class a extends n.LineDataSource {
|
|
constructor(e, t) {
|
|
const s = t || a.createProperties();
|
|
super(e, s), i.e("lt-pane-views").then(i.bind(null, "bFMU")).then(t => {
|
|
this._setPaneViews([new t.ABCDPaneView(this, e)])
|
|
})
|
|
}
|
|
pointsCount() {
|
|
return 4
|
|
}
|
|
name() {
|
|
return "ABCD Pattern"
|
|
}
|
|
properties() {
|
|
return super.properties()
|
|
}
|
|
static createProperties(e) {
|
|
const t = new r.DefaultProperty("linetoolabcd", e);
|
|
return a._configureProperties(t), t
|
|
}
|
|
_getPropertyDefinitionsViewModelClass() {
|
|
return Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "aMeN")).then(
|
|
e => e.PatternWithoutBackgroundDefinitionsViewModel)
|
|
}
|
|
static _configureProperties(e) {
|
|
n.LineDataSource._configureProperties(e), e.addChild("linesColors", new o
|
|
.LineToolColorsProperty([Object(s.ensureDefined)(e.child("color"))])), e
|
|
.addChild("textsColors", new o.LineToolColorsProperty([Object(s
|
|
.ensureDefined)(e.child("textcolor"))]))
|
|
}
|
|
}
|
|
},
|
|
pOzK: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "SetPriceScaleModeCommand", (function() {
|
|
return n
|
|
}));
|
|
var s = i("Ocx9"),
|
|
r = i("RDU5");
|
|
class n extends r.UndoCommand {
|
|
constructor(e, t, i, s) {
|
|
super(i), this._newMode = e, this._priceScaleId = t.id(), this._model = s, this
|
|
._oldMode = t.mode()
|
|
}
|
|
redo() {
|
|
this._applyMode(this._newMode)
|
|
}
|
|
undo() {
|
|
this._applyMode(this._oldMode)
|
|
}
|
|
_applyMode(e) {
|
|
const t = this._findPriceScaleById();
|
|
null !== t && (Object(s.saveDefaultProperties)(!0), t.setMode(e), Object(s
|
|
.saveDefaultProperties)(!1), this._model && (this._model
|
|
.recalculateAllPanes(), this._model.lightUpdate()))
|
|
}
|
|
_findPriceScaleById() {
|
|
const e = this._model.panes();
|
|
for (let t = 0; t < e.length; t++) {
|
|
const i = e[t].getPriceScaleById(this._priceScaleId);
|
|
if (null !== i) return i
|
|
}
|
|
return null
|
|
}
|
|
}
|
|
},
|
|
pPtI: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "normalizeIntervalString", (function() {
|
|
return _
|
|
})), i.d(t, "isAvailable", (function() {
|
|
return m
|
|
})), i.d(t, "setLastUsedResolution", (function() {
|
|
return f
|
|
})), i.d(t, "getRangeResolution", (function() {
|
|
return g
|
|
})), i.d(t, "getTimeBasedResolution", (function() {
|
|
return b
|
|
})), i.d(t, "getDefaultResolution", (function() {
|
|
return v
|
|
})), i.d(t, "getResolutionByChartStyle", (function() {
|
|
return S
|
|
})), i.d(t, "getServerInterval", (function() {
|
|
return y
|
|
})), i.d(t, "isResolutionMultiplierValid", (function() {
|
|
return w
|
|
})), i.d(t, "getMaxResolutionValue", (function() {
|
|
return C
|
|
})), i.d(t, "getResolutionsFromSettings", (function() {
|
|
return x
|
|
})), i.d(t, "convertResolutionsFromSettings", (function() {
|
|
return T
|
|
})), i.d(t, "mergeResolutions", (function() {
|
|
return I
|
|
})), i.d(t, "sortResolutions", (function() {
|
|
return M
|
|
})), i.d(t, "getCustomResolutions", (function() {
|
|
return A
|
|
})), i.d(t, "getTranslatedResolution", (function() {
|
|
return E
|
|
})), i.d(t, "getTranslatedResolutionModel", (function() {
|
|
return k
|
|
})), i.d(t, "isSecondsEnabled", (function() {
|
|
return V
|
|
})), i.d(t, "isTicksEnabled", (function() {
|
|
return B
|
|
}));
|
|
i("bSeV"), i("YFKU");
|
|
var s = i("LxhU"),
|
|
r = i("n5al"),
|
|
n = i("Vdly"),
|
|
o = i("PT1i"),
|
|
a = i("L6rT"),
|
|
l = i("ogJP"),
|
|
c = i("Kxc7"),
|
|
h = i.n(c);
|
|
const u = {
|
|
[s.ResolutionKind.Ticks]: 1,
|
|
[s.ResolutionKind.Seconds]: 60,
|
|
[s.ResolutionKind.Minutes]: 1440,
|
|
[s.SpecialResolutionKind.Hours]: 24,
|
|
[s.ResolutionKind.Days]: 365,
|
|
[s.ResolutionKind.Weeks]: 52,
|
|
[s.ResolutionKind.Months]: 12,
|
|
[s.ResolutionKind.Range]: 1e6,
|
|
[s.ResolutionKind.Invalid]: NaN
|
|
},
|
|
d = {
|
|
[s.ResolutionKind.Ticks]: 0,
|
|
[s.ResolutionKind.Seconds]: 1,
|
|
[s.ResolutionKind.Minutes]: 2,
|
|
[s.SpecialResolutionKind.Hours]: 3,
|
|
[s.ResolutionKind.Days]: 4,
|
|
[s.ResolutionKind.Weeks]: 5,
|
|
[s.ResolutionKind.Months]: 6,
|
|
[s.ResolutionKind.Range]: 7,
|
|
[s.ResolutionKind.Invalid]: 8
|
|
},
|
|
p = {
|
|
[s.ResolutionKind.Invalid]: "",
|
|
[s.ResolutionKind.Ticks]: window.t("T", {
|
|
context: "interval_short"
|
|
}),
|
|
[s.ResolutionKind.Seconds]: window.t("s", {
|
|
context: "interval_short"
|
|
}),
|
|
[s.ResolutionKind.Minutes]: window.t("m", {
|
|
context: "interval_short"
|
|
}),
|
|
[s.SpecialResolutionKind.Hours]: window.t("h", {
|
|
context: "interval_short"
|
|
}),
|
|
[s.ResolutionKind.Days]: window.t("D", {
|
|
context: "interval_short"
|
|
}),
|
|
[s.ResolutionKind.Weeks]: window.t("W", {
|
|
context: "interval_short"
|
|
}),
|
|
[s.ResolutionKind.Months]: window.t("M", {
|
|
context: "interval_short"
|
|
}),
|
|
[s.ResolutionKind.Range]: window.t("R", {
|
|
context: "interval_short"
|
|
})
|
|
};
|
|
|
|
function _(e) {
|
|
return s.Interval.parse(e).value()
|
|
}
|
|
|
|
function m(e) {
|
|
const t = s.Interval.parse(e);
|
|
if (!V() && t.isSeconds()) return !1;
|
|
if (!B() && t.isTicks()) return !1;
|
|
const i = t.value(),
|
|
r = o.linking.supportedResolutions.value();
|
|
return void 0 !== r ? void 0 !== r.find(e => _(e) === i) : t.isSeconds() ? Boolean(o.linking
|
|
.seconds.value()) : t.isTicks() ? Boolean(o.linking.ticks.value()) : t
|
|
.isIntraday() ? Boolean(o.linking.intraday.value()) : t.isDWM()
|
|
}
|
|
|
|
function f(e) {
|
|
s.Interval.isValid(e) && (s.Interval.isRange(e) ? n.setValue(
|
|
"chart.lastUsedRangeResolution", e) : n.setValue(
|
|
"chart.lastUsedTimeBasedResolution", e))
|
|
}
|
|
|
|
function g(e) {
|
|
const t = n.getValue("chart.lastUsedRangeResolution");
|
|
if (void 0 !== t && s.Interval.isRange(t)) return t;
|
|
let i = "100R";
|
|
for (const t of e) {
|
|
const e = s.Interval.parse(t);
|
|
if (e.isRange()) {
|
|
const t = e.value();
|
|
if ("100R" === t) return t;
|
|
i = t
|
|
}
|
|
}
|
|
return i
|
|
}
|
|
|
|
function b(e) {
|
|
const t = n.getValue("chart.lastUsedTimeBasedResolution");
|
|
if (void 0 !== t && s.Interval.isTimeBased(t)) return t;
|
|
let i = "1D";
|
|
for (const t of e) {
|
|
const e = s.Interval.parse(t);
|
|
if (e.isTimeBased()) {
|
|
const t = e.value();
|
|
if ("1D" === t) return t;
|
|
i = t
|
|
}
|
|
}
|
|
return i
|
|
}
|
|
|
|
function v(e) {
|
|
return e ? "100R" : "1D"
|
|
}
|
|
|
|
function S(e, t, i) {
|
|
const n = r.isRangeStyle(e),
|
|
o = s.Interval.isRange(t);
|
|
return !n && o ? b(i) : n && !o ? g(i) : t
|
|
}
|
|
|
|
function y(e) {
|
|
return s.Interval.isRange(e) ? "1" : e
|
|
}
|
|
|
|
function w(e) {
|
|
const t = s.Interval.parse(e),
|
|
i = P(t.kind()),
|
|
r = t.multiplier();
|
|
return t.isValid() && r <= i
|
|
}
|
|
|
|
function P(e) {
|
|
const t = u[e];
|
|
return Number.isNaN(t) ? 1 : t
|
|
}
|
|
|
|
function C(e) {
|
|
return P(s.Interval.kind(e))
|
|
}
|
|
|
|
function x(e) {
|
|
const t = T(n.getJSON(e, []));
|
|
return Object(a.uniq)(t.filter(w).map(_))
|
|
}
|
|
|
|
function T(e) {
|
|
return Array.isArray(e) ? e : Object.keys(e).map(s.Interval.normalize).filter(l.notNull)
|
|
}
|
|
|
|
function I(...e) {
|
|
let t = [].concat(...e);
|
|
return t = Object(a.uniq)(t.filter(w).map(_)), M(t)
|
|
}
|
|
|
|
function M(e) {
|
|
return e.sort(L)
|
|
}
|
|
|
|
function O(e) {
|
|
const t = s.Interval.parse(e),
|
|
i = t.multiplier() || 1;
|
|
return t.isMinuteHours() ? [s.SpecialResolutionKind.Hours, i / 60] : [t.kind(), i]
|
|
}
|
|
|
|
function L(e, t) {
|
|
const [i, s] = O(e), [r, n] = O(t);
|
|
return i !== r ? d[i] - d[r] : s - n
|
|
}
|
|
|
|
function A() {
|
|
return []
|
|
}
|
|
|
|
function E(e) {
|
|
const {
|
|
multiplier: t,
|
|
shortKind: i
|
|
} = k(e);
|
|
return `${t}${i}`
|
|
}
|
|
|
|
function k(e, t) {
|
|
const i = s.Interval.parse(e);
|
|
let r = i.multiplier(),
|
|
n = i.kind();
|
|
if (!i.isValid()) {
|
|
if (t) return null;
|
|
throw new TypeError("Can't translate invalid interval")
|
|
}
|
|
return i.isMinuteHours() && (r = Math.floor(r / 60),
|
|
n = s.SpecialResolutionKind.Hours), {
|
|
multiplier: r.toString(),
|
|
shortKind: D(n),
|
|
hint: `${r} ${D(n, r)}`,
|
|
mayOmitMultiplier: i.isDWM() && 1 === r,
|
|
mayOmitShortKind: i.isMinutes() && !i.isMinuteHours()
|
|
}
|
|
}
|
|
|
|
function D(e, t) {
|
|
if (!t) return p[e];
|
|
switch (e) {
|
|
case s.ResolutionKind.Ticks:
|
|
return window.t("tick", {
|
|
plural: "ticks",
|
|
count: t
|
|
});
|
|
case s.ResolutionKind.Days:
|
|
return window.t("day", {
|
|
plural: "days",
|
|
count: t
|
|
});
|
|
case s.ResolutionKind.Weeks:
|
|
return window.t("week", {
|
|
plural: "weeks",
|
|
count: t
|
|
});
|
|
case s.ResolutionKind.Months:
|
|
return window.t("month", {
|
|
plural: "months",
|
|
count: t
|
|
});
|
|
case s.ResolutionKind.Seconds:
|
|
return window.t("second", {
|
|
plural: "seconds",
|
|
count: t
|
|
});
|
|
case s.ResolutionKind.Minutes:
|
|
return window.t("minute", {
|
|
plural: "minutes",
|
|
count: t
|
|
});
|
|
case s.SpecialResolutionKind.Hours:
|
|
return window.t("hour", {
|
|
plural: "hours",
|
|
count: t
|
|
});
|
|
case s.ResolutionKind.Range:
|
|
return window.t("range", {
|
|
plural: "ranges",
|
|
count: t
|
|
});
|
|
default:
|
|
return e
|
|
}
|
|
}
|
|
|
|
function V() {
|
|
return h.a.enabled("seconds_resolution")
|
|
}
|
|
|
|
function B() {
|
|
return h.a.enabled("tick_resolution")
|
|
}
|
|
},
|
|
"pQ+n": function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e, t) {
|
|
const i = new Set,
|
|
s = t => {
|
|
e.children(t, !1).forEach(e => {
|
|
i.has(e) || (i.add(e), s(e))
|
|
})
|
|
};
|
|
return t.forEach(s), t.filter(e => !i.has(e)).map(t => function e(t, i) {
|
|
let s = [];
|
|
const r = t.children(i, !1);
|
|
for (let i = 0; i < r.length; i++) s = s.concat(e(t, r[i]));
|
|
return s.push(i), s
|
|
}(e, t)).reduce((e, t) => e.concat(t), [])
|
|
}
|
|
i.d(t, "a", (function() {
|
|
return s
|
|
}))
|
|
},
|
|
pZDF: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "getStudyInputsInfo", (function() {
|
|
return r
|
|
}));
|
|
var s = i("YFKU");
|
|
|
|
function r(e) {
|
|
return void 0 === e.inputs ? [] : e.inputs.map(e => ({
|
|
...e,
|
|
id: e.id,
|
|
localizedName: void 0 !== e.name ? Object(s.t)(e.name, {
|
|
context: "input"
|
|
}) : ""
|
|
}))
|
|
}
|
|
},
|
|
pvsv: function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e, t) {
|
|
Promise.all([i.e("react"), i.e(1), i.e(3), i.e("moment"), i.e(81), i.e(0), i.e(2), i.e(
|
|
"symbol-info-dialog-impl")]).then(i.t.bind(null, "1Z/g", 7)).then(i => {
|
|
i.showSymbolInfoDialog(e, t)
|
|
})
|
|
}
|
|
i.r(t), i.d(t, "showSymbolInfoDialog", (function() {
|
|
return s
|
|
}))
|
|
},
|
|
qE4g: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("hbEN"),
|
|
r = i("aO4+"),
|
|
n = i("f6yo"),
|
|
o = i("HGP3"),
|
|
a = i("Eyy1"),
|
|
l = i("YFKU"),
|
|
c = i("Kxc7"),
|
|
h = i("oV8k"),
|
|
u = i("VdBB"),
|
|
d = i("9uLv"),
|
|
p = i("Tmoa"),
|
|
_ = i("//lZ"),
|
|
m = i("gAom"),
|
|
f = i("ikwP"),
|
|
g = i("l7y7"),
|
|
b = i("zDbI"),
|
|
v = i("u+0B");
|
|
i("Oy0l");
|
|
const S = c.enabled("adaptive_logo"),
|
|
y = c.enabled("small_no_display"),
|
|
w = c.enabled("38914"),
|
|
P = "Ch{0}ar{1}t{2}by{3}{4}".format("", "", " ", " ", "TradingView"),
|
|
C = "po{0}wer{1}ed{2}by{3}{4}".format("", "", " ", " ", "TradingView"),
|
|
x = "by{3}{4}".format("", "", " ", " ", "TradingView"),
|
|
T = w ? x : C,
|
|
I = navigator.userAgent.toLowerCase().indexOf("chrome") > -1 && -1 === navigator.userAgent
|
|
.toLowerCase().indexOf("edge"),
|
|
M = window.urlParams || {};
|
|
window.initData;
|
|
M.no_referral_id && enable(M.referral_id || "", "aggressive");
|
|
Object(l.t)("By TradingView"), Object(l.t)("{symbol} financials by TradingView"), Object(l.t)(
|
|
"More features on tradingview.com"), Object(l.t)("powered by");
|
|
const O = Object(l.t)(P),
|
|
L = Object(l.t)(T);
|
|
|
|
function A(e) {
|
|
return "px EuclidCircular" === e ? .1 : 0
|
|
}
|
|
class E extends h.a {
|
|
constructor(e, t, i, r) {
|
|
super(e, t), this._canvasWidth = 0, this._paneHeight = 0, this._left = 13, this
|
|
._bottom = 16, this._layout = "site_branding", this._needToShow = !0,
|
|
this._showBranding = !1, this._customLogoSrc = "", this._customLogoLink =
|
|
"", this._cubicBezier = new d.a(.4, .01, .22, 1), this._openAnimation =
|
|
null, this._closeAnimation = null, this._powBy = null, this._custom = null,
|
|
this._mainSeries = this._model.mainSeries(), this._showAllowance = i, this
|
|
._showForPro = Boolean(r), this._checkLayout(), "widget_custom_branding" !==
|
|
this._layout && "fundamental_custom_branding" !== this._layout || (this
|
|
._left = 8, this._bottom = 5);
|
|
const n = () => {
|
|
this._needToShow ? this._showBranding = !0 : this._showBranding = !1
|
|
};
|
|
this._resizeHandlerDelayed = Object(s.default)(n, 200), n(), window
|
|
.addEventListener("resize", this._resizeHandlerDelayed), this
|
|
._monitorCanvas = Object(f.createDisconnectedBoundCanvas)(document, new f
|
|
.Size(0, 0)), this._monitorCanvas.subscribeCanvasConfigured(() => {
|
|
this._init()
|
|
}), this._model.isSnapshot() ? this._init() : (this._mainSeries.dataEvents()
|
|
.symbolResolved().subscribe(this, this._init), null !== this._mainSeries
|
|
.symbolInfo() && this._init()), this._renderer = {
|
|
draw: this.draw.bind(this),
|
|
hitTest: this.hitTest.bind(this)
|
|
}
|
|
}
|
|
destroy() {
|
|
window.removeEventListener("resize", this._resizeHandlerDelayed), this
|
|
._mainSeries.dataEvents().symbolResolved().unsubscribeAll(this), this
|
|
._powBy && this._powBy.destroy()
|
|
}
|
|
paneViews(e) {
|
|
if (window.TradingView.printing) return [];
|
|
if (!this._showAllowance()) return [];
|
|
if ("site_branding" === this._layout && !this._showForPro && window.user &&
|
|
window.user.is_pro) return [];
|
|
const t = c.enabled("move_logo_to_main_pane");
|
|
return t && e.isMainPane() || !t && e.isLast() || e.isMaximized() ? [{
|
|
renderer: this.renderer.bind(this)
|
|
}] : []
|
|
}
|
|
labelPaneViews(e) {
|
|
return []
|
|
}
|
|
priceAxisViews(e, t) {
|
|
return []
|
|
}
|
|
updateAllViews() {}
|
|
updateViewsForPane(e) {}
|
|
priceScale() {
|
|
return null
|
|
}
|
|
renderer(e, t) {
|
|
return this._paneHeight = e, this._canvasWidth = t, this._renderer
|
|
}
|
|
hasContextMenu() {
|
|
return !1
|
|
}
|
|
onClickOutside() {
|
|
this._hasAnimation() && this._startCloseAnimation()
|
|
}
|
|
hitTest(e) {
|
|
return !this._showBranding || c.enabled("logo_without_link") ? null : this
|
|
._powBy && "widget_custom_no_powered_branding" !== this._layout &&
|
|
"fundamental_custom_no_powered_branding" !== this._layout && (this._powBy
|
|
.hitTest(e) || this._custom && this._custom.hitTest(e)) ? new u
|
|
.HitTestResult(u.HitTestResult.CUSTOM, {
|
|
hideCrosshairLinesOnHover: !0,
|
|
clickHandler: () => {
|
|
this._openLink()
|
|
},
|
|
tapHandler: () => {
|
|
this._hasAnimation() ? this
|
|
._toggleOpenAnimatedOrOpenLink() : this._openLink()
|
|
},
|
|
mouseEnterHandler: () => {
|
|
this._hasAnimation() && this._startOpenAnimation()
|
|
},
|
|
mouseLeaveHandler: () => {
|
|
this._hasAnimation() && this._startCloseAnimation()
|
|
}
|
|
}) : null
|
|
}
|
|
tvUrl() {
|
|
let e = new URL("https://www.tradingview.com/");
|
|
if (this._customLogoLink) return this._customLogoLink;
|
|
if ("library_branding" === this._layout || "library_custom_branding" === this
|
|
._layout) {
|
|
let t;
|
|
switch (!0) {
|
|
case c.enabled("charting_library"):
|
|
t = "library";
|
|
break;
|
|
case c.enabled("trading_terminal"):
|
|
t = "trading-terminal"
|
|
}
|
|
return e.searchParams.append("utm_source", window.location.origin), e
|
|
.searchParams.append("utm_medium", "library"), t && e.searchParams
|
|
.append("utm_campaign", t), e.toString()
|
|
}
|
|
return e.toString()
|
|
}
|
|
draw(e, t) {
|
|
if (!this._showBranding) return;
|
|
let i = 0;
|
|
M.utm = !0, Object(f.drawScaled)(e, t.pixelRatio, () => {
|
|
this._powBy && this._powBy.show && (i = this._powBy.height,
|
|
e.save(), e.translate(this._left, this._paneHeight - this
|
|
._bottom - i), this._powBy.draw(e, t, this
|
|
._canvasWidth), e.restore()), this._custom && this
|
|
._custom
|
|
.show && (e.save(), e.translate(this._left, this._paneHeight -
|
|
this._bottom - i - this._custom.height), this._custom
|
|
.draw(e, t), e.restore())
|
|
})
|
|
}
|
|
_init() {
|
|
const e = this._mainSeries.symbolInfo();
|
|
this._powBy && this._powBy.destroy(), this._powBy = new F(this._layout, (null ==
|
|
e ? void 0 : e.name) || "", this._model, () => this._model
|
|
.fullUpdate()), this._custom = new W(this._layout, this._customLogoSrc,
|
|
() => this._model.fullUpdate()), this._openAnimation = null, this
|
|
._closeAnimation = null
|
|
}
|
|
_checkLayout() {
|
|
if (c.enabled("widget")) 0;
|
|
else if (c.enabled("charting_library") || c.enabled("trading_terminal")) {
|
|
const e = JSON.parse(M.logo) || {};
|
|
e.image ? (this._customLogoSrc = e.image, this._customLogoLink = e.link,
|
|
this._needToShow = c.enabled("widget_logo"), c.enabled(
|
|
"link_to_tradingview") ? this._layout =
|
|
"library_custom_branding" : this._layout =
|
|
"library_custom_no_powered_branding") : (this._layout =
|
|
"library_branding", this._needToShow = c.enabled("widget_logo"))
|
|
} else this._layout = "site_branding"
|
|
}
|
|
_startOpenAnimation() {
|
|
null === this._openAnimation && (null !== this._closeAnimation && (this
|
|
._closeAnimation.stop(), this._closeAnimation = null), this
|
|
._openAnimation = Object(_.doAnimate)({
|
|
from: this._currentStateForAnimation(),
|
|
to: this._openedStateForAnimation(),
|
|
duration: 200,
|
|
easing: this._cubicBezier.easingFunc,
|
|
onStep: this._animatedDrawStep.bind(this)
|
|
}))
|
|
}
|
|
_startCloseAnimation() {
|
|
null === this._closeAnimation && (null !== this._openAnimation && (this
|
|
._openAnimation.stop(), this._openAnimation = null), this
|
|
._closeAnimation = Object(_.doAnimate)({
|
|
from: this._currentStateForAnimation(),
|
|
to: this._closedStateForAnimation(),
|
|
duration: 200,
|
|
easing: this._cubicBezier.easingFunc,
|
|
onStep: this._animatedDrawStep.bind(this)
|
|
}))
|
|
}
|
|
_currentStateForAnimation() {
|
|
return Object(a.ensureNotNull)(this._powBy).width
|
|
}
|
|
_closedStateForAnimation() {
|
|
return Object(a.ensureNotNull)(this._powBy).minimizedAnimationWidth()
|
|
}
|
|
_openedStateForAnimation() {
|
|
return Object(a.ensureNotNull)(this._powBy).maximizedAnimationWidth()
|
|
}
|
|
_animatedDrawStep(e, t) {
|
|
Object(a.ensureNotNull)(this._powBy).animatedDrawStep(e, t), this._model
|
|
.lightUpdate()
|
|
}
|
|
_hasAnimation() {
|
|
return null !== this._powBy && this._powBy.hasAnimation()
|
|
}
|
|
_openLink() {
|
|
if ("site_branding" === this._layout) return !1;
|
|
c.enabled("widget");
|
|
return Object(a.ensureNotNull)(window.open(this.tvUrl(), "_blank")).opener =
|
|
null, !0
|
|
}
|
|
_toggleOpenAnimatedOrOpenLink() {
|
|
null !== this._openAnimation && this._openAnimation.completed() ? this
|
|
._openLink() || this._startCloseAnimation() : this._startOpenAnimation()
|
|
}
|
|
}
|
|
|
|
function k(e) {
|
|
return !S || e > 500
|
|
}
|
|
const D = {
|
|
customBrandingTradingViewText: o.colorsPalette["color-brand"],
|
|
customBrandingText: o.colorsPalette["color-cold-gray-850"],
|
|
background: o.colorsPalette["color-cold-gray-900"],
|
|
shadow: Object(p.generateColor)(o.colorsPalette["color-white"], 91),
|
|
text: o.colorsPalette["color-white"],
|
|
staticTextBackground: Object(p.generateColor)(o.colorsPalette["color-cold-gray-800"],
|
|
20),
|
|
logo: o.colorsPalette["color-white"]
|
|
},
|
|
V = {
|
|
customBrandingTradingViewText: o.colorsPalette["color-brand"],
|
|
customBrandingText: o.colorsPalette["color-cold-gray-850"],
|
|
background: o.colorsPalette["color-white"],
|
|
shadow: Object(p.generateColor)(o.colorsPalette["color-black"], 91),
|
|
text: o.colorsPalette["color-cold-gray-900"],
|
|
staticTextBackground: Object(p.generateColor)(o.colorsPalette["color-white"], 20),
|
|
logo: o.colorsPalette["color-cold-gray-900"]
|
|
};
|
|
const B = {};
|
|
|
|
function R(e, t) {
|
|
const i = B[e];
|
|
if (void 0 !== i) return i.image || null;
|
|
const s = {};
|
|
return B[e] = s,
|
|
function(e) {
|
|
return new Promise(t => {
|
|
const i = g.replace(/fill="#[\da-f]{6}"/i, `fill="${e}"`),
|
|
s = new Image;
|
|
s.onload = () => {
|
|
s.onload = null, t(s)
|
|
}, s.src = URL.createObjectURL(new Blob([i], {
|
|
type: "image/svg+xml"
|
|
}))
|
|
})
|
|
}(e).then(e => {
|
|
s.image = e, t()
|
|
}), null
|
|
}
|
|
|
|
function N(e) {
|
|
const {
|
|
a: t,
|
|
d: i,
|
|
e: s,
|
|
f: n
|
|
} = e;
|
|
return new r.Point(s / t, n / i)
|
|
}
|
|
class j {
|
|
constructor() {
|
|
this._originPoint = null
|
|
}
|
|
hitTest(e) {
|
|
const t = this._getHitTestBox();
|
|
if (t) return Object(n.pointInBox)(e, t)
|
|
}
|
|
_getHitTestBox() {
|
|
const e = this._originPoint;
|
|
if (e) {
|
|
const {
|
|
x: t,
|
|
y: i
|
|
} = e;
|
|
return Object(r.box)(e, new r.Point(t + this.width, i + this.height))
|
|
}
|
|
}
|
|
}
|
|
class F extends j {
|
|
constructor(e, t, i, s) {
|
|
if (super(), this.show = !0, this.borderRadius = 0, this._needDisplayImage = !1,
|
|
this._imageWidth = 22, this._imageHeight = 11, this._animatedWidth = 32, this
|
|
._font = "px " + b.CHART_FONT_FAMILY, this._txt = "TradingView", this
|
|
._textWidth = 0, this._maximizedAnimationTextWidth = 0, this._textWidthCache =
|
|
new v.TextWidthCache, this._pixelRatio = 1, this._model = i, this._layout = e,
|
|
this._symbol = t, this.showAnimatedBranding = c.enabled("show_animated_logo") ||
|
|
"widget_branding" === this._layout, this._fontSize = this.showAnimatedBranding ?
|
|
11 : 14, this.showAnimatedBranding || "widget_custom_branding" !== this
|
|
._layout && "fundamental_custom_branding" !== this._layout || (this._fontSize =
|
|
12), this.width = 32, this.height = this._fontSize + 2, this
|
|
._onReadyCallback = s, this._init(), document.fonts && document.fonts.check &&
|
|
document.fonts.load) {
|
|
document.fonts.check(this._fontSize + "px EuclidCircular") ? this._font =
|
|
"px EuclidCircular" : document.fonts.load(this._fontSize +
|
|
"px EuclidCircular", this._txt).then(() => {
|
|
this._font = "px EuclidCircular", this._recalculateMetrics()
|
|
})
|
|
}
|
|
this._recalculateMetrics()
|
|
}
|
|
destroy() {
|
|
this._model.properties().paneProperties.background.unsubscribeAll(this), this._model
|
|
.onChartThemeLoaded().unsubscribeAll(this)
|
|
}
|
|
hasAnimation() {
|
|
return this.showAnimatedBranding
|
|
}
|
|
minimizedAnimationWidth() {
|
|
return 32
|
|
}
|
|
maximizedAnimationWidth() {
|
|
return this._maximizedAnimationTextWidth + 32 - 3
|
|
}
|
|
animatedDrawStep(e, t) {
|
|
this._animatedWidth = t
|
|
}
|
|
draw(e, t, i) {
|
|
t.pixelRatio !== this._pixelRatio && (this._textWidthCache.reset(), this
|
|
._pixelRatio = t.pixelRatio);
|
|
const s = this._colors;
|
|
if (this.showAnimatedBranding) this._needDisplayImage && null !== this
|
|
._getLogoImage(s.logo) && (e.save(), e.translate(-Math.ceil((32 - this
|
|
._imageWidth) / 2), Math.floor((32 - this._imageHeight) / 2)), this
|
|
._originPoint = N(e.getTransform()), this.borderRadius = 16, this
|
|
._drawFillRectWithRoundedCorner(e, -.5, 0, this._animatedWidth, 32, this
|
|
.borderRadius), this._drawLogoImage(e, Math.round((32 - this
|
|
._imageWidth) / 2), Math.round((32 - this._imageHeight) / 2) + 0), this
|
|
._animatedWidth > 32 && (e.translate(Math.round(32), Math.round(this
|
|
._fontSize * A(this._font))),
|
|
this._drawFillTextCropWidth(e, this._animatedWidth - 32)), e.restore(),
|
|
this.width = this._animatedWidth);
|
|
else if ("widget_custom_branding" === this._layout ||
|
|
"fundamental_custom_branding" === this._layout) {
|
|
e.font = this._fontSize + this._font;
|
|
const t = e.measureText(this._txt).width + 2;
|
|
this.width = t + e.measureText("TradingView").width + 2, this._originPoint = N(e
|
|
.getTransform()), e.save(), e.globalAlpha = .7, e.fillStyle = this
|
|
._colors.customBrandingText, e.fillText(this._txt, 0, 12), e.fillStyle =
|
|
this._colors.customBrandingTradingViewText, e.fillText("TradingView", t,
|
|
12), e.restore()
|
|
} else if (function(e) {
|
|
return !y || e > 480
|
|
}(i))
|
|
if (this._needDisplayImage && null !== this._getLogoImage(s.logo)) {
|
|
e.save(), e.translate(-Math.ceil((32 - this._imageWidth) / 2), Math.floor((
|
|
32 - this._imageHeight) / 2)), this._originPoint = N(e
|
|
.getTransform()), this.borderRadius = 16, this._drawBgCircle(e), e
|
|
.drawImage(Object(a.ensureNotNull)(this._getLogoImage(s.logo)), Math
|
|
.round((32 - this._imageWidth) / 2), Math.round((32 - this
|
|
._imageHeight) / 2) + 0);
|
|
const t = k(i);
|
|
t && (e.translate(37, Math.round(this._fontSize * A(this._font))), this
|
|
._drawTextStroke(e), this._drawTextFill(e)), e.restore(), this
|
|
.width = 32, t && (this.width += this._maximizedAnimationTextWidth)
|
|
} else {
|
|
const t = k(i);
|
|
t && (e.save(), e.translate(I ? -.5 : 0, -.5), this._drawTextStroke(e), this
|
|
._drawTextFill(e), e.restore()), t && (this.width = this
|
|
._maximizedAnimationTextWidth)
|
|
}
|
|
else this.width = 0
|
|
}
|
|
_init() {
|
|
this._checkLayout(), this.show && (this.height = this._needDisplayImage ? 32 : this
|
|
._fontSize + 2, this._updateColors(), this._model.properties()
|
|
.paneProperties.background.subscribe(this, this._updateColors), this._model
|
|
.onChartThemeLoaded().subscribe(this, this._updateColors))
|
|
}
|
|
_recalculateMetrics() {
|
|
const e = Object(f.createDisconnectedBoundCanvas)(document, new f.Size(0, 0)),
|
|
t = Object(f.getPretransformedContext2D)(e, !0);
|
|
t.font = this._fontSize + this._font, this._textWidth = Math.ceil(t.measureText(this
|
|
._txt).width) + 2;
|
|
let i = this._textWidth + 8;
|
|
i % 2 == 0 && (i += 1), this._maximizedAnimationTextWidth = i, this._textWidthCache
|
|
.reset()
|
|
}
|
|
_updateColors() {
|
|
this._colors = this._model.isDark() ? D : V
|
|
}
|
|
_getLogoImage(e) {
|
|
return R(e, this._onReadyCallback)
|
|
}
|
|
_checkLayout() {
|
|
switch (this._layout) {
|
|
case "widget_branding":
|
|
case "widget_referral_branding":
|
|
case "widget_custom_branding":
|
|
case "fundamental_branding":
|
|
case "fundamental_custom_branding":
|
|
case "library_custom_branding":
|
|
case "library_branding":
|
|
case "site_branding":
|
|
this.show = !0;
|
|
break;
|
|
case "widget_custom_no_powered_branding":
|
|
case "fundamental_custom_no_powered_branding":
|
|
case "library_custom_no_powered_branding":
|
|
this.show = !1
|
|
}
|
|
switch (this._layout) {
|
|
case "library_branding":
|
|
this._needDisplayImage = !0, this._txt = O;
|
|
break;
|
|
case "library_custom_branding":
|
|
this._txt = L
|
|
}
|
|
}
|
|
_drawTextStroke(e) {
|
|
e.save(), e.textBaseline = "middle", e.textAlign = "start", e.font = this
|
|
._fontSize + this._font, e.strokeStyle = this._colors.staticTextBackground, e
|
|
.lineWidth = 4, e.lineJoin = "round", e.strokeText(this._txt, 0, 16 + this
|
|
._textWidthCache.yMidCorrection(e, this._txt)), e.restore()
|
|
}
|
|
_drawTextFill(e) {
|
|
e.save(), e.textBaseline = "middle", e.textAlign = "start", e.font = this
|
|
._fontSize + this._font, e.fillStyle = this._colors.text,
|
|
e.fillText(this._txt, 0, 16 + this._textWidthCache.yMidCorrection(e, this
|
|
._txt)), e.restore()
|
|
}
|
|
_drawFillTextCropWidth(e, t) {
|
|
e.save(), e.beginPath(), e.rect(0, 0, t, this.height), e.clip(), this._drawTextFill(
|
|
e), e.restore()
|
|
}
|
|
_drawBgCircle(e) {
|
|
const t = this.borderRadius,
|
|
i = 2 * Math.PI;
|
|
e.save(), e.beginPath(), e.fillStyle = this._colors.shadow, e.arc(t, t, t + 1, 0,
|
|
i), e.fill(), e.closePath(), e.restore(), e.save(), e.beginPath(), e
|
|
.fillStyle =
|
|
this._colors.background, e.arc(t, t, t, 0, i, !1), e.fill(), e.closePath(), e
|
|
.restore()
|
|
}
|
|
_drawFillRectWithRoundedCorner(e, t, i, s, r, n) {
|
|
e.save(), Object(m.drawRoundRect)(e, t - 1, i - 1, s + 2, r + 2, n), e.fillStyle =
|
|
this._colors.shadow, e.fill(), e.closePath(), e.restore(), e.save(), Object(m
|
|
.drawRoundRect)(e, t, i, s, r, n), e.fillStyle = this._colors.background, e
|
|
.fill(), e.closePath(), e.restore()
|
|
}
|
|
_drawLogoImage(e, t, i) {
|
|
e.drawImage(Object(a.ensureNotNull)(this._getLogoImage(this._colors.logo)), t, i)
|
|
}
|
|
}
|
|
class W extends j {
|
|
constructor(e, t, i) {
|
|
super(), this.show = !1, this.width = 0, this.height = 0, this._ready = !1, this
|
|
._layout = e, this._src = t, this._onReadyCallback = i, this._checkLayout();
|
|
const s = new Image;
|
|
this._img = s, this.show && (s.addEventListener("load", () => {
|
|
this.width = Math.round(s.width), this.height = Math.round(s
|
|
.height), this._ready = !0, this._onReadyCallback && this
|
|
._onReadyCallback()
|
|
}), s.crossOrigin = "anonymous", s.src = this._src)
|
|
}
|
|
draw(e, t) {
|
|
this._ready && (e.drawImage(this._img, -.5, -.5, this.width, this.height), this
|
|
._originPoint = N(e.getTransform()))
|
|
}
|
|
_checkLayout() {
|
|
switch (this._layout) {
|
|
case "widget_custom_branding":
|
|
case "widget_custom_no_powered_branding":
|
|
case "fundamental_custom_branding":
|
|
case "fundamental_custom_no_powered_branding":
|
|
case "library_custom_branding":
|
|
case "library_custom_no_powered_branding":
|
|
this.show = !0;
|
|
break;
|
|
case "site_branding":
|
|
case "widget_branding":
|
|
case "widget_referral_branding":
|
|
case "fundamental_branding":
|
|
case "library_branding":
|
|
this.show = !1
|
|
}
|
|
}
|
|
}
|
|
|
|
function H(e, t) {
|
|
function i(t) {
|
|
const i = e.getAll();
|
|
if (1 === i.length) return !0;
|
|
const s = i[0].hasModel() && i[0].model();
|
|
return s && s.model() === t
|
|
}
|
|
e.addCustomSource("branding", (e, s) => new E(e, s, i.bind(null, s), t))
|
|
}
|
|
i.d(t, "addBrandingSource", (function() {
|
|
return H
|
|
}))
|
|
},
|
|
qHEz: function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e, t) {
|
|
const i = e.files && e.files.length > 0;
|
|
if (!i && t && t.eventPhase > 0) return r(t, e), Promise.resolve();
|
|
if (!i) {
|
|
let t = !1;
|
|
const i = i => {
|
|
i.stopImmediatePropagation(), r(i, e), t = !0
|
|
};
|
|
try {
|
|
document.addEventListener("copy", i, !0), document.execCommand("copy")
|
|
} finally {
|
|
document.removeEventListener("copy", i, !0)
|
|
}
|
|
if (t) return Promise.resolve()
|
|
}
|
|
return async function(e) {
|
|
if (!navigator.clipboard || !navigator.clipboard.write || !window.ClipboardItem)
|
|
throw new DOMException("ClipboardApi is not supported",
|
|
"NotSupportedError");
|
|
const t = {};
|
|
for (const i of e.files || []) t[i.type] = i;
|
|
e.text && (t["text/plain"] = e.text);
|
|
e.html && (t["text/html"] = e.html);
|
|
return navigator.clipboard.write([new window.ClipboardItem(t)])
|
|
}(e)
|
|
}
|
|
|
|
function r(e, t) {
|
|
e.preventDefault();
|
|
const i = e.clipboardData;
|
|
t.text && i.setData("text/plain", t.text), t.html && i.setData("text/html", t.html)
|
|
}
|
|
async function n(e, t) {
|
|
if ("text/plain" === t && !navigator.clipboard.write) {
|
|
const t = await e;
|
|
return navigator.clipboard.writeText(await t.text())
|
|
}
|
|
if (!navigator.clipboard || !navigator.clipboard.write || !window.ClipboardItem)
|
|
throw new DOMException("ClipboardApi is not supported", "NotSupportedError");
|
|
let i = null;
|
|
try {
|
|
i = new window.ClipboardItem({
|
|
[t]: e
|
|
})
|
|
} catch (s) {
|
|
i = new window.ClipboardItem({
|
|
[t]: await e
|
|
})
|
|
}
|
|
if (i) return navigator.clipboard.write([i]);
|
|
throw new Error("ClipboardApi is not supported")
|
|
}
|
|
i.d(t, "a", (function() {
|
|
return s
|
|
})), i.d(t, "b", (function() {
|
|
return n
|
|
}))
|
|
},
|
|
qJq3: function(e, t, i) {
|
|
"use strict";
|
|
(function(e, s, r) {
|
|
TradingView.DEFAULT_BAR_COUNT = 300, TradingView.TIME_PLOT = 0, TradingView.OPEN_PLOT =
|
|
1, TradingView.HIGH_PLOT = 2, TradingView.LOW_PLOT = 3, TradingView.CLOSE_PLOT = 4,
|
|
TradingView.ADT_PLOT = 6, TradingView.STYLE_PLOT = 7;
|
|
var n = i("Eyy1").assert,
|
|
o = i("Eyy1").ensureNotNull,
|
|
a = i("lUQk").SeriesBase,
|
|
l = i("x0JF"),
|
|
c = l.SeriesAreaPaneView,
|
|
h = l.SeriesLinePaneView,
|
|
u = l.SeriesHollowCandlesPaneView,
|
|
d = l.SeriesCandlesPaneView,
|
|
p = l.SeriesBarsPaneView,
|
|
_ = l.SeriesHeikenAshiPaneView,
|
|
m = l.SeriesBaselinePaneView,
|
|
f = i("9Jkk").SeriesHiLoPaneView,
|
|
g = i("biIa").SeriesWaterlinePaneView,
|
|
b = i("Kxc7"),
|
|
v = i("ZJKN").BarsRange,
|
|
S = i("38az").SeriesBarColorer,
|
|
y = i("XPit").SeriesData,
|
|
w = i("k9/m"),
|
|
P = w.PlotRowSearchMode,
|
|
C = w.mergeMinMax,
|
|
x = i("okVO").SyncModel,
|
|
T = i("JWMC").trackEvent,
|
|
I = i("txPx").getLogger("Chart.Series"),
|
|
M = i("dfhE"),
|
|
O = i("n5al"),
|
|
L = i("pPtI"),
|
|
A = L.getServerInterval,
|
|
E = L.getResolutionByChartStyle,
|
|
k = i("LxhU").Interval,
|
|
D = i("z+Sa").SeriesHorizontalBaseLinePaneView,
|
|
V = i("Z8aO").SeriesPriceLinePaneView,
|
|
B = i("FIi8").deepExtend,
|
|
R = i("5fI3").encodeExtendedSymbolOrGetSimpleSymbolString,
|
|
N = i("FQhm"),
|
|
j = i("YWnQ").permissionDenied,
|
|
F = !b.enabled("hide_series_legend_item"),
|
|
W = i("uDHo").TIMEFRAMETYPE,
|
|
H = i("H0vP").InvalidationMask,
|
|
U = i("n5al").isSingleValueBasedStyle;
|
|
class z extends a {
|
|
constructor(t, s, r, n) {
|
|
var o = i("OK+B");
|
|
s.removeProperty("currencyId"), super(t, s, r, n), this
|
|
._symbolIntervalChanged = new e, this._intervalChanged = new e, this
|
|
.requestingIntradayWhenNotSupported = new e, this
|
|
.requestingResolutionWhenNotSupported = new e, this
|
|
._onInReplayStateChanged = new e, this
|
|
._replayExitedDueUnsupportedInterval = new e, this
|
|
._replayExitedDueUnavailableForUserInterval = new e, this
|
|
._onTimeFrameApplied = new e, this.m_model = t, this._chartApi = t
|
|
._chartApi, this.m_data = null, this.createPaneView(), this._syncModel =
|
|
null, this._replaySubscriber = null, this
|
|
._isReplayResolutionAvailableForUser = null, this._haStyle = {
|
|
studyId: O.chartStyleStudyId(z.STYLE_HEIKEN_ASHI, !0)
|
|
}, this._renkoStyle = {
|
|
studyId: O.chartStyleStudyId(z.STYLE_RENKO, !0)
|
|
}, this._pbStyle = {
|
|
studyId: O.chartStyleStudyId(z.STYLE_PB, !0)
|
|
}, this._kagiStyle = {
|
|
studyId: O.chartStyleStudyId(z.STYLE_KAGI, !0)
|
|
}, this._pnfStyle = {
|
|
studyId: O.chartStyleStudyId(z.STYLE_PNF, !0)
|
|
}, this._rangeStyle = {
|
|
studyId: O.chartStyleStudyId(z.STYLE_RANGE, !0)
|
|
}, this._properties.addExclusion && (this._properties.addExclusion(
|
|
"visible"), this._properties.addExclusion("currencyId")), this
|
|
._predictBars = 0, this._futureBarsPaneView = null, this._properties
|
|
.showInDataWindow.listeners().subscribe(t, o.prototype.fullUpdate), this
|
|
.properties().minTick.listeners().subscribe(this, z.prototype
|
|
._recreateFormatter);
|
|
var a = this;
|
|
this.properties().minTick.listeners().subscribe(null, (function() {
|
|
a.m_model.fullUpdate()
|
|
})), this._priceLineView = null, this._baseHorizontalLineView = new D(
|
|
this), this._gotoDateResultCleared = !1, this._gotoDateView = null,
|
|
this.bindStyleChange(), this.bindJapChartsInputs(), this
|
|
._createIsDWMProperty(), this._symbolIntervalChanged.subscribe(this,
|
|
this.checkInterval), this.properties().showCountdown.listeners()
|
|
.subscribe(this, z.prototype._onChangeShowCountdown), this
|
|
._onChangeShowCountdown(this.properties().showCountdown), this
|
|
._recreatePriceFormattingDependencies(), this.properties().lineStyle
|
|
.priceSource.listeners().subscribe(this, this._updateBarFunction), this
|
|
.properties().areaStyle.priceSource.listeners().subscribe(this, this
|
|
._updateBarFunction), this.properties().baselineStyle.priceSource
|
|
.listeners().subscribe(this, this._updateBarFunction), this
|
|
._updateBarFunction()
|
|
}
|
|
isLoading() {
|
|
return this._loading
|
|
}
|
|
isSymbolInvalid() {
|
|
return this._status === z.STATUS_INVALID_SYMBOL
|
|
}
|
|
styleStudyInfos() {
|
|
return {
|
|
haStyle: this._haStyle,
|
|
renkoStyle: this._renkoStyle,
|
|
pbStyle: this._pbStyle,
|
|
kagiStyle: this._kagiStyle,
|
|
pnfStyle: this._pnfStyle,
|
|
rangeStyle: this._rangeStyle
|
|
}
|
|
}
|
|
styleStudyInfo(e) {
|
|
return this.styleStudyInfos()[e]
|
|
}
|
|
priceLineColor(e) {
|
|
return this.properties().priceLineColor.value() || e
|
|
}
|
|
serverTimeOffset() {
|
|
return this._chartApi.serverTimeOffset()
|
|
}
|
|
_onChangeShowCountdown(e) {
|
|
var t = this;
|
|
e.value() ? this._countdownUpdateTimer = this.m_model.setInterval((
|
|
function() {
|
|
t._priceAxisView.updateCountdown()
|
|
}), 500) : (this.m_model.clearInterval(this._countdownUpdateTimer),
|
|
delete this._countdownUpdateTimer)
|
|
}
|
|
lastValueData(e, t, i) {
|
|
var s = {
|
|
noData: !0
|
|
};
|
|
if (this.m_model.timeScale().isEmpty() || this.priceScale().isEmpty() ||
|
|
this.data().isEmpty()) return s;
|
|
var r, n, o = this.m_model.timeScale().visibleBarsStrictRange();
|
|
if (null === o) return s;
|
|
if (t) {
|
|
var a = this.data().bars().last();
|
|
if (null === a) return s;
|
|
r = a.value, n = a.index
|
|
} else {
|
|
var l = this.data().bars().search(o.lastBar(), P.NearestLeft);
|
|
if (null === l) return s;
|
|
r = this.data().bars().valueAt(l.index), n = l.index
|
|
}
|
|
var c = {
|
|
noData: !1
|
|
},
|
|
h = void 0 !== e ? r[e] : this._barFunction(r);
|
|
i && (c.price = h);
|
|
var u = this.firstValue();
|
|
c.text = this.priceScale().formatPrice(h, u), c.formattedPriceAbsolute =
|
|
this.priceScale().formatPriceAbsolute(h), c.formattedPricePercentage =
|
|
this.priceScale().formatPricePercentage(h, u, !0);
|
|
var d = this.barColorer().barStyle(n, !1);
|
|
return c.color = d.barColor, c.floatCoordinate = this.priceScale()
|
|
.priceToCoordinate(h, u), c.coordinate = c.floatCoordinate, c.index = n,
|
|
c
|
|
}
|
|
_createIsDWMProperty() {
|
|
this._isDWMProperty = new s(this.isDWM()), this._onRestarted.subscribe(this,
|
|
(function() {
|
|
this._isDWMProperty.setValue(this.isDWM())
|
|
}))
|
|
}
|
|
isDWMProperty() {
|
|
return this._isDWMProperty
|
|
}
|
|
model() {
|
|
return this.m_model
|
|
}
|
|
fixLastBar(e) {
|
|
0
|
|
}
|
|
clearData() {
|
|
n(null === this.m_data, "Cannot clear loaded data"), this._seriesSource
|
|
.clearData()
|
|
}
|
|
data() {
|
|
return this.m_data || this._seriesSource.data()
|
|
}
|
|
isPulse() {
|
|
return this._symbolInfo && this._symbolInfo.resolutions.length > 0
|
|
}
|
|
onSymbolIntervalChanged() {
|
|
return this._symbolIntervalChanged
|
|
}
|
|
onIntervalChanged() {
|
|
return this._intervalChanged
|
|
}
|
|
status() {
|
|
return this._status
|
|
}
|
|
createPaneView() {
|
|
this._paneView = null, this._projectionBarsPaneView = null, this
|
|
._waterlineView = null,
|
|
this._priceLineView = this.hasClosePrice() ? new V(this) : null;
|
|
var e = this._properties.style.value();
|
|
switch (e) {
|
|
case z.STYLE_BARS:
|
|
this._paneView = new p(this, this.m_model);
|
|
break;
|
|
case z.STYLE_CANDLES:
|
|
this._paneView = new d(this, this.m_model);
|
|
break;
|
|
case z.STYLE_LINE:
|
|
this._paneView = new h(this, this.m_model);
|
|
break;
|
|
case z.STYLE_AREA:
|
|
this._paneView = new c(this, this.m_model);
|
|
break;
|
|
case z.STYLE_HEIKEN_ASHI:
|
|
this._paneView = new _(this, this.m_model);
|
|
break;
|
|
case z.STYLE_HOLLOW_CANDLES:
|
|
this._paneView = new u(this, this.m_model);
|
|
break;
|
|
case z.STYLE_BASELINE:
|
|
this._paneView = new m(this, this.m_model), this._waterlineView =
|
|
new g(this);
|
|
break;
|
|
case z.STYLE_HILO:
|
|
this._paneView = new f(this, this.m_model)
|
|
}
|
|
if (null === this._paneView) throw Error("Unknown chart style assigned: " +
|
|
e)
|
|
}
|
|
_clearStylePlot(e, t) {
|
|
if (0 !== e.size()) {
|
|
var i = t || o(e.firstIndex()),
|
|
s = o(e.lastIndex()) + 1;
|
|
e.range(i, s).each((function(e, t) {
|
|
t[TradingView.STYLE_PLOT] = null
|
|
}))
|
|
}
|
|
}
|
|
invalidateBarStylesCache(e) {
|
|
I.logDebug("Invalidate style cache starting from " + e), this
|
|
._clearStylePlot(this.bars(), e), this._clearStylePlot(this.nsBars())
|
|
}
|
|
invalidateBarColorerCache() {
|
|
delete this._barColorerCache, this.invalidateBarStylesCache()
|
|
}
|
|
barColorer() {
|
|
if (this._barColorerCache) return this._barColorerCache;
|
|
for (var e = null, t = this.m_model.dataSources().length - 1; t >= 0; t--) {
|
|
var i = this.m_model.dataSources()[t];
|
|
if (i.metaInfo && TradingView.isInherited(i.constructor, TradingView
|
|
.Study) && i.hasBarColorer() && i.properties().visible
|
|
.value()) {
|
|
var s = i.barColorer();
|
|
null === e ? e = s : e.pushBackBarColorer(s)
|
|
}
|
|
}
|
|
return null === e ? e = new S(this) : e.pushBackBarColorer(new S(this)),
|
|
this._barColorerCache = e, this._barColorerCache
|
|
}
|
|
properties() {
|
|
return this._properties
|
|
}
|
|
_barsState(e) {
|
|
var t = e.state();
|
|
return t.data.forEach((function(e) {
|
|
e.value.splice(7, 1)
|
|
})), t
|
|
}
|
|
state(e) {
|
|
var t = this === this.m_model.mainSeries() ? "MainSeries" : TradingView
|
|
.className(this.constructor);
|
|
const i = this.obsoleteZOrder();
|
|
var s = {
|
|
type: t,
|
|
id: this.id(),
|
|
state: this.properties().state(),
|
|
zorder: i,
|
|
haStyle: this._haStyle,
|
|
renkoStyle: this._renkoStyle,
|
|
pbStyle: this._pbStyle,
|
|
kagiStyle: this._kagiStyle,
|
|
pnfStyle: this._pnfStyle,
|
|
rangeStyle: this._rangeStyle
|
|
};
|
|
return this._symbolInfo && this._symbolInfo.ticker && (s.state.symbol = this
|
|
._symbolInfo.ticker), e && (s.bars = this._barsState(this.bars()), s
|
|
.nsBars = this._barsState(this.nsBars()), s.symbolInfo = this
|
|
._symbolInfo, s.rtPrice = this.data().lastProjectionPrice), s
|
|
.boxSize = this.data().boxSize, s.reversalAmount = this.data()
|
|
.reversalAmount, s
|
|
}
|
|
restoreState(e, t) {
|
|
t && this._setStatus(z.STATUS_SNAPSHOT), this._properties.mergeAndFire(e
|
|
.state), this._properties.hasChild("esdBreaksStyle") && this
|
|
._properties.removeProperty("esdBreaksStyle"), this._prevChartStyle =
|
|
this.properties().style.value(), this.createPaneView(), t && this
|
|
.restoreData(e.bars, e.nsBars, e.symbolInfo, e.rtPrice, e.boxSize, e
|
|
.reversalAmount)
|
|
}
|
|
hasStateForAlert() {
|
|
return !1
|
|
}
|
|
stateForAlert() {
|
|
throw new Error("Not implemented")
|
|
}
|
|
idForAlert() {
|
|
return a.prototype.idForAlert.call(this)
|
|
}
|
|
restoreData(e, t, i, s, r, n) {
|
|
this._status = z.STATUS_SNAPSHOT, this.m_data = new y, this.m_data.m_bars
|
|
.restoreState(e), this.m_data.m_nsBars.restoreState(t), this
|
|
.updateSymbolInfo(i, !1),
|
|
this.m_data.lastProjectionPrice = s, this.m_data.boxSize = r, r || (this
|
|
.properties().style.value() === z.STYLE_PNF ? this.m_data.boxSize =
|
|
this.properties().pnfStyle.inputs.boxSize.value() : this
|
|
.properties().style.value() === z.STYLE_RENKO && (this.m_data
|
|
.boxSize = this.properties().renkoStyle.inputs.boxSize.value())
|
|
), this.m_data.reversalAmount = n, n || this.properties().style
|
|
.value() === z.STYLE_KAGI && (this.m_data.reversalAmount = this
|
|
.properties().kagiStyle.inputs.reversalAmount.value()), this
|
|
._loading = !1
|
|
}
|
|
seriesSource() {
|
|
return this._seriesSource
|
|
}
|
|
_onSymbolResolved(e) {
|
|
this._seriesErrorMessage = null, this.updateSymbolInfo(e, !1), this.m_model
|
|
.updateSource(this), this.m_model.realignLineTools(), TradingView
|
|
.onWidget() || (T("Symbol", e.listed_exchange, e.name), T("Symbol Type",
|
|
e.type, e.listed_exchange));
|
|
var t = this.symbolInfo().minmov / this.symbolInfo().pricescale,
|
|
i = this.properties();
|
|
i.style.value() === z.STYLE_RENKO && i.renkoStyle.inputs.boxSize.value() <
|
|
t ? i.renkoStyle.inputs.merge({
|
|
boxSize: t
|
|
}) : i.style.value() === z.STYLE_PNF && i.pnfStyle.inputs.boxSize
|
|
.value() < t ? i.pnfStyle.inputs.merge({
|
|
boxSize: t
|
|
}) : i.style.value() === z.STYLE_KAGI && i.kagiStyle.inputs
|
|
.reversalAmount.value() < t && i.kagiStyle.inputs.merge({
|
|
reversalAmount: t
|
|
})
|
|
}
|
|
_onSymbolError(e) {
|
|
this._setStatus(z.STATUS_INVALID_SYMBOL), this._loading = !1, this
|
|
._properties.shortName.setValue(this._properties.symbol.value()), this
|
|
.m_model.clearAllStudies(), this.updateAllViews(), this.m_model
|
|
.updateSource(this), e !== j && this.m_model.resetTimeScale(), this
|
|
.m_model.realignLineTools()
|
|
}
|
|
_onSeriesTimeFrame(e, t, i, s, r) {
|
|
var n = this.m_model.timeScale(),
|
|
o = U(this.style()) ? e + .5 : e,
|
|
a = t;
|
|
if (void 0 === r) null !== i && i.type !== W.PeriodBack || (a += n
|
|
.defaultRightOffsetProperty().value());
|
|
else if (r.applyDefaultRightMargin) a += n.defaultRightOffsetProperty()
|
|
.value();
|
|
else if (r.percentRightMargin) {
|
|
var l = t - o + 1,
|
|
c = Math.max(0, Math.min(.99, r.percentRightMargin / 100));
|
|
a += c * l / (1 - c)
|
|
}
|
|
this.m_model.setTimeViewport(o, a)
|
|
}
|
|
_onSeriesError(e) {
|
|
this._loading = !1;
|
|
var t = e.error;
|
|
if (e.ctx) {
|
|
var i = {};
|
|
Object.entries(e.ctx).forEach((function(e, t) {
|
|
i[e] = t.toString()
|
|
})), t = t.format(i)
|
|
}
|
|
b.enabled("charting_library_debug_mode") && I.logNormal("Error reason: " +
|
|
t), this._seriesErrorMessage = t;
|
|
const s = "unknown_symbol" !== t ? z.STATUS_ERROR : b.enabled(
|
|
"no_bars_status") && this._symbolInfo ? z.STATUS_NO_BARS : z
|
|
.STATUS_INVALID_SYMBOL;
|
|
this._setStatus(s), this._seriesLoaded = !0, this._enablePriceRangeReady()
|
|
}
|
|
_onSeriesCompleted(e, t) {
|
|
if (this._setSymbolIntervalDelay) {
|
|
if (this._willSymbolIntervalCurrencyChanged()) return void I.logNormal(
|
|
"command comes during symbol/interval changing");
|
|
I.logNormal(
|
|
"series_completed comes when symbol interval delay present but symbol/interval should not be changed"
|
|
)
|
|
}
|
|
this._loading = !1, this._seriesErrorMessage = null;
|
|
var i = e;
|
|
switch ("pulsed" === i && (i = "delayed"), i) {
|
|
case "streaming":
|
|
this._setStatus(z.STATUS_READY);
|
|
break;
|
|
case "endofday":
|
|
this._setStatus(z.STATUS_EOD);
|
|
break;
|
|
case "delayed":
|
|
this._setStatus(z.STATUS_DELAYED);
|
|
break;
|
|
case "pulsed":
|
|
this._setStatus(z.STATUS_PULSE);
|
|
break;
|
|
case "replay":
|
|
this._setStatus(z.STATUS_REPLAY)
|
|
}
|
|
i.match(/delayed_streaming/) && this._setStatus(z.STATUS_DELAYED_STREAMING);
|
|
var s = this.m_model.paneForSource(this);
|
|
s.recalculatePriceScale(this.priceScale());
|
|
var r = H.full();
|
|
null !== this.m_model.appliedTimeFrame().value() && r
|
|
.lockVisibleTimeRangeOnResize(), this.m_model.invalidate(r), this
|
|
.model().recalcVisibleRangeStudies(!0), this.model()
|
|
.recalcStudyBasedLineTools(), !this.m_priceScale.isLockScale() || this
|
|
.model().timeScale().isEmpty() || this._seriesLoaded || (this.model()
|
|
.timeScale()._correctOffset(), this.model().timeScale()
|
|
.correctBarSpacing(), this.model().resetPriceScale(s, this
|
|
.priceScale())), this._seriesLoaded = !0, this
|
|
._enablePriceRangeReady()
|
|
}
|
|
_onBarReceived(e) {
|
|
this.model().recalcVisibleRangeStudies(!0)
|
|
}
|
|
disconnect() {
|
|
this._seriesSource.stop(), this.m_symbol = void 0, this._predictBars = 0,
|
|
this._status = z.STATUS_OFFLINE
|
|
}
|
|
isStarted() {
|
|
return this._seriesSource.isStarted()
|
|
}
|
|
restart() {
|
|
if (this._status !== z.STATUS_SNAPSHOT) {
|
|
this._loading = !0, this._onRestarted.fire(), this._setStatus(z
|
|
.STATUS_RESOLVING), this.updateSymbolInfo(null, !0);
|
|
var e = this._properties.interval.value();
|
|
this._checkIntervalWillChanged(e) && this._notifyIntervalChanged(e);
|
|
var t = null;
|
|
this._pendingTimeRange && (t = this._pendingTimeRange, delete this
|
|
._pendingTimeRange), this._onBeforeModifySeries(this
|
|
.getSymbolString(), e), this._onTimeFrameApplied.fire(t), e = A(
|
|
e), this.m_data = null, this._seriesSource.modifySeries(this
|
|
._getResolvingSymbolObject(), e, t), this._seriesSource
|
|
.isStarted() || this._seriesSource.start(), this.m_symbol = this
|
|
._properties.symbol.value(), this._currency = this._properties
|
|
.currencyId.value(), this._unit = this._properties.unitId.value(),
|
|
this.m_interval = this._properties.interval.value()
|
|
}
|
|
}
|
|
hasDelayedSymbolIntervalChange() {
|
|
return !!this._setSymbolIntervalDelay
|
|
}
|
|
setSymbolIntervalCurrencyDelayed() {
|
|
this._willSymbolIntervalCurrencyChanged() && (this
|
|
._setSymbolIntervalDelay && (I.logNormal(
|
|
"Clear timeout to change symbol/interval #" + this
|
|
._setSymbolIntervalDelay), clearTimeout(this
|
|
._setSymbolIntervalDelay)), this._setSymbolIntervalDelay =
|
|
setTimeout(function() {
|
|
const e = this._properties;
|
|
I.logNormal("Timeout #" + this._setSymbolIntervalDelay +
|
|
' fired, new symbol will be "' + e.symbol.value() +
|
|
'"'), delete this._setSymbolIntervalDelay, this
|
|
._setSymbolInterval(e.symbol.value(), e.interval
|
|
.value(), e.currencyId.value(), e.unitId.value())
|
|
}.bind(this), 30), I.logNormal("Started timeout #" + this
|
|
._setSymbolIntervalDelay + ' to change symbol/interval from "' +
|
|
this.m_symbol + '" to "' + this._properties.symbol.value() + '"'
|
|
))
|
|
}
|
|
rerequestData() {
|
|
this._setSymbolInterval(this.m_symbol, this.m_interval, this._currency, this
|
|
._unit, !0)
|
|
}
|
|
_notifyIntervalChanged(e) {
|
|
var t = {
|
|
timeframe: this._pendingTimeRange
|
|
};
|
|
this._intervalChanged.fire(e, t), this._pendingTimeRange = t.timeframe
|
|
}
|
|
_setSymbolInterval(e, t, i, s, r) {
|
|
this.clearGotoDateResult(), k.isRange(t) && this._properties.rangeStyle
|
|
.inputs.range.setValue(k.parse(t).multiplier());
|
|
var n = this._checkSymbolWillChanged(e),
|
|
o = this._checkIntervalWillChanged(t),
|
|
a = this._checkCurrencyWillChanged(i),
|
|
l = this._checkUnitWillChanged(s);
|
|
if (!(n || o || a || l || r)) return this.m_model.realignLineTools(),
|
|
void this.m_model.updateLineTools();
|
|
if (this._syncModel = null, this.m_symbol = e, this.m_interval = t, this
|
|
._currency = i,
|
|
this._unit = s, this._status !== z.STATUS_SNAPSHOT && (!this
|
|
._seriesSource.isStarted() || n || a || l) && this.updateSymbolInfo(
|
|
null, !n && (a || l)), this.m_model.realignLineTools(), this
|
|
._status !== z.STATUS_SNAPSHOT) {
|
|
this._loading = !0, this._setStatus(z.STATUS_RESOLVING), this
|
|
._symbolIntervalChanged.fire(), o && this._notifyIntervalChanged(
|
|
this.m_interval), this._onRestarted.fire(), this
|
|
._seriesLoaded = !1, this._lineStyleLastPriceCirclePaneView
|
|
.stopAnimation();
|
|
var c = null;
|
|
this._pendingTimeRange && (c = this._pendingTimeRange, delete this
|
|
._pendingTimeRange), this._onTimeFrameApplied.fire(c), this
|
|
._onBeforeModifySeries(this.getSymbolString(), t), this.m_data =
|
|
null, this._seriesSource.modifySeries(this
|
|
._getResolvingSymbolObject(), A(t), c, r), this._seriesSource
|
|
.isStarted() || (this._predictBars = 0, this._seriesSource.start()),
|
|
(n || a || l) && this.disablePriceRangeReady()
|
|
}
|
|
}
|
|
setDefaultTimeframe(e) {
|
|
this._pendingTimeRange = e
|
|
}
|
|
symbol() {
|
|
return this.properties().symbol.value()
|
|
}
|
|
bars() {
|
|
return this.data().m_bars
|
|
}
|
|
nsBars() {
|
|
return this.data().m_nsBars
|
|
}
|
|
hl2(e) {
|
|
return (this.high(e) + this.low(e)) / 2
|
|
}
|
|
hlc3(e) {
|
|
return (this.high(e) + this.low(e) + this.close(e)) / 3
|
|
}
|
|
ohlc4(e) {
|
|
return (this.open(e) + this.high(e) + this.low(e) + this.close(e)) / 4
|
|
}
|
|
priceRange(e, t) {
|
|
if (!TradingView.isInteger(e)) return I.logDebug(
|
|
"Series.priceRange: incorrect startBar"), null;
|
|
if (!TradingView.isInteger(t)) return I.logDebug(
|
|
"Series.priceRange: incorrect endBar"), null;
|
|
if (this.data().isEmpty()) return null;
|
|
if (this.m_priceScale.isLockScale()) {
|
|
var i = this._model.mainSeriesScaleRatio();
|
|
if (null !== i) {
|
|
var s = this.priceScale().internalHeight() / (this.model()
|
|
.timeScale().barSpacing() / i),
|
|
n = this.data().search(t, P.NearestLeft),
|
|
o = (n.value[TradingView.HIGH_PLOT] + n.value[TradingView
|
|
.LOW_PLOT]) / 2;
|
|
return new r(o - .5 * s, o + .5 * s)
|
|
}
|
|
}
|
|
var a = this.priceSource();
|
|
if (null !== a) var l = this.data().bars().minMaxOnRangeCached(e, t, [{
|
|
name: a,
|
|
offset: 0
|
|
}]),
|
|
c = this.data().nsBars().minMaxOnRangeCached(e, t, [{
|
|
name: a,
|
|
offset: 0
|
|
}]);
|
|
else l = this.data().bars().minMaxOnRangeCached(e, t, [{
|
|
name: "low",
|
|
offset: 0
|
|
}, {
|
|
name: "high",
|
|
offset: 0
|
|
}]), c = this.data().nsBars().minMaxOnRange(e, t, [{
|
|
name: "low",
|
|
offset: 0
|
|
}, {
|
|
name: "high",
|
|
offset: 0
|
|
}]);
|
|
var h = null !== (l = C(l, c)) ? l.min === l.max ? new r(l.min - .5, l.max +
|
|
.5) : new r(l.min, l.max) : new r(-.5, .5);
|
|
return this.priceScale().isLog() ? new r(this.priceScale().priceToLogical(h
|
|
.minValue()), this.priceScale().priceToLogical(h.maxValue())) : h
|
|
}
|
|
nearestData(e, t) {
|
|
if (TradingView.isInteger(e)) {
|
|
var i = this.data().search(e, t);
|
|
return null !== i ? i : void 0
|
|
}
|
|
I.logDebug("Series.nearestData: incorrect logicalPoint")
|
|
}
|
|
nearestIndex(e, t) {
|
|
var i = this.nearestData(e, t);
|
|
return i ? i.index : void 0
|
|
}
|
|
paneViews() {
|
|
if (!this.properties().visible.value()) return null;
|
|
var e = [this._baseHorizontalLineView, this._paneView];
|
|
return this._futureBarsPaneView && e.push(this._futureBarsPaneView), this
|
|
._projectionBarsPaneView && e.push(this._projectionBarsPaneView),
|
|
null !== this._waterlineView && e.push(this._waterlineView), null !==
|
|
this._priceLineView && e.push(this._priceLineView), null !== this
|
|
._gotoDateView && e.push(this._gotoDateView), e.push(...this
|
|
._highLowAvgPaneViews), e
|
|
}
|
|
dataWindowView() {
|
|
return this._dataWindowView
|
|
}
|
|
legendView() {
|
|
return this._legendView
|
|
}
|
|
statusView() {
|
|
return F ? this._statusView : null
|
|
}
|
|
marketStatusModel() {
|
|
return this._marketStatusModel
|
|
}
|
|
dataUpdatedModeModel() {
|
|
return this._dataUpdatedModeModel
|
|
}
|
|
dataProblemModel() {
|
|
return this._dataProblemModel
|
|
}
|
|
purgeSymbolInfo() {
|
|
this._symbolInfo = null
|
|
}
|
|
updateSymbolInfo(e, t) {
|
|
if (this._prevSymbolInfo = t ? this._symbolInfo : null, this._symbolInfo =
|
|
e, e) {
|
|
this._properties.shortName.setValue(e.name);
|
|
var i = O.extractSymbolNameFromSymbolInfo(e, this.m_symbol);
|
|
i && this._properties.symbol.setValue(i), this._currency = O
|
|
.symbolCurrency(e), this._properties.currencyId.setValue(this
|
|
._currency), this._unit = O.symbolUnit(e), this._properties
|
|
.unitId.setValue(this._unit), this._updateSessionIdProxyProperty(!0)
|
|
}
|
|
this._base = e ? e.pricescale / e.minmov : 100, this._pointValue = e && e
|
|
.pointvalue || 1, this._recreatePriceFormattingDependencies(), this
|
|
._statusView.update(), this.priceScale().updateFormatter();
|
|
var s = this._getSymbolForApi();
|
|
this._quotesProvider.setQuotesSessionSymbol(s), this.checkInterval()
|
|
}
|
|
updateAllViews() {
|
|
this._paneView.update(), this._dataWindowView.update(), this._legendView
|
|
.update(), this._statusView.update(), this._highLowAvgPaneViews.forEach(
|
|
e => e.update()), this._labelPaneViews.forEach(e => e.update()),
|
|
this._priceAxisViews.forEach(e => e.update()), this._priceLineAxisViews
|
|
.forEach(e => e.update()), this._futureBarsPaneView && this
|
|
._futureBarsPaneView.update(), this._projectionBarsPaneView && this
|
|
._projectionBarsPaneView.update(), null !== this._waterlineView && this
|
|
._waterlineView.update(), null !== this._priceLineView && this
|
|
._priceLineView.update(), null !== this._gotoDateView && this
|
|
._gotoDateView.update(), this._baseHorizontalLineView.update();
|
|
var e = this._model.activeStrategySource().value();
|
|
null !== e && e.updateAllViews(), this._lineStyleLastPriceCirclePaneView
|
|
.update()
|
|
}
|
|
requestMoreData(e) {
|
|
if ((this._status === z.STATUS_READY || this._status === z.STATUS_PULSE ||
|
|
this._status === z.STATUS_DELAYED || this._status === z
|
|
.STATUS_DELAYED_STREAMING || this._status === z.STATUS_EOD || this
|
|
._status === z.STATUS_REPLAY) && !this.m_model.timeScale()
|
|
.isEmpty()) {
|
|
var t = this.m_model.timeScale().visibleBarsStrictRange();
|
|
if (null !== t && 0 !== this.bars().size()) {
|
|
var i = t.lastBar() - o(this.data().last()).index;
|
|
if (this._predictBars < i && (this._predictBars = i, this
|
|
._seriesSource.requestMoreTickmarks(i)), !this._endOfData) {
|
|
var s = o(this.bars().firstIndex()),
|
|
r = e || s - t.firstBar();
|
|
r <= 0 || (Number.isFinite(r) ? (this._endOfData = !0, this
|
|
._loading = !0, this._seriesSource.requestMoreData(
|
|
r), this._setStatus(z.STATUS_LOADING)) : I
|
|
.logWarn("requestMoreData: invalid bar count: " + r +
|
|
", visible bars: [" + t.firstBar() + ", " + t
|
|
.lastBar() + "], last index: " + o(this.data()
|
|
.last()).index + ", predicted bars: " + this
|
|
._predictBars + ", required bars:" + e))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
bindStyleChange() {
|
|
var e = this;
|
|
Object.keys(z.STYLE_SHORT_NAMES).map((function(e) {
|
|
return z.STYLE_SHORT_NAMES[e] + "Style"
|
|
})).forEach((function(t) {
|
|
e._properties[t].listeners().subscribe(e, z.prototype
|
|
.invalidateBarStylesCache)
|
|
}))
|
|
}
|
|
bindJapChartsInputs() {
|
|
this._properties.style.listeners().subscribe(this, this
|
|
.onChartStyleChanged), this._properties.renkoStyle.inputs.boxSize
|
|
.listeners().subscribe(this, this.onInputChanged),
|
|
this._properties.renkoStyle.inputs.style.listeners().subscribe(this,
|
|
this.onInputChanged), this._properties.renkoStyle.inputs.atrLength
|
|
.listeners().subscribe(this, this.onInputChanged), this._properties
|
|
.renkoStyle.inputs.wicks.listeners().subscribe(this, this
|
|
.onInputChanged), this._properties.renkoStyle.inputs.sources
|
|
.listeners().subscribe(this, this.onInputChanged), this._properties
|
|
.pbStyle.inputs.lb.listeners().subscribe(this, this.onInputChanged),
|
|
this._properties.kagiStyle.inputs.reversalAmount.listeners().subscribe(
|
|
this, this.onInputChanged), this._properties.kagiStyle.inputs.style
|
|
.listeners().subscribe(this, this.onInputChanged), this._properties
|
|
.kagiStyle.inputs.atrLength.listeners().subscribe(this, this
|
|
.onInputChanged), this._properties.pnfStyle.inputs.boxSize
|
|
.listeners().subscribe(this, this.onInputChanged), this._properties
|
|
.pnfStyle.inputs.reversalAmount.listeners().subscribe(this, this
|
|
.onInputChanged), this._properties.pnfStyle.inputs.sources
|
|
.listeners().subscribe(this, this.onInputChanged), this._properties
|
|
.pnfStyle.inputs.style.listeners().subscribe(this, this.onInputChanged),
|
|
this._properties.pnfStyle.inputs.atrLength.listeners().subscribe(this,
|
|
this.onInputChanged), this._properties.pnfStyle.inputs
|
|
.oneStepBackBuilding.listeners().subscribe(this, this.onInputChanged),
|
|
this._properties.rangeStyle.inputs.phantomBars.listeners().subscribe(
|
|
this, this.onInputChanged)
|
|
}
|
|
createDividendsAdjustmentProperty() {
|
|
throw new Error("Not implemented")
|
|
}
|
|
dividendsAdjustmentProperty() {
|
|
return null
|
|
}
|
|
setChartStyleWithIntervalIfNeeded(e, t) {
|
|
var i = t;
|
|
void 0 === t && (i = E(e, this._properties.interval.value(), this._model
|
|
.defaultResolutions())), k.isEqual(i, this._properties.interval
|
|
.value()) || this._properties.interval.setValue(i), this._properties
|
|
.style.setValue(e)
|
|
}
|
|
isNeedRestart(e) {
|
|
return this._status !== z.STATUS_SNAPSHOT && (void 0 === e && (e = this
|
|
.properties().style.value()), !O.isRangeStyle(this
|
|
._prevChartStyle) && !O.isRangeStyle(e) && !(this
|
|
._prevChartStyle === e || !O.isRequiringRestartSeriesStyles(this
|
|
._prevChartStyle) && !O.isRequiringRestartSeriesStyles(e)))
|
|
}
|
|
applyPreferences(e) {
|
|
var t = B({}, e);
|
|
this.m_priceScale.setMode({
|
|
autoScale: t.priceAxisProperties.autoScale,
|
|
percentage: t.priceAxisProperties.percentage,
|
|
log: t.priceAxisProperties.log,
|
|
lockScale: t.priceAxisProperties.lockScale
|
|
}), this.setChartStyleWithIntervalIfNeeded(t.style), delete t.style,
|
|
delete t.interval, this._properties.mergePreferences(t), this
|
|
._properties.saveDefaults(), this.createPaneView(), this
|
|
.invalidateBarStylesCache()
|
|
}
|
|
priceSource() {
|
|
var e = null;
|
|
switch (this._properties.style.value()) {
|
|
case z.STYLE_LINE:
|
|
e = this._properties.lineStyle.priceSource.value();
|
|
break;
|
|
case z.STYLE_AREA:
|
|
e = this._properties.areaStyle.priceSource.value();
|
|
break;
|
|
case z.STYLE_BASELINE:
|
|
e = this._properties.baselineStyle.priceSource.value()
|
|
}
|
|
return e
|
|
}
|
|
isRangeBasedStyle() {
|
|
return O.isRangeBasedStyle(this.style())
|
|
}
|
|
onInputChanged() {
|
|
this.restart()
|
|
}
|
|
getSymbolString() {
|
|
return R(this._getSymbolObject())
|
|
}
|
|
_getResolvingSymbolObject() {
|
|
return this._getSymbolObject()
|
|
}
|
|
getStyleShortName() {
|
|
var e = this._properties.style.value();
|
|
if (z.STYLE_SHORT_NAMES.hasOwnProperty(e)) return z.STYLE_SHORT_NAMES[e];
|
|
throw new Error("Missed short name for style " + e)
|
|
}
|
|
getStyleProperties() {
|
|
return this._properties[this.getStyleShortName() + "Style"]
|
|
}
|
|
getInputsProperties() {
|
|
return this.getStyleProperties().inputs || new s
|
|
}
|
|
getInputsInfoProperties() {
|
|
return this.getStyleProperties().inputInfo || new s
|
|
}
|
|
getRealVisibleRange() {
|
|
var e = this.model().timeScale().visibleBarsStrictRange();
|
|
if (null === e) return null;
|
|
var t = this.data().search(e.firstBar(), P.NearestRight),
|
|
i = this.data().search(e.lastBar(), P.NearestLeft);
|
|
return null === t || null === i ? null : new v(t.index, i.index)
|
|
}
|
|
firstValue() {
|
|
var e = this.firstBar();
|
|
return null === e ? null : this._barFunction(e)
|
|
}
|
|
firstBar() {
|
|
var e = this.model().timeScale().visibleBarsStrictRange();
|
|
if (null === e) return null;
|
|
var t = e.firstBar(),
|
|
i = this.data().search(t, P.NearestRight);
|
|
return null !== i ? i.value : null
|
|
}
|
|
isSpread() {
|
|
return null !== this._symbolInfo && "spread" === this._symbolInfo.type
|
|
}
|
|
getSymbolName() {
|
|
return this._symbolInfo ? this._symbolInfo.name : ""
|
|
}
|
|
loadDataTo(e) {
|
|
var t = this._properties.interval.value();
|
|
this._onTimeFrameApplied.fire(e), this._seriesSource.modifySeries(this
|
|
._getResolvingSymbolObject(), A(t), e)
|
|
}
|
|
checkInterval() {
|
|
if (this._symbolInfo && (k.isIntraday(this.interval()) && !this._symbolInfo
|
|
.has_intraday && this.requestingIntradayWhenNotSupported.fire(),
|
|
this._symbolInfo.hasOwnProperty("supported_resolutions"))) {
|
|
var e = k.normalize(this._properties.interval.value()); - 1 === this
|
|
._symbolInfo.supported_resolutions.indexOf(e) && this
|
|
.requestingResolutionWhenNotSupported.fire(this._symbolInfo
|
|
.supported_resolutions[0])
|
|
}
|
|
}
|
|
priceScale() {
|
|
return this.m_priceScale
|
|
}
|
|
setPriceScale(e) {
|
|
this.m_priceScale !== e && (this._priceScaleAboutToBeChanged.fire(), this
|
|
.m_priceScale = e, this._properties.removeProperty(
|
|
"priceAxisProperties"), this._properties.addChild(
|
|
"priceAxisProperties", e.properties()), this._properties
|
|
.priceAxisProperties.childChanged(), N.emit("series_event",
|
|
"price_scale_changed"), this._priceScaleChanged.fire(e))
|
|
}
|
|
setGotoDateResult(e) {
|
|
this._gotoDateResultCleared = !1, i.e("series-pane-views").then(i.t.bind(
|
|
null, "+weX", 7)).then(({
|
|
GotoDateView: t
|
|
}) => {
|
|
this._gotoDateResultCleared || (this._gotoDateView = new t(this,
|
|
e), this.m_model.updateSource(this))
|
|
})
|
|
}
|
|
clearGotoDateResult(e) {
|
|
this._gotoDateView = null, this._gotoDateResultCleared = !0
|
|
}
|
|
syncModel() {
|
|
if (!this._syncModel) {
|
|
var e = this.symbolInfo(),
|
|
t = this.interval();
|
|
if (!e || !t) return null;
|
|
this._syncModel = new x(e, t)
|
|
}
|
|
return this._syncModel
|
|
}
|
|
getSourceIcon() {
|
|
return {
|
|
type: "loadSvg",
|
|
svgId: "series." + this.properties().style.value()
|
|
}
|
|
}
|
|
isStyleSupported(e) {
|
|
return !0
|
|
}
|
|
isIntervalSupported(e) {
|
|
return !0
|
|
}
|
|
isStyleSupportedForReplay(e) {
|
|
return O.isTimeBasedStyle(e)
|
|
}
|
|
isInReplay() {
|
|
return null !== this._replaySubscriber
|
|
}
|
|
onTimeFrameApplied() {
|
|
return this._onTimeFrameApplied
|
|
}
|
|
onInReplayStateChanged() {
|
|
throw new Error("Not implemented")
|
|
}
|
|
replayExitedDueUnsupportedInterval() {
|
|
throw new Error("Not implemented")
|
|
}
|
|
replayExitedDueUnavailableForUserInterval() {
|
|
throw new Error("Not implemented")
|
|
}
|
|
switchToReplay(e, t) {
|
|
throw new Error("Not implemented")
|
|
}
|
|
switchToRealtime() {
|
|
throw new Error("Not implemented")
|
|
}
|
|
_removeReplaySubscriber() {
|
|
throw new Error("Not implemented")
|
|
}
|
|
_onBeforeModifySeries(e, t) {
|
|
0
|
|
}
|
|
_getTelemetryAdditionalData(e, t) {
|
|
t = void 0 === t || t;
|
|
var i = {
|
|
symbol: this.actualSymbol()
|
|
};
|
|
return t && (i.resolution = this.interval()), void 0 !== e && (i.reason =
|
|
e), i
|
|
}
|
|
_sendTelemetryReport(e, t, i) {
|
|
void 0 === i && (i = this._getTelemetryAdditionalData());
|
|
var s = Object.assign(t, {
|
|
additional: i
|
|
});
|
|
(void 0).sendChartReport(e, s)
|
|
}
|
|
_sendTelemetryCounter(e, t) {
|
|
this._sendTelemetryReport(e, {
|
|
count: 1
|
|
}, t)
|
|
}
|
|
destroy() {
|
|
this._replayExitedDueUnsupportedInterval.destroy(), this
|
|
._replayExitedDueUnavailableForUserInterval.destroy(), this
|
|
._quotesProvider.quotesUpdate().unsubscribeAll(this), this
|
|
._quotesProvider.destroy(), this.clearGotoDateResult(), this._legendView
|
|
.destroy(), this._marketStatusModel.destroy(), null !== this
|
|
._dataUpdatedModeModel && this._dataUpdatedModeModel.destroy(), this
|
|
._dataProblemModel.destroy(), this._paneView && this._paneView
|
|
.destroy && this._paneView.destroy(), this._onTimeFrameApplied
|
|
.destroy(), this._seriesSource.destroy(), super.destroy()
|
|
}
|
|
dataEvents() {
|
|
return this._seriesSource.dataEvents()
|
|
}
|
|
moveData(e) {
|
|
return this._seriesSource.moveData(e)
|
|
}
|
|
}
|
|
Object.assign(z, M), TradingView.Series = z, t.Series = z
|
|
}).call(this, i("aIyQ"), i("tc+8"), i("Qb4w").PriceRange)
|
|
},
|
|
qXYw: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("n5al"),
|
|
r = i("ivNn"),
|
|
n = i("YFKU"),
|
|
o = i("qFKp"),
|
|
a = i("Tmoa"),
|
|
l = i("Ialn"),
|
|
c = i("GH0z"),
|
|
h = i("6I19"),
|
|
u = i("k9/m"),
|
|
d = i("CW80"),
|
|
p = i("mMWL"),
|
|
_ = i("7qT/"),
|
|
m = i("38az"),
|
|
f = i("xCUR");
|
|
const g = o.CheckMobile.any(),
|
|
b = g && !0,
|
|
v = new c.PercentageFormatter,
|
|
S = Object(n.t)("n/a"),
|
|
y = `${S} (${S}%)`;
|
|
i.d(t, "OverlayLegendValuesProvider", (function() {
|
|
return w
|
|
}));
|
|
class w extends class {
|
|
constructor(e, t) {
|
|
this._study = e, this._model = t, this._emptyValues = [{
|
|
title: Object(n.t)("Open"),
|
|
visible: !1,
|
|
value: "",
|
|
index: 0,
|
|
id: ""
|
|
}, {
|
|
title: Object(n.t)("High"),
|
|
visible: !1,
|
|
value: "",
|
|
index: 1,
|
|
id: ""
|
|
}, {
|
|
title: Object(n.t)("Low"),
|
|
visible: !1,
|
|
value: "",
|
|
index: 2,
|
|
id: ""
|
|
}, {
|
|
title: Object(n.t)("Close"),
|
|
visible: !1,
|
|
value: "",
|
|
index: 3,
|
|
id: ""
|
|
}, {
|
|
title: "",
|
|
visible: !1,
|
|
value: "",
|
|
index: 4,
|
|
id: ""
|
|
}, {
|
|
title: "",
|
|
visible: !1,
|
|
value: "",
|
|
index: 5,
|
|
id: ""
|
|
}, {
|
|
title: Object(n.t)("Change"),
|
|
visible: !1,
|
|
value: "",
|
|
index: 6,
|
|
id: ""
|
|
}]
|
|
}
|
|
getItems() {
|
|
return this._emptyValues
|
|
}
|
|
getValues(e) {
|
|
const t = this._emptyValues.map(e => ({
|
|
...e
|
|
}));
|
|
if (this._model.timeScale().isEmpty()) return t;
|
|
if (0 === this._study.data().size()) return t;
|
|
const i = this._showLastPriceAndChangeOnly();
|
|
if (Object(r.isNumber)(e) || (i ? e = this._study.data().lastIndex() : (e = this
|
|
._model.crossHairSource().appliedIndex(), Object(r.isNumber)(e) || (e =
|
|
this._study.data().lastIndex()))), null === e || !Object(r.isNumber)(e))
|
|
return t;
|
|
const s = this._study.data().search(e, u.PlotRowSearchMode.NearestLeft, 1),
|
|
n = Object(h.c)(this._model.paneForSource(this._study));
|
|
if (null === s || null === n) return t;
|
|
const o = s.index,
|
|
c = s.value,
|
|
d = c[1],
|
|
p = c[2],
|
|
_ = c[3],
|
|
g = c[4];
|
|
if (null == d || null == p || null == _ || null == g) return t;
|
|
t[0].value = S, t[1].value = S, t[2].value = S, t[3].value = S, t[6].value = y;
|
|
for (const e of t) e.visible = !i;
|
|
const w = t[4];
|
|
w.visible = !1;
|
|
const {
|
|
values: P
|
|
} = this._changesData(g, d, o, i), C = Object(f.a)(this._study);
|
|
if (Object(f.b)(this._study)) t[6].value = "";
|
|
else if (void 0 !== P) {
|
|
const e = this._study.formatter();
|
|
t[6].value = Object(l.forceLTRStr)(
|
|
`${e.format(P.change, !0)} (${v.format(P.percentChange, !0)})`)
|
|
}
|
|
i ? (t[5].value = C(g), t[5].visible = !0, t[6].visible = !0) : (t[0].value = C(d),
|
|
t[1].value = C(p), t[2].value = C(_), t[3].value = C(g), w.value = C(this
|
|
._study.barFunction()(c)), t[5].visible = !1);
|
|
let x = null;
|
|
if (i && !b) x = void 0 === P || P.change >= 0 ? m.SeriesBarColorer.upColor(this
|
|
._study.properties()) : m.SeriesBarColorer.downColor(this._study
|
|
.properties());
|
|
else {
|
|
const e = this._study.barColorer().barStyle(o, !1),
|
|
t = null != e.barBorderColor ? e.barBorderColor : e.barColor;
|
|
x = Object(h.b)(n, t)
|
|
}
|
|
x = Object(a.resetTransparency)(Object(h.b)(n, x));
|
|
for (const e of t) e.color = x;
|
|
return t
|
|
}
|
|
_showLastPriceAndChangeOnly() {
|
|
return g && (null === this._model.crossHairSource().pane || Object(d.isLineToolName)
|
|
(p.tool.value()) || null !== this._model.lineBeingEdited())
|
|
}
|
|
_changesData(e, t, i, s) {
|
|
var r;
|
|
if (s && !b) {
|
|
const e = this._study.quotes();
|
|
if (null !== e) return {
|
|
values: {
|
|
change: e.change,
|
|
percentChange: e.change_percent
|
|
},
|
|
priceDirection: {
|
|
basedOnCurrentBar: e.change >= 0 ? 0 : 1,
|
|
basedOnPrevClose: e.change >= 0 ? 0 : 1
|
|
}
|
|
}
|
|
} else {
|
|
const s = this._study.data().search(i - 1, u.PlotRowSearchMode.NearestLeft, 1),
|
|
n = null !== (r = null == s ? void 0 : s.value[4]) && void 0 !== r ? r :
|
|
null;
|
|
if (null !== n) return {
|
|
values: {
|
|
change: e - n,
|
|
percentChange: Object(_.a)(n, e)
|
|
},
|
|
priceDirection: {
|
|
basedOnCurrentBar: e >= t ? 0 : 1,
|
|
basedOnPrevClose: e >= n ? 0 : 1
|
|
}
|
|
}
|
|
}
|
|
return {
|
|
priceDirection: {
|
|
basedOnCurrentBar: e >= t ? 0 : 1,
|
|
basedOnPrevClose: e >= t ? 0 : 1
|
|
}
|
|
}
|
|
}
|
|
} {
|
|
constructor(e, t) {
|
|
super(e, t), this._showBarChange = t.properties().paneProperties.legendProperties
|
|
.showBarChange, this._showSeriesOHLC = t.properties().paneProperties
|
|
.legendProperties.showSeriesOHLC, this._seriesStyle = e.properties().childs()
|
|
.style
|
|
}
|
|
getValues(e) {
|
|
const t = super.getValues(e);
|
|
if (!this._showLastPriceAndChangeOnly()) {
|
|
const e = Object(s.isPriceSourceStyle)(this._seriesStyle.value()),
|
|
i = this._showSeriesOHLC.value(),
|
|
r = i && !e,
|
|
n = i && e;
|
|
t[0].visible = r, t[1].visible = r, t[2].visible = r, t[3].visible = r, t[6]
|
|
.visible = this._showBarChange.value(), t[4].visible = n
|
|
}
|
|
return t
|
|
}
|
|
}
|
|
},
|
|
qcGP: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Ss5c").LineDataSource,
|
|
r = i("Ocx9").DefaultProperty,
|
|
n = i("mMWL");
|
|
class o extends s {
|
|
constructor(e, t) {
|
|
super(e, t || o.createProperties()), this._priceAxisViews.push(this
|
|
.createPriceAxisView(3)), i.e("lt-pane-views").then(i.t.bind(null, "9FRF",
|
|
7)).then(({
|
|
ParallelChannelPaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
calculatePriceDiff() {
|
|
var e = this.points();
|
|
if (3 === e.length) {
|
|
var t = e[0],
|
|
i = e[1],
|
|
s = e[2],
|
|
r = this._findPriceOffset(t, i, s);
|
|
null !== r && isFinite(r) && (this._priceOffset = r)
|
|
}
|
|
}
|
|
_findPriceOffset(e, t, i) {
|
|
var s = this.priceScale();
|
|
if (null === s || e.index === t.index) return null;
|
|
if (s.isLog()) {
|
|
var r = this._model.timeScale();
|
|
if (r.isEmpty()) return null;
|
|
var n = this.ownerSource().firstValue(),
|
|
o = r.indexToCoordinate(e.index),
|
|
a = r.indexToCoordinate(t.index),
|
|
l = s.priceToCoordinate(e.price, n),
|
|
c = s.priceToCoordinate(t.price, n),
|
|
h = l + (m = (c - l) / (a - o)) * (r.indexToCoordinate(i.index) - o),
|
|
u = s.priceToCoordinate(i.price, n) - h,
|
|
d = (n = this.ownerSource().firstValue(), .5 * (l + c)),
|
|
p = s.coordinateToPrice(d, n),
|
|
_ = d + u;
|
|
return s.coordinateToPrice(_, n) - p
|
|
}
|
|
var m = (t.price - e.price) / (t.index - e.index),
|
|
f = e.price + m * (i.index - e.index);
|
|
return i.price - f
|
|
}
|
|
setLastPoint(e, t) {
|
|
t && t.shift() && 2 === this.points().length && this._snapPoint45Degree(e, this
|
|
.points()[0]), super.setLastPoint(e), this.calculatePriceDiff()
|
|
}
|
|
restorePoints(e, t, i) {
|
|
super.restorePoints(e, t, i), e && e.length >= 3 && (this._priceOffset = e[2]
|
|
.price - e[0].price)
|
|
}
|
|
setPoint(e, t, i) {
|
|
if (i && i.shift()) switch (e) {
|
|
case 0:
|
|
case 1:
|
|
this._snapPoint45Degree(t, this._points[1 - e]);
|
|
break;
|
|
case 2:
|
|
case 3:
|
|
this._snapPoint45Degree(t, {
|
|
index: this._points[3 - e].index,
|
|
price: this._points[3 - e].price + this._priceOffset
|
|
})
|
|
}
|
|
var s = !1;
|
|
switch (e) {
|
|
case 0:
|
|
case 1:
|
|
super.setPoint(e, t, i);
|
|
break;
|
|
case 2:
|
|
case 3:
|
|
this._points[e - 2].index = t.index, this._points[e - 2].price = t.price -
|
|
this._priceOffset;
|
|
break;
|
|
case 4:
|
|
this._points[2] = t, this.calculatePriceDiff(), s = !0;
|
|
break;
|
|
case 5:
|
|
var r = this._findPriceOffset(this._points[0], this._points[1], t);
|
|
null !== r && isFinite(r) && (this._points[0].price += r, this._points[1]
|
|
.price += r, this._priceOffset -= r, s = !0)
|
|
}
|
|
if (e % 2 == 0 && this._correctThirdPoint(), s && this.linkKey().value()) {
|
|
for (var o = [], a = 0; a < this._points.length; a++) o.push(this._points[a]
|
|
.price);
|
|
n.changeLineStyle({
|
|
model: this._model,
|
|
linkKey: this.linkKey().value(),
|
|
state: {
|
|
prices: o
|
|
}
|
|
})
|
|
}
|
|
}
|
|
restoreExternalState(e) {
|
|
if ((e = Object.assign({}, e)).prices)
|
|
if (this.isActualSymbol()) {
|
|
for (var t = 0; t < e.prices.length; t++) this._points[t].price = e.prices[
|
|
t];
|
|
this._priceOffset = this._points[2].price - this._points[0].price
|
|
} else this._priceOffset = void 0;
|
|
delete e.prices, super.restoreExternalState(e)
|
|
}
|
|
onData(e) {
|
|
super.onData(e), this._updateThirdPointAndPriceOffset()
|
|
}
|
|
setPoints(e) {
|
|
super.setPoints(e), this.calculatePriceDiff()
|
|
}
|
|
getPoint(e) {
|
|
if (e < 2) return s.prototype.getPoint.call(this, e);
|
|
var t = null;
|
|
switch (e) {
|
|
case 2:
|
|
case 3:
|
|
var i = this.points();
|
|
i.length === this.pointsCount() && (t = {
|
|
index: i[e - 2].index,
|
|
price: i[e - 2].price + this._priceOffset
|
|
})
|
|
}
|
|
return t
|
|
}
|
|
pointsCount() {
|
|
return 3
|
|
}
|
|
name() {
|
|
return "Parallel Channel"
|
|
}
|
|
hasEditableCoordinates() {
|
|
return !1
|
|
}
|
|
addPoint(e, t) {
|
|
var i = this.points().length;
|
|
t && t.shift() && 2 === i && this._snapPoint45Degree(e, this.points()[0]);
|
|
var r = s.prototype.addPoint.call(this, e, t);
|
|
return this._updateThirdPointAndPriceOffset(), r
|
|
}
|
|
cloneData(e) {
|
|
this._priceOffset = e._priceOffset
|
|
}
|
|
restoreData(e) {
|
|
e.priceOffset && (this._priceOffset = e.priceOffset)
|
|
}
|
|
state(e) {
|
|
var t = s.prototype.state.call(this, e);
|
|
return t.priceOffset = this._priceOffset, t
|
|
}
|
|
canHasAlert() {
|
|
return !0
|
|
}
|
|
axisPoints() {
|
|
var e = this.points();
|
|
return e.length < 2 ? [] : (e[2] = {
|
|
index: e[0].index,
|
|
price: e[0].price + this._priceOffset
|
|
}, e.push({
|
|
index: e[1].index,
|
|
price: e[1].price + this._priceOffset
|
|
}), e)
|
|
}
|
|
_getAlertPlots() {
|
|
var e = [].concat(this._points).splice(0, 2);
|
|
|
|
function t(e, t) {
|
|
return e.index <= t.index ? [e, t] : [t, e]
|
|
}
|
|
var i, s, r, n, o = t((e = e.concat([{
|
|
price: e[0].price + this._priceOffset,
|
|
time: e[0].time,
|
|
index: e[0].index
|
|
}, {
|
|
price: e[1].price + this._priceOffset,
|
|
time: e[1].time,
|
|
index: e[1].index
|
|
}]))[0], e[1]),
|
|
a = t(e[2], e[3]);
|
|
this._priceOffset < 0 ? (s = a, i = o) : (s = o, i = a);
|
|
var l = this.properties().extendLeft.value(),
|
|
c = this.properties().extendRight.value();
|
|
return e[0].index <= e[1].index ? (r = l, n = c) : (r = c, n = l), [this
|
|
._linePointsToAlertPlot(i, "Upper", r, n), this._linePointsToAlertPlot(s,
|
|
"Lower", r, n)
|
|
]
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "VkdP")))
|
|
.ParallelChannelDefinitionsViewModel
|
|
}
|
|
_updateThirdPointAndPriceOffset() {
|
|
this._points.length === this.pointsCount() && (void 0 === this._priceOffset && this
|
|
.calculatePriceDiff(), this._correctThirdPoint())
|
|
}
|
|
_correctThirdPoint() {
|
|
var e = this._points[0];
|
|
this._points[2].index = e.index, this._points[2].price = e.price + this._priceOffset
|
|
}
|
|
static createProperties(e) {
|
|
var t = new r("linetoolparallelchannel", e);
|
|
return o._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
s._configureProperties(e)
|
|
}
|
|
}
|
|
t.LineToolParallelChannel = o
|
|
},
|
|
qckB: function(e, t) {
|
|
e.exports =
|
|
'<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28"><g fill="none" fill-rule="evenodd" stroke="currentColor" transform="translate(6 3)"><rect width="15" height="12" rx="2" x=".5" y="8.5"/><path stroke-linecap="round" stroke-width="2" d="M8 15v2"/><path d="M11.5 4a3.5 3.5 0 0 0-7 0v4.5"/></g></svg>'
|
|
},
|
|
qgcf: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "calculateLabelPosition", (function() {
|
|
return p
|
|
})), i.d(t, "wordWrap", (function() {
|
|
return f
|
|
})), i.d(t, "TextRenderer", (function() {
|
|
return M
|
|
}));
|
|
var s = i("aO4+"),
|
|
r = i("Eyy1"),
|
|
n = i("f6yo"),
|
|
o = i("Ialn"),
|
|
a = i("VdBB"),
|
|
l = i("gAom"),
|
|
c = i("jFln"),
|
|
h = i("ogJP"),
|
|
u = i("ikwP"),
|
|
d = i("8Uy/");
|
|
|
|
function p(e, t, i, r, n) {
|
|
const o = .5 * (t.x + i.x);
|
|
let a = i.y;
|
|
return t.y > i.y ? (a -= e.height / 2 + r.y, a = Math.max(e.height / 2, a)) : (a += e
|
|
.height / 2 + r.y, a = Math.min(n - e.height / 2, a)), new s.Point(o, a)
|
|
}
|
|
let _;
|
|
|
|
function m() {
|
|
const e = document.createElement("canvas");
|
|
e.width = 0, e.height = 0, _ = Object(r.ensureNotNull)(e.getContext("2d"))
|
|
}
|
|
|
|
function f(e, t, i) {
|
|
_ || m(), i = Object(h.isString)(i) ? parseInt(i) : i, e += "";
|
|
const s = !Object(h.isNumber)(i) || !isFinite(i) || i <= 0 ? e.split(
|
|
/[^\S' '\r\n]*(?:\r\n|\r|\n|$)/) : e.split(/[^\S\r\n]*(?:\r\n|\r|\n|$)/);
|
|
if (s[s.length - 1] || s.pop(), !Object(h.isNumber)(i) || !isFinite(i) || i <= 0) return s;
|
|
_.font = t;
|
|
const r = [];
|
|
for (let e = 0; e < s.length; e++) {
|
|
const t = s[e],
|
|
n = _.measureText(t).width;
|
|
if (n <= i) {
|
|
r.push(t);
|
|
continue
|
|
}
|
|
const o = t.split(/([-)\]},.!?:;])|(\s+)/);
|
|
let a = 0;
|
|
for (; o.length;) {
|
|
let e = ~~(i / n * (o.length + 2) / 3);
|
|
if (e <= 0 || _.measureText(o.slice(0, 3 * e - 1).join("")).width <= i)
|
|
for (; _.measureText(o.slice(0, 3 * (e + 1) - 1).join("")).width <= i;) e++;
|
|
else
|
|
for (; e > 0 && _.measureText(o.slice(0, 3 * --e - 1).join("")).width > i;);
|
|
if (e > 0) r.push(o.slice(0, 3 * e - 1).join("")), o.splice(0, 3 * e);
|
|
else {
|
|
const e = o[0] + (o[1] || "");
|
|
if (a = 1 === a ? 1 : ~~(i / _.measureText(e).width * e.length), _.measureText(e
|
|
.substr(0, a)).width <= i)
|
|
for (; _.measureText(e.substr(0, a + 1)).width <= i;) a++;
|
|
else
|
|
for (; a > 1 && _.measureText(e.substr(0, --a)).width > i;);
|
|
a < 1 && (a = 1), r.push(e.substr(0, a)), o[0] = e.substr(a), o[1] = ""
|
|
}
|
|
if (_.measureText(o.join("")).width <= i) {
|
|
r.push(o.join(""));
|
|
break
|
|
}
|
|
}
|
|
}
|
|
return r
|
|
}
|
|
|
|
function g(e, t, i) {
|
|
if (0 === i) return e.clone();
|
|
const r = (e.x - t.x) * Math.cos(i) - (e.y - t.y) * Math.sin(i) + t.x,
|
|
n = (e.x - t.x) * Math.sin(i) + (e.y - t.y) * Math.cos(i) + t.y;
|
|
return new s.Point(r, n)
|
|
}
|
|
|
|
function b(e, t) {
|
|
return t + 2 * P(e) + 2 * y(e)
|
|
}
|
|
|
|
function v(e, t) {
|
|
return x(e) * t + C(e) * (t - 1) + 2 * w(e) + 2 * S(e)
|
|
}
|
|
|
|
function S(e) {
|
|
return void 0 !== e.boxPaddingVert ? e.boxPaddingVert * I(e) : void 0 !== e.boxPadding ? e
|
|
.boxPadding * I(e) : x(e) / 3
|
|
}
|
|
|
|
function y(e) {
|
|
return void 0 !== e.boxPaddingHorz ? e.boxPaddingHorz * I(e) : void 0 !== e.boxPadding ? e
|
|
.boxPadding * I(e) : x(e) / 3
|
|
}
|
|
|
|
function w(e) {
|
|
return (e.backgroundVertInflate || 0) * I(e)
|
|
}
|
|
|
|
function P(e) {
|
|
return (e.backgroundHorzInflate || 0) * I(e)
|
|
}
|
|
|
|
function C(e) {
|
|
return (e.padding || 0) * I(e)
|
|
}
|
|
|
|
function x(e) {
|
|
return Math.ceil(T(e) * I(e))
|
|
}
|
|
|
|
function T(e) {
|
|
return e.fontsize || e.fontSize || 30
|
|
}
|
|
|
|
function I(e) {
|
|
const t = Math.min(1, Math.max(.2, Math.min(e.scaleX || 1, e.scaleY || 1)));
|
|
if (1 === t) return t;
|
|
const i = T(e);
|
|
return Math.ceil(t * i) / i
|
|
}
|
|
class M {
|
|
constructor(e, t) {
|
|
this._data = null, this._internalData = null, this._boxSize = null, this
|
|
._linesInfo = null, this._fontInfo = null, this._hittest = t || new a
|
|
.HitTestResult(a.HitTestResult.MOVEPOINT, {
|
|
areaName: a.AreaName.Text
|
|
}), void 0 !== e && this.setData(e)
|
|
}
|
|
setData(e) {
|
|
e.horzTextAlign || (e.horzTextAlign = e.horzAlign),
|
|
function(e, t) {
|
|
if (null === e || null === t) return null === e == (null === t);
|
|
if (void 0 === e.points != (void 0 === t.points)) return !1;
|
|
if (void 0 !== e.points && void 0 !== t.points) {
|
|
if (e.points.length !== t.points.length) return !1;
|
|
for (let r = 0; r < e.points.length; ++r)
|
|
if (i = e.points[r], s = t.points[r], i.x !== s.x || i.y !== s.y)
|
|
return !1
|
|
}
|
|
var i, s;
|
|
return e.text === t.text && e.vertAlign === t.vertAlign && e.horzAlign === t
|
|
.horzAlign && e.horzTextAlign === t.horzTextAlign && e.font === t
|
|
.font && e.offsetX === t.offsetX && e.offsetY === t.offsetY && e
|
|
.bold === t.bold && e.italic === t.italic && e.fontsize === t
|
|
.fontsize && e.fontSize === t.fontSize && e.backgroundRoundRect === t
|
|
.backgroundRoundRect && e.forceTextAlign === t.forceTextAlign && e
|
|
.wordWrapWidth === t.wordWrapWidth && e.forceCalculateMaxLineWidth === t
|
|
.forceCalculateMaxLineWidth && e.padding === t.padding && e.scaleY === t
|
|
.scaleY && e.scaleX === t.scaleX && e.highlightBorder === t
|
|
.highlightBorder && e.backgroundHorzInflate === t
|
|
.backgroundHorzInflate && e.backgroundVertInflate === t
|
|
.backgroundVertInflate && e.boxPadding === t.boxPadding && e
|
|
.boxPaddingVert === t.boxPaddingVert && e.boxPaddingHorz === t
|
|
.boxPaddingHorz && e.angle === t.angle && e.maxHeight === t.maxHeight
|
|
}(this._data, e) ? this._data = e : (this._data = e, this._internalData = null,
|
|
this._boxSize = null, this._linesInfo = null, this._fontInfo = null)
|
|
}
|
|
hitTest(e) {
|
|
if (null === this._data || void 0 === this._data.points || 0 === this._data.points
|
|
.length) return null;
|
|
const t = this._data.angle || 0,
|
|
{
|
|
boxLeft: i,
|
|
boxTop: r,
|
|
boxWidth: o,
|
|
boxHeight: a
|
|
} = this._getInternalData(),
|
|
l = this._getRotationPoint(),
|
|
c = [g(new s.Point(i, r), l, t), g(new s.Point(i + o, r), l, t), g(new s.Point(
|
|
i + o, r + a), l, t), g(new s.Point(i, r + a), l, t)];
|
|
return Object(n.pointInPolygon)(e, c) ? this._hittest : null
|
|
}
|
|
doesIntersectWithBox(e) {
|
|
return null !== this._data && void 0 !== this._data.points && 0 !== this._data
|
|
.points.length && Object(n.pointInBox)(this._data.points[0], e)
|
|
}
|
|
measure() {
|
|
if (null === this._data) return {
|
|
width: 0,
|
|
height: 0
|
|
};
|
|
const e = this._getBoxSize();
|
|
return {
|
|
width: e.boxWidth,
|
|
height: e.boxHeight
|
|
}
|
|
}
|
|
rect() {
|
|
if (null === this._data) return {
|
|
x: 0,
|
|
y: 0,
|
|
width: 0,
|
|
height: 0
|
|
};
|
|
const e = this._getInternalData();
|
|
return {
|
|
x: e.boxLeft,
|
|
y: e.boxTop,
|
|
width: e.boxWidth,
|
|
height: e.boxHeight
|
|
}
|
|
}
|
|
setPoints(e, t) {
|
|
Object(r.ensureNotNull)(this._data).points = e, this._hittest = t || new a
|
|
.HitTestResult(a.HitTestResult.MOVEPOINT)
|
|
}
|
|
fontStyle(e) {
|
|
return null === this._data ? "" : this._getFontInfo().fontStyle
|
|
}
|
|
wordWrap(e, t, i) {
|
|
return f(e, i || this.fontStyle(), t)
|
|
}
|
|
draw(e, t) {
|
|
if (null === this._data || void 0 === this._data.points || 0 === this._data.points
|
|
.length) return;
|
|
const i = t.pixelRatio,
|
|
s = this._getInternalData(),
|
|
r = this._getRotationPoint().scaled(i);
|
|
e.save(), e.translate(r.x, r.y), e.rotate(this._data.angle || 0), e.translate(-r.x,
|
|
-r.y);
|
|
const n = this._getFontInfo().fontSize;
|
|
e.textBaseline = s.textBaseLine, e.textAlign = s.textAlign, e.font = this
|
|
.fontStyle();
|
|
const {
|
|
scaledLeft: o,
|
|
scaledRight: a,
|
|
scaledTop: h,
|
|
scaledBottom: p
|
|
} = function(e, t) {
|
|
const i = Math.round(e.boxLeft * t),
|
|
s = Math.round(e.boxTop * t);
|
|
return {
|
|
scaledLeft: i,
|
|
scaledRight: i + Math.round(e.boxWidth * t),
|
|
scaledTop: s,
|
|
scaledBottom: s + Math.round(e.boxHeight * t)
|
|
}
|
|
}(s, i);
|
|
if (this._data.backgroundColor || this._data.borderColor || this._data
|
|
.highlightBorder && this._data.wordWrapWidth) {
|
|
const t = this._data.borderWidth || Math.max(n / 12, 1),
|
|
s = Math.round(t * i),
|
|
r = s / 2;
|
|
if (this._data.backgroundRoundRect) this._data.backgroundColor && (Object(l
|
|
.drawRoundRect)(e, o, h, a - o, p - h, this._data
|
|
.backgroundRoundRect * i), e.fillStyle = this._data.backgroundColor,
|
|
e.fill()), this._data.borderColor && (Object(l.drawRoundRect)(e, o - r,
|
|
h - r, a - o + s, p - h + s, this._data.backgroundRoundRect * i + s
|
|
), e.strokeStyle = this._data.borderColor, e.lineWidth = s, e
|
|
.stroke());
|
|
else if (this._data.backgroundColor && (e.fillStyle = this._data
|
|
.backgroundColor, e.fillRect(o, h, a - o, p - h)), this._data
|
|
.borderColor || this._data.highlightBorder) {
|
|
let t;
|
|
this._data.borderColor ? (e.strokeStyle = this._data.borderColor, t = s) : (
|
|
e.strokeStyle = this._data.color, Object(c.setLineStyle)(e, d
|
|
.LINESTYLE_DASHED), t = Math.max(1, Math.floor(i))), e
|
|
.lineWidth = t, e.beginPath(), e.moveTo(o - t / 2, h - t / 2), e.lineTo(
|
|
o - t / 2, p + t / 2), e.lineTo(a + t / 2, p + t / 2), e.lineTo(a +
|
|
t / 2, h - t / 2), e.lineTo(o - t / 2, h - t / 2), e.stroke()
|
|
}
|
|
}
|
|
e.fillStyle = this._data.color;
|
|
const _ = (o + Math.round(s.textStart * i)) / i,
|
|
m = .05 * n;
|
|
let f = (h + Math.round((s.textTop + m) * i)) / i;
|
|
const g = C(this._data),
|
|
b = this._getLinesInfo();
|
|
for (const t of b.lines) Object(u.drawScaled)(e, i, () => e.fillText(t, _, f)), f +=
|
|
n + g;
|
|
e.restore()
|
|
}
|
|
_getLinesMaxWidth(e) {
|
|
if (_ || m(), _.textBaseline = "alphabetic", _.font = this.fontStyle(), null !==
|
|
this._data && this._data.wordWrapWidth && !this._data.forceCalculateMaxLineWidth
|
|
) return this._data.wordWrapWidth * I(this._data);
|
|
let t = 0;
|
|
for (const i of e) t = Math.max(t, _.measureText(i).width);
|
|
return t
|
|
}
|
|
_getInternalData() {
|
|
if (null !== this._internalData) return this._internalData;
|
|
const e = Object(r.ensureNotNull)(this._data),
|
|
t = this._getBoxSize(),
|
|
i = t.boxWidth,
|
|
s = t.boxHeight,
|
|
n = Object(r.ensureDefined)(e.points)[0];
|
|
let a = n.y;
|
|
switch (e.vertAlign) {
|
|
case "bottom":
|
|
a -= s + e.offsetY;
|
|
break;
|
|
case "middle":
|
|
a -= s / 2;
|
|
break;
|
|
case "top":
|
|
a += e.offsetY
|
|
}
|
|
let l = n.x;
|
|
const c = y(e),
|
|
h = S(e),
|
|
u = P(e) + c;
|
|
let d;
|
|
const p = a + (w(e) + h) + x(e) / 2;
|
|
let _;
|
|
switch (e.horzAlign) {
|
|
case "left":
|
|
l += e.offsetX;
|
|
break;
|
|
case "center":
|
|
l -= i / 2;
|
|
break;
|
|
case "right":
|
|
l -= i + e.offsetX
|
|
}
|
|
switch (Object(r.ensureDefined)(e.horzTextAlign)) {
|
|
case "left":
|
|
_ = "start", d = l + u, Object(o.isRtl)() && (e.forceTextAlign ? _ =
|
|
"left" : (d = l + i - u, _ = "right"));
|
|
break;
|
|
case "center":
|
|
_ = "center", d = l + i / 2;
|
|
break;
|
|
case "right":
|
|
_ = "end", d = l + i - u, Object(o.isRtl)() && e.forceTextAlign && (_ =
|
|
"right")
|
|
}
|
|
return this._internalData = {
|
|
boxLeft: l,
|
|
boxTop: a,
|
|
boxWidth: i,
|
|
boxHeight: s,
|
|
textStart: d - l,
|
|
textTop: p - a,
|
|
textAlign: _,
|
|
textBaseLine: "middle"
|
|
}, this._internalData
|
|
}
|
|
_getLinesInfo() {
|
|
if (null === this._linesInfo) {
|
|
const e = Object(r.ensureNotNull)(this._data);
|
|
let t = this.wordWrap(e.text, e.wordWrapWidth);
|
|
if (void 0 !== e.maxHeight) {
|
|
const i = function(e) {
|
|
const t = Object(r.ensureDefined)(e.maxHeight),
|
|
i = x(e),
|
|
s = C(e);
|
|
return Math.floor((t + s) / (i + s))
|
|
}(e);
|
|
t.length > i && (t = t.slice(0, i))
|
|
}
|
|
this._linesInfo = {
|
|
linesMaxWidth: this._getLinesMaxWidth(t),
|
|
lines: t
|
|
}
|
|
}
|
|
return this._linesInfo
|
|
}
|
|
_getFontInfo() {
|
|
if (null === this._fontInfo) {
|
|
const e = Object(r.ensureNotNull)(this._data),
|
|
t = x(e),
|
|
i = (e.bold ? "bold " : "") + (e.italic ? "italic " : "") + t + "px " + e
|
|
.font;
|
|
this._fontInfo = {
|
|
fontStyle: i,
|
|
fontSize: t
|
|
}
|
|
}
|
|
return this._fontInfo
|
|
}
|
|
_getBoxSize() {
|
|
if (null === this._boxSize) {
|
|
const e = this._getLinesInfo(),
|
|
t = Object(r.ensureNotNull)(this._data);
|
|
this._boxSize = {
|
|
boxWidth: b(t, e.linesMaxWidth),
|
|
boxHeight: v(t, e.lines.length)
|
|
}
|
|
}
|
|
return this._boxSize
|
|
}
|
|
_getRotationPoint() {
|
|
const {
|
|
boxLeft: e,
|
|
boxTop: t,
|
|
boxWidth: i,
|
|
boxHeight: n
|
|
} = this._getInternalData(), {
|
|
horzAlign: o,
|
|
vertAlign: a
|
|
} = Object(r.ensureNotNull)(this._data);
|
|
let l, c;
|
|
switch (o) {
|
|
case "center":
|
|
l = e + i / 2;
|
|
break;
|
|
case "left":
|
|
l = e;
|
|
break;
|
|
case "right":
|
|
l = e + i
|
|
}
|
|
switch (a) {
|
|
case "middle":
|
|
c = t + n / 2;
|
|
break;
|
|
case "top":
|
|
c = t;
|
|
break;
|
|
case "bottom":
|
|
c = t + n
|
|
}
|
|
return new s.Point(l, c)
|
|
}
|
|
}
|
|
},
|
|
qySK: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "b", (function() {
|
|
return u
|
|
})), i.d(t, "a", (function() {
|
|
return d
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("JmuD"),
|
|
n = i("KG+6"),
|
|
o = i("fFKx"),
|
|
a = i("SqfW"),
|
|
l = i("5vwb"),
|
|
c = i("7Fue"),
|
|
h = i("xWfy");
|
|
|
|
function u(e) {
|
|
if (!Object(r.isObject)(e)) throw new Error(
|
|
"Graphics commands should be wrapped in an object");
|
|
if (Object(r.hasProperty)(e, "create"), Object(r.hasProperty)(e, "erase")) {
|
|
const t = e.erase;
|
|
Object(s.assert)(Array.isArray(t), "Collection of erase commands should be array");
|
|
for (const e of t) {
|
|
if (!Object(r.isObject)(e) || !Object(r.hasProperty)(e, "action")) throw new Error(
|
|
"Command should be an object with 'action' property");
|
|
Object(s.assert)("all" === e.action || "one" === e.action,
|
|
"Erase command action should be 'all' or 'one'")
|
|
}
|
|
}
|
|
return e
|
|
}
|
|
class d {
|
|
constructor() {
|
|
this._indexes = [], this._horizlines = new Map, this._vertlines = new Map, this
|
|
._lines = new Map, this._hlines = new Map, this._textmarks = new Map, this
|
|
._shapemarks = new Map, this._backgrounds = new Map, this._polygons = new Map,
|
|
this._trendchannels = new Map, this._hhists = new Map, this._dwglabels =
|
|
new Map, this._dwgboxes = new Map, this._dwglines = new Map, this._dwgtables =
|
|
new Map, this._dwgtablecells = new Map, this._hhistsByTimePointIndex = new Map
|
|
}
|
|
horizlines() {
|
|
return this._horizlines
|
|
}
|
|
vertlines() {
|
|
return this._vertlines
|
|
}
|
|
lines() {
|
|
return this._lines
|
|
}
|
|
hlines() {
|
|
return this._hlines
|
|
}
|
|
textmarks() {
|
|
return this._textmarks
|
|
}
|
|
shapemarks() {
|
|
return this._shapemarks
|
|
}
|
|
backgrounds() {
|
|
return this._backgrounds
|
|
}
|
|
polygons() {
|
|
return this._polygons
|
|
}
|
|
trendchannels() {
|
|
return this._trendchannels
|
|
}
|
|
hhists() {
|
|
return this._hhists
|
|
}
|
|
dwglabels() {
|
|
return this._dwglabels
|
|
}
|
|
dwglines() {
|
|
return this._dwglines
|
|
}
|
|
dwgboxes() {
|
|
return this._dwgboxes
|
|
}
|
|
dwgtables() {
|
|
return this._dwgtables
|
|
}
|
|
dwgtablecells() {
|
|
return this._dwgtablecells
|
|
}
|
|
hhistsByTimePointIndex() {
|
|
return this._hhistsByTimePointIndex
|
|
}
|
|
clear() {
|
|
this._indexes = [], this._clearPrimitives()
|
|
}
|
|
extract() {
|
|
const e = e => e.extract(),
|
|
t = {
|
|
indexes: this._indexes,
|
|
horizlines: _(this._horizlines, e),
|
|
vertlines: _(this._vertlines, e),
|
|
lines: _(this._lines, e),
|
|
hlines: _(this._hlines, e),
|
|
textmarks: _(this._textmarks, e),
|
|
shapemarks: _(this._shapemarks, e),
|
|
backgrounds: _(this._backgrounds, e),
|
|
polygons: _(this._polygons, e),
|
|
trendchannels: _(this._trendchannels, e),
|
|
hhists: _(this._hhists, e),
|
|
dwglabels: _(this._dwglabels, e),
|
|
dwglines: _(this._dwglines, e),
|
|
dwgboxes: _(this._dwgboxes, e),
|
|
dwgtables: _(this._dwgtables, e),
|
|
dwgtablecells: _(this._dwgtablecells, e)
|
|
};
|
|
return this._hhistsByTimePointIndex = new Map, new h.a("data", t)
|
|
}
|
|
replaceIndexesTo(e) {
|
|
this._indexes = e;
|
|
const t = e => e.replaceIndexesTo(this._indexes);
|
|
this._horizlines.forEach(t), this._vertlines.forEach(t), this._lines.forEach(t),
|
|
this._hlines.forEach(t), this._textmarks.forEach(t), this._shapemarks.forEach(
|
|
t), this._backgrounds.forEach(t), this._polygons.forEach(t), this
|
|
._trendchannels
|
|
.forEach(t), this._hhists.forEach(t), this._dwglabels.forEach(t), this._dwgboxes
|
|
.forEach(t), this._dwglines.forEach(t), this._dwgtables.forEach(t), this
|
|
._dwgtablecells.forEach(t), this._hhistsByTimePointIndex = Object(c.b)(this
|
|
._hhists)
|
|
}
|
|
processCommands(e, t) {
|
|
void 0 !== e.erase && this._processEraseCommands(e.erase), void 0 !== e.create &&
|
|
this._processCreateCommands(e.create, t)
|
|
}
|
|
_processCreateCommands(e, t) {
|
|
for (const i in e) {
|
|
if (!e.hasOwnProperty(i)) continue;
|
|
const r = i;
|
|
switch (Object(s.assert)(r in t,
|
|
`There is a '${r}' in study response, but it doesn't present in graphics info!`
|
|
), r) {
|
|
case "hhists":
|
|
m(this._hhists, e[r], t[r], this._indexes, n.d);
|
|
break;
|
|
case "horizlines":
|
|
m(this._horizlines, e[r], t[r], this._indexes, o.b);
|
|
break;
|
|
case "vertlines":
|
|
m(this._vertlines, e[r], t[r], this._indexes, a.b);
|
|
break;
|
|
case "polygons":
|
|
m(this._polygons, e[r], t[r], this._indexes, l.b)
|
|
}
|
|
}
|
|
this._hhistsByTimePointIndex = Object(c.b)(this._hhists)
|
|
}
|
|
_processEraseCommands(e) {
|
|
for (const t of e)
|
|
if ("all" === t.action) this._clearPrimitives();
|
|
else {
|
|
const e = e => e.deleteById(t.id);
|
|
switch (t.type) {
|
|
case "horizlines":
|
|
this._horizlines.forEach(e);
|
|
break;
|
|
case "vertlines":
|
|
this._vertlines.forEach(e);
|
|
break;
|
|
case "lines":
|
|
this._lines.forEach(e);
|
|
break;
|
|
case "hlines":
|
|
this._hlines.forEach(e);
|
|
break;
|
|
case "textmarks":
|
|
this._textmarks.forEach(e);
|
|
break;
|
|
case "shapemarks":
|
|
this._shapemarks.forEach(e);
|
|
break;
|
|
case "backgrounds":
|
|
this._backgrounds.forEach(e);
|
|
break;
|
|
case "polygons":
|
|
this._polygons.forEach(e);
|
|
break;
|
|
case "trendchannels":
|
|
this._trendchannels.forEach(e);
|
|
break;
|
|
case "hhists":
|
|
this._hhists.forEach(e);
|
|
break;
|
|
case "dwglabels":
|
|
this._dwglabels.forEach(e);
|
|
break;
|
|
case "dwglines":
|
|
this._dwglines.forEach(e);
|
|
break;
|
|
case "dwgboxes":
|
|
this._dwgboxes.forEach(e);
|
|
break;
|
|
case "dwgtables":
|
|
this._dwgtables.forEach(e);
|
|
break;
|
|
case "dwgtablecells":
|
|
this._dwgtablecells.forEach(e)
|
|
}
|
|
} this._hhistsByTimePointIndex = Object(c.b)(this._hhists)
|
|
}
|
|
_clearPrimitives() {
|
|
this._horizlines.clear(), this._vertlines.clear(), this._lines.clear(), this._hlines
|
|
.clear(), this._textmarks.clear(), this._shapemarks.clear(), this._backgrounds
|
|
.clear(), this._polygons.clear(), this._trendchannels.clear(), this._hhists
|
|
.clear(), this._dwglabels.clear(), this._dwgboxes.clear(), this._dwglines
|
|
.clear(), this._dwgtables.clear(), this._dwgtablecells.clear(),
|
|
this._hhistsByTimePointIndex = new Map
|
|
}
|
|
}
|
|
class p {
|
|
constructor(e, t) {
|
|
this._primitivesDataById = new Map, this._primitiveById = new Map, this
|
|
._materializePrimitive = e, this._indexes = t
|
|
}
|
|
forEach(e, t) {
|
|
this._primitiveById.forEach(i => {
|
|
e.call(t, i, i, this)
|
|
})
|
|
}
|
|
has(e) {
|
|
let t = !1;
|
|
return this._primitiveById.forEach(i => {
|
|
t = t || i === e
|
|
}), t
|
|
}
|
|
get size() {
|
|
return this._primitiveById.size
|
|
} [Symbol.iterator]() {
|
|
throw new Error("Not implemented")
|
|
}
|
|
entries() {
|
|
throw new Error("Not implemented")
|
|
}
|
|
keys() {
|
|
throw new Error("Not implemented")
|
|
}
|
|
values() {
|
|
throw new Error("Not implemented")
|
|
}
|
|
hasId(e) {
|
|
return this._primitiveById.has(e)
|
|
}
|
|
addData(e) {
|
|
this._primitivesDataById.set(e.id, e), this._tryMaterialize(e)
|
|
}
|
|
deleteById(e) {
|
|
this._primitiveById.delete(e), this._primitivesDataById.delete(e)
|
|
}
|
|
clear() {
|
|
this._primitivesDataById.clear(), this._primitiveById.clear()
|
|
}
|
|
replaceIndexesTo(e) {
|
|
this._indexes = e, this._primitiveById.clear(), this._primitivesDataById.forEach(
|
|
this._tryMaterialize, this)
|
|
}
|
|
extract() {
|
|
const e = new Set(this._primitivesDataById.values());
|
|
return this._primitivesDataById = new Map, this._primitiveById.clear(), e
|
|
}
|
|
_tryMaterialize(e) {
|
|
const t = this._materializePrimitive(e, this._indexes);
|
|
null !== t && (Object(s.assert)(!this._primitiveById.has(e.id),
|
|
"primitive with specified id should not exist"), this._primitiveById
|
|
.set(e.id, t))
|
|
}
|
|
}
|
|
|
|
function _(e, t) {
|
|
const i = new Map;
|
|
return e.forEach((e, s) => i.set(s, t(e))), i
|
|
}
|
|
|
|
function m(e, t, i, r, n) {
|
|
if (void 0 !== t)
|
|
for (const o of t) {
|
|
const t = o.styleId;
|
|
void 0 !== i && Object(s.assert)(t in i,
|
|
"Every style used by graphics primitive should be declared in study metainfo"
|
|
);
|
|
let a = e.get(t);
|
|
void 0 === a && (a = new p(n, r), e.set(t, a)), o.data.forEach(a.addData.bind(a))
|
|
}
|
|
}
|
|
},
|
|
rCHB: function(e, t, i) {
|
|
"use strict";
|
|
var s;
|
|
i.r(t), i.d(t, "LineToolPitchforkStyle", (function() {
|
|
return s
|
|
})),
|
|
function(e) {
|
|
e[e.Original = 0] = "Original", e[e.Schiff = 1] = "Schiff", e[e.Inside = 2] = "Inside",
|
|
e[e.Schiff2 = 3] = "Schiff2"
|
|
}(s || (s = {}))
|
|
},
|
|
rL76: function(e, t, i) {
|
|
e.exports = {
|
|
labelwidth: "19px",
|
|
labelheight: "19px",
|
|
bordersize: "2px",
|
|
bottommargin: "5px",
|
|
gearheight: "15px",
|
|
gearwidth: "15px",
|
|
"price-axis-stub": "price-axis-stub-1DJMiIgd",
|
|
wrapper: "wrapper-1DJMiIgd",
|
|
label: "label-1DJMiIgd",
|
|
symbol: "symbol-1DJMiIgd",
|
|
gear: "gear-1DJMiIgd",
|
|
"fixed-gear": "fixed-gear-1DJMiIgd",
|
|
"fixed-symbol": "fixed-symbol-1DJMiIgd"
|
|
}
|
|
},
|
|
rQHv: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("IiTo"),
|
|
r = {};
|
|
e.exports = function(e, t, i) {
|
|
var n, o, a = {},
|
|
l = r[i] || "out_of_session",
|
|
c = !1,
|
|
h = i,
|
|
u = t,
|
|
d = null;
|
|
|
|
function p() {
|
|
var e = {};
|
|
e.symbolname = h, e.status = "ok", e.values = {}, e.values.current_session = l, r[
|
|
h] = l, TradingView.ChartapiMessagerInstances[u].onQuotesData([u].concat([
|
|
e]))
|
|
}
|
|
|
|
function _() {
|
|
if (n)
|
|
if (o) l = "out_of_session";
|
|
else {
|
|
var e = s.isTradingNow((new Date).getTime(), n) ? "market" :
|
|
"out_of_session";
|
|
e !== l && (l = e, p())
|
|
}
|
|
}
|
|
return e(i, null, (function(e) {
|
|
c || function(e) {
|
|
n = new s.SessionInfo(e.timezone, e.session, e.session_holidays,
|
|
e.corrections), o = e.expired, d = setInterval(_, 6e4),
|
|
_(), p()
|
|
}(e)
|
|
}), (function() {})), a.stop = function() {
|
|
c = !0, d && clearInterval(d)
|
|
}, a.marketStatus = function() {
|
|
return l
|
|
}, a
|
|
}
|
|
},
|
|
rWtV: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return n
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("Y7w9");
|
|
class n {
|
|
constructor() {
|
|
this._histPos = -1,
|
|
this._hist = new Float64Array(2e3), this._times = new Float64Array(2e3)
|
|
}
|
|
addHist(e) {
|
|
if (this._histPos >= 0) {
|
|
const t = this._times[this._histPos];
|
|
Object(s.assert)(t <= e, "History order violation"), this._histPos += t === e ?
|
|
0 : 1
|
|
} else this._histPos += 1;
|
|
if (this._histPos === this._hist.length) {
|
|
const e = new Float64Array(2 * this._hist.length);
|
|
e.set(this._hist), this._hist = e;
|
|
const t = new Float64Array(this._hist.length);
|
|
t.set(this._times), this._times = t
|
|
}
|
|
this._hist[this._histPos] = NaN, this._times[this._histPos] = e
|
|
}
|
|
removeLastIfNaN() {
|
|
Number.isNaN(this.get(0)) && (this._histPos -= 1)
|
|
}
|
|
get(e) {
|
|
Object(s.assert)(0 === e);
|
|
const t = this._histPos - e;
|
|
return this._hist[t]
|
|
}
|
|
getLeftOrEqual(e) {
|
|
const t = Object(r.upperbound)(this._times, e, (e, t) => e < t, 0, this._histPos +
|
|
1);
|
|
return 0 === t ? NaN : this._hist[t - 1]
|
|
}
|
|
set(e) {
|
|
this._hist[this._histPos] = e
|
|
}
|
|
indexOf(e) {
|
|
throw new Error("Not implemented")
|
|
}
|
|
}
|
|
},
|
|
rY0k: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("xDuj").translatedIntervalString,
|
|
r = i("hOqT").getTranslatedSymbolDescription,
|
|
n = i("zDbI").CHART_FONT_FAMILY,
|
|
o = i("di4O"),
|
|
a = o.watermarkProperty,
|
|
l = o.restoreWatermarkPropertyDefaults,
|
|
c = i("ikwP").drawScaled,
|
|
h = i("wZIs").applyDefaultsOverrides,
|
|
u = i("wZIs").applyPropertiesOverrides;
|
|
t.Watermark = function(e, t) {
|
|
var i = {},
|
|
o = a();
|
|
|
|
function d(e, t) {
|
|
var s = e.font;
|
|
return i.hasOwnProperty(s) || (i[s] = {}), i[s].hasOwnProperty(t) || (i[s][t] = e
|
|
.measureText(t).width), i[s][t]
|
|
}
|
|
h(o, void 0, !1, "symbolWatermarkProperties"), o.listeners().subscribe(this, (
|
|
function() {
|
|
e.updateSource(this)
|
|
})), this.destroy = function() {
|
|
o.listeners().unsubscribeAll(this)
|
|
}, this.properties = function() {
|
|
return o
|
|
}, this.restorePropertiesDefaults = function() {
|
|
l()
|
|
}, this.applyOverrides = function(e) {
|
|
u(o, void 0, !1, e, "symbolWatermarkProperties")
|
|
};
|
|
var p = {
|
|
renderer: function(e, i) {
|
|
return {
|
|
draw: function(a, l) {
|
|
c(a, l.pixelRatio, (function() {
|
|
var l = t.symbolInfo();
|
|
a.fillStyle = o.color.value();
|
|
var c, h = l.name;
|
|
/QUANDL/.test(l.exchange) && ((c = h.split(
|
|
/\//)).length && (h = c[c
|
|
.length - 1]));
|
|
for (var u = {
|
|
description: l.description,
|
|
short_description: l
|
|
.short_description,
|
|
pro_name: l.pro_name,
|
|
short_name: l.name,
|
|
local_description: l
|
|
.local_description,
|
|
language: l.language
|
|
}, p = [{
|
|
text: h ? h + ", " + s(t
|
|
.interval()) : "",
|
|
font: "96px " + n,
|
|
lineHeight: 117,
|
|
vertOffset: 0
|
|
}, {
|
|
text: r(u) || "",
|
|
font: "48px " + n,
|
|
lineHeight: 58,
|
|
vertOffset: 5
|
|
}], _ = 0, m = 0; m < p.length; m++) {
|
|
if ((b = p[m]).text) {
|
|
a.font = b.font;
|
|
var f = d(a, b.text);
|
|
b.zoom = f > i ? i / f : 1, _ += b
|
|
.lineHeight * b.zoom
|
|
}
|
|
}
|
|
var g = Math.max((e - _) / 2, 0);
|
|
for (m = 0; m < p.length; m++) {
|
|
var b;
|
|
(b = p[m]).text && (a.save(), a
|
|
.translate(i / 2, g), a
|
|
.textBaseline = "top", a
|
|
.textAlign = "center", a.font =
|
|
b.font, a.scale(b.zoom, b.zoom),
|
|
a.fillText(b.text, 0, b
|
|
.vertOffset), a.restore(),
|
|
g += b.lineHeight * b.zoom)
|
|
}
|
|
}))
|
|
}
|
|
}
|
|
},
|
|
update: function() {}
|
|
};
|
|
this.paneViews = function() {
|
|
return t.symbolInfo() && o.visibility.value() ? [p] : []
|
|
}
|
|
}
|
|
},
|
|
ri5u: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "ChartLoadThemeUndoCommand", (function() {
|
|
return d
|
|
}));
|
|
var s = i("FIi8"),
|
|
r = i("Ocx9"),
|
|
n = i("wZIs"),
|
|
o = i("RDU5");
|
|
|
|
function a(e) {
|
|
const {
|
|
visible: t,
|
|
...i
|
|
} = e;
|
|
return i
|
|
}
|
|
|
|
function l(e) {
|
|
const {
|
|
visible: t,
|
|
...i
|
|
} = e;
|
|
return i
|
|
}
|
|
|
|
function c(e) {
|
|
const {
|
|
visible: t,
|
|
style: i,
|
|
symbol: s,
|
|
interval: r,
|
|
sessionId: n,
|
|
highLowAvgPrice: o,
|
|
showCountdown: c,
|
|
bidAsk: h,
|
|
prePostMarket: u,
|
|
...d
|
|
} = e;
|
|
return {
|
|
bidAsk: a(h),
|
|
prePostMarket: l(u),
|
|
...d
|
|
}
|
|
}
|
|
|
|
function h(e) {
|
|
const {
|
|
scaleSeriesOnly: t,
|
|
showSeriesLastValue: i,
|
|
showStudyLastValue: s,
|
|
showSymbolLabels: r,
|
|
showBidAskLabels: n,
|
|
showPrePostMarketPriceLabel: o,
|
|
showStudyPlotLabels: a,
|
|
showFundamentalNameLabel: l,
|
|
showFundamentalLastValue: c,
|
|
seriesLastValueMode: h,
|
|
...u
|
|
} = e;
|
|
return u
|
|
}
|
|
|
|
function u(e) {
|
|
const {
|
|
topMargin: t,
|
|
bottomMargin: i,
|
|
...s
|
|
} = e;
|
|
return s
|
|
}
|
|
class d extends o.UndoCommand {
|
|
constructor(e, t, i) {
|
|
var r, o, a;
|
|
super("Apply Chart Theme"), this._model = e, this._newSessionProps = t
|
|
.sessions || Object(n.factoryDefaults)("sessions"), ["candleStyle",
|
|
"hollowCandleStyle", "haStyle"
|
|
].forEach(e => {
|
|
t.mainSourceProperties[e].wickUpColor = t.mainSourceProperties[e]
|
|
.wickUpColor || t.mainSourceProperties[e].wickColor, t
|
|
.mainSourceProperties[e].wickDownColor = t.mainSourceProperties[
|
|
e].wickDownColor || t.mainSourceProperties[e].wickColor
|
|
}), t.chartProperties = null !== (r = t.chartProperties) && void 0 !== r ?
|
|
r : {
|
|
paneProperties: void 0,
|
|
scalesProperties: void 0
|
|
}, t.chartProperties.paneProperties.vertGridProperties = null !== (o = t
|
|
.chartProperties.paneProperties.vertGridProperties) && void 0 !== o ?
|
|
o : t.chartProperties.paneProperties.gridProperties, t.chartProperties
|
|
.paneProperties.horzGridProperties = null !== (a = t.chartProperties
|
|
.paneProperties.horzGridProperties) && void 0 !== a ? a : t
|
|
.chartProperties.paneProperties.gridProperties, t.chartProperties
|
|
.paneProperties.legendProperties = this._model.properties().state()
|
|
.paneProperties.legendProperties;
|
|
const l = Object(n.factoryDefaults)("chartproperties"),
|
|
d = Object(s.deepExtend)({}, l, t.chartProperties);
|
|
this._newChartProps = {
|
|
paneProperties: u(d.paneProperties),
|
|
scalesProperties: h(d.scalesProperties)
|
|
}, e.timeScale().preserveBarSpacing() && delete this._newChartProps
|
|
.scalesProperties.barSpacing;
|
|
const p = Object(n.factoryDefaults)("chartproperties.mainSeriesProperties"),
|
|
_ = Object(s.deepExtend)({}, p, t.mainSourceProperties);
|
|
this._newSeriesProps = i ? _ : c(_);
|
|
const m = e.properties().state();
|
|
this._oldChartProps = {
|
|
paneProperties: u(m.paneProperties),
|
|
scalesProperties: h(m.scalesProperties)
|
|
}, this._oldSeriesProps = c(e.mainSeries().properties().state()), this
|
|
._oldSessionProps = this._model.sessions().properties().state()
|
|
}
|
|
undo() {
|
|
this._merge(this._oldChartProps, this._oldSeriesProps, this._oldSessionProps),
|
|
this._model.mainSeries().onChartStyleChanged(), this._model.updateScales(),
|
|
this._model.chartThemeLoaded()
|
|
}
|
|
redo() {
|
|
this._merge(this._newChartProps, this._newSeriesProps, this._newSessionProps),
|
|
this._model.mainSeries().onChartStyleChanged(), this._model.updateScales(),
|
|
this._model.chartThemeLoaded()
|
|
}
|
|
_merge(e, t, i) {
|
|
var s, n, o, a;
|
|
const l = this._model;
|
|
Object(r.saveDefaultProperties)(!0), e && (l.properties().paneProperties
|
|
.mergeAndFire(e.paneProperties), l.properties().scalesProperties
|
|
.mergeAndFire(e.scalesProperties)), l.mainSeries().priceScale()
|
|
.setMode({
|
|
autoScale: null === (s = t.priceAxisProperties) || void 0 === s ?
|
|
void 0 : s.autoScale,
|
|
percentage: null === (n = t.priceAxisProperties) || void 0 === n ?
|
|
void 0 : n.percentage,
|
|
log: null === (o = t.priceAxisProperties) || void 0 === o ? void 0 :
|
|
o.log,
|
|
lockScale: null === (a = t.priceAxisProperties) || void 0 === a ?
|
|
void 0 : a.lockScale
|
|
}), l.mainSeries().properties().mergeAndFire(t), l.mainSeries().properties()
|
|
.saveDefaults(),
|
|
l.mainSeries().createPaneView(), l.mainSeries().invalidateBarStylesCache(),
|
|
l.recalculateAllPanes(), l.fullUpdate(), l.properties().saveDefaults(), l
|
|
.sessions().restoreState({
|
|
properties: i
|
|
}, !1), Object(r.saveDefaultProperties)(!1)
|
|
}
|
|
}
|
|
},
|
|
s1Gx: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "specialZOrderBase", (function() {
|
|
return s
|
|
})), i.d(t, "sortSourcesPreOrdered", (function() {
|
|
return r
|
|
})), i.d(t, "sortSources", (function() {
|
|
return n
|
|
}));
|
|
const s = 1e7,
|
|
r = {
|
|
ChartEventsSource: s + 1,
|
|
Dividends: s + 2,
|
|
Splits: s + 3,
|
|
Earnings: s + 4,
|
|
LineToolOrder: s + 5,
|
|
LineToolPosition: s + 6,
|
|
LineToolExecution: s + 7,
|
|
AlertLabel: s + 8
|
|
};
|
|
|
|
function n(e) {
|
|
return [...e].sort((e, t) => e.zorder() - t.zorder())
|
|
}
|
|
},
|
|
s9sR: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "SetResolutionUndoCommand", (function() {
|
|
return o
|
|
}));
|
|
var s = i("RDU5"),
|
|
r = i("LxhU"),
|
|
n = i("n5al");
|
|
class o extends s.UndoCommand {
|
|
constructor(e, t, i, s) {
|
|
super(s), this._property = e, this._value = t, this._prevValue = e.value(), this
|
|
._chartWidget = i
|
|
}
|
|
redo() {
|
|
this._chartWidget.screen.show(), this._property.setValue(this._value), this
|
|
._handleResolution(this._value)
|
|
}
|
|
undo() {
|
|
this._chartWidget.screen.show(), this._property.setValue(this._prevValue), this
|
|
._handleResolution(this._prevValue)
|
|
}
|
|
_handleResolution(e) {
|
|
const t = this._chartWidget.model().mainSeries().properties(),
|
|
i = t.style.value(),
|
|
s = Object(n.isRangeStyle)(i),
|
|
o = r.Interval.isRange(e);
|
|
!s && o ? t.style.setValue(11) : s && !o && t.style.setValue(Object(n
|
|
.getLastUsedStyle)())
|
|
}
|
|
}
|
|
},
|
|
sDZI: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "sessionsPreferencesDefault", (function() {
|
|
return r
|
|
}));
|
|
var s = i("HGP3");
|
|
const r = {
|
|
graphics: {
|
|
backgrounds: {
|
|
outOfSession: {
|
|
color: s.colorsPalette["color-tv-blue-500"],
|
|
transparency: 92,
|
|
visible: !1
|
|
},
|
|
preMarket: {
|
|
color: "#FF9800",
|
|
transparency: 92,
|
|
visible: !1
|
|
},
|
|
postMarket: {
|
|
color: s.colorsPalette["color-tv-blue-500"],
|
|
transparency: 92,
|
|
visible: !1
|
|
}
|
|
},
|
|
vertlines: {
|
|
sessBreaks: {
|
|
color: "#4985e7",
|
|
style: 2,
|
|
visible: !1,
|
|
width: 1
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
sEk5: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("fTGZ").BarsMarksContainer,
|
|
r = i("mMWL"),
|
|
n = i("CCPt").UserDefinedBarsMarksTooltip;
|
|
e.exports = class extends s {
|
|
constructor(e) {
|
|
super(e), this.toolname = "UserDefinedBarsMarks";
|
|
var t = this;
|
|
r.hideMarksOnBars().subscribe(this, (function() {
|
|
t._properties.visible.setValue(!r.hideMarksOnBars().value())
|
|
}))
|
|
}
|
|
_initialize(e) {
|
|
this._properties.visible.setValue(!0)
|
|
}
|
|
userEditEnabled() {
|
|
return !1
|
|
}
|
|
_plateViewData(e) {
|
|
var t = {
|
|
text: e.text
|
|
};
|
|
return "object" == typeof e.color && (t.theme = "user_defined_theme", t
|
|
.overridedTheme = {}, t.overridedTheme.border = e.color.border, t
|
|
.overridedTheme.background = e.color.background), t
|
|
}
|
|
onClicked(e) {
|
|
var t = e.id;
|
|
this._marks[t].onClicked()
|
|
}
|
|
clearMarks() {
|
|
super.clearMarks(), this.onNeedRepaint.fire()
|
|
}
|
|
_getData(e) {
|
|
var t = this._model.mainSeries().symbolInfo();
|
|
if (t) {
|
|
var i = this.roundRange(this._rangeDifference(e)),
|
|
s = this,
|
|
r = this._model.mainSeries().properties().interval.value();
|
|
ChartApiInstance.getMarks(t, i.start, i.end, (function(t) {
|
|
t.forEach((function(e) {
|
|
s._marks[e.id] = e
|
|
}), s), s._loadedRange = s._rangeUnion(e, s
|
|
._loadedRange), s.onNeedRepaint.fire()
|
|
}), r)
|
|
}
|
|
}
|
|
_createTooltip() {
|
|
return new n
|
|
}
|
|
updatePlateData(e, t) {
|
|
return t.barWidth = this.barWidth(), t.text = e.text, t.tooltipMargin = -1 *
|
|
Math.max(e.minSize / 2, .4 * this.barWidth()), t
|
|
}
|
|
hasContextMenu() {
|
|
return !1
|
|
}
|
|
calcIsActualCurrency() {
|
|
this._isActualCurrency = !0
|
|
}
|
|
calcIsActualUnit() {
|
|
this._isActualUnit = !0
|
|
}
|
|
}
|
|
},
|
|
sJA2: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "ThemesApi", (function() {
|
|
return n
|
|
}));
|
|
var s = i("EsvI"),
|
|
r = i("oiZD");
|
|
class n {
|
|
constructor(e) {
|
|
this._opts = e
|
|
}
|
|
isStdTheme() {
|
|
const e = this._opts.chartWidgetCollection.getAll().every(e => Object(s.isStdTheme)(
|
|
Object(s.extractThemeFromModel)(e.model())));
|
|
return Promise.resolve(e)
|
|
}
|
|
async setStdTheme(e, t = !0, i) {
|
|
await Object(s.loadTheme)(e, !0, !1, this._opts.chartWidgetCollection, t, i)
|
|
}
|
|
setStdThemeForLayout(e, t = !0) {
|
|
Object(r.setTheme)(e), t && Object(s.syncTheme)()
|
|
}
|
|
getCurrentThemeName() {
|
|
return Object(s.getCurrentTheme)().name
|
|
}
|
|
}
|
|
},
|
|
sQaR: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return n
|
|
}));
|
|
var s = i("hY0g"),
|
|
r = i.n(s);
|
|
class n {
|
|
constructor() {
|
|
this._container = document.createElement("div"), this._visibility = new r.a(!1)
|
|
}
|
|
visible() {
|
|
return this._visibility.readonly()
|
|
}
|
|
_setVisibility(e) {
|
|
this._visibility.setValue(e)
|
|
}
|
|
}
|
|
},
|
|
t2ex: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("5rJj"),
|
|
r = i("Ss5c").LineDataSource,
|
|
n = i("j3hX"),
|
|
o = n.LineToolWidthsProperty,
|
|
a = n.LineToolColorsProperty;
|
|
class l extends r {
|
|
constructor(e, t) {
|
|
super(e, t || l.createProperties()), this.version = l.version, this._properties
|
|
._stateVersion = 1, i.e("lt-pane-views").then(i.t.bind(null, "R7Bt", 7)).then(({
|
|
FibRetracementPaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
levelsCount() {
|
|
return l.LevelsCount
|
|
}
|
|
pointsCount() {
|
|
return 2
|
|
}
|
|
name() {
|
|
return "Fib Retracement"
|
|
}
|
|
migrateVersion(e, t, i) {
|
|
1 === e && this.properties().extendLines.setValue(!0)
|
|
}
|
|
processErase(e, t) {
|
|
var i = "level" + t,
|
|
s = this.properties()[i].visible;
|
|
e.setProperty(s, !1, "Erase level line")
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "17v9")))
|
|
.FibDrawingsWith24LevelsDefinitionsViewModel
|
|
}
|
|
static createProperties(e) {
|
|
var t = new s("linetoolfibretracement", e, !1, {
|
|
range: [1, 24],
|
|
names: ["coeff", "color", "visible"]
|
|
});
|
|
return l._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
r._configureProperties(e);
|
|
for (var t = [e.child("trendline").child("linewidth"), e.child("levelsStyle").child(
|
|
"linewidth")], i = [e.child("trendline").child("color")], s = 1; s <= l
|
|
.LevelsCount; s++) i.push(e.child("level" + s).child("color"));
|
|
e.addChild("linesColors", new a(i)), e.addChild("linesWidths", new o(t))
|
|
}
|
|
fibLevelsBasedOnLogScale() {
|
|
return this.properties().fibLevelsBasedOnLogScale.value() && this.priceScale()
|
|
.isLog()
|
|
}
|
|
}
|
|
l.version = 2, l.LevelsCount = 24, t.LineToolFibRetracement = l
|
|
},
|
|
tDUI: function(e, t, i) {
|
|
"use strict";
|
|
(function(e) {
|
|
var s = i("Eyy1").ensureNotNull,
|
|
r = i("Ss5c").LineDataSource,
|
|
n = i("gMtF").LineToolRiskRewardPriceAxisView,
|
|
o = i("mMWL"),
|
|
a = i("Ocx9").DefaultProperty,
|
|
l = i("zXvd").NumericFormatter,
|
|
c = i("wGNx").RiskRewardPointIndex,
|
|
h = i("H007"),
|
|
u = h.RiskRewordEntryPriceProperty,
|
|
d = h.RiskRewordStopPriceProperty,
|
|
p = h.RiskRewardTargetPriceProperty,
|
|
_ = i("ogJP").isNumber,
|
|
m = i("k9/m").PlotRowSearchMode;
|
|
class f extends r {
|
|
constructor(t, s) {
|
|
var r = s;
|
|
if (super(t, r), !s.stopLevel && !s.profitLevel) {
|
|
var o = t.timeScale().visibleBarsStrictRange(),
|
|
a = o.firstBar(),
|
|
h = o.lastBar(),
|
|
_ = t.mainSeries().priceRange(a, h),
|
|
m = t.mainSeries().priceScale();
|
|
if (m.isLog()) {
|
|
var g = m.logicalToPrice(_.minValue()),
|
|
b = m.logicalToPrice(_.maxValue());
|
|
_ = new e(g, b)
|
|
}
|
|
if (_ && !_.isEmpty()) {
|
|
var v = Math.round(.2 * _.length() * t.mainSeries().base());
|
|
r.merge({
|
|
stopLevel: v,
|
|
profitLevel: v
|
|
})
|
|
}
|
|
}
|
|
var S = this;
|
|
r.stopLevel.listeners().subscribe(this, this.recalculate), r.stopLevel
|
|
.listeners().subscribe(null, (function() {
|
|
S.properties().stopPrice._listeners.fire(S.properties()
|
|
.stopPrice)
|
|
})), r.profitLevel.listeners().subscribe(this, this.recalculate), r
|
|
.profitLevel.listeners().subscribe(null, (function() {
|
|
S.properties().targetPrice._listeners.fire(S.properties()
|
|
.targetPrice)
|
|
})), r.addChild("entryPrice", new u(this)), r.addChild("stopPrice",
|
|
new d(this)), r.addChild("targetPrice", new p(this)), r.addProperty(
|
|
"riskSize", 0), r.addProperty("qty", 0), r.addProperty(
|
|
"amountTarget", r.accountSize.value()), r.addProperty("amountStop",
|
|
r.accountSize.value()), this._riskInPercentsFormatter = new l(2),
|
|
this._riskInMoneyFormatter = new l, r.risk.subscribe(this, this
|
|
._recalculateRiskSize), r.accountSize.subscribe(this, this
|
|
._recalculateRiskSize), r.riskDisplayMode.subscribe(this, this
|
|
._recalculateRisk), r.riskDisplayMode.subscribe(this, this
|
|
._recalculateRiskSize), r.entryPrice.subscribe(this, this
|
|
._recalculateRiskSize), r.stopPrice.subscribe(this, this
|
|
._recalculateRiskSize), r.profitLevel.subscribe(this, this
|
|
._recalculateRiskSize), r.profitLevel.subscribe(this, this
|
|
.syncPriceLevels.bind(this)), r.stopLevel.subscribe(this, this
|
|
._recalculateRiskSize), r.stopLevel.subscribe(this, this
|
|
.syncPriceLevels.bind(this)), r.qty.subscribe(this, this
|
|
._recalculateRiskSize), this.pointAdded().subscribe(this, e => {
|
|
switch (e) {
|
|
case c.Entry:
|
|
case c.Close:
|
|
this._recalculateRiskSize()
|
|
}
|
|
}), this.pointChanged().subscribe(this, e => {
|
|
switch (e) {
|
|
case c.Entry:
|
|
case c.Close:
|
|
this._recalculateRiskSize()
|
|
}
|
|
}), "percents" === r.riskDisplayMode.value() && r.risk.value() > 100 &&
|
|
r.riskDisplayMode.setValueSilently("money"), this
|
|
._syncStateExclusions = ["points", "entryPrice", "stopPrice",
|
|
"targetPrice", "stopLevel", "profitLevel", "riskSize", "qty",
|
|
"amountTarget", "amountStop", "risk", "accountSize"
|
|
], this.version = f.version, this._entryPriceAxisView = new n(this, {
|
|
colorProperty: r.linecolor,
|
|
priceProperty: r.entryPrice
|
|
}), this._stopPriceAxisView = new n(this, {
|
|
colorProperty: r.stopBackground,
|
|
priceProperty: r.stopPrice
|
|
}), this._profitPriceAxisView = new n(this, {
|
|
colorProperty: r.profitBackground,
|
|
priceProperty: r.targetPrice
|
|
}), i.e("lt-pane-views").then(i.t.bind(null, "u+oH", 7)).then(({
|
|
RiskRewardPaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
riskFormatter(e) {
|
|
return "percents" === e ? this._riskInPercentsFormatter : this
|
|
._riskInMoneyFormatter
|
|
}
|
|
getRiskStep(e) {
|
|
return "percents" === e ? .01 : 1
|
|
}
|
|
_roundValue(e) {
|
|
return parseFloat(e.toFixed(2))
|
|
}
|
|
hasEditableCoordinates() {
|
|
return !1
|
|
}
|
|
_recalculateRisk() {
|
|
var e = this.properties(),
|
|
t = e.riskDisplayMode.value(),
|
|
i = e.riskSize.value(),
|
|
s = e.accountSize.value(),
|
|
r = e.risk.value();
|
|
r = "percents" === t ? this._roundValue(i / s * 100) : this._roundValue(s /
|
|
100 * r), this._riskInChange = !0,
|
|
e.risk.setValue(this.riskFormatter(t).format(r)), this._riskInChange = !
|
|
1
|
|
}
|
|
_recalculateRiskSize() {
|
|
if (!this._riskInChange) {
|
|
var e = this.properties(),
|
|
t = e.risk.value(),
|
|
i = e.riskDisplayMode.value(),
|
|
s = e.accountSize.value();
|
|
"percents" === i ? e.riskSize.setValue(t / 100 * s) : t > s ? (e.risk
|
|
.setValue(s), e.riskSize.setValue(s)) : e.riskSize.setValue(t)
|
|
}
|
|
}
|
|
lastBarData() {
|
|
var e = this._model.mainSeries().bars().firstIndex(),
|
|
t = this._model.mainSeries().bars().lastIndex();
|
|
if (null === e || null === t || isNaN(e) || isNaN(t)) return null;
|
|
var i = this.points();
|
|
if (4 === i.length) {
|
|
var s = i[c.ActualClose];
|
|
return s.index < e ? null : {
|
|
closePrice: s.price,
|
|
index: Math.min(t, s.index)
|
|
}
|
|
}
|
|
var r = i[c.Close];
|
|
if (r.index < e) return null;
|
|
var n = Math.min(t, r.index),
|
|
o = this._model.mainSeries().bars().search(n, m.NearestLeft);
|
|
return null === o ? null : {
|
|
closePrice: o.value[TradingView.CLOSE_PLOT],
|
|
index: o.index
|
|
}
|
|
}
|
|
migrateVersion(e, t, i) {
|
|
if (1 === e && this._points.length >= 1) {
|
|
var s = [];
|
|
if (s.push(this._points[0]), n = {
|
|
price: (n = this._points[0]).price,
|
|
index: this._getClosePointIndex(n.index)
|
|
}, s.push(n), this._points[1] && s.push(this._points[1]), this
|
|
._points[2] && s.push(this._points[2]), this._points = s, this
|
|
._timePoint.length >= 1) {
|
|
var r = [],
|
|
n = this._timePoint[0];
|
|
r.push(n);
|
|
var o = {
|
|
price: n.price,
|
|
time_t: n.time_t,
|
|
offset: this._getClosePointIndex(n.offset)
|
|
};
|
|
r.push(o), this._timePoint[1] && s.push(this._points[1]), this
|
|
._timePoint[2] && s.push(this._points[2]), this._timePoint = r
|
|
}
|
|
}
|
|
}
|
|
checkAlert() {
|
|
this.recalculate()
|
|
}
|
|
priceAxisViews(e, t) {
|
|
return this.isSourceHidden() || t !== this.priceScale() || this._model
|
|
.paneForSource(this) !== e ? null : [this._entryPriceAxisView, this
|
|
._stopPriceAxisView, this._profitPriceAxisView
|
|
]
|
|
}
|
|
updateAllViews() {
|
|
this.isActualSymbol() && this._properties.visible.value() && (o
|
|
.hideAllDrawings().value() && this.userEditEnabled() || (super
|
|
.updateAllViews(), this._entryPriceAxisView.update(), this
|
|
._stopPriceAxisView.update(), this._profitPriceAxisView.update()
|
|
))
|
|
}
|
|
restoreExternalState(e) {
|
|
(e = Object.assign({}, e), this.isActualSymbol()) || _(e.entryPrice) && (
|
|
this._timePoint[0].price = e.entryPrice, delete e.entryPrice);
|
|
this.properties().merge(e)
|
|
}
|
|
_changeEntryPoint(e) {
|
|
var t = this.properties().stopPrice.value(),
|
|
i = this.properties().targetPrice.value(),
|
|
s = 1 / this._model.mainSeries().base(),
|
|
r = Math.min(t, i) + s,
|
|
n = Math.max(t, i) - s;
|
|
e.price = Math.max(r, Math.min(n, this._roundPrice(e.price))), super
|
|
.setPoint(0, e), this.properties().stopPrice.setValue(t), this
|
|
.properties().targetPrice.setValue(i)
|
|
}
|
|
setPoint(e, t, i) {
|
|
if (this.isActualSymbol()) {
|
|
switch (this._muteSyncLineStyle(), e) {
|
|
case 0:
|
|
this._changeEntryPoint(t);
|
|
break;
|
|
case 2:
|
|
this.properties().stopPrice.setValue(this.preparseStopPrice(t
|
|
.price));
|
|
break;
|
|
case 3:
|
|
this.properties().targetPrice.setValue(this.preparseProfitPrice(
|
|
t.price));
|
|
break;
|
|
case 1:
|
|
t.price = this._roundPrice(t.price), super.setPoint(1, t), this
|
|
.recalculate()
|
|
}
|
|
this._unmuteSyncLineStyleWithoutApplyingChanges(), this
|
|
.syncPriceLevels()
|
|
}
|
|
}
|
|
getPoint(e) {
|
|
switch (e) {
|
|
case 0:
|
|
return this._points[0];
|
|
case 1:
|
|
return {
|
|
index: this._points[1].index, price: this._points[0].price
|
|
};
|
|
case 2:
|
|
return {
|
|
index: this._points[0].index, price: this.stopPrice()
|
|
};
|
|
case 3:
|
|
return {
|
|
index: this._points[0].index, price: this.profitPrice()
|
|
}
|
|
}
|
|
return null
|
|
}
|
|
setPoints(e) {
|
|
this._muteSyncLineStyle(), super.setPoints(e), this.recalculate(), this
|
|
._unmuteSyncLineStyleWithoutApplyingChanges(), this.syncPriceLevels()
|
|
}
|
|
syncPriceLevels() {
|
|
if (this.linkKey().value()) {
|
|
var e = this.properties(),
|
|
t = {
|
|
entryPrice: e.entryPrice.value(),
|
|
stopLevel: e.stopLevel.value(),
|
|
profitLevel: e.profitLevel.value()
|
|
};
|
|
o.changeLineStyle({
|
|
linkKey: this.linkKey().value(),
|
|
state: t,
|
|
model: this._model
|
|
})
|
|
}
|
|
}
|
|
pointsCount() {
|
|
return 1
|
|
}
|
|
name() {
|
|
return "Risk/Reward"
|
|
}
|
|
addPoint(e) {
|
|
e.price = this._roundPrice(e.price), super.addPoint(e, null, !0);
|
|
var t = {
|
|
price: e.price,
|
|
index: this._getClosePointIndex(e.index)
|
|
};
|
|
super._addPointIntenal(t, null, !0);
|
|
var i = this.calculateActualEntry(e, t);
|
|
i && (super._addPointIntenal(i, null, !0), (t = this.findClosePoint(i,
|
|
t)) && super._addPointIntenal(t, null, !0));
|
|
return this._lastPoint = null, this.normalizePoints(), this
|
|
.createServerPoints(), !0
|
|
}
|
|
setOwnerSource(e) {
|
|
super.setOwnerSource(e), this._model.mainSeries().symbolInfo() && (this
|
|
._recalculateAmount(), this._recalculateQty())
|
|
}
|
|
_roundPrice(e) {
|
|
var t = this._model.mainSeries().base();
|
|
return Math.round(e * t) / t
|
|
}
|
|
recalculate() {
|
|
if (0 !== this.points().length) {
|
|
var e = this.properties().targetPrice.value(),
|
|
t = this.properties().stopPrice.value(),
|
|
i = [this._points[0], this._points[1]],
|
|
s = this.calculateActualEntry(this.points()[0], this.points()[1]);
|
|
if (s) {
|
|
i.push(s);
|
|
var r = this.findClosePoint(s, this.points()[1]);
|
|
r && i.push(r)
|
|
}
|
|
this._points = i, e !== this.properties().targetPrice.value() && this
|
|
.properties().targetPrice._listeners.fire(this.properties()
|
|
.targetPrice), t !== this.properties().stopPrice.value() && this
|
|
.properties().stopPrice._listeners.fire(this.properties().stopPrice)
|
|
}
|
|
}
|
|
start() {
|
|
super.start(), this.recalculate()
|
|
}
|
|
startMoving(e, t, i) {
|
|
e.logical.price = this._roundPrice(e.logical.price), super.startMoving(e, t,
|
|
i)
|
|
}
|
|
move(e, t, i) {
|
|
e.logical.price = this._roundPrice(e.logical.price), super.move(e, t, i),
|
|
this.recalculate(), this._entryPriceAxisView.update()
|
|
}
|
|
_correctPoints(e) {
|
|
return !!this.isActualSymbol() && r.prototype._correctPoints.call(this, [e[
|
|
0], e[1]])
|
|
}
|
|
entryPrice() {
|
|
return this.points()[0].price
|
|
}
|
|
findClosePoint(e, t) {
|
|
for (var i = this._model.mainSeries().bars(), r = s(i.firstIndex()), n =
|
|
Math.max(e.index, r), o = s(i.lastIndex()), a = Math.min(o, t
|
|
.index), l = n; l <= a; l++) {
|
|
var c = i.valueAt(l);
|
|
if (null !== c) {
|
|
var h = this.checkStopPrice(c);
|
|
if (null != h) return {
|
|
index: l,
|
|
price: h
|
|
}
|
|
}
|
|
}
|
|
return null
|
|
}
|
|
calculateActualEntry(e, t) {
|
|
var i = this._model.mainSeries().bars();
|
|
if (i.isEmpty()) return null;
|
|
for (var r = s(i.firstIndex()), n = Math.max(e.index, r), o = e.price, a =
|
|
s(i.lastIndex()), l = Math.min(a, t.index), c = n; c <= l; c++) {
|
|
var h = i.valueAt(c);
|
|
if (null !== h && h[TradingView.HIGH_PLOT] >= o && h[TradingView
|
|
.LOW_PLOT] <= o) return {
|
|
index: c,
|
|
price: o
|
|
}
|
|
}
|
|
return null
|
|
}
|
|
axisPoints() {
|
|
if (!this._points[c.ActualEntry]) return [];
|
|
var e = this._points[c.ActualEntry],
|
|
t = null;
|
|
if (4 === this._points.length) t = this._points[c.ActualClose];
|
|
else {
|
|
var i = this.lastBarData();
|
|
if (!i) return [];
|
|
t = {
|
|
index: i.index,
|
|
price: i.closePrice
|
|
}
|
|
}
|
|
return [e, t]
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null,
|
|
"RYNR"))).RiskRewardDefinitionsViewModel
|
|
}
|
|
template() {
|
|
var e = this.properties(),
|
|
t = r.prototype.template.call(this);
|
|
return t.stopLevel = e.stopLevel.value(), t.profitLevel = e.profitLevel
|
|
.value(), t
|
|
}
|
|
_applyTemplateImpl(e) {
|
|
delete e.targetPrice, delete e.stopPrice, delete e.entryPrice, super
|
|
._applyTemplateImpl(e);
|
|
var t = this.properties();
|
|
void 0 !== e.stopLevel && t.stopLevel.setValue(e.stopLevel), void 0 !== e
|
|
.profitLevel && t.profitLevel.setValue(e.profitLevel)
|
|
}
|
|
getOrderTemplate() {
|
|
return null
|
|
}
|
|
_propertiesStateExclusions() {
|
|
return ["entryPrice", "stopPrice", "targetPrice"]
|
|
}
|
|
static _configureProperties(e) {
|
|
r._configureProperties(e), e.addExclusion("stopLevel"), e.addExclusion(
|
|
"profitLevel"), e.addExclusion("stopPrice"), e.addExclusion(
|
|
"targetPrice"), e.addExclusion("entryPrice")
|
|
}
|
|
_getClosePointIndex(e) {
|
|
var t = this._model.timeScale(),
|
|
i = Math.round(t.width() / t.barSpacing());
|
|
return e + Math.max(3, Math.round(.15 * i))
|
|
}
|
|
}
|
|
f.version = 2;
|
|
class g extends f {
|
|
constructor(e, t) {
|
|
super(e, t || g.createProperties());
|
|
var i = this.properties();
|
|
i.entryPrice.subscribe(this, this._recalculateQty), i.stopPrice.subscribe(
|
|
this, this._recalculateQty), i.riskSize.subscribe(this, this
|
|
._recalculateQty), i.entryPrice.subscribe(this, this
|
|
._recalculateAmount), i.profitLevel.subscribe(this, this
|
|
._recalculateAmount), i.stopLevel.subscribe(this, this
|
|
._recalculateAmount), i.accountSize.subscribe(this, this
|
|
._recalculateAmount), i.riskSize.subscribe(this, this
|
|
._recalculateAmount), i.qty.subscribe(this, this._recalculateAmount)
|
|
}
|
|
_recalculateQty() {
|
|
if (0 !== this.points().length) {
|
|
var e = this.properties(),
|
|
t = e.entryPrice.value(),
|
|
i = e.stopPrice.value(),
|
|
s = e.riskSize.value(),
|
|
r = this._model.mainSeries().pointValue(),
|
|
n = s / (Math.abs(i - t) * r);
|
|
e.qty.setValue(n)
|
|
}
|
|
}
|
|
_recalculateAmount() {
|
|
if (0 !== this.points().length) {
|
|
var e = this.properties(),
|
|
t = e.accountSize.value(),
|
|
i = e.entryPrice.value(),
|
|
s = e.qty.value(),
|
|
r = e.stopPrice.value(),
|
|
n = e.targetPrice.value(),
|
|
o = this._model.mainSeries().pointValue(),
|
|
a = this._roundValue(t + (i - n) * s * o),
|
|
l = this._roundValue(t - (r - i) * s * o);
|
|
e.amountTarget.setValue(a), e.amountStop.setValue(l)
|
|
}
|
|
}
|
|
name() {
|
|
return "Risk/Reward short"
|
|
}
|
|
stopPrice() {
|
|
return this.entryPrice() + this.properties().stopLevel.value() / this._model
|
|
.mainSeries().base()
|
|
}
|
|
profitPrice() {
|
|
return this.entryPrice() - this.properties().profitLevel.value() / this
|
|
._model.mainSeries().base()
|
|
}
|
|
calculatePL(e) {
|
|
return this.entryPrice() - e
|
|
}
|
|
preparseStopPrice(e) {
|
|
e = this._roundPrice(e);
|
|
var t = this.entryPrice() + 1 / this._model.mainSeries().base();
|
|
return Math.max(e, t)
|
|
}
|
|
preparseProfitPrice(e) {
|
|
e = this._roundPrice(e);
|
|
var t = this.entryPrice() - 1 / this._model.mainSeries().base();
|
|
return Math.min(e, t)
|
|
}
|
|
checkStopPrice(e) {
|
|
var t = this.stopPrice(),
|
|
i = this.profitPrice();
|
|
return e[TradingView.HIGH_PLOT] >= t ? this.stopPrice() : e[TradingView
|
|
.LOW_PLOT] <= i ? this.profitPrice() : null
|
|
}
|
|
_orderSide() {
|
|
throw new Error("not supported")
|
|
}
|
|
static createProperties(e) {
|
|
var t = new a("linetoolriskrewardshort", e);
|
|
return g._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
f._configureProperties(e)
|
|
}
|
|
}
|
|
class b extends f {
|
|
constructor(e, t) {
|
|
super(e, t || b.createProperties());
|
|
var i = this.properties();
|
|
i.entryPrice.subscribe(this, this._recalculateQty), i.stopPrice.subscribe(
|
|
this, this._recalculateQty),
|
|
i.riskSize.subscribe(this, this._recalculateQty), i.entryPrice
|
|
.subscribe(this, this._recalculateAmount), i.profitLevel.subscribe(this,
|
|
this._recalculateAmount), i.stopLevel.subscribe(this, this
|
|
._recalculateAmount), i.accountSize.subscribe(this, this
|
|
._recalculateAmount), i.riskSize.subscribe(this, this
|
|
._recalculateAmount), i.qty.subscribe(this, this._recalculateAmount)
|
|
}
|
|
_recalculateQty() {
|
|
if (0 !== this.points().length) {
|
|
var e = this.properties(),
|
|
t = e.entryPrice.value(),
|
|
i = e.stopPrice.value(),
|
|
s = e.riskSize.value(),
|
|
r = this._model.mainSeries().pointValue(),
|
|
n = s / (Math.abs(t - i) * r);
|
|
e.qty.setValue(n)
|
|
}
|
|
}
|
|
_recalculateAmount() {
|
|
if (0 !== this.points().length) {
|
|
var e = this.properties(),
|
|
t = e.accountSize.value(),
|
|
i = e.entryPrice.value(),
|
|
s = e.qty.value(),
|
|
r = e.stopPrice.value(),
|
|
n = e.targetPrice.value(),
|
|
o = this._model.mainSeries().pointValue(),
|
|
a = this._roundValue(t + (n - i) * s * o),
|
|
l = this._roundValue(t - (i - r) * s * o);
|
|
e.amountTarget.setValue(a), e.amountStop.setValue(l)
|
|
}
|
|
}
|
|
stopPrice() {
|
|
return this.entryPrice() - this.properties().stopLevel.value() / this._model
|
|
.mainSeries().base()
|
|
}
|
|
profitPrice() {
|
|
return this.entryPrice() + this.properties().profitLevel.value() / this
|
|
._model.mainSeries().base()
|
|
}
|
|
calculatePL(e) {
|
|
return e - this.entryPrice()
|
|
}
|
|
preparseStopPrice(e) {
|
|
e = this._roundPrice(e);
|
|
var t = this.entryPrice() - 1 / this._model.mainSeries().base();
|
|
return Math.min(e, t)
|
|
}
|
|
preparseProfitPrice(e) {
|
|
e = this._roundPrice(e);
|
|
var t = this.entryPrice() + 1 / this._model.mainSeries().base();
|
|
return Math.max(e, t)
|
|
}
|
|
checkStopPrice(e) {
|
|
var t = this.stopPrice(),
|
|
i = this.profitPrice();
|
|
return e[TradingView.LOW_PLOT] <= t ? this.stopPrice() : e[TradingView
|
|
.HIGH_PLOT] >= i ? this.profitPrice() : null
|
|
}
|
|
name() {
|
|
return "Risk/Reward long"
|
|
}
|
|
_orderSide() {
|
|
throw new Error("not supported")
|
|
}
|
|
static createProperties(e) {
|
|
var t = new a("linetoolriskrewardlong", e);
|
|
return b._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
f._configureProperties(e)
|
|
}
|
|
}
|
|
t.LineToolRiskRewardLong = b, t.LineToolRiskRewardShort = g
|
|
}).call(this, i("Qb4w").PriceRange)
|
|
},
|
|
tG6Q: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Ss5c").LineDataSource,
|
|
r = i("Ocx9").DefaultProperty;
|
|
class n extends s {
|
|
constructor(e, t) {
|
|
super(e, t || n.createProperties()), i.e("lt-pane-views").then(i.t.bind(null,
|
|
"GS+0", 7)).then(({
|
|
LineToolCircleLinesPaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
pointsCount() {
|
|
return 2
|
|
}
|
|
name() {
|
|
return "Cyclic Lines"
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "LX4V")))
|
|
.CyclicAndSineLinesPatternDefinitionsViewModel
|
|
}
|
|
static createProperties(e) {
|
|
var t = new r("linetoolcirclelines", e);
|
|
return n._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
s._configureProperties(e)
|
|
}
|
|
}
|
|
t.LineToolCircleLines = n
|
|
},
|
|
tWVy: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return r
|
|
})), i.d(t, "b", (function() {
|
|
return n
|
|
}));
|
|
var s = i("aIyQ");
|
|
const r = new(i.n(s).a);
|
|
|
|
function n() {
|
|
r.fire()
|
|
}
|
|
},
|
|
"tc+8": function(e, t, i) {
|
|
"use strict";
|
|
(function(t) {
|
|
var s = i("ogJP").isFunction;
|
|
|
|
function r(e) {
|
|
if (this._listeners = new t, this._childs = [], this._muteChildChanges = !1,
|
|
void 0 !== e)
|
|
if (this.isPrimitiveType(e)) this._value = e;
|
|
else
|
|
for (var i in e) this.addProperty(i, e[i])
|
|
}
|
|
r.prototype.merge = function(e, t) {
|
|
var i = null;
|
|
if (t) var s = (i = []).length;
|
|
if (void 0 === e) return i;
|
|
if (this.isPrimitiveType(e)) return t && this._value !== e && i.push(this), this
|
|
._value = e, i;
|
|
if (Array.isArray(e))
|
|
for (var r = 0; r < e.length; r++)
|
|
if (this[r]) {
|
|
var n = this[r].merge(e[r], t);
|
|
t && (i = i.concat(n))
|
|
} else this.addProperty(r, e[r]), t && i.push(this[r]);
|
|
else
|
|
for (var o in e)
|
|
if (this[o]) {
|
|
n = this[o].merge(e[o], t);
|
|
t && void 0 !== n && (i = i.concat(n))
|
|
} else this.addProperty(o, e[o]), t && i.push(this[o]);
|
|
return t && i.length > s && i.push(this), i
|
|
}, r.prototype.mergeAndFire = function(e) {
|
|
var t = this.merge(e, !0);
|
|
this._muteChildChanges = !0, t.forEach((function(e) {
|
|
e._muteChildChanges = !0
|
|
})), t.forEach((function(e) {
|
|
e._muteChildChanges = !1, e.listeners().fire(e)
|
|
})), this._muteChildChanges = !1, t.length > 0 && this.listeners().fire(
|
|
this)
|
|
}, r.prototype.state = function(e) {
|
|
var t = s(this.value) ? this.value() : void 0;
|
|
void 0 === t && (t = {});
|
|
for (var i = 0; i < this._childs.length; i++) {
|
|
var r = this._childs[i];
|
|
if (!e || -1 === e.indexOf(r))
|
|
if (e) {
|
|
for (var n = [], o = 0; o < e.length; o++) {
|
|
var a = e[o];
|
|
a.startsWith(r + ".") && n.push(a.substr(r.length + 1))
|
|
}
|
|
t[r] = this[r].state(n)
|
|
} else t[r] = this[r].state()
|
|
}
|
|
return t
|
|
}, r.prototype.clone = function(e) {
|
|
return new r(this.state())
|
|
}, r.prototype.isPrimitiveType = function(e) {
|
|
return null === e || (!!isNumber(e) || (!!new TradingView.TypeValidator(String)
|
|
.check(e) || TradingView.isBoolean(e)))
|
|
}, r.prototype.value = function() {
|
|
return this._value
|
|
}, r.prototype.listeners = function() {
|
|
return this._listeners
|
|
}, r.prototype.childCount = function() {
|
|
return this._childs.length
|
|
}, r.prototype.childNames = function() {
|
|
return this._childs
|
|
}, r.prototype.child = function(e) {
|
|
return this[e]
|
|
}, r.prototype.setValue = function(e, t) {
|
|
(this._value !== e || t) && (this._value = e, this._listeners.fire(this))
|
|
}, r.prototype.setValueSilently = function(e) {
|
|
this._value = e
|
|
}, r.prototype.addProperty = function(e, t) {
|
|
var i = new r(t);
|
|
this[e] = i, this._childs.push(e), i.subscribe(this, this.childChanged)
|
|
}, r.prototype.removeProperty = function(e) {
|
|
this[e].unsubscribe(this, this.childChanged), delete this[e], this._childs =
|
|
this._childs.filter((function(t) {
|
|
return t !== e
|
|
}))
|
|
}, r.prototype.hasChild = function(e) {
|
|
return this._childs.indexOf(e) >= 0
|
|
}, r.prototype.addChild = function(e, t) {
|
|
this[e] && this[e].unsubscribe(this, this.childChanged), this[e] = t, -1 ===
|
|
this._childs.indexOf(e) && this._childs.push(e), t.subscribe(this, this
|
|
.childChanged)
|
|
}, r.prototype.childChanged = function(e, t) {
|
|
this._muteChildChanges || this.listeners().fire(this)
|
|
}, r.prototype.subscribe = function(e, t) {
|
|
this.listeners().subscribe(e, t, !1)
|
|
}, r.prototype.unsubscribe = function(e, t) {
|
|
this.listeners().unsubscribe(e, t)
|
|
}, r.prototype.unsubscribeAll = function(e) {
|
|
this.listeners().unsubscribeAll(e)
|
|
}, r.prototype.childs = function() {
|
|
return this
|
|
}, e.exports = r
|
|
}).call(this, i("aIyQ"))
|
|
},
|
|
teHb: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "ratioStudyItem", (function() {
|
|
return n
|
|
}));
|
|
var s = i("7dm8");
|
|
class r extends s.a {
|
|
_doCalculation(e, t, i, s) {
|
|
return e * t / (i * s)
|
|
}
|
|
}
|
|
const n = {
|
|
name: "Ratio",
|
|
metainfo: {
|
|
_metainfoVersion: 15,
|
|
defaults: s.b,
|
|
plots: s.d,
|
|
styles: s.e,
|
|
description: "Ratio",
|
|
shortDescription: "Ratio",
|
|
is_price_study: !1,
|
|
inputs: s.c,
|
|
id: "Ratio@tv-basicstudies-1"
|
|
},
|
|
constructor: r
|
|
}
|
|
},
|
|
tqok: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "INVALID_TIME_POINT_INDEX", (function() {
|
|
return s
|
|
}));
|
|
const s = -2e6
|
|
},
|
|
txPx: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LOGLEVEL", (function() {
|
|
return n
|
|
})), i.d(t, "getLogLevel", (function() {
|
|
return _
|
|
})), i.d(t, "isHighRateEnabled", (function() {
|
|
return m
|
|
})), i.d(t, "setLogLevel", (function() {
|
|
return f
|
|
})), i.d(t, "getRawLogHistory", (function() {
|
|
return g
|
|
})), i.d(t, "serializeLogHistoryEntry", (function() {
|
|
return b
|
|
})), i.d(t, "getLogHistory", (function() {
|
|
return v
|
|
})), i.d(t, "getLogger", (function() {
|
|
return y
|
|
})), i.d(t, "loggingOn", (function() {
|
|
return P
|
|
})), i.d(t, "loggingOff", (function() {
|
|
return C
|
|
}));
|
|
const s = "undefined" != typeof window ? window : {};
|
|
let r = !1;
|
|
try {
|
|
localStorage.getItem(""), r = !0
|
|
} catch (e) {}
|
|
var n;
|
|
! function(e) {
|
|
e[e.ERROR = 1] = "ERROR", e[e.WARNING = 2] = "WARNING", e[e.INFO = 3] = "INFO", e[e.NORMAL =
|
|
4] = "NORMAL", e[e.DEBUG = 5] = "DEBUG"
|
|
}(n || (n = {}));
|
|
let o = 0;
|
|
const a = [];
|
|
let l = null,
|
|
c = null,
|
|
h = null,
|
|
u = NaN,
|
|
d = n.WARNING,
|
|
p = !1;
|
|
|
|
function _() {
|
|
return d
|
|
}
|
|
|
|
function m() {
|
|
return p
|
|
}
|
|
|
|
function f(e) {
|
|
e = Math.max(n.ERROR, Math.min(n.DEBUG, e)), d = e, x()
|
|
}
|
|
|
|
function g(e, t) {
|
|
let i = a.reduce((e, t) => e.concat(t), []);
|
|
return i.sort((e, t) => e.id - t.id), void 0 !== t && (i = i.filter(e => e.subSystemId ===
|
|
t)), "number" == typeof e && (i = i.slice(-e)), i
|
|
}
|
|
|
|
function b(e) {
|
|
return new Date(e.timestamp).toISOString() + ":" + e.subSystemId + ":" + e.message.replace(
|
|
/"/g, "'")
|
|
}
|
|
|
|
function v(e, t) {
|
|
return function(e, t) {
|
|
let i, s = 0,
|
|
r = 0;
|
|
for (i = e.length - 1; i >= 1 && (s += 8 * (1 + encodeURIComponent(e[i]).length), !(
|
|
i - 1 > 0 && (r = 8 * (1 + encodeURIComponent(e[i - 1]).length), s + r >
|
|
t))); i--);
|
|
return e.slice(i)
|
|
}(g(e, t).map(b), 75497472)
|
|
}
|
|
|
|
function S(e, t, i, s) {
|
|
if (t === c && s.id === h) return;
|
|
const r = new Date;
|
|
if (e <= n.NORMAL && function(e, t, i, s, r) {
|
|
const n = {
|
|
id: o,
|
|
message: String(t),
|
|
subSystemId: s,
|
|
timestamp: Number(e)
|
|
};
|
|
o += 1, i.push(n), void 0 !== r && i.length > r && i.splice(0, 1)
|
|
}(r, t, i, s.id, s.maxCount), e <= d && (!s.highRate || m()) && (!l || s.id.match(l))) {
|
|
const i = r.toISOString() + ":" + s.id + ":" + t;
|
|
switch (e) {
|
|
case n.DEBUG:
|
|
console.debug(i);
|
|
break;
|
|
case n.INFO:
|
|
case n.NORMAL:
|
|
s.color ? console.log("%c" + i, "color: " + s.color) : console.log(i);
|
|
break;
|
|
case n.WARNING:
|
|
console.warn(i);
|
|
break;
|
|
case n.ERROR:
|
|
console.error(i)
|
|
}
|
|
c = t, h = s.id, u && clearTimeout(u), u = setTimeout(() => {
|
|
c = null, h = null, u = NaN
|
|
}, 1e3)
|
|
}
|
|
}
|
|
|
|
function y(e, t = {}) {
|
|
const i = [];
|
|
a.push(i);
|
|
const s = Object.assign(t, {
|
|
id: e
|
|
});
|
|
|
|
function r(e) {
|
|
return t => S(e, t, i, s)
|
|
}
|
|
return {
|
|
logDebug: r(n.DEBUG),
|
|
logError: r(n.ERROR),
|
|
logInfo: r(n.INFO),
|
|
logNormal: r(n.NORMAL),
|
|
logWarn: r(n.WARNING)
|
|
}
|
|
}
|
|
const w = y("logger"),
|
|
P = s.lon = (e, t) => {
|
|
f(n.DEBUG), w.logNormal("Debug logging enabled"), p = Boolean(e), l = t || null, x()
|
|
},
|
|
C = s.loff = () => {
|
|
f(n.INFO), w.logInfo("Debug logging disabled")
|
|
};
|
|
|
|
function x() {
|
|
try {
|
|
r && (localStorage.setItem("tv.logger.logHighRate", String(p)), localStorage.setItem(
|
|
"tv.logger.loglevel", String(d)))
|
|
} catch (e) {
|
|
w.logWarn(
|
|
`Cannot save logger state (level: ${d}, high-rate: ${p}) to localStorage: ${e.message}`
|
|
)
|
|
}
|
|
}! function() {
|
|
p = !!r && "true" === localStorage.getItem("tv.logger.logHighRate");
|
|
let e = parseInt(r && localStorage.getItem("tv.logger.loglevel") || "");
|
|
Number.isNaN(e) && (e = n.WARNING), f(e), w.logNormal(
|
|
`Init with settings - level: ${d}, high-rate: ${p}`)
|
|
}(),
|
|
s.performance && s.performance.now ? w.logNormal("Sync logger and perf times, now is " + s
|
|
.performance.now()) : w.logWarn("Perf time is not available")
|
|
},
|
|
"u+0B": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "TextWidthCache", (function() {
|
|
return r
|
|
}));
|
|
const s = /[2-9]/g;
|
|
class r {
|
|
constructor(e = 50) {
|
|
this._actualSize = 0, this._usageTick = 1, this._oldestTick = 1, this
|
|
._tick2Labels = {}, this._cache = {}, this._maxSize = e
|
|
}
|
|
reset() {
|
|
this._actualSize = 0, this._cache = {}, this._usageTick = 1, this._oldestTick = 1,
|
|
this._tick2Labels = {}
|
|
}
|
|
measureText(e, t, i) {
|
|
return this._getMetrics(e, t, i).width
|
|
}
|
|
yMidCorrection(e, t, i) {
|
|
const s = this._getMetrics(e, t, i);
|
|
return ((s.actualBoundingBoxAscent || 0) - (s.actualBoundingBoxDescent || 0)) / 2
|
|
}
|
|
_getMetrics(e, t, i) {
|
|
const r = i || s,
|
|
n = String(t).replace(r, "0");
|
|
if (this._cache[n]) return this._cache[n].metrics;
|
|
if (this._actualSize === this._maxSize) {
|
|
const e = this._tick2Labels[this._oldestTick];
|
|
delete this._tick2Labels[this._oldestTick], delete this._cache[e], this
|
|
._oldestTick++, this._actualSize--
|
|
}
|
|
e.save(), e.textBaseline = "middle";
|
|
const o = e.measureText(n);
|
|
return e.restore(), 0 === o.width && t.length || (this._cache[n] = {
|
|
metrics: o,
|
|
tick: this._usageTick
|
|
}, this._tick2Labels[this._usageTick] = n, this._actualSize++, this
|
|
._usageTick++), o
|
|
}
|
|
}
|
|
},
|
|
u0yd: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "PaneRendererArea", (function() {
|
|
return a
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("gyZD"),
|
|
n = i("jFln"),
|
|
o = i("Zp/P");
|
|
class a extends r.PaneRendererLine {
|
|
constructor(e) {
|
|
e.forceLineColor = !1, super(e)
|
|
}
|
|
draw(e, t) {
|
|
var i;
|
|
e.save(), e.scale(t.pixelRatio, t.pixelRatio);
|
|
const r = this._data;
|
|
if (0 === r.items.length) return;
|
|
e.lineCap = "butt", e.strokeStyle = r.lineColor, e.lineWidth = r.lineWidth,
|
|
Object(n.setLineStyle)(e, r.lineStyle), e.lineWidth = 1;
|
|
let a = 0;
|
|
for (; a < r.items.length && !Object(o.coordinateIsValid)(r.items[a].y);) a++;
|
|
let l = r.items.length - 1;
|
|
for (; l >= 0 && !Object(o.coordinateIsValid)(r.items[l].y);) l--;
|
|
if (a > l) return;
|
|
const c = {},
|
|
h = r.items;
|
|
for (let e = a; e <= l; e++) {
|
|
const t = h[e];
|
|
let i;
|
|
if (i = t.style ? t.style.color : r.lineColor, e < l && h[e + 1].style) {
|
|
const r = Object(s.ensureDefined)(h[e + 1].style).color;
|
|
if (i !== r) {
|
|
const e = c[r] || [];
|
|
e.push(t), c[r] = e
|
|
}
|
|
}
|
|
const n = c[i] || [];
|
|
n.push(t), c[i] = n
|
|
}
|
|
for (const t of Object.keys(c)) {
|
|
const s = c[t];
|
|
e.beginPath();
|
|
let n = 0;
|
|
for (let o = 0; o < s.length; o++) s[o].style && (null === (i = s[o]
|
|
.style) || void 0 === i ? void 0 : i.color) !== t && (e.moveTo(Math
|
|
.round(s[n].x), r.bottom), this._walkLine(e, s.slice(n, o), !0,
|
|
r.bottom), n = o);
|
|
if (e.moveTo(Math.round(s[n].x), r.bottom), this._walkLine(e, s.slice(n, s
|
|
.length), !0, r.bottom), e.closePath(), r.isSeries) {
|
|
const t = e.createLinearGradient(0, 0, 0, r.bottom);
|
|
t.addColorStop(0, r.color1), t.addColorStop(1, r.color2), e.fillStyle =
|
|
t, r.simpleMode = !0
|
|
} else e.fillStyle = t;
|
|
e.fill()
|
|
}
|
|
e.lineWidth = r.lineWidth, e.restore(), super.draw(e, t)
|
|
}
|
|
}
|
|
},
|
|
uDHo: function(e, t, i) {
|
|
"use strict";
|
|
var s, r;
|
|
|
|
function n(e, t) {
|
|
return "period-back" === e.type && "period-back" === t.type ? e.value === t.value :
|
|
"time-range" === e.type && "time-range" === t.type && (e.from === t.from && e.to === t
|
|
.to)
|
|
}
|
|
i.r(t), i.d(t, "Helpers", (function() {
|
|
return s
|
|
})), i.d(t, "TIMEFRAMETYPE", (function() {
|
|
return r
|
|
})), i.d(t, "areEqualTimeFrames", (function() {
|
|
return n
|
|
})),
|
|
function(e) {
|
|
e.extractErrorReason = function(e) {
|
|
return e.params[1]
|
|
}
|
|
}(s || (s = {})),
|
|
function(e) {
|
|
e.PeriodBack = "period-back", e.TimeRange = "time-range"
|
|
}(r || (r = {}))
|
|
},
|
|
ufwo: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "rangesAreEqual", (function() {
|
|
return n
|
|
}));
|
|
var s = i("uDHo"),
|
|
r = i("LxhU");
|
|
|
|
function n(e, t) {
|
|
return !!r.Interval.isEqual(e.res, t.res) && Object(s.areEqualTimeFrames)(e.val, t.val)
|
|
}
|
|
},
|
|
ulZB: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return n
|
|
})), i.d(t, "b", (function() {
|
|
return o
|
|
}));
|
|
var s = i("aIyQ"),
|
|
r = i.n(s);
|
|
class n {
|
|
constructor(e, t, i, s, n) {
|
|
this._onChange = new r.a, this._handleChange = () => {
|
|
this._onChange.fire(this.get())
|
|
}, this._crossTabEvents = e, this._jsonKeyValueStore = t, this
|
|
.CROSSTAB_EVENT_NAME = i, this.JSON_STORE_KEY = s, this.defaultStoreValue = this
|
|
._serialize(n), this._subscribe()
|
|
}
|
|
get() {
|
|
const e = this._jsonKeyValueStore.getJSON(this.JSON_STORE_KEY, this
|
|
.defaultStoreValue);
|
|
return this._deserialize(e)
|
|
}
|
|
set(e, t) {
|
|
const i = this._serialize(e);
|
|
this._jsonKeyValueStore.setJSON(this.JSON_STORE_KEY, i, t), this._crossTabEvents
|
|
.emit(this.CROSSTAB_EVENT_NAME), this._onChange.fire(e)
|
|
}
|
|
getOnChange() {
|
|
return this._onChange
|
|
}
|
|
destroy() {
|
|
this._unsubscribe(), this._onChange.destroy(), delete this._onChange
|
|
}
|
|
_subscribe() {
|
|
this._crossTabEvents.on(this.CROSSTAB_EVENT_NAME, this._handleChange), this
|
|
._jsonKeyValueStore.onSync.subscribe(this, this._handleChange)
|
|
}
|
|
_unsubscribe() {
|
|
this._crossTabEvents.off(this.CROSSTAB_EVENT_NAME, this._handleChange), this
|
|
._jsonKeyValueStore.onSync.unsubscribe(this, this._handleChange)
|
|
}
|
|
}
|
|
class o extends n {
|
|
_serialize(e) {
|
|
return e
|
|
}
|
|
_deserialize(e) {
|
|
return e
|
|
}
|
|
}
|
|
},
|
|
v5F8: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("5rJj"),
|
|
r = i("aDyP").LineToolPitchfork;
|
|
class n extends r {
|
|
constructor(e, t) {
|
|
super(e, t || n.createProperties())
|
|
}
|
|
name() {
|
|
return "Modified Schiff Pitchfork"
|
|
}
|
|
static createProperties(e) {
|
|
var t = new s("linetoolschiffpitchfork", e, !1, {
|
|
range: [0, 8]
|
|
});
|
|
return n._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
r._configureProperties(e)
|
|
}
|
|
}
|
|
t.LineToolSchiffPitchfork = n
|
|
},
|
|
vAx0: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("aO4+").Point,
|
|
r = i("VdBB").HitTestResult,
|
|
n = i("Zy3/").CompositeRenderer,
|
|
o = (i("LxhU").Interval, i("jCNj").utc_to_cal),
|
|
a = i("jCNj").get_timezone,
|
|
l = i("3t3b").dateFormatProperty,
|
|
c = i("gQ5K").DateFormatter,
|
|
h = i("z+cS").VerticalLineRenderer,
|
|
u = i("Khfk").LollipopRenderer,
|
|
d = i("u+0B").TextWidthCache;
|
|
i("zDbI").CHART_FONT_FAMILY, window.t("Earnings"), window.t("Standardized"), window.t(
|
|
"As reported"), window.t("Estimate"), window.t("Surprise"), window.t("Split"), window.t(
|
|
"Dividends"), window.t("Net"), window.t("Gross"), window.t("Date"), window.t(
|
|
"Period Ending"), window.t("Payment Date");
|
|
t.ESDPaneView = class {
|
|
constructor(e, t, i) {
|
|
this._lastClickedId = null, this._model = e, this._study = t, this
|
|
._lollipops = {}, this._lollipopsCounter = 0, this._invalidated = !0, this
|
|
._hideLollipops = !1, this.defaultStyle = null, this.hoveredStyle = null,
|
|
this.activeStyle = null, this._hitTestHandler = i, this._renderer = new n,
|
|
this._textWidthCache = new d, this._recreateStyles(e), this
|
|
._onPaneBgChangeBound = this.onPaneBgChange.bind(this), e.backgroundColor()
|
|
.subscribe(this._onPaneBgChangeBound), e.mainSeries()
|
|
.onSymbolIntervalChanged().subscribe(this, this._onSymbolOrIntervalChanged)
|
|
}
|
|
destroy() {
|
|
this._model.backgroundColor().unsubscribe(this._onPaneBgChangeBound), this
|
|
._model.mainSeries().onSymbolIntervalChanged().unsubscribeAll(this)
|
|
}
|
|
onPaneBgChange() {
|
|
this._recreateStyles(this._model)
|
|
}
|
|
onClickOutside(e) {
|
|
if (null !== this._lastClickedId && e) {
|
|
var t = null;
|
|
if (e.touches && 1 === e.touches.length) {
|
|
var i = e.target.getBoundingClientRect(),
|
|
r = e.touches[0];
|
|
t = new s(r.clientX - i.left, r.clientY - i.top)
|
|
} else t = new s(e.offsetX, e.offsetY);
|
|
var n = this._renderer.hitTest(t);
|
|
null !== n && n.data().activeItem === this._lollipops[this._lastClickedId]
|
|
.itemIndex || this.clearLastClicked()
|
|
} else this.clearLastClicked()
|
|
}
|
|
clearLastClicked() {
|
|
void 0 !== this._lollipops[this._lastClickedId] && (this._lollipops[this
|
|
._lastClickedId].active = !1), this._lastClickedId = null
|
|
}
|
|
getLastClickedLollipopId() {
|
|
return this._lastClickedId
|
|
}
|
|
_recreateStyles(e) {
|
|
this._stylesCache = null
|
|
}
|
|
_setStackStudies() {
|
|
this._stackStudies = []
|
|
}
|
|
_getY() {
|
|
for (var e = 0, t = this._model.panes(), i = t.length; i--;) {
|
|
var s = t[i];
|
|
s.containsMainSeries() && (e += s.height())
|
|
}
|
|
return e
|
|
}
|
|
update() {
|
|
this._invalidated = !0
|
|
}
|
|
updateImpl(e, t) {
|
|
this._setStackStudies();
|
|
var i = this,
|
|
s = this._study.data(),
|
|
r = this._model.timeScale(),
|
|
n = r.visibleBarsStrictRange(),
|
|
o = this._model.mainSeries().bars(),
|
|
a = this._study.priceScale(),
|
|
l = this._model.mainSeries().firstBar();
|
|
if (a && !a.isEmpty() && !r.isEmpty() && l && s) {
|
|
for (var c in this._hideLollipops = !1, this._lollipops) this._lollipops
|
|
.hasOwnProperty(c) && (this._lollipops[c].visible = !1);
|
|
var h = this._getY(),
|
|
u = n.firstBar(),
|
|
d = n.lastBar();
|
|
s.range(u, d).each((function(e, t) {
|
|
for (var s = 0, n = 0; n < i._stackStudies.length; ++n) i
|
|
._stackStudies[n].data().contains(e) && ++s;
|
|
e > u && e < d && i.addLollipop(h, o, r, a, e, t, s)
|
|
})), this.afterUpdate(h, o, r, a), this._createRenderers(e, t)
|
|
}
|
|
}
|
|
addLollipop(e, t, i, r, n, o, a) {
|
|
var l = o[0],
|
|
c = this._model.mainSeries().symbolInfo();
|
|
if (c) {
|
|
var h = c.name,
|
|
u = null,
|
|
d = this._study.metaInfo().id + "_" + l + "_" + h,
|
|
p = void 0 !== this._lollipops[d] ? this._lollipops[d].itemIndex : this
|
|
._lollipopsCounter++,
|
|
_ = this._model.lastHittestData(),
|
|
m = d === this.getLastClickedLollipopId(),
|
|
f = this._model.hoveredSource() === this._study && null !== _ && _
|
|
.activeItem === p;
|
|
if (f || m) {
|
|
var g = t.valueAt(n);
|
|
if (null !== g) {
|
|
var b = g[TradingView.LOW_PLOT],
|
|
v = this._model.mainSeries().firstValue();
|
|
u = r.priceToCoordinate(b, v)
|
|
}
|
|
}
|
|
this._lollipops[d] = Object.assign({
|
|
id: d,
|
|
itemIndex: p,
|
|
visible: !0,
|
|
basePoint: new s(i.indexToCoordinate(n), e),
|
|
hovered: f,
|
|
active: m,
|
|
barY: u,
|
|
stack: a
|
|
}, this.extraData(o))
|
|
}
|
|
}
|
|
afterUpdate(e, t, i) {}
|
|
extraData(e) {
|
|
throw new Error("Not Implemented")
|
|
}
|
|
createTooltipContent(e, t) {
|
|
throw new Error("Not Implemented")
|
|
}
|
|
showBarLine() {
|
|
return !0
|
|
}
|
|
getStyle(e) {
|
|
var t = e.active ? "active" : e.hovered ? "hovered" : "default",
|
|
i = t;
|
|
if (e.stack && (i += "_stack:" + e.stack), "active" === i) return this
|
|
.activeStyle;
|
|
if ("hovered" === i) return this.hoveredStyle;
|
|
if ("default" === i) return this.defaultStyle;
|
|
if (this._stylesCache || (this._stylesCache = {}), !this._stylesCache[i]) {
|
|
var s = TradingView.clone("active" === t ? this.activeStyle : "hovered" ===
|
|
t ? this.hoveredStyle : this.defaultStyle);
|
|
e.stack && (s.lollipop.incHeight = 25 * e.stack), this._stylesCache[i] = s
|
|
}
|
|
return this._stylesCache[i]
|
|
}
|
|
hasTooltip(e) {
|
|
return !0
|
|
}
|
|
renderer(e, t) {
|
|
return this._invalidated && (this.updateImpl(t, e),
|
|
this._invalidated = !1), this._hideLollipops ? null : this._renderer
|
|
}
|
|
_createRenderers(e, t) {
|
|
for (var i in this._renderer.clear(), this._lollipops)
|
|
if (this._lollipops.hasOwnProperty(i)) {
|
|
var r = this._lollipops[i];
|
|
if (r.visible) {
|
|
var n = this.getStyle(r),
|
|
o = {
|
|
id: r.id,
|
|
centerPoint: new s(r.basePoint.x, r.basePoint.y - n.lollipop
|
|
.bottom - n.lollipop.height / 2 - (n.lollipop
|
|
.incHeight || 0)),
|
|
style: n.lollipop
|
|
},
|
|
a = {
|
|
activeItem: r.itemIndex,
|
|
clickHandler: this._lollipopMouseClickHandler.bind(this, o),
|
|
tapHandler: this._lollipopMouseClickHandler.bind(this, o)
|
|
};
|
|
if (this._renderer.append(this._createRendererForLollipop(o, a)), (r
|
|
.hovered || r.active) && this.hasTooltip(r) && r.barY &&
|
|
this.showBarLine()) {
|
|
var l = {
|
|
width: e,
|
|
height: t,
|
|
color: n.strokeStyle,
|
|
linestyle: n.barLine.lineStyle,
|
|
linewidth: n.lineWidth,
|
|
x: r.basePoint.x,
|
|
top: 0,
|
|
bottom: r.basePoint.y - n.lollipop.bottom - n.lollipop
|
|
.height
|
|
},
|
|
c = new h;
|
|
c.setData(l), this._renderer.insert(c)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
_createRendererForLollipop(e, t) {
|
|
return new u(e, new r(r.CUSTOM, t), this._textWidthCache)
|
|
}
|
|
_lollipopMouseClickHandler(e, t) {
|
|
t.preventDefault();
|
|
var i = e.id;
|
|
if (this._lastClickedId = this._lastClickedId === i ? null : i, null !== this
|
|
._lastClickedId) {
|
|
var r = e.style.width / 2,
|
|
n = e.style.height / 2,
|
|
o = new s(t.clientX - t.localX + e.centerPoint.x, t.clientY - t.localY +
|
|
e.centerPoint.y),
|
|
a = {
|
|
target: t.target,
|
|
left: o.x - r,
|
|
top: o.y - n,
|
|
right: o.x + r,
|
|
bottom: o.x + n
|
|
};
|
|
this._hitTestHandler(a, () => {
|
|
var e = this._lollipops[i],
|
|
t = this.createTooltipContent(e);
|
|
return t ? [t] : null
|
|
})
|
|
}
|
|
}
|
|
_formatDate(e) {
|
|
let t = "Etc/UTC";
|
|
const i = this._model.mainSeries();
|
|
if (!i.isDWM() && (t = this._model.properties().timezone.value(), "exchange" ===
|
|
t)) {
|
|
const e = i.symbolInfo();
|
|
t = e && e.timezone || ""
|
|
}
|
|
var s = a(t),
|
|
r = o(s, e);
|
|
return new c(l.value()).format(r)
|
|
}
|
|
_onSymbolOrIntervalChanged() {
|
|
this._lollipops = {}, this._lollipopsCounter = 0, this._renderer.clear(), this
|
|
.clearLastClicked()
|
|
}
|
|
}
|
|
},
|
|
vIQA: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("ocLq");
|
|
i("2cgs");
|
|
var r = i("hyq/").pivotPointsStandardStudyItem,
|
|
n = i("krs7").volumeProfileVisibleRangeStudyItem,
|
|
o = i("+Qfv").volumeProfileFixedRangeVbPStudyItem,
|
|
a = i("+Qfv").volumeProfileFixedRangeBSStudyItem,
|
|
l = i("QCyK").spreadStudyItem,
|
|
c = i("teHb").ratioStudyItem,
|
|
h = i("+PIq").regressionTrendStudyItem;
|
|
JSServer.studyLibrary = JSServer.studyLibrary.concat([{
|
|
name: "Compare",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !0,
|
|
defaults: {
|
|
styles: {
|
|
compare: {
|
|
linestyle: 0,
|
|
linewidth: 2,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#9C27B0"
|
|
}
|
|
},
|
|
inputs: {
|
|
source: "close",
|
|
symbol: ""
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "compare",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
compare: {
|
|
title: "Plot",
|
|
histogramBase: 0
|
|
}
|
|
},
|
|
description: "Compare",
|
|
shortDescription: "Compare",
|
|
is_price_study: !0,
|
|
inputs: [{
|
|
defval: "close",
|
|
id: "source",
|
|
name: "Source",
|
|
options: ["open", "high", "low", "close", "hl2", "hlc3",
|
|
"ohlc4"
|
|
],
|
|
type: "text"
|
|
}, {
|
|
id: "symbol",
|
|
name: "Symbol",
|
|
type: "symbol",
|
|
isHidden: !0
|
|
}],
|
|
id: "Compare@tv-basicstudies-1",
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.init = function(e, t) {
|
|
this._context = e, this._context.new_sym(t(1), s.Std.period(this
|
|
._context))
|
|
}, this.main = function(e, t) {
|
|
this._context = e;
|
|
var i = this._context.new_unlimited_var(this._context.symbol
|
|
.time);
|
|
this._context.select_sym(1);
|
|
var r = this._context.new_unlimited_var(this._context.symbol
|
|
.time),
|
|
n = s.Std[t(0)](this._context),
|
|
o = this._context.new_unlimited_var(n);
|
|
return this._context.select_sym(0), [o.adopt(r, i, 0)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Overlay",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !0,
|
|
defaults: {
|
|
styles: {},
|
|
inputs: {
|
|
symbol: ""
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "open",
|
|
type: "line"
|
|
}, {
|
|
id: "high",
|
|
type: "line"
|
|
}, {
|
|
id: "low",
|
|
type: "line"
|
|
}, {
|
|
id: "close",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
open: {
|
|
title: "Open"
|
|
},
|
|
high: {
|
|
title: "High"
|
|
},
|
|
low: {
|
|
title: "Low"
|
|
},
|
|
close: {
|
|
title: "Close"
|
|
}
|
|
},
|
|
description: "Overlay",
|
|
shortDescription: "Overlay",
|
|
is_price_study: !1,
|
|
inputs: [{
|
|
id: "symbol",
|
|
name: "symbol",
|
|
defval: "",
|
|
type: "symbol",
|
|
isHidden: !0
|
|
}],
|
|
id: "Overlay@tv-basicstudies-1",
|
|
format: {
|
|
type: "price",
|
|
precision: 4
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.init = function(e, t) {
|
|
this._context = e, this._context.new_sym(t(0), s.Std.period(this
|
|
._context))
|
|
}, this.main = function(e, t) {
|
|
this._context = e;
|
|
var i = this._context.new_unlimited_var(this._context.symbol
|
|
.time);
|
|
this._context.select_sym(1);
|
|
var r = this._context.new_unlimited_var(this._context.symbol
|
|
.time),
|
|
n = this._context.new_unlimited_var(s.Std.open(this
|
|
._context)),
|
|
o = this._context.new_unlimited_var(s.Std.high(this
|
|
._context)),
|
|
a = this._context.new_unlimited_var(s.Std.low(this
|
|
._context)),
|
|
l = this._context.new_unlimited_var(s.Std.close(this
|
|
._context));
|
|
return this._context.select_sym(0), [n.adopt(r, i, 1), o.adopt(
|
|
r, i, 1), a.adopt(r, i, 1), l.adopt(r, i, 1)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Volume",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
vol: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 5,
|
|
trackPrice: !1,
|
|
transparency: 50,
|
|
visible: !0,
|
|
color: "#000080"
|
|
},
|
|
vol_ma: {
|
|
linestyle: 0,
|
|
linewidth: 1,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !1,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
palettes: {
|
|
volumePalette: {
|
|
colors: {
|
|
0: {
|
|
color: "#EF5350",
|
|
width: 1,
|
|
style: 0
|
|
},
|
|
1: {
|
|
color: "#26A69A",
|
|
width: 1,
|
|
style: 0
|
|
}
|
|
}
|
|
}
|
|
},
|
|
inputs: {
|
|
showMA: !1,
|
|
length: 20,
|
|
col_prev_close: !1
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "vol",
|
|
type: "line"
|
|
}, {
|
|
id: "volumePalette",
|
|
palette: "volumePalette",
|
|
target: "vol",
|
|
type: "colorer"
|
|
}, {
|
|
id: "vol_ma",
|
|
type: "line"
|
|
}],
|
|
styles: {
|
|
vol: {
|
|
title: "Volume",
|
|
histogramBase: 0
|
|
},
|
|
vol_ma: {
|
|
title: "Volume MA",
|
|
histogramBase: 0
|
|
}
|
|
},
|
|
description: "Volume",
|
|
shortDescription: "Volume",
|
|
is_price_study: !1,
|
|
palettes: {
|
|
volumePalette: {
|
|
colors: {
|
|
0: {
|
|
name: "Falling"
|
|
},
|
|
1: {
|
|
name: "Growing"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
inputs: [{
|
|
id: "showMA",
|
|
name: "show MA",
|
|
defval: !1,
|
|
type: "bool",
|
|
isHidden: !0
|
|
}, {
|
|
id: "length",
|
|
name: "MA Length",
|
|
defval: 20,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 2e3
|
|
}, {
|
|
defval: !1,
|
|
id: "col_prev_close",
|
|
name: "Color based on previous close",
|
|
type: "bool"
|
|
}],
|
|
id: "Volume@tv-basicstudies-1",
|
|
format: {
|
|
type: "volume"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function(e, t) {
|
|
return s.Std.gt(e, t) ? 0 : 1
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = s.Std.volume(this._context),
|
|
r = s.Std.volume(this._context),
|
|
n = this._context.new_var(r),
|
|
o = s.Std.sma(n, this._input(1), this._context),
|
|
a = this._context.new_var(s.Std.close(this._context));
|
|
return [i, a.get(1) && this._input(2) ? this.f_0(a.get(1), s.Std
|
|
.close(this._context)) : this.f_0(s.Std.open(this
|
|
._context), s.Std.close(this._context)), o]
|
|
}
|
|
}
|
|
}, {
|
|
name: "ZigZag",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 2,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 0,
|
|
visible: !0,
|
|
color: "#2196F3"
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 5,
|
|
in_1: 10
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_1",
|
|
target: "plot_0",
|
|
type: "dataoffset"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "Plot",
|
|
histogramBase: 0,
|
|
joinPoints: !1
|
|
}
|
|
},
|
|
description: "Zig Zag",
|
|
shortDescription: "ZigZag",
|
|
is_price_study: !0,
|
|
classId: "ScriptWithDataOffset",
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "deviation",
|
|
defval: 5,
|
|
type: "float",
|
|
min: .001,
|
|
max: 100
|
|
}, {
|
|
id: "in_1",
|
|
name: "depth",
|
|
defval: 10,
|
|
type: "integer",
|
|
min: 2,
|
|
max: 1e3
|
|
}],
|
|
id: "ZigZag@tv-basicstudies-1",
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this._input(0),
|
|
r = this._input(1),
|
|
n = i / 100,
|
|
o = Math.ceil(r / 2);
|
|
return [s.Std.zigzag(n, o, this._context), s.Std.zigzagbars(n,
|
|
o, this._context)]
|
|
}
|
|
}
|
|
}, {
|
|
name: "Sessions",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
defaults: {
|
|
graphics: {
|
|
vertlines: {
|
|
sessBreaks: {
|
|
color: "#4985e7",
|
|
style: 2,
|
|
visible: !1,
|
|
width: 1
|
|
}
|
|
}
|
|
},
|
|
linkedToSeries: !0
|
|
},
|
|
description: "Sessions",
|
|
graphics: {
|
|
vertlines: {
|
|
sessBreaks: {
|
|
name: "Session Break",
|
|
halign: "left"
|
|
}
|
|
}
|
|
},
|
|
id: "Sessions@tv-basicstudies-1",
|
|
inputs: [],
|
|
is_hidden_study: !0,
|
|
is_price_study: !0,
|
|
name: "Sessions@tv-basicstudies",
|
|
palettes: {},
|
|
plots: [],
|
|
shortDescription: "Sessions",
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
function e(e, t) {
|
|
return {
|
|
id: e,
|
|
index: e,
|
|
extendBottom: !0,
|
|
extendTop: !0
|
|
}
|
|
}
|
|
this.init = function() {
|
|
this._times = []
|
|
}, this._getVerticalLineData = function(t) {
|
|
return s.Std.selectSessionBreaks(t, this._times).map(e)
|
|
}, this.main = function(e, t) {
|
|
if (s.Std.isdwm(e)) return null;
|
|
var i = s.Std.time(e);
|
|
if (isNaN(i)) return null;
|
|
var r = this._times.length;
|
|
if (0 !== r && this._times[r - 1] === i || this._times.push(i),
|
|
!e.symbol.isLastBar || !e.symbol.isNewBar) return null;
|
|
var n = this._getVerticalLineData(e);
|
|
return 0 === n.length ? null : {
|
|
nonseries: !0,
|
|
type: "study_graphics",
|
|
data: {
|
|
graphicsCmds: {
|
|
create: {
|
|
vertlines: [{
|
|
styleId: "sessBreaks",
|
|
data: n
|
|
}]
|
|
},
|
|
erase: [{
|
|
action: "all"
|
|
}]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}, {
|
|
name: "SuperTrend",
|
|
metainfo: {
|
|
_metainfoVersion: 52,
|
|
isTVScript: !1,
|
|
isTVScriptStub: !1,
|
|
is_hidden_study: !1,
|
|
defaults: {
|
|
styles: {
|
|
plot_0: {
|
|
linestyle: 0,
|
|
linewidth: 3,
|
|
plottype: 0,
|
|
trackPrice: !1,
|
|
transparency: 35,
|
|
visible: !0,
|
|
color: "#000080"
|
|
},
|
|
plot_2: {
|
|
linestyle: 0,
|
|
linewidth: 3,
|
|
plottype: "shape_arrow_up",
|
|
trackPrice: !1,
|
|
location: "BelowBar",
|
|
transparency: 35,
|
|
visible: !0,
|
|
color: "#00FF00"
|
|
},
|
|
plot_3: {
|
|
linestyle: 0,
|
|
linewidth: 3,
|
|
plottype: "shape_arrow_down",
|
|
trackPrice: !1,
|
|
location: "AboveBar",
|
|
transparency: 35,
|
|
visible: !0,
|
|
color: "#FF0000"
|
|
}
|
|
},
|
|
palettes: {
|
|
palette_0: {
|
|
colors: {
|
|
0: {
|
|
color: "#008000",
|
|
width: 3,
|
|
style: 0
|
|
},
|
|
1: {
|
|
color: "#800000",
|
|
width: 3,
|
|
style: 0
|
|
}
|
|
}
|
|
}
|
|
},
|
|
inputs: {
|
|
in_0: 10,
|
|
in_1: 3
|
|
}
|
|
},
|
|
plots: [{
|
|
id: "plot_0",
|
|
type: "line"
|
|
}, {
|
|
id: "plot_1",
|
|
palette: "palette_0",
|
|
target: "plot_0",
|
|
type: "colorer"
|
|
}, {
|
|
id: "plot_2",
|
|
type: "shapes"
|
|
}, {
|
|
id: "plot_3",
|
|
type: "shapes"
|
|
}],
|
|
styles: {
|
|
plot_0: {
|
|
title: "SuperTrend",
|
|
histogramBase: 0,
|
|
joinPoints: !1,
|
|
isHidden: !1
|
|
},
|
|
plot_2: {
|
|
title: "Up Arrow",
|
|
histogramBase: 0,
|
|
joinPoints: !1,
|
|
isHidden: !1
|
|
},
|
|
plot_3: {
|
|
title: "Down Arrow",
|
|
histogramBase: 0,
|
|
joinPoints: !1,
|
|
isHidden: !1
|
|
}
|
|
},
|
|
description: "SuperTrend",
|
|
shortDescription: "SuperTrend",
|
|
is_price_study: !0,
|
|
palettes: {
|
|
palette_0: {
|
|
colors: {
|
|
0: {
|
|
name: "Color 0"
|
|
},
|
|
1: {
|
|
name: "Color 1"
|
|
}
|
|
},
|
|
valToIndex: {
|
|
0: 0,
|
|
1: 1
|
|
}
|
|
}
|
|
},
|
|
inputs: [{
|
|
id: "in_0",
|
|
name: "Length",
|
|
defval: 10,
|
|
type: "integer",
|
|
min: 1,
|
|
max: 100
|
|
}, {
|
|
id: "in_1",
|
|
name: "Factor",
|
|
defval: 3,
|
|
type: "float",
|
|
min: 1,
|
|
max: 100
|
|
}],
|
|
id: "SuperTrend@tv-basicstudies-1",
|
|
scriptIdPart: "",
|
|
name: "SuperTrend",
|
|
isCustomIndicator: !0,
|
|
format: {
|
|
type: "inherit"
|
|
}
|
|
},
|
|
constructor: function() {
|
|
this.f_0 = function() {
|
|
var e = this._input(0),
|
|
t = this._input(1),
|
|
i = s.Std.atr(e, this._context),
|
|
r = (e = s.Std.hl2(this._context) + i * t, i = s.Std.hl2(
|
|
this._context) - i * t, this._context.new_var(s.Std
|
|
.close(this._context))),
|
|
n = (t = this._context.new_var(), s.Std.max(i, t.get(1)));
|
|
return t.set(s.Std.gt(r.get(1), t.get(1)) ? n : i), i = this
|
|
._context.new_var(), n = s.Std.min(e, i.get(1)), i.set(s.Std
|
|
.lt(r.get(1), i.get(1)) ? n : e), e = this._context
|
|
.new_var(), r = s.Std.nz(e.get(1), 1), r = s.Std.lt(s.Std
|
|
.close(this._context), t.get(1)) ? -1 : r, e.set(s.Std
|
|
.gt(s.Std.close(this._context), i.get(1)) ? 1 : r), [t =
|
|
s.Std.eq(e.get(0), 1) ? t.get(0) : i.get(0), s.Std.eq(e
|
|
.get(0), 1) ? 0 : 1, 1 === e.get(0) && -1 === e.get(
|
|
1) ? 1 : NaN, -1 === e.get(0) && 1 === e.get(1) ?
|
|
1 : NaN
|
|
]
|
|
}, this.main = function(e, t) {
|
|
this._context = e, this._input = t;
|
|
var i = this.f_0();
|
|
return [i[0], i[1], i[2], i[3]]
|
|
}
|
|
}
|
|
}, r, n, o, a, l, c, h])
|
|
},
|
|
vPbs: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "CHART_WIDGET_COLLECTION_SERVICE", (function() {
|
|
return r
|
|
})), i.d(t, "chartWidgetCollectionService", (function() {
|
|
return n
|
|
})), i.d(t, "CollectionViewMode", (function() {
|
|
return o
|
|
}));
|
|
var s = i("eqEH");
|
|
const r = {
|
|
id: "ChartWidgetCollectionService"
|
|
};
|
|
|
|
function n() {
|
|
return Object(s.hasService)(r) ? Object(s.service)(r) : null
|
|
}
|
|
var o;
|
|
! function(e) {
|
|
e.Multichart = "multichart", e.ForceFullscreen = "force-fullscreen"
|
|
}(o || (o = {}))
|
|
},
|
|
vTIA: function(e, t, i) {
|
|
"use strict";
|
|
var s, r;
|
|
i.r(t), i.d(t, "PositionPLDisplay", (function() {
|
|
return s
|
|
})), i.d(t, "TradingSourcesHorizontalAlignment", (function() {
|
|
return r
|
|
})), i.d(t, "tradingPreferencesDefault", (function() {
|
|
return n
|
|
})), i.d(t, "CustomSourceLayer", (function() {
|
|
return o
|
|
})),
|
|
function(e) {
|
|
e[e.Money = 0] = "Money", e[e.Pips = 1] = "Pips", e[e.Percentage = 2] = "Percentage"
|
|
}(s || (s = {})),
|
|
function(e) {
|
|
e[e.Left = 0] = "Left", e[e.Center = 1] = "Center", e[e.Right = 2] = "Right"
|
|
}(r || (r = {}));
|
|
const n = {
|
|
showPositions: !1,
|
|
positionPL: {
|
|
visibility: !1,
|
|
display: s.Money
|
|
},
|
|
showOrders: !1,
|
|
showExecutions: !1,
|
|
extendLeft: !1,
|
|
lineLength: 0,
|
|
horizontalAlignment: r.Left,
|
|
lineWidth: 0,
|
|
lineStyle: 0
|
|
};
|
|
var o;
|
|
! function(e) {
|
|
e[e.Background = 0] = "Background", e[e.Foreground = 1] = "Foreground", e[e.Topmost = 2] =
|
|
"Topmost"
|
|
}(o || (o = {}))
|
|
},
|
|
vaqD: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LoadingScreen", (function() {
|
|
return o
|
|
}));
|
|
var s = i("Kxc7"),
|
|
r = i("4vW/"),
|
|
n = i("YWnQ");
|
|
class o {
|
|
constructor(e, t) {
|
|
this._showed = !1, this._cw = e, this._element = document.createElement("div"), this
|
|
._element.classList.add("chart-loading-screen"), this._shield = document
|
|
.createElement("div"), this._shield.classList.add(
|
|
"chart-loading-screen-shield"), this._element.appendChild(this._shield), t
|
|
.appendChild(this._element), this._cw.withModel(this, this._connectToModel)
|
|
}
|
|
show() {
|
|
this._cw.setInLoadingState(!0), this._showed || (this._showed = !0, this._show())
|
|
}
|
|
hide() {
|
|
this._cw.setInLoadingState(!1), this._showed && this._hide()
|
|
}
|
|
isShown() {
|
|
return this._showed
|
|
}
|
|
_connectToModel() {
|
|
const e = this._cw.model().mainSeries().dataEvents();
|
|
e.symbolError().subscribe(this, e => {
|
|
e !== n.permissionDenied && this.hide()
|
|
}),
|
|
e.seriesError().subscribe(this, () => {
|
|
Object(s.enabled)("hide_loading_screen_on_series_error") && this.hide()
|
|
}), e.completed().subscribe(this, this.hide)
|
|
}
|
|
_show() {
|
|
const e = this._cw.properties().childs().paneProperties.childs();
|
|
let t;
|
|
if (e.backgroundType.value() === r.ColorType.Solid) t = e.background.value();
|
|
else {
|
|
t = `linear-gradient(${e.backgroundGradientStartColor.value()},${e.backgroundGradientEndColor.value()})`
|
|
}
|
|
this._shield.style.background = t, this._element.classList.add("fade")
|
|
}
|
|
_hide() {
|
|
this._showed = !1, this._element.classList.remove("fade")
|
|
}
|
|
}
|
|
},
|
|
vq8G: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "SelectionRenderer", (function() {
|
|
return o
|
|
}));
|
|
var s = i("VdBB"),
|
|
r = i("//lt"),
|
|
n = i("f6yo");
|
|
class o {
|
|
constructor(e) {
|
|
this._data = e || null
|
|
}
|
|
setData(e) {
|
|
this._data = e
|
|
}
|
|
draw(e, t) {
|
|
if (null === this._data || !this._data.visible) return;
|
|
const i = t.pixelRatio;
|
|
e.strokeStyle = void 0 !== this._data.color ? this._data.color : "#1E53E5", e
|
|
.lineCap = "butt";
|
|
const s = Math.max(1, Math.floor(i));
|
|
e.lineWidth = s;
|
|
const r = this._data.vertOffset || 0;
|
|
for (let t = 0; t < this._data.points.length; ++t) {
|
|
const o = this._data.points[t];
|
|
(n = o, Number.isFinite(n.x) && Number.isFinite(n.y)) && (e.fillStyle = this
|
|
._data.bgColors[t], this._drawMarker(e, o, r, s, i))
|
|
}
|
|
var n
|
|
}
|
|
hitTest(e) {
|
|
if (!this._data || !this._data.visible) return null;
|
|
for (let t = 0; t < this._data.points.length; t++) {
|
|
const i = this._data.points[t];
|
|
if (i.subtract(e).length() <= 5.5) {
|
|
const e = void 0 !== this._data.pointsCursorType ? this._data
|
|
.pointsCursorType[t] : r.PaneCursorType.Default;
|
|
return new s.HitTestResult(this._data.hittestResult, {
|
|
pointIndex: i.data,
|
|
cursorType: e
|
|
})
|
|
}
|
|
}
|
|
return null
|
|
}
|
|
doesIntersectWithBox(e) {
|
|
return !!this._data && this._data.points.some(t => Object(n.pointInBox)(t, e))
|
|
}
|
|
_drawMarker(e, t, i, s, r) {
|
|
let n = Math.round(3.5 * r * 2);
|
|
n % 2 != s % 2 && (n += 1);
|
|
let o = Math.round(n + 2 * (.5 * s + .75 * r));
|
|
o % 2 != s % 2 && (o += 1);
|
|
const a = Math.round(t.x * r),
|
|
l = Math.round((t.y + i) * r),
|
|
c = s % 2 / 2;
|
|
e.beginPath(), e.arc(a + c, l + c, o / 2, 0, 2 * Math.PI, !0), e.closePath(), e
|
|
.fill(), e.beginPath(), e.arc(a + c, l + c, n / 2, 0, 2 * Math.PI, !0), e
|
|
.closePath(), e.stroke()
|
|
}
|
|
}
|
|
},
|
|
vwKG: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "showTooManyStudiesNotice", (function() {
|
|
return n
|
|
}));
|
|
var s = i("YFKU"),
|
|
r = i("fZEr");
|
|
|
|
function n(e) {
|
|
"number" != typeof e && (e = TradingView.STUDY_COUNT_LIMIT), Object(r.showWarning)({
|
|
title: Object(s.t)("Warning"),
|
|
text: Object(s.t)(
|
|
"Studies limit exceeded: {number} studies per layout.\nPlease, remove some studies."
|
|
).format({
|
|
number: e
|
|
})
|
|
})
|
|
}
|
|
},
|
|
w4Ji: function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e) {
|
|
const t = new Map;
|
|
return e.plots.forEach((e, i) => {
|
|
t.set(e.id, e => e[i + 1])
|
|
}), t
|
|
}
|
|
|
|
function r(e, t) {
|
|
return null == e[t]
|
|
}
|
|
i.r(t), i.d(t, "studyPlotFunctionMap", (function() {
|
|
return s
|
|
})), i.d(t, "studyEmptyPlotValuePredicate", (function() {
|
|
return r
|
|
}))
|
|
},
|
|
w9cH: function(e, t, i) {
|
|
"use strict";
|
|
|
|
function s(e) {
|
|
if (e instanceof Error) return e.stack || e.message;
|
|
try {
|
|
return e.outerHTML.slice(0, 1024)
|
|
} catch (e) {}
|
|
try {
|
|
if (void 0 !== e) return JSON.stringify(e).slice(0, 1024)
|
|
} catch (e) {}
|
|
return String(e)
|
|
}
|
|
|
|
function r() {
|
|
window.__tv_js_errors || (window.__tv_js_errors = []), window.addEventListener("error",
|
|
e => {
|
|
const t = (new Date).toISOString();
|
|
window.__tv_js_errors.push(
|
|
`${t} ${e.message || "JS error"}. ${e.filename || "<unknown url>"}, line ${e.lineno}, col ${e.colno}.\nError: ` +
|
|
s(e.error))
|
|
}, !1), window.addEventListener("unhandledrejection", e => {
|
|
const t = (new Date).toISOString();
|
|
window.__tv_js_errors.push(t + " Unhandled rejection.\nReason: " + s(e.reason))
|
|
}, !1), document.addEventListener("securitypolicyviolation", e => {
|
|
var t, i;
|
|
const r = (new Date).toISOString(),
|
|
n = "report" === e.disposition ? "CSP report-only" : "CSP violation";
|
|
window.__tv_js_errors.push(
|
|
`${r} ${n}: ${e.violatedDirective || e.effectiveDirective}. ${e.sourceFile || "<unknown url>"}, line ${null !== (t = e.lineno) && void 0 !== t ? t : e.lineNumber}, col ${null !== (i = e.colno) && void 0 !== i ? i : e.columnNumber}.\nBlocked URI: ${e.blockedURL || e.blockedURI}\nSample: ${e.sample}\nTarget: ` +
|
|
s(e.target))
|
|
}, !1)
|
|
}
|
|
i.r(t), i.d(t, "install", (function() {
|
|
return r
|
|
}))
|
|
},
|
|
wGNx: function(e, t, i) {
|
|
"use strict";
|
|
var s;
|
|
i.r(t), i.d(t, "RiskRewardPointIndex", (function() {
|
|
return s
|
|
})),
|
|
function(e) {
|
|
e[e.Entry = 0] = "Entry", e[e.Close = 1] = "Close", e[e.ActualEntry = 2] =
|
|
"ActualEntry", e[e.ActualClose = 3] = "ActualClose"
|
|
}(s || (s = {}))
|
|
},
|
|
wOSo: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return a
|
|
}));
|
|
var s = i("IWXC"),
|
|
r = i("aIyQ"),
|
|
n = i.n(r),
|
|
o = i("e3/o");
|
|
class a {
|
|
constructor() {
|
|
this._quotes = null, this._quoteSessionSymbol = null, this._quoteSessionClientId =
|
|
"", this._quotesUpdate = new n.a, this._quoteSymbolChanged = new n.a
|
|
}
|
|
setQuotesSessionSymbol(e) {
|
|
this._quoteSessionSymbol !== e && (this._quoteSessionClientId || (this
|
|
._quoteSessionClientId = "series-" + Object(o.guid)()), this
|
|
._unsubscribeQuoteSession(), this._quotes = null, e && (this
|
|
._quoteSessionSymbol = e, Object(s.getQuoteSessionInstance)("full")
|
|
.subscribe(this._quoteSessionClientId, this._quoteSessionSymbol, this
|
|
._onUpdate.bind(this))), this._quoteSymbolChanged.fire())
|
|
}
|
|
quotesUpdate() {
|
|
return this._quotesUpdate
|
|
}
|
|
quoteSymbolChanged() {
|
|
return this._quoteSymbolChanged
|
|
}
|
|
quotes() {
|
|
return this._quotes
|
|
}
|
|
destroy() {
|
|
this._unsubscribeQuoteSession()
|
|
}
|
|
_onUpdate(e, t) {
|
|
this._quotes = e && e.values || null, t && t.values && this._quotesUpdate.fire(e, t)
|
|
}
|
|
_unsubscribeQuoteSession() {
|
|
this._quoteSessionSymbol && (Object(s.getQuoteSessionInstance)("full").unsubscribe(
|
|
this._quoteSessionClientId, this._quoteSessionSymbol), this
|
|
._quoteSessionSymbol = null, this._quotes = null)
|
|
}
|
|
}
|
|
},
|
|
wVAQ: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "fetch", (function() {
|
|
return r
|
|
}));
|
|
var s = i("txPx");
|
|
Object(s.getLogger)("Fetch");
|
|
|
|
function r(e, t, i = {}) {
|
|
return window.fetch(e, t)
|
|
}
|
|
},
|
|
wYrq: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Eyy1"),
|
|
r = i("aO4+"),
|
|
n = i("eJTA"),
|
|
o = i("Kxc7"),
|
|
a = i("Hr11"),
|
|
l = i("ogJP"),
|
|
c = i("Tmoa"),
|
|
h = i("dOnf");
|
|
|
|
function u(e, t) {
|
|
const i = new Map;
|
|
return function(...s) {
|
|
const r = "" + (t ? t.apply(null, s) : s[0]);
|
|
if (!i.has(r)) {
|
|
const t = e.apply(this, s);
|
|
return i.set(r, t), t
|
|
}
|
|
return i.get(r)
|
|
}
|
|
}
|
|
var d = i("VdBB"),
|
|
p = i("u0yd"),
|
|
_ = i("Zy3/"),
|
|
m = i("gyZD"),
|
|
f = i("Zp8I"),
|
|
g = i("k9/m"),
|
|
b = i("o2pV"),
|
|
v = i("vq8G"),
|
|
S = i("i6cO"),
|
|
y = i("Zp/P");
|
|
class w {
|
|
constructor(e) {
|
|
this._data = e
|
|
}
|
|
draw(e, t) {
|
|
const i = this._data,
|
|
s = t.pixelRatio,
|
|
r = Math.max(1, Math.floor(s)) % 2 ? .5 : 0,
|
|
n = i.vertOffset || 0,
|
|
o = i.lineColor || i.color,
|
|
a = i.lineWidth || i.height / 2;
|
|
let c = "",
|
|
h = !1;
|
|
for (const t of i.items) {
|
|
const i = t.x,
|
|
u = t.y + n;
|
|
if (Object(l.isNaN)(i) || Object(l.isNaN)(u)) continue;
|
|
let d, p;
|
|
null != t.style ? (d = t.style.color, p = t.style.width) : (d = o, p = a), d !==
|
|
c && (c = d, h && e.fill(), e.beginPath(), e.fillStyle = d);
|
|
const _ = Math.round(i * s) + r,
|
|
m = Math.round(u * s) + r,
|
|
f = Math.round(p * s) + r;
|
|
e.moveTo(_ + f, m), e.arc(_, m, f, 0, 2 * Math.PI, !1), h = !0
|
|
}
|
|
h && e.fill()
|
|
}
|
|
hitTest(e) {
|
|
const t = this._data,
|
|
i = t.lineWidth || t.height / 2,
|
|
s = t.vertOffset || 0,
|
|
n = Object(y.interactionTolerance)().series + i;
|
|
for (const o of t.items) {
|
|
if (!o) continue;
|
|
if (new r.Point(o.x, o.y + s).subtract(e).length() + i <= n) return new d
|
|
.HitTestResult(d.HitTestResult.REGULAR)
|
|
}
|
|
return null
|
|
}
|
|
}
|
|
class P {
|
|
constructor(e) {
|
|
this._data = null, this._precalculatedCache = [], this.setData(e)
|
|
}
|
|
setData(e) {
|
|
this._data = e, this._precalculatedCache = []
|
|
}
|
|
draw(e, t) {
|
|
if (null === this._data || 0 === this._data.items.length) return;
|
|
const i = t.pixelRatio;
|
|
this._precalculatedCache.length || this._fillPrecalculatedCache(i);
|
|
const s = Math.max(1, Math.floor(i)),
|
|
r = Math.round(this._data.histogramBase * i) - Math.floor(s / 2),
|
|
n = r + s,
|
|
o = this._data.lineColor;
|
|
for (let t = 0; t < this._data.items.length; t++) {
|
|
const a = this._data.items[t],
|
|
l = this._precalculatedCache[t],
|
|
c = Math.round(a.y * i),
|
|
h = a.style ? a.style.color : o;
|
|
let u, d;
|
|
e.fillStyle = h, c <= r ? (u = c, d = n) : (u = r, d = c - Math.floor(s / 2) +
|
|
s), e.fillRect(l.left, u, l.right - l.left + 1, d - u)
|
|
}
|
|
}
|
|
hitTest(e) {
|
|
if (null === this._data) return null;
|
|
const t = .5 * this._data.barSpacing,
|
|
i = e.x - t,
|
|
s = e.x + t;
|
|
for (const t of this._data.items) {
|
|
const r = t.x;
|
|
if (r >= i && r <= s) {
|
|
const i = t.y;
|
|
if (e.y >= Math.min(i, this._data.histogramBase) && e.y <= Math.max(i, this
|
|
._data.histogramBase)) return new d.HitTestResult(d.HitTestResult
|
|
.REGULAR)
|
|
}
|
|
}
|
|
return null
|
|
}
|
|
_fillPrecalculatedCache(e) {
|
|
if (null === this._data || 0 === this._data.items.length) return void(this
|
|
._precalculatedCache = []);
|
|
const t = Math.ceil(this._data.barSpacing * e) <= 1 ? 0 : Math.max(1, Math.floor(
|
|
e)),
|
|
i = Math.round(this._data.barSpacing * e) - t;
|
|
this._precalculatedCache = new Array(this._data.items.length);
|
|
for (let t = 0; t < this._data.items.length; t++) {
|
|
const s = this._data.items[t],
|
|
r = Math.round(s.x * e);
|
|
let n, o;
|
|
if (i % 2) {
|
|
const e = (i - 1) / 2;
|
|
n = r - e, o = r + e
|
|
} else {
|
|
const e = i / 2;
|
|
n = r - e, o = r + e - 1
|
|
}
|
|
this._precalculatedCache[t] = {
|
|
left: n,
|
|
right: o,
|
|
roundedCenter: r,
|
|
center: s.x * e,
|
|
time: s.timePointIndex
|
|
}
|
|
}
|
|
for (let e = 1; e < this._data.items.length; e++) {
|
|
const i = this._precalculatedCache[e],
|
|
s = this._precalculatedCache[e - 1];
|
|
i.time === s.time + 1 && (i.left - s.right !== t + 1 && (s.roundedCenter > s
|
|
.center ? s.right = i.left - t - 1 : i.left = s.right + t + 1))
|
|
}
|
|
let s = Math.ceil(this._data.barSpacing * e);
|
|
for (let e = 0; e < this._data.items.length; e++) {
|
|
const t = this._precalculatedCache[e];
|
|
t.right < t.left && (t.right = t.left);
|
|
const i = t.right - t.left + 1;
|
|
s = Math.min(i, s)
|
|
}
|
|
if (t > 0 && s < 4)
|
|
for (let e = 0; e < this._data.items.length; e++) {
|
|
const t = this._precalculatedCache[e];
|
|
t.right - t.left + 1 > s && (t.roundedCenter > t.center ? t.right -= 1 : t
|
|
.left += 1)
|
|
}
|
|
}
|
|
}
|
|
var C = i("GEp6");
|
|
class x {
|
|
constructor(e) {
|
|
this._data = e
|
|
}
|
|
draw(e, t) {
|
|
var i, s, r, n;
|
|
const o = t.pixelRatio;
|
|
let a = "",
|
|
c = !1;
|
|
for (const t of this._data.items) {
|
|
if (Object(l.isNaN)(t.x) || Object(l.isNaN)(t.y)) continue;
|
|
const h = null !== (s = null === (i = t.style) || void 0 === i ? void 0 : i
|
|
.color) && void 0 !== s ? s : this._data.lineColor,
|
|
u = Math.max(1, Math.floor((null !== (n = null === (r = t.style) ||
|
|
void 0 === r ? void 0 : r.width) && void 0 !== n ? n : this
|
|
._data.lineWidth) * o));
|
|
h !== a && (a = h, c && e.fill(), e.beginPath(), e.fillStyle = h);
|
|
let d = 3 * u;
|
|
d % 2 != u % 2 && (d += 1);
|
|
const p = Math.round(Math.round(t.x * o) - d / 2),
|
|
_ = Math.round(Math.round(t.y * o) - d / 2),
|
|
m = p + Math.floor(d / 2 - u / 2),
|
|
f = _ + Math.floor(d / 2 - u / 2);
|
|
e.rect(p, f, d, u), e.rect(m, _, u, d), c = !0
|
|
}
|
|
c && e.fill()
|
|
}
|
|
hitTest(e) {
|
|
const t = Object(y.interactionTolerance)().series + this._data.lineWidth / 2;
|
|
let i, s, n, o;
|
|
for (let a = 1; a < this._data.items.length; ++a) {
|
|
i = this._data.items[a - 1], s = this._data.items[a], n = i.x, o = s.x;
|
|
if (Object(C.distanceToSegment)(new r.Point(n, i.y), new r.Point(o, s.y), new r
|
|
.Point(e.x, e.y)).distance <= t) return new d.HitTestResult(d
|
|
.HitTestResult.REGULAR)
|
|
}
|
|
return null
|
|
}
|
|
}
|
|
class T {
|
|
constructor(e) {
|
|
this._data = e
|
|
}
|
|
draw(e, t) {
|
|
if (0 === this._data.items.length) return;
|
|
const i = t.pixelRatio;
|
|
e.fillStyle = this._data.lineColor;
|
|
const s = Math.max(1, Math.floor(this._data.lineWidth * i)),
|
|
r = s / 2,
|
|
n = Math.max(1, Math.floor(i)),
|
|
o = Math.round(this._data.histogramBase * i) - Math.floor(n / 2),
|
|
a = o + n;
|
|
for (const t of this._data.items) {
|
|
let l = s,
|
|
c = r;
|
|
t.style ? (e.fillStyle = t.style.color, l = Math.max(1, Math.floor(t.style
|
|
.width * i)), c = l / 2) : e.fillStyle = this._data.lineColor;
|
|
const h = l % 2 ? .5 : 0,
|
|
u = Math.round(t.x * i) + h,
|
|
d = Math.round(t.y * i);
|
|
let p, _;
|
|
d <= o ? (p = d, _ = a) : (p = o, _ = d - Math.floor(n / 2) + n), e.fillRect(
|
|
Math.floor(u - c), p, l, _ - p)
|
|
}
|
|
}
|
|
hitTest(e) {
|
|
const t = Object(y.interactionTolerance)().series + this._data.lineWidth / 2,
|
|
i = new Map;
|
|
for (const n of this._data.items) {
|
|
const o = n.x,
|
|
a = n.y;
|
|
let l = t;
|
|
n.style && (i.has(n.style.width) ? l = Object(s.ensureDefined)(i.get(n.style
|
|
.width)) : i.set(this._data.lineWidth, l));
|
|
if (Object(C.distanceToSegment)(new r.Point(o, a), new r.Point(o, this._data
|
|
.histogramBase), new r.Point(e.x, e.y)).distance <= l) return new d
|
|
.HitTestResult(d.HitTestResult.REGULAR)
|
|
}
|
|
return null
|
|
}
|
|
}
|
|
var I = i("23IT"),
|
|
M = i("UAFa");
|
|
i.d(t, "a", (function() {
|
|
return A
|
|
}));
|
|
const O = e => {
|
|
const t = Object(n.rgbToHsl)(Object(n.parseRgb)(e)),
|
|
i = t[0] + .05;
|
|
return t[0] = i - Math.floor(i), Object(n.rgbToHexString)(Object(n.hslToRgb)(t))
|
|
},
|
|
L = u(O);
|
|
class A {
|
|
constructor(e, t, i, s) {
|
|
this._histogramBase = null, this._items = [], this._selectionData = null, this
|
|
._lineColor = "", this._lineWidth = 1, this._color1 = "", this._color2 = "",
|
|
this._invalidated = !1, this._isMarkersEnabled = o.enabled(
|
|
"source_selection_markers"), this._study = e, this._series = t, this
|
|
._model = i, this._plotName = s, this._plotIndex = e.metaInfo().plots.findIndex(
|
|
e => e.id === s), this._colorProvider = Object(M
|
|
.createStudyPlotColorProvider)(e.metaInfo(), e.properties(), s), this
|
|
._selectionIndexer = new b.SelectionIndexes(i.timeScale())
|
|
}
|
|
items() {
|
|
return this._items
|
|
}
|
|
update() {
|
|
this._invalidated = !0
|
|
}
|
|
renderer() {
|
|
const e = this._study.properties().styles[this._plotName];
|
|
if (!e.visible.value()) return null;
|
|
if (!this._study.priceScale()) return null;
|
|
this._invalidated && (this._updateImpl(), this._invalidated = !1);
|
|
const t = {};
|
|
t.barSpacing = this._model.timeScale().barSpacing(), t.items = this._items,
|
|
t.histogramBase = this._histogramBase ? this._histogramBase : Object(s
|
|
.ensureNotNull)(this._study.priceScale()).height(), t.lineIndex = 0, t
|
|
.lineStyle = e.linestyle.value(), t.lineColor = this._lineColor, t.lineWidth =
|
|
this._lineWidth, t.lineWidth = Object(l.isNumber)(t.lineWidth) ? t.lineWidth :
|
|
1, t.color1 = this._color1, t.color2 = this._color2, t.bottom = t.histogramBase,
|
|
t.simpleMode = this._colorProvider.singleColor();
|
|
const i = new _.CompositeRenderer,
|
|
r = !!e.joinPoints && e.joinPoints.value();
|
|
switch (e.plottype.value()) {
|
|
case I.LineStudyPlotStyle.Line:
|
|
case I.LineStudyPlotStyle.LineWithBreaks:
|
|
i.append(new m.PaneRendererLine(t));
|
|
break;
|
|
case I.LineStudyPlotStyle.Area:
|
|
case I.LineStudyPlotStyle.AreaWithBreaks:
|
|
i.append(new p.PaneRendererArea(t));
|
|
break;
|
|
case I.LineStudyPlotStyle.Histogram:
|
|
i.append(new T(t));
|
|
break;
|
|
case I.LineStudyPlotStyle.Columns:
|
|
i.append(new P(t));
|
|
break;
|
|
case I.LineStudyPlotStyle.Cross:
|
|
if (i.append(new x(t)), r) {
|
|
const e = Object(h.deepCopy)(t);
|
|
e.lineWidth = 1, e.forceLineWidth = !0, i.append(new m.PaneRendererLine(
|
|
e))
|
|
}
|
|
break;
|
|
case I.LineStudyPlotStyle.Circles:
|
|
if (i.append(new w(t)), r) {
|
|
const e = Object(h.deepCopy)(t);
|
|
e.lineWidth = 1, e.ignorePaletteLineWidth = !0, i.append(new m
|
|
.PaneRendererLine(e))
|
|
}
|
|
break;
|
|
case I.LineStudyPlotStyle.StepLine:
|
|
case I.LineStudyPlotStyle.StepLineWithDiamonds: {
|
|
t.decoration = e.plottype.value() === I.LineStudyPlotStyle
|
|
.StepLineWithDiamonds ? f.StepLineDecoration.Diamonds : f
|
|
.StepLineDecoration.None;
|
|
const s = new f.PaneRendererStepLine;
|
|
s.setData(t), i.append(s);
|
|
break
|
|
}
|
|
default:
|
|
i.append(new m.PaneRendererLine(t))
|
|
}
|
|
return this._model.selection().isSelected(this._study) && this._isMarkersEnabled &&
|
|
this._selectionData && i.append(new v.SelectionRenderer(this._selectionData)), i
|
|
}
|
|
_getTranspValue() {
|
|
const e = this._study.properties(),
|
|
t = e.styles[this._plotName];
|
|
let i = 0;
|
|
const s = this._study.metaInfo();
|
|
return "Volume@tv-basicstudies" === s.id && s.version <= 46 && "transparency" in e ?
|
|
(i = e.transparency.value(), i = Object(l.isNumber)(i) ? i : 0, i) : (t
|
|
.transparency && (i = t.transparency.value(), i = Object(l.isNumber)(i) ?
|
|
i : 0), i)
|
|
}
|
|
_updateImpl() {
|
|
var e, t, i, n, o;
|
|
this._histogramBase = null, this._items = [];
|
|
const l = this._study.priceScale();
|
|
if (this._model.timeScale().isEmpty() || null === l || l.isEmpty()) return;
|
|
const h = this._model.timeScale().visibleBarsStrictRange();
|
|
if (null === h) return;
|
|
let u = null !== (e = this._series.nearestIndex(h.firstBar() - 1, g
|
|
.PlotRowSearchMode.NearestLeft)) && void 0 !== e ? e : this._series.bars()
|
|
.firstIndex(),
|
|
p = null !== (t = this._series.nearestIndex(h.lastBar() + 1, g.PlotRowSearchMode
|
|
.NearestRight)) && void 0 !== t ? t : this._series.bars().lastIndex();
|
|
if (null === u || null === p) return;
|
|
const _ = this._study.offset(this._plotName);
|
|
_ > 0 ? (u -= _, p += _) : (u += _, p -= _);
|
|
const m = this._study.getMinFirstBarIndexForPlot(this._plotName);
|
|
if (m > p) return;
|
|
u = Math.max(m, u);
|
|
const f = this._study.properties().styles[this._plotName],
|
|
b = f.plottype.value(),
|
|
v = [I.LineStudyPlotStyle.Line, I.LineStudyPlotStyle.Area, I.LineStudyPlotStyle
|
|
.Circles, I.LineStudyPlotStyle.Cross
|
|
].indexOf(b) >= 0,
|
|
y = this._study.data(),
|
|
w = this._study.firstValue();
|
|
if (null === w) return;
|
|
const P = y.rangeIterator(u, p),
|
|
C = this._study.priceScale();
|
|
if (null === C) return;
|
|
const x = Object(a.clamp)(this._getTranspValue(), 0, 100),
|
|
T = new Map,
|
|
M = (e, t) => {
|
|
let i = T.get(e);
|
|
void 0 === i && (i = new Map, T.set(e, i));
|
|
let s = i.get(t);
|
|
if (void 0 === s) {
|
|
const r = !this._plotName || "vol" !== this._plotName;
|
|
s = Object(c.generateColor)(e, t, r), i.set(t, s)
|
|
}
|
|
return s
|
|
};
|
|
let A = NaN,
|
|
E = NaN;
|
|
const k = Object(S.createEmptyStyle)();
|
|
for (; P.hasNext();) {
|
|
const e = P.next();
|
|
let t = e.index;
|
|
const o = e.value;
|
|
t += _, t = Math.floor(t);
|
|
let a = o[this._plotIndex + 1];
|
|
const l = null == a;
|
|
if (a = l ? NaN : a, v && l) {
|
|
E = a;
|
|
continue
|
|
}
|
|
const h = new r.Point(t, Object(s.ensure)(a));
|
|
h.timePointIndex = t, h.valIsNotSameAsPrev = a !== E;
|
|
if (this._colorProvider.isColorDefined() && (h.style = {
|
|
color: M(f.color.value(), 100),
|
|
width: f.linewidth.value(),
|
|
style: f.linestyle.value()
|
|
}, null != a)) {
|
|
const e = this._colorProvider.getPlotPointStyle(o, k),
|
|
t = e.colors[S.ColorerType.Main];
|
|
void 0 !== t && (h.style.color = Object(c.isHexColor)(t) ? M(t, x) : t), h
|
|
.style.width = null !== (i = e.lineWidth) && void 0 !== i ? i : h.style
|
|
.width, h.style.style = null !== (n = e.lineStyle) && void 0 !== n ? n :
|
|
h.style.style
|
|
}
|
|
v || isNaN(A) || A === t - 1 || this._items.push(new r.Point(t - 1, NaN)), A =
|
|
t, E = a, this._items.push(h)
|
|
}
|
|
if (C.pointsArrayToCoordinates(this._items, w), this._model.timeScale()
|
|
.timedValuesToCoordinates(this._items), f.histogramBase && (this
|
|
._histogramBase = C.priceToCoordinate(f.histogramBase.value(), w)), this
|
|
._model.selection().isSelected(this._study)) {
|
|
const e = this._selectionIndexer.indexes();
|
|
this._selectionData = {
|
|
points: [],
|
|
bgColors: [],
|
|
visible: !0,
|
|
hittestResult: d.HitTestResult.REGULAR,
|
|
barSpacing: this._model.timeScale().barSpacing()
|
|
};
|
|
const t = Object(s.ensureNotNull)(this._model.paneForSource(this._study))
|
|
.height();
|
|
for (let i = 0; i < e.length; i++) {
|
|
let s = e[i];
|
|
const n = this._study.data().valueAt(s);
|
|
if (s += _, null === n) continue;
|
|
const o = n[this._plotIndex + 1];
|
|
if (null == o) continue;
|
|
const a = this._model.timeScale().indexToCoordinate(Math.floor(s)),
|
|
l = C.priceToCoordinate(o, w);
|
|
this._selectionData.points.push(new r.Point(a, l)), this._selectionData
|
|
.bgColors.push(this._model.backgroundColorAtYPercentFromTop(l / t))
|
|
}
|
|
} else this._selectionIndexer.clear();
|
|
const D = f;
|
|
this._lineColor = Object(c.generateColor)(D.color.value(), x), this._lineWidth = D
|
|
.linewidth.value();
|
|
let V = D.color.value();
|
|
const B = this._colorProvider.getDefaultPlotPointStyle();
|
|
B && (V = B.colors[S.ColorerType.Main], this._lineWidth = null !== (o = B
|
|
.lineWidth) && void 0 !== o ? o : this._lineWidth, this._lineColor = V ?
|
|
Object(c.generateColor)(V, x) : this._lineColor), this._color2 = Object(c
|
|
.generateColor)(V, x);
|
|
const R = this._study.metaInfo().isRGB ? O(V) : L(V);
|
|
this._color1 = Object(c.generateColor)(R, x)
|
|
}
|
|
}
|
|
},
|
|
wZIs: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("vTIA").PositionPLDisplay;
|
|
const {
|
|
getHexColorByName: r
|
|
} = i("HGP3"), {
|
|
generateColor: n
|
|
} = i("Tmoa");
|
|
var o = i("vTIA").TradingSourcesHorizontalAlignment,
|
|
a = i("dfhE"),
|
|
l = i("rCHB").LineToolPitchforkStyle,
|
|
c = i("Ye2/").LineToolBarsPatternMode,
|
|
h = i("23IT").LineStudyPlotStyle,
|
|
u = i("8OdW"),
|
|
d = i("oXaB").PriceAxisLastValueMode,
|
|
p = i("XXdw").StoriesTimeLineItemType,
|
|
_ = i("4o++").MagnetMode,
|
|
m = i("a7Ha").LineEnd,
|
|
f = i("4vW/").ColorType,
|
|
g = i("bKFv").StatsPosition,
|
|
b = i("sDZI").sessionsPreferencesDefault,
|
|
v = i("txPx").getLogger("Chart.Defaults"),
|
|
S = i("zDbI").CHART_FONT_FAMILY;
|
|
const y = r("color-tv-blue-500");
|
|
var w = function(e) {
|
|
var t = function(e, t) {
|
|
return {
|
|
color: e,
|
|
visible: t
|
|
}
|
|
},
|
|
i = function(e, t, i) {
|
|
return {
|
|
coeff: e,
|
|
color: t,
|
|
visible: i
|
|
}
|
|
},
|
|
r = function(e, t, i, s, r) {
|
|
return {
|
|
coeff: e,
|
|
color: t,
|
|
visible: i,
|
|
linestyle: void 0 === s ? CanvasEx.LINESTYLE_SOLID : s,
|
|
linewidth: void 0 === r ? 1 : r
|
|
}
|
|
},
|
|
v = function(e, t, i) {
|
|
return {
|
|
color: e,
|
|
width: i,
|
|
visible: t
|
|
}
|
|
},
|
|
w = function(e, t, i, s, r) {
|
|
return {
|
|
color: e,
|
|
visible: t,
|
|
width: i,
|
|
x: s,
|
|
y: r
|
|
}
|
|
},
|
|
P = function(e, t, i, s, r, n) {
|
|
return {
|
|
coeff1: e,
|
|
coeff2: t,
|
|
color: i,
|
|
visible: s,
|
|
linestyle: void 0 === r ? CanvasEx.LINESTYLE_SOLID : r,
|
|
linewidth: void 0 === n ? 1 : n
|
|
}
|
|
};
|
|
if (void 0 === TradingView.defaultProperties) {
|
|
var T;
|
|
switch (window.locale) {
|
|
case "ar_AE":
|
|
T = "Asia/Dubai";
|
|
break;
|
|
case "au":
|
|
T = "Australia/Sydney";
|
|
break;
|
|
case "br":
|
|
T = "America/Sao_Paulo";
|
|
break;
|
|
case "ca":
|
|
T = "America/Toronto";
|
|
break;
|
|
case "de_DE":
|
|
case "it":
|
|
T = "Europe/Berlin";
|
|
break;
|
|
case "es":
|
|
T = "Europe/Madrid";
|
|
break;
|
|
case "fa_IR":
|
|
T = "Asia/Tehran";
|
|
break;
|
|
case "fr":
|
|
case "sv_SE":
|
|
T = "Europe/Paris";
|
|
break;
|
|
case "he_IL":
|
|
case "tr":
|
|
T = "Europe/Athens";
|
|
break;
|
|
case "hu_HU":
|
|
case "pl":
|
|
T = "Europe/Warsaw";
|
|
break;
|
|
case "id":
|
|
case "th_TH":
|
|
case "vi_VN":
|
|
T = "Asia/Bangkok";
|
|
break;
|
|
case "in":
|
|
T = "Asia/Kolkata";
|
|
break;
|
|
case "ja":
|
|
case "kr":
|
|
T = "Asia/Tokyo";
|
|
break;
|
|
case "ms_MY":
|
|
T = "Asia/Singapore";
|
|
break;
|
|
case "ru":
|
|
T = "Europe/Moscow";
|
|
break;
|
|
case "uk":
|
|
T = "Europe/London";
|
|
break;
|
|
case "zh_CN":
|
|
case "zh_TW":
|
|
T = "Asia/Shanghai";
|
|
break;
|
|
default:
|
|
T = "Etc/UTC"
|
|
}
|
|
TradingView.defaultProperties = {
|
|
chartproperties: {
|
|
timezone: T,
|
|
priceScaleSelectionStrategyName: "auto",
|
|
dataWindowProperties: {
|
|
background: "rgba( 255, 254, 206, 0.2)",
|
|
border: "rgba( 96, 96, 144, 1)",
|
|
font: "Verdana",
|
|
fontBold: !1,
|
|
fontItalic: !1,
|
|
fontSize: 10,
|
|
transparency: 80,
|
|
visible: !0
|
|
},
|
|
paneProperties: {
|
|
backgroundType: f.Solid,
|
|
background: "#ffffff",
|
|
backgroundGradientStartColor: "#ffffff",
|
|
backgroundGradientEndColor: "#ffffff",
|
|
vertGridProperties: {
|
|
color: "rgba(42, 46, 57, 0.06)",
|
|
style: CanvasEx.LINESTYLE_SOLID
|
|
},
|
|
horzGridProperties: {
|
|
color: "rgba(42, 46, 57, 0.06)",
|
|
style: CanvasEx.LINESTYLE_SOLID
|
|
},
|
|
crossHairProperties: {
|
|
color: "#9598A1",
|
|
style: CanvasEx.LINESTYLE_DASHED,
|
|
transparency: 0,
|
|
width: 1
|
|
},
|
|
topMargin: 10,
|
|
bottomMargin: 8,
|
|
axisProperties: {
|
|
autoScale: !0,
|
|
autoScaleDisabled: !1,
|
|
lockScale: !1,
|
|
percentage: !1,
|
|
percentageDisabled: !1,
|
|
indexedTo100: !1,
|
|
log: !1,
|
|
logDisabled: !1,
|
|
alignLabels: !0,
|
|
isInverted: !1
|
|
},
|
|
legendProperties: {
|
|
showStudyArguments: !0,
|
|
showStudyTitles: !0,
|
|
showStudyValues: !0,
|
|
showSeriesTitle: !0,
|
|
showSeriesOHLC: !0,
|
|
showLegend: !0,
|
|
showBarChange: !0,
|
|
showBackground: !0,
|
|
backgroundTransparency: 50,
|
|
wrapText: !1
|
|
}
|
|
},
|
|
scalesProperties: {
|
|
backgroundColor: "#ffffff",
|
|
lineColor: "rgba(42, 46, 57, 0.14)",
|
|
textColor: "#131722",
|
|
fontSize: 12,
|
|
scaleSeriesOnly: !1,
|
|
showSeriesLastValue: !0,
|
|
seriesLastValueMode: d.LastValueAccordingToScale,
|
|
showSeriesPrevCloseValue: !1,
|
|
showStudyLastValue: !1,
|
|
showSymbolLabels: !1,
|
|
showStudyPlotLabels: !1,
|
|
showBidAskLabels: !1,
|
|
showPrePostMarketPriceLabel: !0,
|
|
showFundamentalNameLabel: !1,
|
|
showFundamentalLastValue: !1,
|
|
barSpacing: u.DEFAULT_BAR_SPACING,
|
|
showCurrency: !0,
|
|
showUnit: !0
|
|
},
|
|
mainSeriesProperties: {
|
|
style: a.STYLE_CANDLES,
|
|
esdShowDividends: !0,
|
|
esdShowSplits: !0,
|
|
esdShowEarnings: !0,
|
|
esdShowBreaks: !1,
|
|
esdFlagSize: 2,
|
|
showCountdown: !0,
|
|
bidAsk: {
|
|
visible: !1,
|
|
lineStyle: CanvasEx.LINESTYLE_DOTTED,
|
|
lineWidth: 1,
|
|
bidLineColor: y,
|
|
askLineColor: "#EF5350"
|
|
},
|
|
prePostMarket: {
|
|
visible: !0,
|
|
lineStyle: CanvasEx.LINESTYLE_DOTTED,
|
|
lineWidth: 1,
|
|
preMarketColor: "#fb8c00",
|
|
postMarketColor: y
|
|
},
|
|
highLowAvgPrice: {
|
|
highLowPriceLinesVisible: !1,
|
|
highLowPriceLabelsVisible: !1,
|
|
averageClosePriceLineVisible: !1,
|
|
averageClosePriceLabelVisible: !1
|
|
},
|
|
showInDataWindow: !0,
|
|
visible: !0,
|
|
showPriceLine: !0,
|
|
priceLineWidth: 1,
|
|
priceLineColor: "",
|
|
baseLineColor: "#B2B5BE",
|
|
showPrevClosePriceLine: !1,
|
|
prevClosePriceLineWidth: 1,
|
|
prevClosePriceLineColor: "rgba( 85, 85, 85, 1)",
|
|
minTick: "default",
|
|
dividendsAdjustment: void 0,
|
|
sessionId: "regular",
|
|
sessVis: !1,
|
|
statusViewStyle: {
|
|
fontSize: 16,
|
|
showExchange: !0,
|
|
showInterval: !0,
|
|
symbolTextSource: "description"
|
|
},
|
|
candleStyle: {
|
|
upColor: "#26a69a",
|
|
downColor: "#ef5350",
|
|
drawWick: !0,
|
|
drawBorder: !0,
|
|
borderColor: "#378658",
|
|
borderUpColor: "#26a69a",
|
|
borderDownColor: "#ef5350",
|
|
wickColor: "#737375",
|
|
wickUpColor: "#26a69a",
|
|
wickDownColor: "#ef5350",
|
|
barColorsOnPrevClose: !1,
|
|
drawBody: !0
|
|
},
|
|
hollowCandleStyle: {
|
|
upColor: "#26a69a",
|
|
downColor: "#ef5350",
|
|
drawWick: !0,
|
|
drawBorder: !0,
|
|
borderColor: "rgba( 55, 134, 88, 1)",
|
|
borderUpColor: "#26a69a",
|
|
borderDownColor: "#ef5350",
|
|
wickColor: "rgba( 115, 115, 117, 1)",
|
|
wickUpColor: "#26a69a",
|
|
wickDownColor: "#ef5350",
|
|
drawBody: !0
|
|
},
|
|
haStyle: {
|
|
upColor: "#26a69a",
|
|
downColor: "#ef5350",
|
|
drawWick: !0,
|
|
drawBorder: !0,
|
|
borderColor: "rgba( 55, 134, 88, 1)",
|
|
borderUpColor: "#26a69a",
|
|
borderDownColor: "#ef5350",
|
|
wickColor: "rgba( 115, 115, 117, 1)",
|
|
wickUpColor: "#26a69a",
|
|
wickDownColor: "#ef5350",
|
|
showRealLastPrice: !1,
|
|
barColorsOnPrevClose: !1,
|
|
inputs: {},
|
|
inputInfo: {},
|
|
drawBody: !0
|
|
},
|
|
barStyle: {
|
|
upColor: "#26a69a",
|
|
downColor: "#ef5350",
|
|
barColorsOnPrevClose: !1,
|
|
dontDrawOpen: !1,
|
|
thinBars: !0
|
|
},
|
|
hiloStyle: {
|
|
color: y,
|
|
showBorders: !0,
|
|
borderColor: y,
|
|
showLabels: !0,
|
|
labelColor: y,
|
|
fontSize: 7,
|
|
drawBody: !0
|
|
},
|
|
lineStyle: {
|
|
color: y,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
linewidth: 2,
|
|
priceSource: "close",
|
|
styleType: a.STYLE_LINE_TYPE_SIMPLE
|
|
},
|
|
areaStyle: {
|
|
color1: n(y, 72),
|
|
color2: y,
|
|
linecolor: y,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
linewidth: 2,
|
|
priceSource: "close",
|
|
transparency: 100
|
|
},
|
|
priceAxisProperties: {
|
|
autoScale: !0,
|
|
autoScaleDisabled: !1,
|
|
lockScale: !1,
|
|
percentage: !1,
|
|
percentageDisabled: !1,
|
|
indexedTo100: !1,
|
|
log: !1,
|
|
logDisabled: !1,
|
|
isInverted: !1,
|
|
alignLabels: !0
|
|
},
|
|
renkoStyle: {
|
|
upColor: "#26a69a",
|
|
downColor: "#ef5350",
|
|
borderUpColor: "#26a69a",
|
|
borderDownColor: "#ef5350",
|
|
upColorProjection: "rgba( 169, 220, 195, 1)",
|
|
downColorProjection: "rgba( 245, 166, 174, 1)",
|
|
borderUpColorProjection: "rgba( 169, 220, 195, 1)",
|
|
borderDownColorProjection: "rgba( 245, 166, 174, 1)",
|
|
wickUpColor: "#26a69a",
|
|
wickDownColor: "#ef5350",
|
|
inputs: {
|
|
source: "close",
|
|
sources: "Close",
|
|
boxSize: 3,
|
|
style: "ATR",
|
|
atrLength: 14,
|
|
wicks: !0
|
|
},
|
|
inputInfo: {
|
|
source: {
|
|
name: "source"
|
|
},
|
|
sources: {
|
|
name: "Source"
|
|
},
|
|
boxSize: {
|
|
name: "Box size"
|
|
},
|
|
style: {
|
|
name: "Style"
|
|
},
|
|
atrLength: {
|
|
name: "ATR length"
|
|
},
|
|
wicks: {
|
|
name: "Wicks"
|
|
}
|
|
}
|
|
},
|
|
pbStyle: {
|
|
upColor: "#26a69a",
|
|
downColor: "#ef5350",
|
|
borderUpColor: "#26a69a",
|
|
borderDownColor: "#ef5350",
|
|
upColorProjection: "rgba( 169, 220, 195, 1)",
|
|
downColorProjection: "rgba( 245, 166, 174, 1)",
|
|
borderUpColorProjection: "rgba( 169, 220, 195, 1)",
|
|
borderDownColorProjection: "rgba( 245, 166, 174, 1)",
|
|
inputs: {
|
|
source: "close",
|
|
lb: 3
|
|
},
|
|
inputInfo: {
|
|
source: {
|
|
name: "Source"
|
|
},
|
|
lb: {
|
|
name: "Number of line"
|
|
}
|
|
}
|
|
},
|
|
kagiStyle: {
|
|
upColor: "#26a69a",
|
|
downColor: "#ef5350",
|
|
upColorProjection: "rgba( 169, 220, 195, 1)",
|
|
downColorProjection: "rgba( 245, 166, 174, 1)",
|
|
inputs: {
|
|
source: "close",
|
|
style: "ATR",
|
|
atrLength: 14,
|
|
reversalAmount: 1
|
|
},
|
|
inputInfo: {
|
|
source: {
|
|
name: "Source"
|
|
},
|
|
style: {
|
|
name: "Style"
|
|
},
|
|
atrLength: {
|
|
name: "ATR length"
|
|
},
|
|
reversalAmount: {
|
|
name: "Reversal amount"
|
|
}
|
|
}
|
|
},
|
|
pnfStyle: {
|
|
upColor: "#26a69a",
|
|
downColor: "#ef5350",
|
|
upColorProjection: "rgba( 169, 220, 195, 1)",
|
|
downColorProjection: "rgba( 245, 166, 174, 1)",
|
|
inputs: {
|
|
sources: "Close",
|
|
reversalAmount: 3,
|
|
boxSize: 1,
|
|
style: "ATR",
|
|
atrLength: 14,
|
|
oneStepBackBuilding: !1
|
|
},
|
|
inputInfo: {
|
|
sources: {
|
|
name: "Source"
|
|
},
|
|
boxSize: {
|
|
name: "Box size"
|
|
},
|
|
reversalAmount: {
|
|
name: "Reversal amount"
|
|
},
|
|
style: {
|
|
name: "Style"
|
|
},
|
|
atrLength: {
|
|
name: "ATR length"
|
|
},
|
|
oneStepBackBuilding: {
|
|
name: "One step back building"
|
|
}
|
|
}
|
|
},
|
|
baselineStyle: {
|
|
baselineColor: "rgba( 117, 134, 150, 1)",
|
|
topFillColor1: "rgba( 38, 166, 154, 0.28)",
|
|
topFillColor2: "rgba( 38, 166, 154, 0.05)",
|
|
bottomFillColor1: "rgba( 239, 83, 80, 0.05)",
|
|
bottomFillColor2: "rgba( 239, 83, 80, 0.28)",
|
|
topLineColor: "rgba( 38, 166, 154, 1)",
|
|
bottomLineColor: "rgba( 239, 83, 80, 1)",
|
|
topLineWidth: 2,
|
|
bottomLineWidth: 2,
|
|
priceSource: "close",
|
|
transparency: 50,
|
|
baseLevelPercentage: 50
|
|
},
|
|
rangeStyle: {
|
|
upColor: "#26a69a",
|
|
downColor: "#ef5350",
|
|
thinBars: !0,
|
|
upColorProjection: "rgba( 169, 220, 195, 1)",
|
|
downColorProjection: "rgba( 245, 166, 174, 1)",
|
|
inputs: {
|
|
range: 10,
|
|
phantomBars: !1
|
|
},
|
|
inputInfo: {
|
|
range: {
|
|
name: "Range"
|
|
},
|
|
phantomBars: {
|
|
name: "Phantom bars"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
chartEventsSourceProperties: {
|
|
visible: !0,
|
|
futureOnly: !0,
|
|
breaks: {
|
|
color: "rgba(85, 85, 85, 1)",
|
|
visible: !1,
|
|
style: CanvasEx.LINESTYLE_DASHED,
|
|
width: 1
|
|
}
|
|
},
|
|
tradingProperties: {
|
|
showPositions: !0,
|
|
positionPL: {
|
|
visibility: !0,
|
|
display: s.Money
|
|
},
|
|
showOrders: !0,
|
|
showExecutions: !0,
|
|
horizontalAlignment: o.Left,
|
|
extendLeft: !0,
|
|
lineLength: 5,
|
|
lineWidth: 1,
|
|
lineStyle: CanvasEx.LINESTYLE_SOLID
|
|
},
|
|
editorFontsList: ["Verdana", "Courier New", "Times New Roman", "Arial"],
|
|
volumePaneSize: "large"
|
|
},
|
|
sessions: b,
|
|
drawings: {
|
|
magnet: !1,
|
|
magnetMode: _.WeakMagnet,
|
|
stayInDrawingMode: !1,
|
|
drawOnAllCharts: !0
|
|
},
|
|
linetoolorder: {
|
|
extendLeft: "inherit",
|
|
lineLength: "inherit",
|
|
lineColor: "rgba( 255, 0, 0, 1)",
|
|
lineActiveBuyColor: "rgb(64,148,232)",
|
|
lineInactiveBuyColor: "rgba(64,148,232,.5)",
|
|
lineActiveSellColor: "rgb(231,86,86)",
|
|
lineInactiveSellColor: "rgba(231,86,86,.5)",
|
|
lineStyle: "inherit",
|
|
lineWidth: "inherit",
|
|
bodyBorderActiveBuyColor: "rgb(64,148,232)",
|
|
bodyBorderInactiveBuyColor: "rgba(64,148,232,.5)",
|
|
bodyBorderActiveSellColor: "rgb(231,86,86)",
|
|
bodyBorderInactiveSellColor: "rgba(231,86,86,.5)",
|
|
bodyBackgroundColor: "rgba( 255, 255, 255, 0.75)",
|
|
bodyBackgroundTransparency: 25,
|
|
bodyTextInactiveLimitColor: "rgba(38,140,2,.5)",
|
|
bodyTextActiveLimitColor: "rgb(38,140,2)",
|
|
bodyTextInactiveStopColor: "rgba(231,86,86,.5)",
|
|
bodyTextActiveStopColor: "rgb(231,86,86)",
|
|
bodyTextInactiveBuyColor: "rgba(64,148,232,.5)",
|
|
bodyTextActiveBuyColor: "rgb(64,148,232)",
|
|
bodyTextInactiveSellColor: "rgba(231,86,86,.5)",
|
|
bodyTextActiveSellColor: "rgb(231,86,86)",
|
|
bodyFontFamily: "Verdana",
|
|
bodyFontSize: 9,
|
|
bodyFontBold: !0,
|
|
bodyFontItalic: !1,
|
|
quantityBorderActiveBuyColor: "rgb(64,148,232)",
|
|
quantityBorderInactiveBuyColor: "rgba(64,148,232,.5)",
|
|
quantityBorderActiveSellColor: "rgb(231,86,86)",
|
|
quantityBorderInactiveSellColor: "rgba(231,86,86,.5)",
|
|
quantityBackgroundInactiveBuyColor: "rgba(64,148,232,.5)",
|
|
quantityBackgroundActiveBuyColor: "rgb(64,148,232)",
|
|
quantityBackgroundInactiveSellColor: "rgba(231,86,86,.5)",
|
|
quantityBackgroundActiveSellColor: "rgb(231,86,86)",
|
|
quantityTextColor: "rgba( 255, 255, 255, 1)",
|
|
quantityTextTransparency: 0,
|
|
quantityFontFamily: "Verdana",
|
|
quantityFontSize: 9,
|
|
quantityFontBold: !0,
|
|
quantityFontItalic: !1,
|
|
cancelButtonBorderActiveBuyColor: "rgb(64,148,232)",
|
|
cancelButtonBorderInactiveBuyColor: "rgba(64,148,232,.5)",
|
|
cancelButtonBorderActiveSellColor: "rgb(231,86,86)",
|
|
cancelButtonBorderInactiveSellColor: "rgba(231,86,86,.5)",
|
|
cancelButtonBackgroundColor: "rgba( 255, 255, 255, 0.75)",
|
|
cancelButtonBackgroundTransparency: 25,
|
|
cancelButtonIconActiveBuyColor: "rgb(64,148,232)",
|
|
cancelButtonIconInactiveBuyColor: "rgba(64,148,232,.5)",
|
|
cancelButtonIconActiveSellColor: "rgb(231,86,86)",
|
|
cancelButtonIconInactiveSellColor: "rgba(231,86,86,.5)",
|
|
tooltip: "",
|
|
modifyTooltip: "",
|
|
cancelTooltip: ""
|
|
},
|
|
linetoolposition: {
|
|
extendLeft: "inherit",
|
|
lineLength: "inherit",
|
|
lineBuyColor: "rgb(64,148,232)",
|
|
lineSellColor: "rgb(231,86,86)",
|
|
lineStyle: "inherit",
|
|
lineWidth: "inherit",
|
|
bodyBorderBuyColor: "rgb(64,148,232)",
|
|
bodyBorderSellColor: "rgb(231,86,86)",
|
|
bodyBackgroundColor: "rgba( 255, 255, 255, 0.75)",
|
|
bodyBackgroundTransparency: 25,
|
|
bodyTextPositiveColor: "rgb(38,140,2)",
|
|
bodyTextNeutralColor: "rgb(100,100,100)",
|
|
bodyTextNegativeColor: "rgb(231,86,86)",
|
|
bodyFontFamily: "Verdana",
|
|
bodyFontSize: 9,
|
|
bodyFontBold: !0,
|
|
bodyFontItalic: !1,
|
|
quantityBorderBuyColor: "rgb(64,148,232)",
|
|
quantityBorderSellColor: "rgb(231,86,86)",
|
|
quantityBackgroundBuyColor: "rgb(64,148,232)",
|
|
quantityBackgroundSellColor: "rgb(231,86,86)",
|
|
quantityTextColor: "rgba( 255, 255, 255, 1)",
|
|
quantityTextTransparency: 0,
|
|
quantityFontFamily: "Verdana",
|
|
quantityFontSize: 9,
|
|
quantityFontBold: !0,
|
|
quantityFontItalic: !1,
|
|
reverseButtonBorderBuyColor: "rgb(64,148,232)",
|
|
reverseButtonBorderSellColor: "rgb(231,86,86)",
|
|
reverseButtonBackgroundColor: "rgba( 255, 255, 255, 0.75)",
|
|
reverseButtonBackgroundTransparency: 25,
|
|
reverseButtonIconBuyColor: "rgb(64,148,232)",
|
|
reverseButtonIconSellColor: "rgb(231,86,86)",
|
|
closeButtonBorderBuyColor: "rgb(64,148,232)",
|
|
closeButtonBorderSellColor: "rgb(231,86,86)",
|
|
closeButtonBackgroundColor: "rgba( 255, 255, 255, 0.75)",
|
|
closeButtonBackgroundTransparency: 25,
|
|
closeButtonIconBuyColor: "rgb(64,148,232)",
|
|
closeButtonIconSellColor: "rgb(231,86,86)",
|
|
tooltip: "",
|
|
protectTooltip: "",
|
|
closeTooltip: "",
|
|
reverseTooltip: ""
|
|
},
|
|
linetoolexecution: {
|
|
direction: "buy",
|
|
arrowHeight: 8,
|
|
arrowSpacing: 1,
|
|
arrowBuyColor: "#4094e8",
|
|
arrowSellColor: "#e75656",
|
|
text: "",
|
|
textColor: "rgba( 0, 0, 0, 1)",
|
|
textTransparency: 0,
|
|
fontFamily: "Verdana",
|
|
fontSize: 10,
|
|
fontBold: !1,
|
|
fontItalic: !1,
|
|
tooltip: ""
|
|
},
|
|
linetoolicon: {
|
|
color: y,
|
|
size: 40,
|
|
icon: 61720,
|
|
angle: .5 * Math.PI,
|
|
scale: 1
|
|
},
|
|
linetoolimage: {
|
|
transparency: 0,
|
|
cssWidth: 0,
|
|
cssHeight: 0,
|
|
angle: 0
|
|
},
|
|
linetoolbezierquadro: {
|
|
linecolor: y,
|
|
linewidth: 1,
|
|
fillBackground: !1,
|
|
backgroundColor: n(y, 80),
|
|
transparency: 50,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
extendLeft: !1,
|
|
extendRight: !1,
|
|
leftEnd: m.Normal,
|
|
rightEnd: m.Normal
|
|
},
|
|
linetoolbeziercubic: {
|
|
linecolor: "#00bcd4",
|
|
linewidth: 1,
|
|
fillBackground: !1,
|
|
backgroundColor: "rgba(0, 188, 212, 0.2)",
|
|
transparency: 50,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
extendLeft: !1,
|
|
extendRight: !1,
|
|
leftEnd: m.Normal,
|
|
rightEnd: m.Normal
|
|
},
|
|
linetooltrendline: {
|
|
linecolor: y,
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
extendLeft: !1,
|
|
extendRight: !1,
|
|
leftEnd: m.Normal,
|
|
rightEnd: m.Normal,
|
|
showLabel: !1,
|
|
horzLabelsAlign: "center",
|
|
vertLabelsAlign: "bottom",
|
|
font: "Verdana",
|
|
textcolor: y,
|
|
fontsize: 14,
|
|
bold: !1,
|
|
italic: !1,
|
|
alwaysShowStats: !1,
|
|
showMiddlePoint: !1,
|
|
showPriceRange: !1,
|
|
showBarsRange: !1,
|
|
showDateTimeRange: !1,
|
|
showDistance: !1,
|
|
showAngle: !1,
|
|
statsPosition: g.Right
|
|
},
|
|
linetoolinfoline: {
|
|
linecolor: y,
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
extendLeft: !1,
|
|
extendRight: !1,
|
|
leftEnd: m.Normal,
|
|
rightEnd: m.Normal,
|
|
font: "Verdana",
|
|
showLabel: !1,
|
|
horzLabelsAlign: "center",
|
|
vertLabelsAlign: "bottom",
|
|
textcolor: y,
|
|
fontsize: 14,
|
|
bold: !1,
|
|
italic: !1,
|
|
alwaysShowStats: !0,
|
|
showMiddlePoint: !1,
|
|
showPriceRange: !0,
|
|
showBarsRange: !0,
|
|
showDateTimeRange: !0,
|
|
showDistance: !0,
|
|
showAngle: !0,
|
|
statsPosition: g.Center
|
|
},
|
|
linetooltimecycles: {
|
|
linecolor: "rgba(21, 153, 128, 1)",
|
|
linewidth: 1,
|
|
fillBackground: !0,
|
|
backgroundColor: "rgba(106, 168, 79, 0.5)",
|
|
transparency: 50,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID
|
|
},
|
|
linetoolsineline: {
|
|
linecolor: "rgba( 21, 153, 128, 1)",
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID
|
|
},
|
|
linetooltrendangle: {
|
|
linecolor: y,
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
font: "Verdana",
|
|
textcolor: y,
|
|
fontsize: 12,
|
|
bold: !1,
|
|
italic: !1,
|
|
alwaysShowStats: !1,
|
|
showMiddlePoint: !1,
|
|
showPriceRange: !1,
|
|
showBarsRange: !1,
|
|
extendRight: !1,
|
|
extendLeft: !1,
|
|
statsPosition: g.Right
|
|
},
|
|
linetooldisjointangle: {
|
|
linecolor: "rgba(0, 150, 136, 1)",
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
fillBackground: !0,
|
|
backgroundColor: "rgba(0, 150, 136, 0.2)",
|
|
transparency: 20,
|
|
extendLeft: !1,
|
|
extendRight: !1,
|
|
leftEnd: m.Normal,
|
|
rightEnd: m.Normal,
|
|
font: "Verdana",
|
|
textcolor: "rgba(0, 150, 136, 1)",
|
|
fontsize: 12,
|
|
bold: !1,
|
|
italic: !1,
|
|
showPrices: !1,
|
|
showPriceRange: !1,
|
|
showDateTimeRange: !1,
|
|
showBarsRange: !1
|
|
},
|
|
linetoolflatbottom: {
|
|
linecolor: "rgba(171, 71, 188, 1)",
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
fillBackground: !0,
|
|
backgroundColor: "rgba(171, 71, 188, 0.2)",
|
|
transparency: 20,
|
|
extendLeft: !1,
|
|
extendRight: !1,
|
|
leftEnd: m.Normal,
|
|
rightEnd: m.Normal,
|
|
font: "Verdana",
|
|
textcolor: "rgba(171, 71, 188, 1)",
|
|
fontsize: 12,
|
|
bold: !1,
|
|
italic: !1,
|
|
showPrices: !1,
|
|
showPriceRange: !1,
|
|
showDateTimeRange: !1,
|
|
showBarsRange: !1
|
|
},
|
|
linetoolfibspiral: {
|
|
counterclockwise: !1,
|
|
linecolor: "rgba(0, 150, 136, 1)",
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID
|
|
},
|
|
linetooldaterange: {
|
|
linecolor: y,
|
|
linewidth: 1,
|
|
font: S,
|
|
textcolor: "rgba( 255, 255, 255, 1)",
|
|
fontsize: 12,
|
|
fillLabelBackground: !0,
|
|
labelBackgroundColor: n(y, 10),
|
|
fillBackground: !0,
|
|
backgroundColor: n(y, 80),
|
|
backgroundTransparency: 60,
|
|
drawBorder: !1,
|
|
borderColor: n(y, 10),
|
|
extendTop: !1,
|
|
extendBottom: !1
|
|
},
|
|
linetoolpricerange: {
|
|
linecolor: y,
|
|
linewidth: 1,
|
|
font: S,
|
|
textcolor: "rgba( 255, 255, 255, 1)",
|
|
fontsize: 12,
|
|
fillLabelBackground: !0,
|
|
labelBackgroundColor: n(y, 10),
|
|
fillBackground: !0,
|
|
backgroundColor: n(y, 80),
|
|
backgroundTransparency: 60,
|
|
drawBorder: !1,
|
|
borderColor: n(y, 10),
|
|
extendLeft: !1,
|
|
extendRight: !1
|
|
},
|
|
linetooldateandpricerange: {
|
|
linecolor: y,
|
|
linewidth: 1,
|
|
font: S,
|
|
textcolor: "rgba( 255, 255, 255, 1)",
|
|
fontsize: 12,
|
|
fillLabelBackground: !0,
|
|
labelBackgroundColor: n(y, 10),
|
|
fillBackground: !0,
|
|
backgroundColor: n(y, 80),
|
|
backgroundTransparency: 60,
|
|
borderWidth: 1,
|
|
drawBorder: !1,
|
|
borderColor: y
|
|
},
|
|
linetoolriskrewardshort: {
|
|
linecolor: "rgba(120, 123, 134, 1)",
|
|
linewidth: 1,
|
|
font: "Verdana",
|
|
textcolor: "rgba(255, 255, 255, 1)",
|
|
fontsize: 12,
|
|
fillLabelBackground: !0,
|
|
labelBackgroundColor: "rgba( 88, 88, 88, 1)",
|
|
fillBackground: !0,
|
|
stopBackground: "rgba(244, 67, 54, 0.2)",
|
|
profitBackground: "rgba(0, 150, 136, 0.2)",
|
|
stopBackgroundTransparency: 80,
|
|
profitBackgroundTransparency: 80,
|
|
drawBorder: !1,
|
|
borderColor: "rgba( 102, 123, 139, 1)",
|
|
compact: !1,
|
|
riskDisplayMode: "percents",
|
|
accountSize: 1e3,
|
|
lotSize: 1,
|
|
risk: 25,
|
|
alwaysShowStats: !1,
|
|
showPriceLabels: !0
|
|
},
|
|
linetoolriskrewardlong: {
|
|
linecolor: "rgba(120, 123, 134, 1)",
|
|
linewidth: 1,
|
|
font: "Verdana",
|
|
textcolor: "rgba(255, 255, 255, 1)",
|
|
fontsize: 12,
|
|
fillLabelBackground: !0,
|
|
labelBackgroundColor: "rgba( 88, 88, 88, 1)",
|
|
fillBackground: !0,
|
|
stopBackground: "rgba(244, 67, 54, 0.2)",
|
|
profitBackground: "rgba(0, 150, 136, 0.2)",
|
|
stopBackgroundTransparency: 80,
|
|
profitBackgroundTransparency: 80,
|
|
drawBorder: !1,
|
|
borderColor: "rgba( 102, 123, 139, 1)",
|
|
compact: !1,
|
|
riskDisplayMode: "percents",
|
|
accountSize: 1e3,
|
|
lotSize: 1,
|
|
risk: 25,
|
|
alwaysShowStats: !1,
|
|
showPriceLabels: !0
|
|
},
|
|
linetoolarrow: {
|
|
linecolor: y,
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
extendLeft: !1,
|
|
extendRight: !1,
|
|
leftEnd: m.Normal,
|
|
rightEnd: m.Arrow,
|
|
font: "Verdana",
|
|
showLabel: !1,
|
|
horzLabelsAlign: "center",
|
|
vertLabelsAlign: "bottom",
|
|
textcolor: y,
|
|
fontsize: 14,
|
|
bold: !1,
|
|
italic: !1,
|
|
alwaysShowStats: !1,
|
|
showMiddlePoint: !1,
|
|
showPriceRange: !1,
|
|
showBarsRange: !1,
|
|
showDateTimeRange: !1,
|
|
showDistance: !1,
|
|
showAngle: !1,
|
|
statsPosition: g.Right
|
|
},
|
|
linetoolray: {
|
|
linecolor: y,
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
extendLeft: !1,
|
|
extendRight: !0,
|
|
leftEnd: m.Normal,
|
|
rightEnd: m.Normal,
|
|
font: "Verdana",
|
|
showLabel: !1,
|
|
horzLabelsAlign: "center",
|
|
vertLabelsAlign: "bottom",
|
|
textcolor: y,
|
|
fontsize: 14,
|
|
bold: !1,
|
|
italic: !1,
|
|
alwaysShowStats: !1,
|
|
showMiddlePoint: !1,
|
|
showPriceRange: !1,
|
|
showBarsRange: !1,
|
|
showDateTimeRange: !1,
|
|
showDistance: !1,
|
|
showAngle: !1,
|
|
statsPosition: g.Right
|
|
},
|
|
linetoolextended: {
|
|
linecolor: y,
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
extendLeft: !0,
|
|
extendRight: !0,
|
|
leftEnd: m.Normal,
|
|
rightEnd: m.Normal,
|
|
font: "Verdana",
|
|
showLabel: !1,
|
|
horzLabelsAlign: "center",
|
|
vertLabelsAlign: "bottom",
|
|
textcolor: y,
|
|
fontsize: 14,
|
|
bold: !1,
|
|
italic: !1,
|
|
alwaysShowStats: !1,
|
|
showMiddlePoint: !1,
|
|
showPriceRange: !1,
|
|
showBarsRange: !1,
|
|
showDateTimeRange: !1,
|
|
showDistance: !1,
|
|
showAngle: !1,
|
|
statsPosition: g.Right
|
|
},
|
|
linetoolhorzline: {
|
|
linecolor: y,
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
showPrice: !0,
|
|
showLabel: !1,
|
|
font: "Verdana",
|
|
textcolor: y,
|
|
fontsize: 12,
|
|
bold: !1,
|
|
italic: !1,
|
|
horzLabelsAlign: "center",
|
|
vertLabelsAlign: "top"
|
|
},
|
|
linetoolhorzray: {
|
|
linecolor: y,
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
showPrice: !0,
|
|
showLabel: !1,
|
|
font: "Verdana",
|
|
textcolor: y,
|
|
fontsize: 12,
|
|
bold: !1,
|
|
italic: !1,
|
|
horzLabelsAlign: "center",
|
|
vertLabelsAlign: "top"
|
|
},
|
|
linetoolvertline: {
|
|
linecolor: y,
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
extendLine: !0,
|
|
showTime: !0,
|
|
showLabel: !1,
|
|
horzLabelsAlign: "right",
|
|
vertLabelsAlign: "top",
|
|
font: "Verdana",
|
|
textcolor: y,
|
|
textOrientation: "vertical",
|
|
fontsize: 14,
|
|
bold: !1,
|
|
italic: !1
|
|
},
|
|
linetoolcrossline: {
|
|
linecolor: y,
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
showPrice: !0,
|
|
showTime: !0
|
|
},
|
|
linetoolcirclelines: {
|
|
trendline: {
|
|
visible: !0,
|
|
color: "rgba( 128, 128, 128, 1)",
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_DASHED
|
|
},
|
|
linecolor: "rgba( 128, 204, 219, 1)",
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID
|
|
},
|
|
linetoolfibtimezone: {
|
|
horzLabelsAlign: "right",
|
|
vertLabelsAlign: "bottom",
|
|
baselinecolor: "rgba( 128, 128, 128, 1)",
|
|
linecolor: "rgba( 0, 85, 219, 1)",
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
showLabels: !0,
|
|
font: S,
|
|
fillBackground: !1,
|
|
transparency: 80,
|
|
trendline: {
|
|
visible: !0,
|
|
color: "rgba( 128, 128, 128, 1)",
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_DASHED
|
|
},
|
|
level1: r(0, "rgba(120, 123, 134, 1)", !0),
|
|
level2: r(1, y, !0),
|
|
level3: r(2, y, !0),
|
|
level4: r(3, y, !0),
|
|
level5: r(5, y, !0),
|
|
level6: r(8, y, !0),
|
|
level7: r(13, y, !0),
|
|
level8: r(21, y, !0),
|
|
level9: r(34, y, !0),
|
|
level10: r(55, y, !0),
|
|
level11: r(89, y, !0)
|
|
},
|
|
linetooltext: {
|
|
color: y,
|
|
font: "Verdana",
|
|
fontsize: 14,
|
|
fillBackground: !1,
|
|
backgroundColor: "rgba( 91, 133, 191, 0.3)",
|
|
backgroundTransparency: 70,
|
|
drawBorder: !1,
|
|
borderColor: "rgba( 102, 123, 139, 1)",
|
|
bold: !1,
|
|
italic: !1,
|
|
fixedSize: !0,
|
|
wordWrap: !1,
|
|
wordWrapWidth: 200
|
|
},
|
|
linetooltextabsolute: {
|
|
color: y,
|
|
font: "Verdana",
|
|
fontsize: 14,
|
|
fillBackground: !1,
|
|
backgroundColor: "rgba( 155, 190, 213, 0.3)",
|
|
backgroundTransparency: 70,
|
|
drawBorder: !1,
|
|
borderColor: "rgba( 102, 123, 139, 1)",
|
|
bold: !1,
|
|
italic: !1,
|
|
fixedSize: !1,
|
|
wordWrap: !1,
|
|
wordWrapWidth: 200
|
|
},
|
|
linetoolballoon: {
|
|
color: "#ffffff",
|
|
backgroundColor: "rgba(156, 39, 176, 0.7)",
|
|
borderColor: "rgba(156, 39, 176, 0.0)",
|
|
fontsize: 14,
|
|
transparency: 30
|
|
},
|
|
linetoolbrush: {
|
|
linecolor: "#00bcd4",
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
smooth: 5,
|
|
fillBackground: !1,
|
|
backgroundColor: "rgba(0, 188, 212, 0.5)",
|
|
transparency: 50,
|
|
leftEnd: m.Normal,
|
|
rightEnd: m.Normal
|
|
},
|
|
linetoolhighlighter: {
|
|
linecolor: "rgba(236, 64, 122, 0.15)",
|
|
smooth: 5,
|
|
transparency: 85
|
|
},
|
|
linetoolpolyline: {
|
|
linecolor: "#7e57c2",
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
fillBackground: !0,
|
|
backgroundColor: "rgba(126, 87, 194, 0.2)",
|
|
transparency: 50,
|
|
filled: !1
|
|
},
|
|
linetoolsignpost: {
|
|
itemType: p.Emoji,
|
|
emoji: "🙂",
|
|
showImage: !1,
|
|
plateColor: y,
|
|
fontSize: 12,
|
|
bold: !1,
|
|
italic: !1
|
|
},
|
|
linetoolpath: {
|
|
lineColor: y,
|
|
lineWidth: 2,
|
|
lineStyle: CanvasEx.LINESTYLE_SOLID,
|
|
leftEnd: m.Normal,
|
|
rightEnd: m.Arrow
|
|
},
|
|
linetoolarrowmarkleft: {
|
|
color: y,
|
|
arrowColor: y,
|
|
fontsize: 14,
|
|
font: S,
|
|
bold: !1,
|
|
italic: !1,
|
|
showLabel: !0
|
|
},
|
|
linetoolarrowmarkup: {
|
|
color: "#009688",
|
|
arrowColor: "#009688",
|
|
fontsize: 14,
|
|
font: S,
|
|
bold: !1,
|
|
italic: !1,
|
|
showLabel: !0
|
|
},
|
|
linetoolarrowmarkright: {
|
|
color: y,
|
|
arrowColor: y,
|
|
fontsize: 14,
|
|
font: S,
|
|
bold: !1,
|
|
italic: !1,
|
|
showLabel: !0
|
|
},
|
|
linetoolarrowmarkdown: {
|
|
color: "#E53935",
|
|
arrowColor: "#E53935",
|
|
fontsize: 14,
|
|
font: S,
|
|
bold: !1,
|
|
italic: !1,
|
|
showLabel: !0
|
|
},
|
|
linetoolflagmark: {
|
|
flagColor: y
|
|
},
|
|
linetoolnote: {
|
|
markerColor: y,
|
|
textColor: "#ffffff",
|
|
backgroundColor: n(y, 30),
|
|
backgroundTransparency: 0,
|
|
borderColor: y,
|
|
font: "Verdana",
|
|
fontSize: 14,
|
|
bold: !1,
|
|
italic: !1,
|
|
fixedSize: !0
|
|
},
|
|
linetoolnoteabsolute: {
|
|
markerColor: y,
|
|
textColor: "#ffffff",
|
|
backgroundColor: n(y, 30),
|
|
backgroundTransparency: 0,
|
|
borderColor: y,
|
|
font: "Verdana",
|
|
fontSize: 14,
|
|
bold: !1,
|
|
italic: !1,
|
|
fixedSize: !0
|
|
},
|
|
linetoolpricelabel: {
|
|
color: "#ffffff",
|
|
backgroundColor: y,
|
|
borderColor: y,
|
|
fontWeight: "bold",
|
|
fontsize: 14,
|
|
font: S,
|
|
transparency: 0
|
|
},
|
|
linetoolpricenote: {
|
|
showLabel: !1,
|
|
horzLabelsAlign: "center",
|
|
vertLabelsAlign: "bottom",
|
|
textColor: y,
|
|
fontSize: 14,
|
|
bold: !1,
|
|
italic: !1,
|
|
lineColor: y,
|
|
priceLabelBackgroundColor: y,
|
|
priceLabelBorderColor: y,
|
|
priceLabelTextColor: "#ffffff",
|
|
priceLabelFontSize: 12,
|
|
priceLabelBold: !1,
|
|
priceLabelItalic: !1
|
|
},
|
|
linetoolarrowmarker: {
|
|
backgroundColor: "#1E53E5",
|
|
textColor: "#1E53E5",
|
|
font: S,
|
|
bold: !0,
|
|
italic: !1,
|
|
fontsize: 16,
|
|
showLabel: !0
|
|
},
|
|
linetoolrectangle: {
|
|
color: "#9c27b0",
|
|
fillBackground: !0,
|
|
backgroundColor: "rgba(156, 39, 176, 0.2)",
|
|
linewidth: 1,
|
|
transparency: 50,
|
|
showLabel: !1,
|
|
horzLabelsAlign: "left",
|
|
vertLabelsAlign: "bottom",
|
|
textColor: "#9c27b0",
|
|
fontSize: 14,
|
|
bold: !1,
|
|
italic: !1,
|
|
extendLeft: !1,
|
|
extendRight: !1
|
|
},
|
|
linetoolrotatedrectangle: {
|
|
color: "#4caf50",
|
|
fillBackground: !0,
|
|
backgroundColor: "rgba(76, 175, 80, 0.2)",
|
|
transparency: 50,
|
|
linewidth: 1
|
|
},
|
|
linetoolellipse: {
|
|
color: "#e91e63",
|
|
fillBackground: !0,
|
|
backgroundColor: "rgba(233, 30, 99, 0.2)",
|
|
transparency: 50,
|
|
linewidth: 1
|
|
},
|
|
linetoolarc: {
|
|
color: "#ab47bc",
|
|
fillBackground: !0,
|
|
backgroundColor: "rgba(171, 71, 188, 0.2)",
|
|
transparency: 50,
|
|
linewidth: 1
|
|
},
|
|
linetoolprediction: {
|
|
linecolor: y,
|
|
linewidth: 1,
|
|
sourceBackColor: y,
|
|
sourceTextColor: "rgba(255, 255, 255, 1)",
|
|
sourceStrokeColor: y,
|
|
targetStrokeColor: y,
|
|
targetBackColor: y,
|
|
targetTextColor: "rgba(255, 255, 255, 1)",
|
|
successBackground: "rgba(76, 175, 80, 1)",
|
|
successTextColor: "rgba(255, 255, 255, 1)",
|
|
failureBackground: "rgba(244, 67, 54, 1)",
|
|
failureTextColor: "rgba(255, 255, 255, 1)",
|
|
intermediateBackColor: "rgba(234, 210, 137, 1)",
|
|
intermediateTextColor: "rgba(109, 77, 34, 1)",
|
|
transparency: 10,
|
|
centersColor: "rgba( 32, 32, 32, 1)"
|
|
},
|
|
linetooltriangle: {
|
|
color: "#f57c00",
|
|
fillBackground: !0,
|
|
backgroundColor: "rgba(245, 124, 0, 0.2)",
|
|
transparency: 50,
|
|
linewidth: 1
|
|
},
|
|
linetoolcallout: {
|
|
color: "#ffffff",
|
|
backgroundColor: "rgba(0, 151, 167, 0.7)",
|
|
transparency: 50,
|
|
linewidth: 1,
|
|
fontsize: 14,
|
|
font: "Verdana",
|
|
bordercolor: "rgba(0, 151, 167, 1)",
|
|
bold: !1,
|
|
italic: !1,
|
|
wordWrap: !1,
|
|
wordWrapWidth: 200
|
|
},
|
|
linetoolparallelchannel: {
|
|
linecolor: y,
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
extendLeft: !1,
|
|
extendRight: !1,
|
|
fillBackground: !0,
|
|
backgroundColor: n(y, 80),
|
|
transparency: 20,
|
|
showMidline: !0,
|
|
midlinecolor: y,
|
|
midlinewidth: 1,
|
|
midlinestyle: CanvasEx.LINESTYLE_DASHED
|
|
},
|
|
linetoolelliottimpulse: {
|
|
degree: 7,
|
|
showWave: !0,
|
|
color: "rgba( 61, 133, 198, 1)",
|
|
linewidth: 1
|
|
},
|
|
linetoolelliotttriangle: {
|
|
degree: 7,
|
|
showWave: !0,
|
|
color: "rgba( 255, 152, 0, 1)",
|
|
linewidth: 1
|
|
},
|
|
linetoolelliotttriplecombo: {
|
|
degree: 7,
|
|
showWave: !0,
|
|
color: "rgba( 106, 168, 79, 1)",
|
|
linewidth: 1
|
|
},
|
|
linetoolelliottcorrection: {
|
|
degree: 7,
|
|
showWave: !0,
|
|
color: "rgba( 61, 133, 198, 1)",
|
|
linewidth: 1
|
|
},
|
|
linetoolelliottdoublecombo: {
|
|
degree: 7,
|
|
showWave: !0,
|
|
color: "rgba( 106, 168, 79, 1)",
|
|
linewidth: 1
|
|
},
|
|
linetoolbarspattern: {
|
|
color: y,
|
|
mode: c.Bars,
|
|
mirrored: !1,
|
|
flipped: !1
|
|
},
|
|
linetoolghostfeed: {
|
|
averageHL: 20,
|
|
variance: 50,
|
|
candleStyle: {
|
|
upColor: "rgba(178, 223, 219, 1)",
|
|
downColor: "rgba(239, 154, 154, 1)",
|
|
drawWick: !0,
|
|
drawBorder: !0,
|
|
borderColor: "#378658",
|
|
borderUpColor: "rgba(0, 150, 136, 1)",
|
|
borderDownColor: "rgba(244, 67, 54, 1)",
|
|
wickColor: "rgba(120, 123, 134, 1)"
|
|
},
|
|
transparency: 50
|
|
},
|
|
study: {
|
|
inputs: {},
|
|
styles: {},
|
|
palettes: {},
|
|
bands: {},
|
|
area: {},
|
|
graphics: {},
|
|
showInDataWindow: !0,
|
|
visible: !0,
|
|
showStudyArguments: !0,
|
|
precision: "default"
|
|
},
|
|
linetoolpitchfork: {
|
|
fillBackground: !0,
|
|
transparency: 80,
|
|
style: l.Original,
|
|
median: {
|
|
visible: !0,
|
|
color: "rgba(244, 67, 54, 1)",
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID
|
|
},
|
|
extendLines: !1,
|
|
level0: r(.25, "rgba(255, 183, 77, 1)", !1),
|
|
level1: r(.382, "rgba(129, 199, 132, 1)", !1),
|
|
level2: r(.5, "rgba(76, 175, 80, 1)", !0),
|
|
level3: r(.618, "rgba(0, 150, 136, 1)", !1),
|
|
level4: r(.75, "rgba(100, 181, 246, 1)", !1),
|
|
level5: r(1, y, !0),
|
|
level6: r(1.5, "rgba(156, 39, 176, 1)", !1),
|
|
level7: r(1.75, "rgba(233, 30, 99, 1)", !1),
|
|
level8: r(2, "rgba(229, 115, 115, 1)", !1)
|
|
},
|
|
linetoolpitchfan: {
|
|
fillBackground: !0,
|
|
transparency: 80,
|
|
median: {
|
|
visible: !0,
|
|
color: "rgba(244, 67, 54, 1)",
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID
|
|
},
|
|
level0: r(.25, "rgba(255, 183, 77, 1)", !1),
|
|
level1: r(.382, "rgba(129, 199, 132, 1)", !1),
|
|
level2: r(.5, "rgba(76, 175, 80, 1)", !0),
|
|
level3: r(.618, "rgba(0, 150, 136, 1)", !1),
|
|
level4: r(.75, "rgba(100, 181, 246, 1)", !1),
|
|
level5: r(1, y, !0),
|
|
level6: r(1.5, "rgba(156, 39, 176, 1)", !1),
|
|
level7: r(1.75, "rgba(233, 30, 99, 1)", !1),
|
|
level8: r(2, "rgba(229, 115, 115, 1)", !1)
|
|
},
|
|
linetoolgannfan: {
|
|
showLabels: !0,
|
|
font: "Verdana",
|
|
fillBackground: !0,
|
|
transparency: 80,
|
|
level1: P(1, 8, "rgba(255, 183, 77, 1)", !0),
|
|
level2: P(1, 4, "rgba(129, 199, 132, 1)", !0),
|
|
level3: P(1, 3, "rgba(76, 175, 80, 1)", !0),
|
|
level4: P(1, 2, "rgba(0, 150, 136, 1)", !0),
|
|
level5: P(1, 1, "rgba(100, 181, 246, 1)", !0),
|
|
level6: P(2, 1, y, !0),
|
|
level7: P(3, 1, "rgba(156, 39, 176, 1)", !0),
|
|
level8: P(4, 1, "rgba(233, 30, 99, 1)", !0),
|
|
level9: P(8, 1, "rgba(229, 115, 115, 1)", !0)
|
|
},
|
|
linetoolganncomplex: {
|
|
fillBackground: !1,
|
|
arcsBackground: {
|
|
fillBackground: !0,
|
|
transparency: 80
|
|
},
|
|
reverse: !1,
|
|
scaleRatio: "",
|
|
showLabels: !0,
|
|
labelsStyle: {
|
|
font: S,
|
|
fontSize: 12,
|
|
bold: !1,
|
|
italic: !1
|
|
},
|
|
levels: [v("rgba(120, 123, 134, 1)", !0, 1), v("rgba(255, 152, 0, 1)", !
|
|
0, 1), v("rgba(129, 199, 132, 1)", !0, 1), v(
|
|
"rgba(76, 175, 80, 1)", !0, 1), v("rgba(0, 150, 136, 1)", !
|
|
0, 1), v("rgba(120, 123, 134, 1)", !0, 1)],
|
|
fanlines: [w("rgba(179, 157, 219, 1)", !1, 1, 8, 1), w(
|
|
"rgba(244, 67, 54, 1)", !1, 1, 5, 1), w(
|
|
"rgba(120, 123, 134, 1)", !1, 1, 4, 1), w(
|
|
"rgba(255, 152, 0, 1)", !1, 1, 3, 1), w(
|
|
"rgba(129, 199, 132, 1)", !0, 1, 2, 1), w(
|
|
"rgba(76, 175, 80, 1)", !0, 1, 1, 1), w(
|
|
"rgba(0, 150, 136, 1)", !0, 1, 1, 2), w(
|
|
"rgba(0, 150, 136, 1)", !1, 1, 1, 3), w(y, !1, 1, 1, 4), w(
|
|
"rgba(149, 117, 205, 1)", !1, 1, 1, 5), w(
|
|
"rgba(179, 157, 219, 1)", !1, 1, 1, 8)],
|
|
arcs: [w("rgba(255, 152, 0, 1)", !0, 1, 1, 0), w("rgba(255, 152, 0, 1)",
|
|
!0, 1, 1, 1), w("rgba(255, 152, 0, 1)", !0, 1, 1.5, 0), w(
|
|
"rgba(129, 199, 132, 1)", !0, 1, 2, 0), w(
|
|
"rgba(129, 199, 132, 1)", !0, 1, 2, 1), w(
|
|
"rgba(76, 175, 80, 1)", !0, 1, 3, 0), w(
|
|
"rgba(76, 175, 80, 1)", !0, 1, 3, 1), w(
|
|
"rgba(0, 150, 136, 1)", !0, 1, 4, 0), w(
|
|
"rgba(0, 150, 136, 1)", !0, 1, 4, 1), w(y, !0, 1, 5, 0), w(
|
|
y, !0, 1, 5, 1)]
|
|
},
|
|
linetoolgannfixed: {
|
|
fillBackground: !1,
|
|
arcsBackground: {
|
|
fillBackground: !0,
|
|
transparency: 80
|
|
},
|
|
reverse: !1,
|
|
levels: [v("rgba(120, 123, 134, 1)", !0, 1), v("rgba(255, 152, 0, 1)", !
|
|
0, 1), v("rgba(129, 199, 132, 1)", !0, 1), v(
|
|
"rgba(76, 175, 80, 1)", !0, 1), v("rgba(0, 150, 136, 1)", !
|
|
0, 1), v("rgba(120, 123, 134, 1)", !0, 1)],
|
|
fanlines: [w("rgba(179, 157, 219, 1)", !1, 1, 8, 1), w(
|
|
"rgba(244, 67, 54, 1)", !1, 1, 5, 1), w(
|
|
"rgba(120, 123, 134, 1)", !1, 1, 4, 1), w(
|
|
"rgba(255, 152, 0, 1)", !1, 1, 3, 1), w(
|
|
"rgba(129, 199, 132, 1)", !0, 1, 2, 1), w(
|
|
"rgba(76, 175, 80, 1)", !0, 1, 1, 1), w(
|
|
"rgba(0, 150, 136, 1)", !0, 1, 1, 2), w(
|
|
"rgba(0, 150, 136, 1)", !1, 1, 1, 3), w(y, !1, 1, 1, 4), w(
|
|
"rgba(149, 117, 205, 1)", !1, 1, 1, 5), w(
|
|
"rgba(179, 157, 219, 1)", !1, 1, 1, 8)],
|
|
arcs: [w("rgba(255, 152, 0, 1)", !0, 1, 1, 0), w("rgba(255, 152, 0, 1)",
|
|
!0, 1, 1, 1), w("rgba(255, 152, 0, 1)", !0, 1, 1.5, 0), w(
|
|
"rgba(129, 199, 132, 1)", !0, 1, 2, 0), w(
|
|
"rgba(129, 199, 132, 1)", !0, 1, 2, 1), w(
|
|
"rgba(76, 175, 80, 1)", !0, 1, 3, 0), w(
|
|
"rgba(76, 175, 80, 1)", !0, 1, 3, 1), w(
|
|
"rgba(0, 150, 136, 1)", !0, 1, 4, 0), w(
|
|
"rgba(0, 150, 136, 1)", !0, 1, 4, 1), w(y, !0, 1, 5, 0), w(
|
|
y, !0, 1, 5, 1)]
|
|
},
|
|
linetoolgannsquare: {
|
|
color: "rgba( 21, 56, 153, 0.8)",
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
font: S,
|
|
showTopLabels: !0,
|
|
showBottomLabels: !0,
|
|
showLeftLabels: !0,
|
|
showRightLabels: !0,
|
|
fillHorzBackground: !0,
|
|
horzTransparency: 80,
|
|
fillVertBackground: !0,
|
|
vertTransparency: 80,
|
|
reverse: !1,
|
|
fans: t("rgba(149, 152, 161, 1)", !1),
|
|
hlevel1: i(0, "rgba(120, 123, 134, 1)", !0),
|
|
hlevel2: i(.25, "rgba(245, 124, 0, 1)", !0),
|
|
hlevel3: i(.382, "rgba(129, 199, 132, 1)", !0),
|
|
hlevel4: i(.5, "rgba(76, 175, 80, 1)", !0),
|
|
hlevel5: i(.618, "rgba(0, 150, 136, 1)", !0),
|
|
hlevel6: i(.75, y, !0),
|
|
hlevel7: i(1, "rgba(120, 123, 134, 1)", !0),
|
|
vlevel1: i(0, "rgba(120, 123, 134, 1)", !0),
|
|
vlevel2: i(.25, "rgba(245, 124, 0, 1)", !0),
|
|
vlevel3: i(.382, "rgba(129, 199, 132, 1)", !0),
|
|
vlevel4: i(.5, "rgba(76, 175, 80, 1)", !0),
|
|
vlevel5: i(.618, "rgba(0, 150, 136, 1)", !0),
|
|
vlevel6: i(.75, y, !0),
|
|
vlevel7: i(1, "rgba(120, 123, 134, 1)", !0)
|
|
},
|
|
linetoolfibspeedresistancefan: {
|
|
fillBackground: !0,
|
|
transparency: 80,
|
|
grid: {
|
|
color: "rgba( 21, 56, 153, 0.8)",
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
visible: !0
|
|
},
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
font: S,
|
|
showTopLabels: !0,
|
|
showBottomLabels: !0,
|
|
showLeftLabels: !0,
|
|
showRightLabels: !0,
|
|
reverse: !1,
|
|
hlevel1: i(0, "rgba(120, 123, 134, 1)", !0),
|
|
hlevel2: i(.25, "rgba(245, 124, 0, 1)", !0),
|
|
hlevel3: i(.382, "rgba(129, 199, 132, 1)", !0),
|
|
hlevel4: i(.5, "rgba(76, 175, 80, 1)", !0),
|
|
hlevel5: i(.618, "rgba(0, 150, 136, 1)", !0),
|
|
hlevel6: i(.75, y, !0),
|
|
hlevel7: i(1, "rgba(120, 123, 134, 1)", !0),
|
|
vlevel1: i(0, "rgba(120, 123, 134, 1)", !0),
|
|
vlevel2: i(.25, "rgba(245, 124, 0, 1)", !0),
|
|
vlevel3: i(.382, "rgba(129, 199, 132, 1)", !0),
|
|
vlevel4: i(.5, "rgba(76, 175, 80, 1)", !0),
|
|
vlevel5: i(.618, "rgba(0, 150, 136, 1)", !0),
|
|
vlevel6: i(.75, y, !0),
|
|
vlevel7: i(1, "rgba(120, 123, 134, 1)", !0)
|
|
},
|
|
linetoolfibretracement: {
|
|
showCoeffs: !0,
|
|
showPrices: !0,
|
|
font: S,
|
|
fillBackground: !0,
|
|
transparency: 80,
|
|
extendLines: !1,
|
|
extendLinesLeft: !1,
|
|
horzLabelsAlign: "left",
|
|
vertLabelsAlign: "bottom",
|
|
reverse: !1,
|
|
coeffsAsPercents: !1,
|
|
fibLevelsBasedOnLogScale: !1,
|
|
trendline: {
|
|
visible: !0,
|
|
color: "rgba(120, 123, 134, 1)",
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_DASHED
|
|
},
|
|
levelsStyle: {
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID
|
|
},
|
|
level1: i(0, "rgba(120, 123, 134, 1)", !0),
|
|
level2: i(.236, "rgba(244, 67, 54, 1)", !0),
|
|
level3: i(.382, "rgba(129, 199, 132, 1)", !0),
|
|
level4: i(.5, "rgba(76, 175, 80, 1)", !0),
|
|
level5: i(.618, "rgba(0, 150, 136, 1)", !0),
|
|
level6: i(.786, "rgba(100, 181, 246, 1)", !0),
|
|
level7: i(1, "rgba(120, 123, 134, 1)", !0),
|
|
level8: i(1.618, y, !0),
|
|
level9: i(2.618, "rgba(244, 67, 54, 1)", !0),
|
|
level10: i(3.618, "rgba(156, 39, 176, 1)", !0),
|
|
level11: i(4.236, "rgba(233, 30, 99, 1)", !0),
|
|
level12: i(1.272, "rgba(129, 199, 132, 1)", !1),
|
|
level13: i(1.414, "rgba(244, 67, 54, 1)", !1),
|
|
level16: i(2, "rgba(0, 150, 136, 1)", !1),
|
|
level14: i(2.272, "rgba(129, 199, 132, 1)", !1),
|
|
level15: i(2.414, "rgba(76, 175, 80, 1)", !1),
|
|
level17: i(3, "rgba(100, 181, 246, 1)", !1),
|
|
level18: i(3.272, "rgba(120, 123, 134, 1)", !1),
|
|
level19: i(3.414, y, !1),
|
|
level20: i(4, "rgba( 204, 40, 40, 1)", !1),
|
|
level21: i(4.272, "rgba(156, 39, 176, 1)", !1),
|
|
level22: i(4.414, "rgba(233, 30, 99, 1)", !1),
|
|
level23: i(4.618, "rgba(129, 199, 132, 1)", !1),
|
|
level24: i(4.764, "rgba(0, 150, 136, 1)", !1)
|
|
},
|
|
linetoolfibchannel: {
|
|
showCoeffs: !0,
|
|
showPrices: !0,
|
|
font: S,
|
|
fillBackground: !0,
|
|
transparency: 80,
|
|
extendLeft: !1,
|
|
extendRight: !1,
|
|
horzLabelsAlign: "left",
|
|
vertLabelsAlign: "middle",
|
|
coeffsAsPercents: !1,
|
|
levelsStyle: {
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID
|
|
},
|
|
level1: i(0, "rgba(120, 123, 134, 1)", !0),
|
|
level2: i(.236, "rgba(244, 67, 54, 1)", !0),
|
|
level3: i(.382, "rgba(129, 199, 132, 1)", !0),
|
|
level4: i(.5, "rgba(76, 175, 80, 1)", !0),
|
|
level5: i(.618, "rgba(0, 150, 136, 1)", !0),
|
|
level6: i(.786, "rgba(100, 181, 246, 1)", !0),
|
|
level7: i(1, "rgba(120, 123, 134, 1)", !0),
|
|
level8: i(1.618, y, !0),
|
|
level9: i(2.618, "rgba(244, 67, 54, 1)", !0),
|
|
level10: i(3.618, "rgba(156, 39, 176, 1)", !0),
|
|
level11: i(4.236, "rgba(233, 30, 99, 1)", !0),
|
|
level12: i(1.272, "rgba(129, 199, 132, 1)", !1),
|
|
level13: i(1.414, "rgba(244, 67, 54, 1)", !1),
|
|
level16: i(2, "rgba(0, 150, 136, 1)", !1),
|
|
level14: i(2.272, "rgba(129, 199, 132, 1)", !1),
|
|
level15: i(2.414, "rgba(76, 175, 80, 1)", !1),
|
|
level17: i(3, "rgba(100, 181, 246, 1)", !1),
|
|
level18: i(3.272, "rgba(120, 123, 134, 1)", !1),
|
|
level19: i(3.414, y, !1),
|
|
level20: i(4, "rgba( 204, 40, 40, 1)", !1),
|
|
level21: i(4.272, "rgba(156, 39, 176, 1)", !1),
|
|
level22: i(4.414, "rgba(233, 30, 99, 1)", !1),
|
|
level23: i(4.618, "rgba(129, 199, 132, 1)", !1),
|
|
level24: i(4.764, "rgba(0, 150, 136, 1)", !1)
|
|
},
|
|
linetoolprojection: {
|
|
showCoeffs: !0,
|
|
font: "Verdana",
|
|
fillBackground: !0,
|
|
transparency: 80,
|
|
color1: n(y, 80),
|
|
color2: "rgba(156, 39, 176, 0.2)",
|
|
linewidth: 1,
|
|
trendline: {
|
|
visible: !0,
|
|
color: "rgba(149, 152, 161, 1)",
|
|
linestyle: CanvasEx.LINESTYLE_SOLID
|
|
},
|
|
level1: r(1, "rgba( 128, 128, 128, 1)", !0)
|
|
},
|
|
linetool5pointspattern: {
|
|
color: y,
|
|
textcolor: "rgba( 255, 255, 255, 1)",
|
|
fillBackground: !0,
|
|
backgroundColor: y,
|
|
font: "Verdana",
|
|
fontsize: 12,
|
|
bold: !1,
|
|
italic: !1,
|
|
transparency: 85,
|
|
linewidth: 1
|
|
},
|
|
linetoolcypherpattern: {
|
|
color: y,
|
|
textcolor: "#FFFFFF",
|
|
fillBackground: !0,
|
|
backgroundColor: y,
|
|
font: "Verdana",
|
|
fontsize: 12,
|
|
bold: !1,
|
|
italic: !1,
|
|
transparency: 85,
|
|
linewidth: 1
|
|
},
|
|
linetooltrianglepattern: {
|
|
color: "#673AB7",
|
|
textcolor: "#FFFFFF",
|
|
fillBackground: !0,
|
|
backgroundColor: "#673AB7",
|
|
font: "Verdana",
|
|
fontsize: 12,
|
|
bold: !1,
|
|
italic: !1,
|
|
transparency: 85,
|
|
linewidth: 1
|
|
},
|
|
linetoolabcd: {
|
|
color: "#009688",
|
|
textcolor: "rgba( 255, 255, 255, 1)",
|
|
font: "Verdana",
|
|
fontsize: 12,
|
|
bold: !1,
|
|
italic: !1,
|
|
linewidth: 1
|
|
},
|
|
linetoolthreedrivers: {
|
|
color: "#673AB7",
|
|
textcolor: "rgba( 255, 255, 255, 1)",
|
|
fillBackground: !0,
|
|
backgroundColor: "rgba( 149, 40, 204, 0.5)",
|
|
font: "Verdana",
|
|
fontsize: 12,
|
|
bold: !1,
|
|
italic: !1,
|
|
transparency: 50,
|
|
linewidth: 1
|
|
},
|
|
linetoolheadandshoulders: {
|
|
color: "#009688",
|
|
textcolor: "rgba( 255, 255, 255, 1)",
|
|
fillBackground: !0,
|
|
backgroundColor: "#009688",
|
|
font: "Verdana",
|
|
fontsize: 12,
|
|
bold: !1,
|
|
italic: !1,
|
|
transparency: 85,
|
|
linewidth: 1
|
|
},
|
|
linetoolfibwedge: {
|
|
showCoeffs: !0,
|
|
font: S,
|
|
fillBackground: !0,
|
|
transparency: 80,
|
|
trendline: {
|
|
visible: !0,
|
|
color: "rgba( 128, 128, 128, 1)",
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID
|
|
},
|
|
level1: r(.236, "rgba(244, 67, 54, 1)", !0),
|
|
level2: r(.382, "rgba(129, 199, 132, 1)", !0),
|
|
level3: r(.5, "rgba(76, 175, 80, 1)", !0),
|
|
level4: r(.618, "rgba(0, 150, 136, 1)", !0),
|
|
level5: r(.786, "rgba(100, 181, 246, 1)", !0),
|
|
level6: r(1, "rgba(120, 123, 134, 1)", !0),
|
|
level7: r(1.618, y, !1),
|
|
level8: r(2.618, "rgba(244, 67, 54, 1)", !1),
|
|
level9: r(3.618, "rgba(103, 58, 183, 1)", !1),
|
|
level10: r(4.236, "rgba(233, 30, 99, 1)", !1),
|
|
level11: r(4.618, "rgba(233, 30, 99, 1)", !1)
|
|
},
|
|
linetoolfibcircles: {
|
|
showCoeffs: !0,
|
|
font: S,
|
|
fillBackground: !0,
|
|
transparency: 80,
|
|
coeffsAsPercents: !1,
|
|
trendline: {
|
|
visible: !0,
|
|
color: "rgba(120, 123, 134, 1)",
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_DASHED
|
|
},
|
|
level1: r(.236, "rgba(244, 67, 54, 1)", !0),
|
|
level2: r(.382, "rgba(129, 199, 132, 1)", !0),
|
|
level3: r(.5, "rgba(76, 175, 80, 1)", !0),
|
|
level4: r(.618, "rgba(0, 150, 136, 1)", !0),
|
|
level5: r(.786, "rgba(100, 181, 246, 1)", !0),
|
|
level6: r(1, "rgba(120, 123, 134, 1)", !0),
|
|
level7: r(1.618, y, !0),
|
|
level8: r(2.618, "rgba(244, 67, 54, 1)", !0),
|
|
level9: r(3.618, "rgba(103, 58, 183, 1)", !0),
|
|
level10: r(4.236, "rgba(233, 30, 99, 1)", !0),
|
|
level11: r(4.618, "rgba(233, 30, 99, 1)", !0)
|
|
},
|
|
linetoolfibspeedresistancearcs: {
|
|
showCoeffs: !0,
|
|
font: S,
|
|
fillBackground: !0,
|
|
transparency: 80,
|
|
fullCircles: !1,
|
|
trendline: {
|
|
visible: !0,
|
|
color: "rgba(120, 123, 134, 1)",
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_DASHED
|
|
},
|
|
level1: r(.236, "rgba(244, 67, 54, 1)", !0),
|
|
level2: r(.382, "rgba(129, 199, 132, 1)", !0),
|
|
level3: r(.5, "rgba(76, 175, 80, 1)", !0),
|
|
level4: r(.618, "rgba(0, 150, 136, 1)", !0),
|
|
level5: r(.786, "rgba(100, 181, 246, 1)", !0),
|
|
level6: r(1, "rgba(120, 123, 134, 1)", !0),
|
|
level7: r(1.618, y, !0),
|
|
level8: r(2.618, "rgba(244, 67, 54, 1)", !0),
|
|
level9: r(3.618, "rgba(103, 58, 183, 1)", !0),
|
|
level10: r(4.236, "rgba(233, 30, 99, 1)", !0),
|
|
level11: r(4.618, "rgba(233, 30, 99, 1)", !0)
|
|
},
|
|
linetooltrendbasedfibextension: {
|
|
showCoeffs: !0,
|
|
showPrices: !0,
|
|
font: S,
|
|
fillBackground: !0,
|
|
transparency: 80,
|
|
extendLines: !1,
|
|
extendLinesLeft: !1,
|
|
horzLabelsAlign: "left",
|
|
vertLabelsAlign: "bottom",
|
|
reverse: !1,
|
|
coeffsAsPercents: !1,
|
|
fibLevelsBasedOnLogScale: !1,
|
|
trendline: {
|
|
visible: !0,
|
|
color: "rgba(120, 123, 134, 1)",
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_DASHED
|
|
},
|
|
levelsStyle: {
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID
|
|
},
|
|
level1: i(0, "rgba(120, 123, 134, 1)", !0),
|
|
level2: i(.236, "rgba(244, 67, 54, 1)", !0),
|
|
level3: i(.382, "rgba(129, 199, 132, 1)", !0),
|
|
level4: i(.5, "rgba(76, 175, 80, 1)", !0),
|
|
level5: i(.618, "rgba(0, 150, 136, 1)", !0),
|
|
level6: i(.786, "rgba(100, 181, 246, 1)", !0),
|
|
level7: i(1, "rgba(120, 123, 134, 1)", !0),
|
|
level8: i(1.618, y, !0),
|
|
level9: i(2.618, "rgba(244, 67, 54, 1)", !0),
|
|
level10: i(3.618, "rgba(156, 39, 176, 1)", !0),
|
|
level11: i(4.236, "rgba(233, 30, 99, 1)", !0),
|
|
level12: i(1.272, "rgba(129, 199, 132, 1)", !1),
|
|
level13: i(1.414, "rgba(244, 67, 54, 1)", !1),
|
|
level16: i(2, "rgba(0, 150, 136, 1)", !1),
|
|
level14: i(2.272, "rgba(129, 199, 132, 1)", !1),
|
|
level15: i(2.414, "rgba(76, 175, 80, 1)", !1),
|
|
level17: i(3, "rgba(100, 181, 246, 1)", !1),
|
|
level18: i(3.272, "rgba(120, 123, 134, 1)", !1),
|
|
level19: i(3.414, y, !1),
|
|
level20: i(4, "rgba( 204, 40, 40, 1)", !1),
|
|
level21: i(4.272, "rgba(156, 39, 176, 1)", !1),
|
|
level22: i(4.414, "rgba(233, 30, 99, 1)", !1),
|
|
level23: i(4.618, "rgba(129, 199, 132, 1)", !1),
|
|
level24: i(4.764, "rgba(0, 150, 136, 1)", !1)
|
|
},
|
|
linetooltrendbasedfibtime: {
|
|
showCoeffs: !0,
|
|
font: "Verdana",
|
|
fillBackground: !0,
|
|
transparency: 80,
|
|
horzLabelsAlign: "right",
|
|
vertLabelsAlign: "bottom",
|
|
trendline: {
|
|
visible: !0,
|
|
color: "rgba(120, 123, 134, 1)",
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_DASHED
|
|
},
|
|
level1: r(0, "rgba(120, 123, 134, 1)", !0),
|
|
level2: r(.382, "rgba(244, 67, 54, 1)", !0),
|
|
level3: r(.5, "rgba(129, 199, 132, 1)", !1),
|
|
level4: r(.618, "rgba(76, 175, 80, 1)", !0),
|
|
level5: r(1, "rgba(0, 150, 136, 1)", !0),
|
|
level6: r(1.382, "rgba(100, 181, 246, 1)", !0),
|
|
level7: r(1.618, "rgba(120, 123, 134, 1)", !0),
|
|
level8: r(2, y, !0),
|
|
level9: r(2.382, "rgba(244, 67, 54, 1)", !0),
|
|
level10: r(2.618, "rgba(156, 39, 176, 1)", !0),
|
|
level11: r(3, "rgba(233, 30, 99, 1)", !0)
|
|
},
|
|
linetoolschiffpitchfork: {
|
|
fillBackground: !0,
|
|
transparency: 80,
|
|
style: l.Schiff,
|
|
median: {
|
|
visible: !0,
|
|
color: "rgba(244, 67, 54, 1)",
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID
|
|
},
|
|
extendLines: !1,
|
|
level0: r(.25, "rgba(255, 183, 77, 1)", !1),
|
|
level1: r(.382, "rgba(129, 199, 132, 1)", !1),
|
|
level2: r(.5, "rgba(76, 175, 80, 1)", !0),
|
|
level3: r(.618, "rgba(0, 150, 136, 1)", !1),
|
|
level4: r(.75, "rgba(100, 181, 246, 1)", !1),
|
|
level5: r(1, y, !0),
|
|
level6: r(1.5, "rgba(156, 39, 176, 1)", !1),
|
|
level7: r(1.75, "rgba(233, 30, 99, 1)", !1),
|
|
level8: r(2, "rgba(229, 115, 115, 1)", !1)
|
|
},
|
|
linetoolschiffpitchfork2: {
|
|
fillBackground: !0,
|
|
transparency: 80,
|
|
style: l.Schiff2,
|
|
median: {
|
|
visible: !0,
|
|
color: "rgba(244, 67, 54, 1)",
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID
|
|
},
|
|
extendLines: !1,
|
|
level0: r(.25, "rgba(255, 183, 77, 1)", !1),
|
|
level1: r(.382, "rgba(129, 199, 132, 1)", !1),
|
|
level2: r(.5, "rgba(76, 175, 80, 1)", !0),
|
|
level3: r(.618, "rgba(0, 150, 136, 1)", !1),
|
|
level4: r(.75, "rgba(100, 181, 246, 1)", !1),
|
|
level5: r(1, y, !0),
|
|
level6: r(1.5, "rgba(156, 39, 176, 1)", !1),
|
|
level7: r(1.75, "rgba(233, 30, 99, 1)", !1),
|
|
level8: r(2, "rgba(229, 115, 115, 1)", !1)
|
|
},
|
|
linetoolinsidepitchfork: {
|
|
fillBackground: !0,
|
|
transparency: 80,
|
|
style: l.Inside,
|
|
median: {
|
|
visible: !0,
|
|
color: "rgba(244, 67, 54, 1)",
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID
|
|
},
|
|
extendLines: !1,
|
|
level0: r(.25, "rgba(255, 183, 77, 1)", !1),
|
|
level1: r(.382, "rgba(129, 199, 132, 1)", !1),
|
|
level2: r(.5, "rgba(76, 175, 80, 1)", !0),
|
|
level3: r(.618, "rgba(0, 150, 136, 1)", !1),
|
|
level4: r(.75, "rgba(100, 181, 246, 1)", !1),
|
|
level5: r(1, y, !0),
|
|
level6: r(1.5, "rgba(156, 39, 176, 1)", !1),
|
|
level7: r(1.75, "rgba(233, 30, 99, 1)", !1),
|
|
level8: r(2, "rgba(229, 115, 115, 1)", !1)
|
|
},
|
|
linetoolregressiontrend: {
|
|
linewidth: 1,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
styles: {
|
|
upLine: {
|
|
visible: !0,
|
|
color: n(y, 70),
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
linewidth: 1
|
|
},
|
|
downLine: {
|
|
visible: !0,
|
|
color: n(y, 70),
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
linewidth: 1
|
|
},
|
|
baseLine: {
|
|
visible: !0,
|
|
color: "rgba(244, 67, 54, 0.3)",
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
linewidth: 1
|
|
},
|
|
extendLines: !1,
|
|
showPearsons: !0,
|
|
transparency: 70
|
|
}
|
|
}
|
|
}, C(TradingView.defaultProperties.chartproperties), x()
|
|
}
|
|
if (void 0 === TradingView.defaultProperties["study_MA@tv-basicstudies"] && (TradingView
|
|
.defaultProperties["study_MA@tv-basicstudies"] = {
|
|
description: "Moving Average",
|
|
shortDescription: "MA",
|
|
inputs: {
|
|
length: 9,
|
|
source: "close"
|
|
},
|
|
styles: {
|
|
MovAvg: {
|
|
visible: !0,
|
|
color: y,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
linewidth: 1,
|
|
plottype: h.Line,
|
|
histogramBase: 0,
|
|
title: "MA"
|
|
}
|
|
}
|
|
}), void 0 === TradingView.defaultProperties[
|
|
"study_PivotPointsHighLow@tv-basicstudies"] && (TradingView.defaultProperties[
|
|
"study_PivotPointsHighLow@tv-basicstudies"] = {
|
|
font: "Arial",
|
|
fontsize: 10,
|
|
borderColor: y,
|
|
backColor: "#E3EFFD",
|
|
textColor: "#131722"
|
|
}), void 0 === TradingView.defaultProperties[
|
|
"study_PivotPointsStandard@tv-basicstudies"]) {
|
|
TradingView.defaultProperties["study_PivotPointsStandard@tv-basicstudies"] = {
|
|
_hardCodedDefaultsVersion: 1,
|
|
font: "Arial",
|
|
fontsize: 11,
|
|
levelsStyle: {
|
|
showLabels: !0,
|
|
visibility: {
|
|
P: !0,
|
|
"S1/R1": !0,
|
|
"S2/R2": !0,
|
|
"S3/R3": !0,
|
|
"S4/R4": !0,
|
|
"S5/R5": !0
|
|
},
|
|
colors: {
|
|
P: "#FB8C00",
|
|
"S1/R1": "#FB8C00",
|
|
"S2/R2": "#FB8C00",
|
|
"S3/R3": "#FB8C00",
|
|
"S4/R4": "#FB8C00",
|
|
"S5/R5": "#FB8C00"
|
|
},
|
|
widths: {
|
|
P: 1,
|
|
"S1/R1": 1,
|
|
"S2/R2": 1,
|
|
"S3/R3": 1,
|
|
"S4/R4": 1,
|
|
"S5/R5": 1
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (void 0 === TradingView.defaultProperties["study_ZigZag@tv-basicstudies"] && (
|
|
TradingView.defaultProperties["study_ZigZag@tv-basicstudies"] = {
|
|
color: y,
|
|
linewidth: 2
|
|
}), void 0 === TradingView.defaultProperties[
|
|
"study_ElliottWave@tv-basicstudies"] && (TradingView.defaultProperties[
|
|
"study_ElliottWave@tv-basicstudies"] = {
|
|
inputs: {},
|
|
level0: t("rgba( 255, 0, 0, 1)", !1),
|
|
level1: t("rgba( 0, 128, 0, 1)", !1),
|
|
level2: t("rgba( 0, 0, 255, 1)", !1),
|
|
level3: t("rgba( 255, 0, 255, 1)", !1),
|
|
level4: t("rgba( 0, 128, 255, 1)", !0),
|
|
level5: t("rgba( 255, 0, 0, 1)", !0),
|
|
level6: t("rgba( 0, 128, 0, 1)", !0),
|
|
level7: t("rgba( 0, 0, 255, 1)", !0),
|
|
level8: t("rgba( 255, 0, 255, 1)", !0)
|
|
}), void 0 === TradingView.defaultProperties[
|
|
"study_LinearRegression@tv-basicstudies"] && (TradingView.defaultProperties[
|
|
"study_LinearRegression@tv-basicstudies"] = {
|
|
styles: {
|
|
upLine: {
|
|
visible: !0,
|
|
color: n(y, 70),
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
linewidth: 1
|
|
},
|
|
downLine: {
|
|
visible: !0,
|
|
color: n(y, 70),
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
linewidth: 1
|
|
},
|
|
baseLine: {
|
|
visible: !0,
|
|
color: "rgba(244, 67, 54, 0.3)",
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
linewidth: 1
|
|
},
|
|
extendLines: !0,
|
|
showPearsons: !0,
|
|
backgroundColor: "rgba( 153, 21, 21, 0.3)",
|
|
transparency: 70
|
|
}
|
|
}), void 0 === TradingView.defaultProperties["study_Compare@tv-basicstudies"] && (
|
|
TradingView.defaultProperties["study_Compare@tv-basicstudies"] = {
|
|
minTick: "default"
|
|
}), void 0 === TradingView.defaultProperties["study_Overlay@tv-basicstudies"]) {
|
|
TradingView.defaultProperties["study_Overlay@tv-basicstudies"] = {
|
|
style: a.STYLE_LINE,
|
|
allowExtendTimeScale: !1,
|
|
showPriceLine: !1,
|
|
minTick: "default",
|
|
candleStyle: {
|
|
upColor: "rgba( 107, 165, 131, 1)",
|
|
downColor: "rgba( 215, 84, 66, 1)",
|
|
drawWick: !0,
|
|
drawBorder: !0,
|
|
drawBody: !0,
|
|
borderColor: "rgba( 55, 134, 88, 1)",
|
|
borderUpColor: "rgba( 34, 84, 55, 1)",
|
|
borderDownColor: "rgba( 91, 26, 19, 1)",
|
|
wickColor: "rgba( 115, 115, 117, 1)",
|
|
wickUpColor: "rgba( 115, 115, 117, 1)",
|
|
wickDownColor: "rgba( 115, 115, 117, 1)",
|
|
barColorsOnPrevClose: !1
|
|
},
|
|
hollowCandleStyle: {
|
|
upColor: "rgba( 107, 165, 131, 1)",
|
|
downColor: "rgba( 215, 84, 66, 1)",
|
|
drawWick: !0,
|
|
drawBorder: !0,
|
|
drawBody: !0,
|
|
borderColor: "rgba( 55, 134, 88, 1)",
|
|
borderUpColor: "rgba( 34, 84, 55, 1)",
|
|
borderDownColor: "rgba( 91, 26, 19, 1)",
|
|
wickColor: "rgba( 115, 115, 117, 1)",
|
|
wickUpColor: "rgba( 115, 115, 117, 1)",
|
|
wickDownColor: "rgba( 115, 115, 117, 1)",
|
|
barColorsOnPrevClose: !1
|
|
},
|
|
barStyle: {
|
|
upColor: "rgba( 107, 165, 131, 1)",
|
|
downColor: "rgba( 215, 84, 66, 1)",
|
|
barColorsOnPrevClose: !1,
|
|
dontDrawOpen: !1,
|
|
thinBars: !0
|
|
},
|
|
lineStyle: {
|
|
color: "#FF6D00",
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
linewidth: 2,
|
|
priceSource: "close",
|
|
styleType: a.STYLE_LINE_TYPE_SIMPLE
|
|
},
|
|
areaStyle: {
|
|
color1: y,
|
|
color2: y,
|
|
linecolor: y,
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
linewidth: 2,
|
|
priceSource: "close",
|
|
transparency: 95
|
|
},
|
|
baselineStyle: {
|
|
baselineColor: "rgba( 117, 134, 150, 1)",
|
|
topFillColor1: "rgba( 83, 185, 135, 0.05)",
|
|
topFillColor2: "rgba( 83, 185, 135, 0.05)",
|
|
bottomFillColor1: "rgba( 235, 77, 92, 0.05)",
|
|
bottomFillColor2: "rgba( 235, 77, 92, 0.05)",
|
|
topLineColor: "rgba( 83, 185, 135, 1)",
|
|
bottomLineColor: "rgba( 235, 77, 92, 1)",
|
|
topLineWidth: 2,
|
|
bottomLineWidth: 2,
|
|
priceSource: "close",
|
|
transparency: 50,
|
|
baseLevelPercentage: 50
|
|
},
|
|
styles: {
|
|
open: {
|
|
visible: !0,
|
|
color: "rgba( 255, 0, 0, 1)",
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
linewidth: 1,
|
|
plottype: h.Line,
|
|
histogramBase: 0
|
|
},
|
|
high: {
|
|
visible: !0,
|
|
color: "rgba( 255, 0, 0, 1)",
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
linewidth: 1,
|
|
plottype: h.Line,
|
|
histogramBase: 0
|
|
},
|
|
low: {
|
|
visible: !0,
|
|
color: "rgba( 255, 0, 0, 1)",
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
linewidth: 1,
|
|
plottype: h.Line,
|
|
histogramBase: 0
|
|
},
|
|
close: {
|
|
visible: !0,
|
|
color: "rgba( 255, 0, 0, 1)",
|
|
linestyle: CanvasEx.LINESTYLE_SOLID,
|
|
linewidth: 1,
|
|
plottype: h.Line,
|
|
histogramBase: 0
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for (var I = e.split("."), M = TradingView.defaultProperties, O = 0; O < I.length; O++)
|
|
M && (M = M[I[O]]);
|
|
return null != M ? TradingView.clone(M) : {}
|
|
};
|
|
|
|
function P(e, t, i, s, r) {
|
|
if (s)
|
|
for (var n in s) {
|
|
var o = n.split("."),
|
|
a = c(o[0]),
|
|
l = void 0 !== r && r === o[0];
|
|
0 !== o.length && l && (a = c((o = o.slice(1))[0])), 0 !== o.length && e
|
|
.hasOwnProperty(a) ? h(e, o, s[n]) || u(n) : l && u(n)
|
|
}
|
|
|
|
function c(e) {
|
|
return t && t[e] ? t[e] : e
|
|
}
|
|
|
|
function h(e, t, i, s) {
|
|
var r = c(t[0]);
|
|
return !!e.hasOwnProperty(r) && (t.length > 1 ? h(e[r], t.slice(1), i) : (e[r] && e[r]
|
|
.setValue ? e[r].setValue(i) : e[r] = i, !0))
|
|
}
|
|
|
|
function u(e) {
|
|
i || v.logWarn("Path `" + e + "` does not exist.")
|
|
}
|
|
}
|
|
|
|
function C(e, t, i, s) {
|
|
window.__defaultsOverrides && P(e, t, i, window.__defaultsOverrides, s)
|
|
}
|
|
|
|
function x() {
|
|
var e = /^linetool.+/;
|
|
Object.keys(TradingView.defaultProperties).forEach((function(t) {
|
|
e.test(t) && C(TradingView.defaultProperties[t], null, !1, t)
|
|
}))
|
|
}
|
|
|
|
function T(e, t) {
|
|
return t ? function(e, t) {
|
|
var i = w(e);
|
|
if (!window._UNIT_TESTS) {
|
|
var s = TradingView.clone(TVSettings.getJSON(e, null));
|
|
if (function(e) {
|
|
var t = new Set(["linetoolregressiontrend"]);
|
|
return e.startsWith("study_") || t.has(e)
|
|
}(e) && s && function(e) {
|
|
if (!e) return !1;
|
|
e = e.toString();
|
|
var t = new RegExp("\\d+").exec(e);
|
|
return null !== t && t[0] === e
|
|
}(s.version)) {
|
|
var r = s.inputs,
|
|
n = t.updateStudyInputs(s.id, s.version, "last", r, null);
|
|
s.inputs = n;
|
|
var o = t.updateStudyState(s, s);
|
|
s = o
|
|
}
|
|
TradingView.merge(i, s)
|
|
}
|
|
return i
|
|
}(e, t) : function(e) {
|
|
var t = w(e);
|
|
if (!window._UNIT_TESTS) {
|
|
var i = TradingView.clone(TVSettings.getJSON(e, null));
|
|
i && TradingView.merge(t, i)
|
|
}
|
|
return t
|
|
}(e)
|
|
}
|
|
T.create = function(e, t) {
|
|
if (t) {
|
|
var i = w(e);
|
|
TradingView.defaultProperties[e] = Object.assign(t, i)
|
|
}
|
|
}, T.remove = function(e) {
|
|
TradingView.defaultProperties[e] = void 0
|
|
}, TradingView.saveDefaults = function(e, t) {
|
|
TVSettings.setJSON(e, t)
|
|
}, TradingView.factoryDefaults = w, window.applyDefaultOverridesToLinetools = x, window
|
|
.applyDefaultsOverrides = C, window.applyPropertiesOverrides = P, window.defaults = T, t
|
|
.applyDefaultOverridesToLinetools = x, t.applyDefaultsOverrides = C, t
|
|
.applyPropertiesOverrides = P, t.defaults = T, t.factoryDefaults = w, t.saveDefaults =
|
|
TradingView.saveDefaults
|
|
},
|
|
wamh: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "ChangeToolBarsThemeUndoCommand", (function() {
|
|
return o
|
|
}));
|
|
var s = i("EsvI"),
|
|
r = i("oiZD"),
|
|
n = i("RDU5");
|
|
class o extends n.UndoCommand {
|
|
constructor(e, t, i = !0) {
|
|
super("Apply Toolbars Theme"), this._prevThemeName = e, this._themeName = t,
|
|
this._syncState = i
|
|
}
|
|
undo() {
|
|
Object(s.isStdThemeName)(this._prevThemeName) && (Object(r.setTheme)(this
|
|
._prevThemeName), this._syncState && Object(s.syncTheme)())
|
|
}
|
|
redo() {
|
|
Object(s.isStdThemeName)(this._themeName.toLowerCase()) && (Object(r.setTheme)(
|
|
this._themeName.toLowerCase()), this._syncState && Object(s
|
|
.syncTheme)())
|
|
}
|
|
}
|
|
},
|
|
wi9r: function(e, t, i) {
|
|
"use strict";
|
|
(function(e) {
|
|
var t = i("e3/o").randomHash;
|
|
|
|
function s(e) {
|
|
this._chartApi = e, this._sessionid = "qs_" + t(), this._sessionstarted = !1
|
|
}
|
|
s.prototype.destroy = function() {
|
|
this._sessionstarted && (this._chartApi.quoteDeleteSession(this._sessionid),
|
|
this._sessionid = null, this._sessionstarted = !1)
|
|
}, s.prototype.connected = function() {
|
|
return this._chartApi.connected()
|
|
}, s.prototype.connect = function(e) {
|
|
this._globalHandler = e, this._chartApi.createSession(this._sessionid, this),
|
|
this._chartApi.connect()
|
|
}, s.prototype.disconnect = function() {
|
|
this._chartApi.disconnect()
|
|
}, s.prototype.quoteAddSymbols = function(e, t) {
|
|
e = [].concat(e), t && t.forcePermission && (e = e.concat({
|
|
flags: ["force_permission"]
|
|
})), this._chartApi.quoteAddSymbols(this._sessionid, e)
|
|
}, s.prototype.quoteRemoveSymbols = function(e) {
|
|
this._chartApi.quoteRemoveSymbols(this._sessionid, e)
|
|
}, s.prototype.quoteFastSymbols = function(e) {
|
|
this._chartApi.quoteFastSymbols(this._sessionid, e)
|
|
}, s.prototype.quoteSetFields = function(e) {
|
|
this._chartApi.quoteSetFields(this._sessionid, e)
|
|
}, s.prototype.onMessage = function(e) {
|
|
switch (e.method) {
|
|
case "connected":
|
|
this._sessionstarted || (this._chartApi.quoteCreateSession(this
|
|
._sessionid), this._sessionstarted = !0);
|
|
break;
|
|
case "disconnected":
|
|
this._sessionstarted = !1
|
|
}
|
|
this._globalHandler(e)
|
|
}, s.prototype.quoteHibernateAll = function(e) {
|
|
this._chartApi.quoteHibernateAll(this._sessionid)
|
|
}, TradingView.QuoteSession = s, e && e.exports && (e.exports = s)
|
|
}).call(this, i("YuTi")(e))
|
|
},
|
|
wiuq: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineToolArrowMarker", (function() {
|
|
return a
|
|
}));
|
|
var s = i("Ss5c"),
|
|
r = i("Ocx9"),
|
|
n = i("tc+8"),
|
|
o = i.n(n);
|
|
class a extends s.LineDataSource {
|
|
constructor(e, t) {
|
|
super(e, t || a.createProperties()),
|
|
i.e("lt-pane-views").then(i.bind(null, "Qa6j")).then(({
|
|
ArrowMarkerPaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this.model())])
|
|
})
|
|
}
|
|
pointsCount() {
|
|
return 2
|
|
}
|
|
name() {
|
|
return "Trend Line"
|
|
}
|
|
static createProperties(e) {
|
|
const t = new r.DefaultProperty("linetoolarrowmarker", e);
|
|
return a._configureProperties(t), t
|
|
}
|
|
_getPropertyDefinitionsViewModelClass() {
|
|
return Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "FxV7")).then(
|
|
e => e.ArrowMarkerDefinitionsViewModel)
|
|
}
|
|
static _configureProperties(e) {
|
|
s.LineDataSource._configureProperties(e), e.hasChild("text") || e.addChild(
|
|
"text", new o.a("")), e.addExclusion("text")
|
|
}
|
|
}
|
|
},
|
|
wjVR: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("Eyy1"),
|
|
r = i("txPx");
|
|
|
|
function n(e, t) {
|
|
const i = Object.create(Object.getPrototypeOf(e));
|
|
for (const s of t) Object.prototype.hasOwnProperty.call(e, s) && (i[s] = e[s]);
|
|
return i
|
|
}
|
|
var o = i("qFKp"),
|
|
a = i("jofe"),
|
|
l = i("FQhm"),
|
|
c = i("sQaR");
|
|
let h;
|
|
class u extends c.a {
|
|
constructor() {
|
|
super(), this._dialog = null, this._subscribe = e => {
|
|
this._setVisibility(e)
|
|
}
|
|
}
|
|
show() {
|
|
this._load().then(e => e.show())
|
|
}
|
|
hide() {
|
|
var e;
|
|
null === (e = this._dialog) || void 0 === e || e.hide()
|
|
}
|
|
static getInstance() {
|
|
return h || (h = new u), h
|
|
}
|
|
_load() {
|
|
return Promise.all([i.e("redux"), i.e("react"), i.e(1), i.e(3), i.e(4), i.e(6),
|
|
i.e(8), i.e(9), i.e(11), i.e(12), i.e(13), i.e(14), i.e(16), i.e(
|
|
22), i.e(24), i.e(41), i.e(51), i.e(63), i.e(74), i.e(0), i.e(
|
|
2), i
|
|
.e(5), i.e(7), i.e(10), i.e(15), i.e(20), i.e(38), i.e(47), i.e(56),
|
|
i.e("object-tree-dialog")
|
|
]).then(i.bind(null, "xNz2")).then(e => {
|
|
var t, i;
|
|
return null === (t = this._dialog) || void 0 === t || t.hide(),
|
|
null === (i = this._dialog) || void 0 === i || i.visible()
|
|
.unsubscribe(this._subscribe), this._dialog = new e
|
|
.ObjectTreeDialogRenderer, this._dialog.visible().subscribe(this
|
|
._subscribe), this._dialog
|
|
})
|
|
}
|
|
}
|
|
var d = i("ogJP"),
|
|
p = i("dDSx");
|
|
var _ = i("CW80"),
|
|
m = i("3ClC"),
|
|
f = i("H0vP"),
|
|
g = i("mkn5"),
|
|
b = i("eJTA"),
|
|
v = i("Hr11"),
|
|
S = i("S8xo"),
|
|
y = i("ikwP");
|
|
i("bc0y");
|
|
class w {
|
|
constructor(e, t, i) {
|
|
this._handleEl = null, this._startY = 0, this._deltaY = 0, this._totalHeight = 0,
|
|
this._totalStretch = 0, this._prevStretchA = 0, this._minPaneHeight = 0, this
|
|
._maxPaneHeight = 0, this._pixelStretchFactor = 0, this._colorCache = {
|
|
lineColor: "",
|
|
backgroundColor: "",
|
|
color: ""
|
|
}, this._chart = e, this._paneA = e.paneWidgets()[t], this._paneB = e
|
|
.paneWidgets()[i], this._row = document.createElement("tr"), this._cell =
|
|
document.createElement("td"), this._row.appendChild(this._cell), this._cell
|
|
.classList.add("pane-separator"), this._cell.setAttribute("colspan", "3"), this
|
|
._cell.style.background = this._color(), this.adjustSize(), this._cell
|
|
.addEventListener("click", () => {});
|
|
const s = document.createElement("div");
|
|
s.classList.add("handle"), this._cell.appendChild(s), this._mouseEventHandler =
|
|
new S.MouseEventHandler(s, this, {
|
|
treatVertTouchDragAsPageScroll: !1,
|
|
treatHorzTouchDragAsPageScroll: !0
|
|
}), this._handleEl = s
|
|
}
|
|
destroy() {
|
|
this._mouseEventHandler.destroy(), this._row.parentElement && this._row
|
|
.parentElement.removeChild(this._row)
|
|
}
|
|
getElement() {
|
|
return this._row
|
|
}
|
|
hide() {
|
|
this._row.classList.add("js-hidden")
|
|
}
|
|
show() {
|
|
this._row.classList.remove("js-hidden")
|
|
}
|
|
adjustSize() {
|
|
this._row.style.height = w.height() + "px"
|
|
}
|
|
mouseDownEvent(e) {
|
|
this._mouseDownOrTouchStartEvent(e)
|
|
}
|
|
touchStartEvent(e) {
|
|
this._mouseDownOrTouchStartEvent(e)
|
|
}
|
|
pressedMouseMoveEvent(e) {
|
|
this._pressedMouseOrTouchMoveEvent(e)
|
|
}
|
|
touchMoveEvent(e) {
|
|
this._pressedMouseOrTouchMoveEvent(e)
|
|
}
|
|
mouseUpEvent(e) {
|
|
this._mouseUpOrTouchEndEvent(e)
|
|
}
|
|
touchEndEvent(e) {
|
|
this._mouseUpOrTouchEndEvent(e)
|
|
}
|
|
update() {
|
|
this._cell.style.background = this._color().toString()
|
|
}
|
|
paint() {}
|
|
image() {
|
|
const e = this._paneA.leftPriceAxisesContainer().getWidth(),
|
|
t = this._paneA.width(),
|
|
i = this._paneA.rightPriceAxisesContainer().getWidth(),
|
|
s = this._color(),
|
|
r = Object(y.createDisconnectedCanvas)(document, new y.Size(e, 1)),
|
|
n = Object(y.getPrescaledContext2D)(r);
|
|
n.fillStyle = s, n.fillRect(0, 0, e, 1);
|
|
const o = Object(y.createDisconnectedCanvas)(document, new y.Size(t, 1)),
|
|
a = Object(y.getPrescaledContext2D)(o);
|
|
a.fillStyle = s, a.fillRect(0, 0, t, 1);
|
|
const l = Object(y.createDisconnectedCanvas)(document, new y.Size(i, 1)),
|
|
c = Object(y.getPrescaledContext2D)(l);
|
|
return c.fillStyle = s, c.fillRect(0, 0, i, 1), {
|
|
type: "separator",
|
|
leftAxis: {
|
|
content: r.toDataURL(),
|
|
canvas: r,
|
|
contentWidth: e,
|
|
contentHeight: 1
|
|
},
|
|
rightAxis: {
|
|
content: l.toDataURL(),
|
|
canvas: l,
|
|
contentWidth: i,
|
|
contentHeight: 1
|
|
},
|
|
content: o.toDataURL(),
|
|
canvas: o,
|
|
contentWidth: t,
|
|
contentHeight: 1
|
|
}
|
|
}
|
|
static height() {
|
|
const e = window.devicePixelRatio || 1;
|
|
return e >= 1 ? 1 : 1 / e
|
|
}
|
|
_mouseDownOrTouchStartEvent(e) {
|
|
this._startY = e.pageY, this._deltaY = 0, this._totalHeight = this._paneA.height() +
|
|
this._paneB.height(), this._totalStretch = this._paneA.state().stretchFactor() +
|
|
this._paneB.state().stretchFactor(), this._prevStretchA = this._paneA.state()
|
|
.stretchFactor(), this._minPaneHeight = 30, this._maxPaneHeight = this
|
|
._totalHeight - this._minPaneHeight, this._pixelStretchFactor = this
|
|
._totalStretch / this._totalHeight, Object(s.ensureNotNull)(this._handleEl)
|
|
.classList.add("i-active")
|
|
}
|
|
_pressedMouseOrTouchMoveEvent(e) {
|
|
this._deltaY = e.pageY - this._startY;
|
|
const t = this._paneA.height(),
|
|
i = Object(v.clamp)(t + this._deltaY, this._minPaneHeight, this
|
|
._maxPaneHeight) * this._pixelStretchFactor,
|
|
s = this._totalStretch - i;
|
|
this._paneA.state().setStretchFactor(i), this._paneB.state().setStretchFactor(s),
|
|
this._chart.adjustSize(), this._paneA.height() !== t && (this._startY = e
|
|
.pageY), this._chart.model().model().fullUpdate()
|
|
}
|
|
_mouseUpOrTouchEndEvent(e) {
|
|
this._chart.model().addPaneStretchFactorUndoCommand(this._paneA.state(), this._paneB
|
|
.state(), this._prevStretchA, this._paneA.state().stretchFactor()), this
|
|
._startY = 0, this._deltaY = 0, this._totalHeight = 0, this._totalStretch = 0,
|
|
this._minPaneHeight = 0, this._maxPaneHeight = 0, this._pixelStretchFactor = 0,
|
|
Object(s.ensureNotNull)(this._handleEl).classList.remove("i-active")
|
|
}
|
|
_color() {
|
|
const e = this._chart.properties().childs().scalesProperties.childs().lineColor
|
|
.value(),
|
|
t = this._chart.model().model().backgroundColor().value();
|
|
if (this._colorCache.lineColor !== e || this._colorCache.backgroundColor !== t) {
|
|
const i = Object(b.parseRgba)(t),
|
|
s = Object(b.parseRgba)(e),
|
|
r = 0 === i[3] && 0 === s[3] ? "rgba(0,0,0,0)" : Object(b.rgbaToString)(
|
|
Object(b.blendRgba)(i, s));
|
|
this._colorCache = {
|
|
lineColor: e,
|
|
backgroundColor: t,
|
|
color: r
|
|
}
|
|
}
|
|
return this._colorCache.color
|
|
}
|
|
}
|
|
var P = i("mMWL"),
|
|
C = i("KnF9"),
|
|
x = i("VaSN"),
|
|
T = i("aIyQ"),
|
|
I = i.n(T),
|
|
M = i("hY0g"),
|
|
O = i.n(M),
|
|
L = i("Tmoa"),
|
|
A = i("EsvI");
|
|
const E = {
|
|
moving: "wait_finishing",
|
|
wait_finishing: "stop",
|
|
stop: "moving"
|
|
};
|
|
class k {
|
|
constructor(e) {
|
|
this._chartModel = null, this._currentDistance = 0, this._deferredFinishTimeout = 0,
|
|
this._finishingTimeout = 0, this._moveType = "", this._startTime = 0, this
|
|
._state = "stop", this._movingTimeout = 0, this._chart = e, this._chart
|
|
.withModel(this, () => {
|
|
this._chartModel = this._chart.model()
|
|
})
|
|
}
|
|
destroy() {
|
|
clearTimeout(this._movingTimeout)
|
|
}
|
|
move(e) {
|
|
if (null !== this._chartModel && "stop" === this._state && this._chartModel
|
|
.beginUndoMacro(1 === e ? "Move Left" : "Move Right"), this._state = E.stop,
|
|
this._moveType = "animated", this._deferredFinishTimeout && (clearTimeout(this
|
|
._deferredFinishTimeout), this._deferredFinishTimeout = 0), this
|
|
._finishingTimeout && (clearTimeout(this._finishingTimeout), this
|
|
._finishingTimeout = 0), this._startTime = Date.now(), 0 === this
|
|
._movingTimeout) {
|
|
const t = this._startTime,
|
|
i = 10,
|
|
s = () => {
|
|
this.moveStep(t, 0, 50 * e, 1e3), this._movingTimeout = setTimeout(s, i)
|
|
};
|
|
this._movingTimeout = setTimeout(s, i)
|
|
}
|
|
}
|
|
moveStep(e, t, i, s) {
|
|
if (null !== this._chartModel && !this._chartModel.timeScale().isEmpty()) {
|
|
const r = Date.now();
|
|
r < e && (e = r);
|
|
let n = (r - e) / s;
|
|
(n > 1 || !isFinite(n)) && (n = 1);
|
|
const o = 1 - Math.pow(1 - n, 3);
|
|
return this._currentDistance = (i - t) * o + t, this._chartModel.scrollChart(
|
|
this._currentDistance), n
|
|
}
|
|
}
|
|
moveByBar(e) {
|
|
if (null !== this._chartModel) {
|
|
const t = this._chartModel.timeScale();
|
|
if (t.isEmpty()) return;
|
|
if ("stop" === this._state && this._chartModel.beginUndoMacro(1 === e ?
|
|
"Move Left" : "Move Right"), null !== t.visibleBarsStrictRange()) {
|
|
const e = t.indexToCoordinate(t.visibleBarsStrictRange().lastBar()) + t
|
|
.barSpacing() / 2;
|
|
Math.abs(t.width() - e) > t.barSpacing() / 6 && this._chartModel
|
|
.scrollChart(t.width() - e)
|
|
}
|
|
if (this._state = E.stop, this._moveType = "by_bar", this._startTime = Date
|
|
.now(), !this._movingTimeout) {
|
|
let t = 0,
|
|
i = 150;
|
|
const s = 400,
|
|
r = () => {
|
|
this._moveByBarStep(e), t++, i > 100 && (i -= t / 5 * 20), this
|
|
._movingTimeout = setTimeout(r, i)
|
|
};
|
|
this._movingTimeout = setTimeout(r, s), this._moveByBarStep(e)
|
|
}
|
|
}
|
|
}
|
|
stopMove() {
|
|
"by_bar" === this._moveType ? this.stopMoveByBar() : this._stopMove()
|
|
}
|
|
stopMoveByBar() {
|
|
"moving" === this._state && (clearTimeout(this._movingTimeout), this
|
|
._movingTimeout = 0, this._state = E.wait_finishing, this._moveType = "",
|
|
this._movingTimeout = 0, this._currentDistance = 0, null !== this
|
|
._chartModel && this._chartModel.endUndoMacro())
|
|
}
|
|
_finishMove() {
|
|
clearTimeout(this._movingTimeout), this._movingTimeout = 0, this
|
|
._deferredFinishTimeout = 0;
|
|
const e = this._currentDistance,
|
|
t = Date.now(),
|
|
i = () => {
|
|
const s = this.moveStep(t, e, 0, 700);
|
|
s && s < 1 ? this._finishingTimeout = setTimeout(i, 10) : null !== this
|
|
._chartModel && (this._state = E.wait_finishing, this._moveType = "",
|
|
this._movingTimeout = 0, this._currentDistance = 0, this._chartModel
|
|
.endUndoMacro())
|
|
};
|
|
this._finishingTimeout = setTimeout(i, 10)
|
|
}
|
|
_stopMove() {
|
|
"moving" === this._state && (this._state = E.moving, Date.now() - this._startTime <
|
|
200 ? this._deferredFinishTimeout = setTimeout(this._finishMove.bind(this),
|
|
200 - (Date.now() - this._startTime)) : this._finishMove())
|
|
}
|
|
_moveByBarStep(e) {
|
|
if (null !== this._chartModel) {
|
|
if (this._chartModel.timeScale().isEmpty()) return;
|
|
this._chartModel.scrollChartByBar(e)
|
|
}
|
|
}
|
|
}
|
|
var D = i("m/3z"),
|
|
V = i("Kxc7"),
|
|
B = i("nqXy"),
|
|
R = i("n5al"),
|
|
N = i("pPtI");
|
|
class j {
|
|
constructor() {
|
|
this._draggingSource = null, this._activeTouchPanes = new Set, this._scrollingPane =
|
|
null, this._pinchingPane = null
|
|
}
|
|
onPaneDestroyed(e) {
|
|
this._activeTouchPanes.delete(e), this._scrollingPane === e && (this
|
|
._scrollingPane = null), this._pinchingPane === e && (this._pinchingPane =
|
|
null)
|
|
}
|
|
startTouch(e) {
|
|
this._activeTouchPanes.add(e)
|
|
}
|
|
endTouch(e) {
|
|
this._activeTouchPanes.delete(e)
|
|
}
|
|
hasTouchesOnOtherPanes(e) {
|
|
return this._activeTouchPanes.size > 1 || 1 === this._activeTouchPanes.size && !this
|
|
._activeTouchPanes.has(e)
|
|
}
|
|
trySetDraggingSource(e, t) {
|
|
return !this.hasTouchesOnOtherPanes(t) && (Object(s.assert)(null === this
|
|
._draggingSource || this._draggingSource === e), this._draggingSource =
|
|
e, !0)
|
|
}
|
|
clearDraggingSource() {
|
|
null !== this._draggingSource && (this._draggingSource = null)
|
|
}
|
|
draggingSource() {
|
|
return this._draggingSource
|
|
}
|
|
setScrollingPane(e) {
|
|
Object(s.assert)(null === e || null === this._scrollingPane), this._scrollingPane =
|
|
e
|
|
}
|
|
scrollingPane() {
|
|
return this._scrollingPane
|
|
}
|
|
setPinchingPane(e) {
|
|
Object(s.assert)(null === e || null === this._pinchingPane), this._pinchingPane = e
|
|
}
|
|
pinchingPane() {
|
|
return this._pinchingPane
|
|
}
|
|
}
|
|
var F = i("JWMC");
|
|
i.d(t, "ChartWidgetBase", (function() {
|
|
return G
|
|
}));
|
|
const W = Object(V.enabled)("chart_content_overrides_by_defaults"),
|
|
H = Object(r.getLogger)("ChartWidget", {
|
|
color: "#606"
|
|
}),
|
|
U = {
|
|
addToWatchlistEnabled: !0,
|
|
showFinancialsEnabled: !1,
|
|
sourceSelectionEnabled: !0,
|
|
propertyPagesEnabled: !0,
|
|
paneContextMenuEnabled: !0,
|
|
priceScaleContextMenuEnabled: !0,
|
|
currencyConversionEnabled: !1,
|
|
unitConversionEnabled: !1,
|
|
goToDateEnabled: !1,
|
|
marketStatusWidgetEnabled: !0,
|
|
chartWarningWidgetEnabled: !0,
|
|
dataProblemWidgetEnabled: !0,
|
|
paneControlsEnabled: !0,
|
|
isSymbolAvailable: e => Promise.resolve(!0),
|
|
legendWidgetEnabled: !0,
|
|
chartEventsEnabled: !0,
|
|
esdEnabled: !1,
|
|
croppedTickMarks: !0,
|
|
countdownEnabled: !0,
|
|
lastPriceAnimationEnabled: !0,
|
|
useKineticScroll: o.CheckMobile.any(),
|
|
indicatorsDialogShortcutEnabled: !0,
|
|
handleScale: {
|
|
mouseWheel: !0,
|
|
pinch: !0,
|
|
axisPressedMouseMove: {
|
|
time: !0,
|
|
price: !0
|
|
}
|
|
},
|
|
handleScroll: {
|
|
mouseWheel: !0,
|
|
pressedMouseMove: !0,
|
|
horzTouchDrag: !0,
|
|
vertTouchDrag: !0
|
|
}
|
|
};
|
|
|
|
function z(e, t, i, s = 0) {
|
|
const r = t.mainSeries().syncModel(),
|
|
n = e.mainSeries().syncModel();
|
|
let o = i;
|
|
if (null !== r && null !== n) {
|
|
const t = e.createSyncPoint(r, n);
|
|
0 !== s && (i = r.projectTime(i, s)), o = t.sourceTimeToTargetTime(i)
|
|
}
|
|
return e.timeScale().points().roughIndex(o, n && n.distance.bind(n))
|
|
}
|
|
class G {
|
|
constructor(e, t, i) {
|
|
this.activePaneWidget = null, this._model = null, this._paneWidgets = [], this
|
|
._maximizedPaneWidget = null, this._timeAxisWidget = null, this
|
|
._paneSeparators = [], this._controlBarNavigation = null, this
|
|
._lineToolsSynchronizer = null, this._modelCreated = new I.a, this
|
|
._isDestroyed = !1, this._customLegendWidgetsFactoryMap = new Map, this
|
|
._backgroundTopTheme = new O.a("light"), this._backgroundBasedTheme = new O.a(
|
|
"light"), this._backgroundBottomTheme = new O.a("light"), this
|
|
._lhsAxesWidth = 0, this._rhsAxesWidth = 0, this._lhsPriceAxisWidthChanged =
|
|
new I.a, this._rhsPriceAxisWidthChanged = new I.a, this._mainDiv = null, this
|
|
._parent = null, this._elTooltipDiv = null, this._hotkeysListener = null, this
|
|
._mouseWheelHelper = null,
|
|
this._onWheelBound = null, this._justActivated = !1, this._inited = !1, this
|
|
._containsData = !1, this._initialLoading = !1, this._defTimeframe = void 0,
|
|
this._removeMaximizeHotkey = null, this._metaInfoRepository = null, this
|
|
._invalidationMask = null, this._drawPlanned = !1, this._drawRafId = 0, this
|
|
._inLoadingState = !1, this._timingsMeter = null, this._tagsChanged = new I.a,
|
|
this._redraw = new I.a, this._isVisible = new O.a(!0), this._dataWindowWidget =
|
|
null, this._updateThemedColorBound = this._updateThemedColor.bind(this), this
|
|
._saveChartService = null, this._objectTreeDialogController = null, this
|
|
._chartPaintedPromise = null, this._noExchangeSubscrptionWarning = null, this
|
|
._paneWidgetsSharedState = new j, this._brokerName = "", this._onZoom = new I.a,
|
|
this._id = t, this._layoutId = i, this._options = Object(d.merge)(Object(d
|
|
.clone)(U), e), this._options.customLegendWidgetFactories && (this
|
|
._customLegendWidgetsFactoryMap = this._options.customLegendWidgetFactories
|
|
), this._subscribeToDrawingState(), this.withModel(this, () => {
|
|
const e = this.model().model();
|
|
e.backgroundTopColor().subscribe(this._updateThemedColorBound), e
|
|
.backgroundColor().subscribe(this._updateThemedColorBound)
|
|
}), this._scrollHelper = new k(this), this._objectTreeDialogController = u
|
|
.getInstance()
|
|
}
|
|
destroy() {
|
|
var e, t;
|
|
null === (e = this._lineToolsSynchronizer) || void 0 === e || e.destroy(), null ===
|
|
(t = this._noExchangeSubscrptionWarning) || void 0 === t || t.destroy(), window
|
|
.loginStateChange.unsubscribe(this, this._handleLoginStateChanged), null !==
|
|
this._model && (this._model.model().backgroundTopColor().unsubscribe(this
|
|
._updateThemedColorBound), this._model.model().backgroundColor()
|
|
.unsubscribe(this._updateThemedColorBound), this._model.destroy()), this
|
|
._customLegendWidgetsFactoryMap.clear(), this._scrollHelper.destroy(), this
|
|
._isDestroyed = !0
|
|
}
|
|
model() {
|
|
return Object(s.ensureNotNull)(this._model)
|
|
}
|
|
id() {
|
|
return this._id
|
|
}
|
|
layoutId() {
|
|
return this._layoutId
|
|
}
|
|
isVisible() {
|
|
return this._isVisible.value()
|
|
}
|
|
setVisible(e) {
|
|
this._isVisible.setValue(e)
|
|
}
|
|
getPriceAxisWidthChangedByName(e) {
|
|
return "left" === e ? this._lhsPriceAxisWidthChanged : this
|
|
._rhsPriceAxisWidthChanged
|
|
}
|
|
getPriceAxisMaxWidthByName(e) {
|
|
return "left" === e ? this._lhsAxesWidth : this._rhsAxesWidth
|
|
}
|
|
timeAxisHeight() {
|
|
return null !== this._timeAxisWidget ? this._timeAxisWidget.size.h : 0
|
|
}
|
|
withModel(e, t) {
|
|
null !== this._model ? t.call(e) : this.modelCreated().subscribe(e, t, !0)
|
|
}
|
|
hasModel() {
|
|
return null !== this._model
|
|
}
|
|
onZoom() {
|
|
return this._onZoom
|
|
}
|
|
images(e) {
|
|
window.TradingView.printing = !0;
|
|
const t = this.model().selection().allSources();
|
|
this.model().selectionMacro(e => e.clearSelection());
|
|
const i = (t, i) => {
|
|
t.paint(i, this.onWidget());
|
|
const s = {
|
|
showCollapsedStudies: Boolean(null == e ? void 0 : e
|
|
.showCollapsedStudies),
|
|
status: null == e ? void 0 : e.status
|
|
};
|
|
return t.getScreenshotData(s)
|
|
},
|
|
s = [];
|
|
if (null !== this._maximizedPaneWidget) {
|
|
const e = this._paneWidgets.indexOf(this._maximizedPaneWidget);
|
|
s.push(i(this._maximizedPaneWidget, f.InvalidationMask.light()
|
|
.invalidateForPane(e)))
|
|
} else
|
|
for (let e = 0; e < this._paneWidgets.length; ++e) {
|
|
const t = this._paneWidgets[e];
|
|
s.push(i(t, f.InvalidationMask.light().invalidateForPane(e))), e < this
|
|
._paneWidgets.length - 1 && s.push(this._paneSeparators[e].image())
|
|
}
|
|
let r;
|
|
this._timeAxisWidget && (this._timeAxisWidget.paint(f.InvalidationLevel.Light), r =
|
|
this._timeAxisWidget.getScreenshotData()), window.TradingView.printing = !1,
|
|
this.model().selectionMacro(e => {
|
|
t.forEach(t => {
|
|
e.addSourceToSelection(t)
|
|
})
|
|
}), this.model().model().lightUpdate();
|
|
const n = this.mainSeriesQuotesAndMetainfo();
|
|
return {
|
|
panes: s,
|
|
timeAxis: r,
|
|
colors: {
|
|
text: this.properties().childs().scalesProperties.childs().textColor
|
|
.value(),
|
|
bg: this.properties().childs().paneProperties.childs().background.value(),
|
|
scales: this.properties().childs().scalesProperties.childs().lineColor
|
|
.value()
|
|
},
|
|
meta: n.meta,
|
|
ohlc: n.ohlc,
|
|
quotes: n.quotes
|
|
}
|
|
}
|
|
setSaveChartService(e) {
|
|
this._saveChartService = e, null !== this._lineToolsSynchronizer && this
|
|
._lineToolsSynchronizer.setSaveChartService(e)
|
|
}
|
|
getSaveChartService() {
|
|
return this._saveChartService
|
|
}
|
|
mainSeriesQuotesAndMetainfo() {
|
|
let e, t, i;
|
|
const s = this._model && this._model.mainSeries();
|
|
if (s) {
|
|
const r = e => null == e ? "" : s.formatter().format(e, void 0, void 0, !0, !
|
|
1) + "",
|
|
n = e => null == e ? "" : e + "";
|
|
e = {
|
|
resolution: s.interval(),
|
|
symbol: s.symbol()
|
|
};
|
|
const o = s.symbolInfo();
|
|
o && (e.symbol = o.full_name, e.description = o.description, e.exchange = o
|
|
.exchange);
|
|
const a = s.bars().last();
|
|
null !== a && (t = a.value.slice(1, 5).map(r));
|
|
const l = s.quotes();
|
|
l && (i = {
|
|
change: r(l.change),
|
|
changePercent: n(l.change_percent),
|
|
last: r(l.last_price)
|
|
})
|
|
}
|
|
return {
|
|
meta: e,
|
|
ohlc: t,
|
|
quotes: i
|
|
}
|
|
}
|
|
updateCrossHairPositionIfNeeded() {
|
|
if (this._model) {
|
|
const e = P.tool.value();
|
|
if (this._model.model().setCurrentTool(e), Object(x.lastEventIsTouch)()) {
|
|
const e = this._maximizedPaneWidget || this._paneWidgets[0];
|
|
if (e.hasState() && (this._isLineToolModeExceptBrush() || this
|
|
.selectPointMode().value() || Object(P.toolIsMeasure)(P.tool
|
|
.value()))) {
|
|
const t = e.state(),
|
|
i = .5 * this._model.model().timeScale().width(),
|
|
s = .5 * t.defaultPriceScale().height();
|
|
this._model.model().setAndSaveCurrentPosition(i, s, t)
|
|
}
|
|
}
|
|
this._model && Object(x.lastEventIsTouch)() && this._model.model()
|
|
.crossHairSource().updateAllViews()
|
|
}
|
|
}
|
|
trackingModePaneWidget() {
|
|
if (!Object(x.lastEventIsTouch)()) return null;
|
|
for (const e of this.paneWidgets())
|
|
if (e.trackingModeEnabled()) return e;
|
|
return null
|
|
}
|
|
startTrackingMode() {
|
|
if (Object(x.lastEventIsTouch)()) {
|
|
this.exitTrackingMode(), this.updateCrossHairPositionIfNeeded();
|
|
const e = this._maximizedPaneWidget || this._paneWidgets[0],
|
|
t = this.model().model().crossHairSource().currentPoint();
|
|
e.startTrackingMode(t, t)
|
|
}
|
|
}
|
|
exitTrackingMode() {
|
|
Object(x.lastEventIsTouch)() && this.paneWidgets().some(e => e
|
|
.trackingModeEnabled()) && (this.paneWidgets().forEach(e => e
|
|
.exitTrackingMode()), this.model().model().clearCurrentPosition())
|
|
}
|
|
onToolChanged() {
|
|
this.selectPointMode().value() && this.cancelRequestSelectPoint(), this
|
|
.exitTrackingMode()
|
|
}
|
|
setInLoadingState(e) {
|
|
this._inLoadingState = e
|
|
}
|
|
paint(e) {
|
|
const t = null != e ? e : f.InvalidationMask.full();
|
|
t.validationActions().forEach(e => e()), this._paneWidgets.forEach((e, i) => {
|
|
null !== this._maximizedPaneWidget && this._maximizedPaneWidget !== e ||
|
|
e.paint(t.invalidateForPane(i), !1)
|
|
}), this._timeAxisWidget && this._timeAxisWidget.paint(t
|
|
.invalidateForTimeScale()), this._redraw.fire()
|
|
}
|
|
GUIResetScales() {
|
|
Object(F.trackEvent)("GUI", "Reset Scales"),
|
|
null !== this._model && this._model.resetScales()
|
|
}
|
|
maximizedPaneWidget() {
|
|
return this._maximizedPaneWidget
|
|
}
|
|
isMaximizedPane() {
|
|
return null !== this._maximizedPaneWidget
|
|
}
|
|
unsetActivePaneWidget() {
|
|
this.activePaneWidget = null
|
|
}
|
|
setActivePaneWidget(e) {
|
|
this.activePaneWidget = e
|
|
}
|
|
onPaneWidgetDestroyed(e) {
|
|
this.activePaneWidget === e && (this.activePaneWidget = null)
|
|
}
|
|
backgroundTopTheme() {
|
|
return this._backgroundTopTheme.readonly()
|
|
}
|
|
backgroundBasedTheme() {
|
|
return this._backgroundBasedTheme.readonly()
|
|
}
|
|
backgroundBottomTheme() {
|
|
return this._backgroundBottomTheme.readonly()
|
|
}
|
|
lineToolsAndGroupsDTO() {
|
|
return Object(s.ensureNotNull)(this._lineToolsSynchronizer).prepareDTO()
|
|
}
|
|
resetLineToolsInvalidated(e, t) {
|
|
Object(s.ensureNotNull)(this._lineToolsSynchronizer).resetInvalidated(e, t)
|
|
}
|
|
applyLineToolUpdateNotification(e) {
|
|
Object(s.ensureNotNull)(this._lineToolsSynchronizer)
|
|
.applyLineToolUpdateNotification(e)
|
|
}
|
|
applyAlertIdByExternalSource(e, t) {
|
|
var i;
|
|
null === (i = this._lineToolsSynchronizer) || void 0 === i || i
|
|
.applyAlertIdByExternalSource(e, t)
|
|
}
|
|
deleteAlertByExternalSource(e, t) {
|
|
var i;
|
|
null === (i = this._lineToolsSynchronizer) || void 0 === i || i
|
|
.deleteAlertByExternalSource(e)
|
|
}
|
|
shouldBeSavedEvenIfHidden() {
|
|
return this.model().model().shouldBeSavedEvenIfHidden()
|
|
}
|
|
showObjectsTreeDialog() {
|
|
var e;
|
|
null === (e = this._objectTreeDialogController) || void 0 === e || e.show()
|
|
}
|
|
addCustomWidgetToLegend(e, t) {
|
|
this._customLegendWidgetsFactoryMap.set(e, t);
|
|
for (const i of this.paneWidgets()) i.addCustomWidgetToLegend(e, t)
|
|
}
|
|
applyIndicatorsToAllChartsAvailable() {
|
|
if (!this.chartWidgetCollection().applyIndicatorsToAllChartsAvailable()) return !1;
|
|
for (const e of this.model().model().panes()) {
|
|
if (e.sourcesByGroup().all().some(e => Object(m.isStudy)(e) && !Object(m
|
|
.isESDStudy)(e))) return !0
|
|
}
|
|
return !1
|
|
}
|
|
restoreState(e, t, i) {
|
|
this.adjustSize();
|
|
Object(s.ensureNotNull)(this._model).restoreState(this._content, t, i);
|
|
this._setActions()
|
|
}
|
|
addCompareAsOverlay(e, t) {
|
|
const i = this.model();
|
|
return Object(s.ensureDefined)(this._options.isSymbolAvailable)(e).then(s => {
|
|
if (!s) return null;
|
|
const r = i.createStudyInserter({
|
|
type: "java",
|
|
studyId: "Overlay@tv-basicstudies"
|
|
});
|
|
return r.setForceOverlay(!0), r.setPreferredPriceScale("as-series"), r
|
|
.setTargetPriceScaleMode({
|
|
percentage: !0
|
|
}), void 0 !== t && r.setPropertiesState({
|
|
allowExtendTimeScale: t
|
|
}), r.insert(async () => ({
|
|
symbol: e
|
|
}))
|
|
})
|
|
}
|
|
scrollHelper() {
|
|
return this._scrollHelper
|
|
}
|
|
adjustSize(e) {
|
|
var t;
|
|
let i = 0;
|
|
const s = null === this._model ? null : this._model.model().priceScaleSlotsCount(),
|
|
r = new Uint32Array(null === s ? 0 : s.left),
|
|
n = new Uint32Array(null === s ? 0 : s.right),
|
|
o = Object(y.getCanvasDevicePixelRatio)(document.body),
|
|
a = (e, t) => e + t,
|
|
c = (e, t) => {
|
|
t.forEach((t, i) => {
|
|
e[i] = Math.max(e[i], t)
|
|
})
|
|
};
|
|
for (const e of this._paneWidgets)
|
|
if (!this._maximizedPaneWidget || this._maximizedPaneWidget === e) {
|
|
const t = e.leftPriceAxisesContainer().optimalWidths(),
|
|
s = e.rightPriceAxisesContainer().optimalWidths();
|
|
c(r, t), c(n, s), i += e.stretchFactor()
|
|
} let h = r.reduce(a, 0),
|
|
u = n.reduce(a, 0);
|
|
const d = this._width(),
|
|
p = this._height();
|
|
let _ = Math.max(d - h - u, 0);
|
|
if (_ <= 102) {
|
|
h = 0, u = 0, _ = d;
|
|
for (let e = 0; e < r.length; e++) r[e] = 0;
|
|
for (let e = 0; e < n.length; e++) n[e] = 0
|
|
}
|
|
for (const e of this._paneSeparators) e.adjustSize();
|
|
const m = this._paneSeparators.length,
|
|
f = w.height(),
|
|
g = this.isMaximizedPane() ? 0 : f * m,
|
|
b = null !== this._timeAxisWidget ? this._timeAxisWidget.optimalHeight() : 0;
|
|
let v = p - b >= 61 ? b : 0;
|
|
v % 2 && (v += 1);
|
|
const S = g + v,
|
|
P = p < S ? 0 : p - S,
|
|
C = P / i;
|
|
let x = 0,
|
|
T = !1;
|
|
const I = null === (t = this._model) || void 0 === t ? void 0 : t.model();
|
|
for (let e = 0; e < this._paneWidgets.length; ++e) {
|
|
const t = this._paneWidgets[e];
|
|
void 0 !== I && t.setState(I.panes()[e]);
|
|
let i = 0;
|
|
if (this.isMaximizedPane()) i = this._maximizedPaneWidget === t ? P : 0;
|
|
else {
|
|
let s = 0;
|
|
s = e === this._paneWidgets.length - 1 ? Math.ceil((P - x) * o) / o : Math
|
|
.round(t.stretchFactor() * C * o) / o, i = Math.max(s, 2), x += i
|
|
}
|
|
t.setPriceAxisSizes("left", i, r), t.setPriceAxisSizes("right", i, n), T = T ||
|
|
i !== t.height(), t.setSize(new y.Size(_, i)), I && t.state() && I
|
|
.setPaneHeight(t.state(), i)
|
|
}
|
|
null !== this._timeAxisWidget && this._timeAxisWidget.setSizes(new y.Size(_, v), r,
|
|
n), I && I.setWidth(_, e), this._controlBarNavigation && this
|
|
._controlBarNavigation.updatePosition(), this._lhsAxesWidth !== h && (this
|
|
._lhsAxesWidth = h, this._lhsPriceAxisWidthChanged.fire(h)), this
|
|
._rhsAxesWidth !== u && (this._rhsAxesWidth = u, this._rhsPriceAxisWidthChanged
|
|
.fire(u)), T && l.emit("panes_height_changed")
|
|
}
|
|
setBroker(e) {
|
|
var t;
|
|
this._brokerName = e, null === (t = this._lineToolsSynchronizer) || void 0 === t ||
|
|
t.setBroker(e)
|
|
}
|
|
chartPainted() {
|
|
return this._drawPlanned ? (null === this._chartPaintedPromise && (this
|
|
._chartPaintedPromise = Object(a.createDeferredPromise)()), this
|
|
._chartPaintedPromise.promise) : Promise.resolve()
|
|
}
|
|
setDataWindowWidget(e) {
|
|
this._dataWindowWidget = e
|
|
}
|
|
removeDataWindowWidget() {
|
|
this._dataWindowWidget = null
|
|
}
|
|
_createLineToolsSynchronizerIfNeeded() {
|
|
0
|
|
}
|
|
_updateThemedColor() {
|
|
const e = this.model().model(),
|
|
t = e.backgroundColorAtYPercentFromTop(.5);
|
|
let i = e.backgroundTopColor().value(),
|
|
s = e.backgroundColor().value();
|
|
const r = Object(L.isColorDark)(t),
|
|
n = Object(L.isColorDark)(i),
|
|
o = Object(L.isColorDark)(s);
|
|
this.widget().classList.toggle("chart-widget--themed-dark", r), this.widget()
|
|
.classList.toggle("chart-widget--themed-light", !r), this.widget().classList
|
|
.toggle("chart-widget__top--themed-dark", n), this.widget().classList.toggle(
|
|
"chart-widget__top--themed-light", !n), this.widget().classList.toggle(
|
|
"chart-widget__bottom--themed-dark", o), this.widget().classList.toggle(
|
|
"chart-widget__bottom--themed-light", !o), this._backgroundTopTheme
|
|
.setValue(n ? "dark" : "light"), this._backgroundBasedTheme.setValue(r ?
|
|
"dark" : "light"), this._backgroundBottomTheme.setValue(o ? "dark" :
|
|
"light"), i === s && Object(A.isStdThemedDefaultValue)(
|
|
"chartProperties.paneProperties.background", i, this._backgroundBasedTheme
|
|
.value()) && (i = null, s = null);
|
|
for (const e of this._paneWidgets) e.updateThemedColors(i, s)
|
|
}
|
|
_isLineToolModeExceptBrush() {
|
|
const e = P.tool.value();
|
|
return Object(_.isLineToolName)(e) && !Object(_.isLineDrawnWithPressedButton)(e) &&
|
|
!this.selectPointMode().value()
|
|
}
|
|
_cancelCreatingLine() {
|
|
const e = Object(s.ensureNotNull)(this._model).model(),
|
|
t = e.lineBeingCreated();
|
|
if (null !== t) {
|
|
const i = Object(s.ensureNotNull)(e.paneForSource(t));
|
|
Object(s.ensureNotNull)(this.paneByState(i)).cancelCreatingLineTool()
|
|
}
|
|
const i = e.crossHairSource().measurePane();
|
|
if (null !== i) {
|
|
Object(s.ensureNotNull)(this.paneByState(i)).cancelMeasuring()
|
|
}
|
|
}
|
|
_makePaneWidgetsAndSeparators() {
|
|
const e = this.model().model().panes(),
|
|
t = e.length,
|
|
i = this._paneWidgets.length;
|
|
for (let e = t; e < i; e++) {
|
|
Object(s.ensureDefined)(this._paneWidgets.pop()).destroy();
|
|
const e = this._paneSeparators.pop();
|
|
e && e.destroy()
|
|
}
|
|
const r = this._options.containsData;
|
|
for (let s = i; s < t; s++) {
|
|
const t = {
|
|
contextMenuEnabled: this._options.paneContextMenuEnabled,
|
|
currencyConversionEnabled: this._options.currencyConversionEnabled,
|
|
unitConversionEnabled: this._options.unitConversionEnabled,
|
|
handleScale: this._options.handleScale,
|
|
handleScroll: this._options.handleScroll,
|
|
priceScaleContextMenuEnabled: this._options
|
|
.priceScaleContextMenuEnabled,
|
|
legendWidgetEnabled: this._options.legendWidgetEnabled,
|
|
sourceStatusesWidgetEnabled: !r,
|
|
sourceStatusesWidget: this._options.sourceStatusesWidget,
|
|
marketStatusWidgetEnabled: this._options.marketStatusWidgetEnabled && !
|
|
r,
|
|
marketStatusWidget: this._options.marketStatusWidget,
|
|
chartWarningWidgetEnabled: this._options.chartWarningWidgetEnabled && !
|
|
r,
|
|
chartWarningWidget: this._options.chartWarningWidget,
|
|
dataProblemWidgetEnabled: this._options.dataProblemWidgetEnabled && !r,
|
|
legendWidget: this._options.legendWidget,
|
|
propertyPagesEnabled: this._options.propertyPagesEnabled,
|
|
sourceSelectionEnabled: this._options.sourceSelectionEnabled,
|
|
controlsEnabled: this._options.paneControlsEnabled,
|
|
croppedTickMarks: this._options.croppedTickMarks,
|
|
countdownEnabled: this._options.countdownEnabled,
|
|
customLegendWidgetFactories: new Map(this
|
|
._customLegendWidgetsFactoryMap),
|
|
useKineticScroll: this._options.useKineticScroll
|
|
};
|
|
void 0 !== this._options.paneContextMenu && (t.contextMenu = this._options
|
|
.paneContextMenu), void 0 !== this._options.priceScaleContextMenu && (t
|
|
.priceScaleContextMenu = this._options.priceScaleContextMenu);
|
|
const i = new g.PaneWidget(this, e[s], t, this._paneWidgetsSharedState);
|
|
if (this._paneWidgets.push(i), s > 0) {
|
|
const e = new w(this, s - 1, s);
|
|
this._paneSeparators.push(e), this._timeAxisWidget ? this._elMainTable
|
|
.insertBefore(e.getElement(), this._timeAxisWidget.getElement()) : this
|
|
._elMainTable.appendChild(e.getElement())
|
|
}
|
|
this._timeAxisWidget ? this._elMainTable.insertBefore(i.getElement(), this
|
|
._timeAxisWidget.getElement()) : this._elMainTable.appendChild(i
|
|
.getElement())
|
|
}
|
|
for (let i = 0; i < t; i++) {
|
|
const t = e[i],
|
|
s = this._paneWidgets[i];
|
|
s.hasState() && s.state() === t ? s.updatePriceAxisWidgets() : s.setState(t)
|
|
}
|
|
for (let e = t; e--;) this._paneWidgets[e].updateControls();
|
|
this._updateThemedColor()
|
|
}
|
|
_width() {
|
|
return this._options.width.value()
|
|
}
|
|
_height() {
|
|
return this._options.height.value()
|
|
}
|
|
_onMousewheel(e) {
|
|
if (!this.model().model().zoomEnabled() || null === this._mouseWheelHelper) return;
|
|
if (!Object(o.onWidget)() && parent && parent !== window && parent.IS_DEMO_PAGE)
|
|
return;
|
|
if (null === this._model) return;
|
|
if (this.model().timeScale().isEmpty()) return;
|
|
const t = this._mouseWheelHelper.processWheel(e),
|
|
i = t.deltaX,
|
|
r = -t.deltaY;
|
|
if (0 !== i && this._options.handleScroll.mouseWheel || 0 !== r && this._options
|
|
.handleScale.mouseWheel) {
|
|
if (e.cancelable && e.preventDefault(), 0 !== r && this._options.handleScale
|
|
.mouseWheel) {
|
|
const t = Math.sign(r) * Math.min(1, Math.abs(r)),
|
|
i = Object(s.ensureNotNull)(this._mainDiv).getBoundingClientRect(),
|
|
n = e.clientX - this._lhsAxesWidth - i.left;
|
|
if (!Number.isFinite(n) || !Number.isFinite(t)) return void H.logWarn(
|
|
"Incorrect mouse wheel processing: scrollPosition: " + n +
|
|
", zoomScale: " + t);
|
|
const o = new C.a(e).control();
|
|
this.model().model().zoomTime(n, t, !!o || void 0), this._onZoom.fire(o)
|
|
}
|
|
0 !== i && this._options.handleScroll.mouseWheel && this.model().scrollChart(-
|
|
80 * i)
|
|
}
|
|
}
|
|
_setElement(e) {
|
|
if (this._mainDiv) {
|
|
this._mainDiv.remove();
|
|
const e = document.createRange();
|
|
e.selectNodeContents(Object(s.ensureNotNull)(this._parent)), e.deleteContents()
|
|
}
|
|
this._controlBarNavigation && (this._controlBarNavigation.destroy(), this
|
|
._controlBarNavigation = null), null !== this._removeMaximizeHotkey && this
|
|
._removeMaximizeHotkey(), this._removeMaximizeHotkey = this._initMaximizeHotkey(
|
|
e);
|
|
const t = e.ownerDocument,
|
|
r = t.createElement("div");
|
|
r.classList.add("chart-container-border"), e.insertBefore(r, e.firstChild), this
|
|
._parent = r;
|
|
const n = t.createElement("div");
|
|
if (n.classList.add("chart-widget"), this._mainDiv = n, this._elTooltipDiv = t
|
|
.createElement("div"), this._elTooltipDiv.className = "tooltip-wrapper", this
|
|
._mainDiv.appendChild(this._elTooltipDiv), this._elMainTable = t.createElement(
|
|
"table"), this._elMainTable.className = "chart-markup-table", this
|
|
._elMainTable.setAttribute("cellpading", "0"), this._elMainTable.setAttribute(
|
|
"cellspacing", "0"), this._mainDiv.appendChild(this._elMainTable), this
|
|
._hotkeysListener && this._hotkeysListener.destroy(), this._hotkeysListener =
|
|
new D.a(this, this._mainDiv), (this._options.controlBarEnabled || Object(V
|
|
.enabled)("control_bar")) && Promise.all([i.e("react"), i.e(72), i.e(7), i
|
|
.e("chart-widget-gui")
|
|
]).then(i.bind(null, "TGRH")).then(e => {
|
|
this._controlBarNavigation = new e.ControlBarNavigation(this, Object(s
|
|
.ensureNotNull)(this._mainDiv), this._options.controlBar), this
|
|
._model && this.adjustSize()
|
|
}), this._options.handleScale.mouseWheel || this._options.handleScroll
|
|
.mouseWheel) {
|
|
this._mouseWheelHelper = new B.a;
|
|
const e = this._onMousewheel.bind(this);
|
|
this._onWheelBound = e, this._mainDiv.addEventListener("wheel", e, {
|
|
passive: !1
|
|
})
|
|
}
|
|
this.resize(), this._justActivated = !1, this.withModel(this, () => {
|
|
r.appendChild(n), n.addEventListener("mousedown", this
|
|
._beginRequestActive.bind(this)), n.addEventListener("mouseup",
|
|
this._endRequestActive.bind(this)), n.addEventListener(
|
|
"touchstart", this._beginRequestActive.bind(this)), n
|
|
.addEventListener("touchmove", this._endRequestActive.bind(this)), n
|
|
.addEventListener("touchend", this._endRequestActive.bind(this)), n
|
|
.addEventListener("click", this._requestActive.bind(this))
|
|
}), this._inited && (null !== this._timeAxisWidget && (this._timeAxisWidget
|
|
.destroy(), this._timeAxisWidget = null), this._paneWidgets.forEach(
|
|
e => {
|
|
e.destroy()
|
|
}), this._paneWidgets.length = 0, this._paneSeparators.forEach(e => {
|
|
e.destroy()
|
|
}), this._paneSeparators.length = 0, this._update(f.InvalidationMask
|
|
.full()))
|
|
}
|
|
_makeDefaultModel() {
|
|
let e;
|
|
if (this._content && this._content.timeScale.points) {
|
|
const t = this._content.timeScale.points.items[0];
|
|
e = {
|
|
startDate: t
|
|
}
|
|
}
|
|
if (!Object(s.ensureNotNull)(this._metaInfoRepository).getInternalMetaInfoArray())
|
|
throw new Error("Cannot create chart model: studies metainfo is absent");
|
|
const t = () => {
|
|
this._drawPlanned = !1, this._drawRafId = 0, this._inLoadingState || (this
|
|
._invalidationMask && (this._update(this._invalidationMask), this
|
|
._invalidationMask = null), null !== this
|
|
._chartPaintedPromise && (this._chartPaintedPromise.resolve(), this
|
|
._chartPaintedPromise = null))
|
|
},
|
|
i = () => {
|
|
const i = {
|
|
readOnly: this.readOnly(),
|
|
isSnapshot: !!this._containsData,
|
|
...n(this._options, ["timeScale", "crossHair", "esdEnabled",
|
|
"countdownEnabled", "lastPriceAnimationEnabled",
|
|
"currencyConversionEnabled", "unitConversionEnabled",
|
|
"watermarkEnabled", "shiftVisibleRangeOnNewBar"
|
|
])
|
|
},
|
|
r = function(e, t, i, s, r, n, o, a, l) {
|
|
const c = new p.ChartUndoModel(e, t, i, s, r, n, o, a, l);
|
|
return c.model().fullUpdate(), c
|
|
}(this._chartSession, e => {
|
|
if (!(e instanceof f.InvalidationMask)) throw new Error(
|
|
"Invalid mask");
|
|
null !== this._invalidationMask ? this._invalidationMask.merge(
|
|
e) : this._invalidationMask = e, this._drawPlanned || (
|
|
this._drawPlanned = !0, this._options.visible.when(
|
|
() => {
|
|
const e = !document.hidden,
|
|
i = this.screen && this.screen.isShown();
|
|
null !== this._timingsMeter && e && !i && this
|
|
._timingsMeter.startWaitingDraw();
|
|
const r = Object(s.ensureNotNull)(Object(s
|
|
.ensureNotNull)(this._parent)
|
|
.ownerDocument.defaultView);
|
|
this._drawRafId = r.requestAnimationFrame(t)
|
|
}))
|
|
}, this.properties(), e, Object(s.ensureNotNull)(this
|
|
._metaInfoRepository), this, this._options.undoHistory, this
|
|
._options.barsMarksContainersFactory, i);
|
|
return this._createSessions(r.model()), r
|
|
};
|
|
Object(V.enabled)("lean_chart_load") ? this._model = this._model || i() : this
|
|
._model = i(), this._createVolumeIfNeeded();
|
|
if (this._content) {
|
|
let e = {};
|
|
W && this._initialLoading && (e = {
|
|
symbol: this._defSymbol,
|
|
interval: this._defInterval,
|
|
style: this._defStyle
|
|
}), this.restoreState(this._content, this._containsData, e), W && this
|
|
._defSymbol && this.model().model().recalculatePriceRangeOnce()
|
|
} else this._setActions();
|
|
return this._createLineToolsSynchronizerIfNeeded(), (() => {
|
|
const e = Object(s.ensureNotNull)(this._model);
|
|
e.onTagsChanged().subscribe(this, () => this.onModelTagsChanged()), this
|
|
._initBackgroundColor(), this._updateGui(), this._modelCreated.fire(
|
|
e), this._tagsChanged.fire();
|
|
const t = e.mainSeries();
|
|
this._defTimeframe && t.setDefaultTimeframe(this._defTimeframe), e
|
|
.lineCancelled().subscribe(this, () => this.onLineCancelled()), t
|
|
.dataEvents().symbolNotPermitted().subscribe(null, e => {
|
|
t.properties().symbol.setValue(e)
|
|
}), t.properties().style.unsubscribe(this, this
|
|
._onChartStyleChanged), t.properties().style.subscribe(this,
|
|
this._onChartStyleChanged), t.dataEvents().completed()
|
|
.subscribe(this, () => this._addPerfMark("SeriesCompleted"), !0), t
|
|
.dataEvents().barReceived().subscribe(this, () => this._addPerfMark(
|
|
"SeriesFirstDataReceived"), !0);
|
|
this._options;
|
|
t.dataEvents().chartTypeNotPermitted().subscribe(null, () => {
|
|
t.properties().interval.setValue("D")
|
|
}), t.dataEvents().intradaySpreadNotPermitted().subscribe(null,
|
|
() => {
|
|
t.properties().interval.setValue("D")
|
|
}), t.dataEvents().customIntervalNotPermitted().subscribe(null,
|
|
() => {
|
|
t.properties().interval.setValue(Object(N
|
|
.getDefaultResolution)(Object(R.isRangeStyle)(t
|
|
.properties().style.value())))
|
|
}), t.dataEvents().intradayExchangeNotPermitted().subscribe(
|
|
null, () => {
|
|
t.properties().interval.setValue("D")
|
|
}), t.requestingResolutionWhenNotSupported.subscribe(null,
|
|
e => {
|
|
t.properties().interval.setValue(e)
|
|
})
|
|
})()
|
|
}
|
|
_handleLoginStateChanged() {
|
|
0
|
|
}
|
|
_subscribeToDrawingState() {
|
|
if (this._options.readOnly) return;
|
|
Object(P.init)();
|
|
const e = (e, t) => {
|
|
if (null === this._model) return;
|
|
const i = this._model.model();
|
|
e.model !== i && t(i, this._model)
|
|
};
|
|
P.createdLineTool.subscribe(null, t => {
|
|
e(t, (e, i) => {
|
|
const r = Object(s.ensureNotNull)(e.paneForSource(e
|
|
.mainSeries()));
|
|
let n, o = null;
|
|
if (void 0 === t.pointPositionPercents) {
|
|
if (o = z(e, t.model, t.point.timeStamp), null === o)
|
|
return;
|
|
n = t.point.price
|
|
} else {
|
|
const i = t.pointPositionPercents.x * e.timeScale()
|
|
.width(),
|
|
s = e.mainSeries().priceScale(),
|
|
r = t.pointPositionPercents.y * s.height(),
|
|
a = e.mainSeries().firstValue();
|
|
if (null === a) return;
|
|
o = e.timeScale().coordinateToIndex(i), n = s
|
|
.coordinateToPrice(r, a)
|
|
}
|
|
const a = {
|
|
index: Object(s.ensureNotNull)(o),
|
|
price: n
|
|
},
|
|
l = i.createLineTool(r, a, t.linetool, t.properties, t
|
|
.linkKey, e.mainSeries(), !0);
|
|
null !== l && !Boolean(this.model().lineBeingCreated()) && t
|
|
.finalState && l.restoreExternalPoints(t.finalState, {
|
|
indexesChanged: !0,
|
|
pricesChanged: !0
|
|
})
|
|
})
|
|
}), P.continuedLineTool.subscribe(null, t => {
|
|
e(t, (e, i) => {
|
|
const s = z(e, t.model, t.point.timeStamp);
|
|
if (null === s) return;
|
|
const r = {
|
|
index: s,
|
|
price: t.point.price
|
|
},
|
|
n = e.lineBeingCreated();
|
|
if (null === n) return;
|
|
i.continueExternalLine(r, null === t.envState ? void 0 : t
|
|
.envState, !!t.finalState) && t.finalState && n
|
|
.restoreExternalPoints(t.finalState, {
|
|
indexesChanged: !0,
|
|
pricesChanged: !0
|
|
})
|
|
})
|
|
}), P.cancelledLineTool.subscribe(null, t => {
|
|
e(t, (e, t) => {
|
|
e.cancelCreatingLine()
|
|
})
|
|
}), P.beenSetLineToolLastPoint.subscribe(null, t => {
|
|
e(t, (e, i) => {
|
|
const s = e.lineBeingCreated();
|
|
if (null === s || s.linkKey().value() !== t.linkKey) return;
|
|
const r = z(e, t.model, t.point.timeStamp);
|
|
if (null === r) return;
|
|
const n = {
|
|
index: r,
|
|
price: t.point.price
|
|
};
|
|
s.setLastPoint(n), s.updateAllViews(), e.lightUpdate()
|
|
})
|
|
}), P.startedMovingLineTool.subscribe(null, t => {
|
|
e(t, (e, i) => {
|
|
const s = t.linkKeys.map(_.lineToolByLinkKey.bind(null, e))
|
|
.filter(d.notNull);
|
|
if (s.length) {
|
|
const i = z(e, t.model, t.point.timeStamp);
|
|
if (null === i) return;
|
|
const r = {
|
|
index: i,
|
|
price: t.point.price
|
|
},
|
|
n = void 0 !== t.itemIndex ? t.itemIndex : null;
|
|
e.startMovingSources(s, {
|
|
logical: r
|
|
}, n, t.pointPositionPercents, null === t
|
|
.envState ? void 0 : t.envState, !0)
|
|
}
|
|
})
|
|
}), P.movedLineTool.subscribe(null, t => {
|
|
e(t, (e, i) => {
|
|
if (!e.sourcesBeingMoved().filter(_.isLineTool).filter(e =>
|
|
(e => t.linkKeys.some(t => e.linkKey().value() ===
|
|
t))(e)).length) return;
|
|
const s = z(e, t.model, t.point.timeStamp);
|
|
if (null === s) return;
|
|
const r = {
|
|
index: s,
|
|
price: t.point.price
|
|
};
|
|
e.moveSources({
|
|
logical: r
|
|
}, t.pointPositionPercents, null === t.envState ?
|
|
void 0 : t.envState, !0)
|
|
})
|
|
}), P.finishedMovingLineTool.subscribe(null, t => {
|
|
e(t, (e, i) => {
|
|
const s = e.sourcesBeingMoved().filter(_.isLineTool);
|
|
if (0 === s.length) return;
|
|
s.forEach(i => {
|
|
const s = (e => {
|
|
for (let i = 0; i < t.linkKeys
|
|
.length; i++)
|
|
if (t.linkKeys[i] === e
|
|
.linkKey().value()) return {
|
|
state: t.finalStates[i],
|
|
changes: t.changes[i]
|
|
};
|
|
return null
|
|
})(i);
|
|
e.endMovingSources(null !== s, !0), null !==
|
|
s && (i.restoreExternalPoints(s.state, s
|
|
.changes), s.state
|
|
.pointPositionPercents && i
|
|
.restorePositionPercents(s.state
|
|
.pointPositionPercents))
|
|
})
|
|
})
|
|
}), P.startedChangingLineTool.subscribe(null, t => {
|
|
e(t, (e, i) => {
|
|
const s = Object(_.lineToolByLinkKey)(e, t.linkKey);
|
|
if (null !== s) {
|
|
const i = s.getPoint(t.pointIndex),
|
|
r = i ? i.index : z(e, t.model, t.point.timeStamp);
|
|
if (null === r) return;
|
|
if (s.isActualSymbol() && s.isActualCurrency() && s
|
|
.isActualUnit()) {
|
|
const i = {
|
|
index: r,
|
|
price: t.point.price
|
|
};
|
|
e.startChangingLinetool(s, i, t.pointIndex, null ===
|
|
t.envState ? void 0 : t.envState, !0)
|
|
}
|
|
}
|
|
})
|
|
}), P.changedLineTool.subscribe(null, t => {
|
|
e(t, (e, i) => {
|
|
const r = e.lineBeingEdited();
|
|
if (null === r || r.linkKey().value() !== t.linkKey) return;
|
|
let n = null;
|
|
if (n = t.changes.indexesChanged ? z(e, t.model, t.point
|
|
.timeStamp) : Object(s.ensureNotNull)(e
|
|
.linePointBeingChanged()).index, null !== n && r
|
|
.isActualSymbol() && r.isActualCurrency() && r
|
|
.isActualUnit()) {
|
|
const i = {
|
|
index: n,
|
|
price: t.point.price
|
|
};
|
|
e.changeLinePoint(i, void 0, !0)
|
|
}
|
|
})
|
|
}), P.finishedChangingLineTool.subscribe(null, t => {
|
|
e(t, (e, i) => {
|
|
const s = Object(_.lineToolByLinkKey)(e, t.linkKey);
|
|
null !== s && s.isActualSymbol() && s.isActualCurrency() &&
|
|
s.isActualUnit() && null !== e.lineBeingEdited() && e
|
|
.endChangingLinetool(!!t.finalState, !0), null !== s &&
|
|
t.finalState && s.restoreExternalPoints(t.finalState, t
|
|
.changes)
|
|
})
|
|
}), P.removedLineTool.subscribe(null, t => {
|
|
e(t, (e, i) => {
|
|
const s = Object(_.lineToolByLinkKey)(e, t.linkKey),
|
|
{
|
|
withUndo: r
|
|
} = t;
|
|
if (null !== s) r ? i.removeSource(s, !1) : e.removeSource(
|
|
s);
|
|
else if (this._lineToolsSynchronizer) {
|
|
const {
|
|
sourceTitle: e,
|
|
linkKey: s,
|
|
symbol: n,
|
|
lineToolState: o
|
|
} = t;
|
|
i.removeUnloadedLineTool(this._lineToolsSynchronizer, e,
|
|
s, n, o, r)
|
|
}
|
|
})
|
|
}), P.finishedLineTool.subscribe(null, t => {
|
|
e(t, (e, i) => {
|
|
const s = Object(_.lineToolByLinkKey)(e, t.linkKey);
|
|
null !== s && Object(_.isLineDrawnWithPressedButton)(s
|
|
.toolname) && s.finish()
|
|
})
|
|
}), P.changedLineStyle.subscribe(null, t => {
|
|
e(t, (e, i) => {
|
|
const s = Object(_.lineToolByLinkKey)(e, t.linkKey);
|
|
null !== s && (s.restoreExternalState(t.state), s
|
|
.propertiesChanged(!0))
|
|
})
|
|
}), P.restoredLineToolState.subscribe(null, t => {
|
|
e(t, (e, i) => {
|
|
const s = Object(_.lineToolByLinkKey)(e, t.linkKey);
|
|
if (null !== s) {
|
|
const i = {
|
|
...t.state
|
|
};
|
|
i.indexes = t.state.points.map(i => ({
|
|
index: z(e, t.model, i.time_t),
|
|
price: i.price
|
|
})), e.restoreLineToolState(s, i)
|
|
}
|
|
})
|
|
}), P.restoredLineTool.subscribe(null, t => {
|
|
e(t, (e, i) => {
|
|
e.restoreSource(t.state.restorePane, t.state.paneIndex, t
|
|
.state.paneState, t.state.sourceState, null)
|
|
})
|
|
}), P.copiedLineTool.subscribe(null, t => {
|
|
e(t, (e, i) => {
|
|
const r = Object(s.ensureNotNull)(e.paneForSource(e
|
|
.mainSeries()));
|
|
let n;
|
|
const o = Object(_.createLineToolProperties)(t.linetool, t
|
|
.state);
|
|
if (t.pointPositionPercents) {
|
|
const e = {
|
|
index: 0,
|
|
price: 0
|
|
};
|
|
if (n = i.createLineTool(r, e, t.linetool, o, t.linkKey,
|
|
void 0, !0), null === n) return;
|
|
n.restorePositionPercents(Object(s.ensureDefined)(t
|
|
.pointPositionPercents))
|
|
} else {
|
|
const a = t.points.map(i => ({
|
|
index: Object(s.ensureNotNull)(z(e, t
|
|
.model, i.timeStamp)),
|
|
price: i.price
|
|
})),
|
|
l = a[0];
|
|
if (n = i.createLineTool(r, l, t.linetool, o, t.linkKey,
|
|
void 0, !0), null === n) return;
|
|
if (e.lineBeingCreated())
|
|
for (let e = 1; e < a.length; e++) e !== a.length -
|
|
1 || !Object(_.isLineDrawnWithPressedButton)(t
|
|
.linetool) && "LineToolGhostFeed" !== t
|
|
.linetool || n.finish(), i.continueCreatingLine(
|
|
a[e], new C.a(void 0), e < a.length - 1, !0)
|
|
}
|
|
n.properties().interval.setValue(t.state.interval), n
|
|
.restoreExternalState(t.state), n.restoreData && n
|
|
.restoreData(t), n.propertiesChanged(!0), t
|
|
.finalState && (n.calcIsActualSymbol(), n
|
|
.restoreExternalPoints(t.finalState, {
|
|
pricesChanged: !0,
|
|
indexesChanged: !0
|
|
}))
|
|
})
|
|
})
|
|
}
|
|
}
|
|
},
|
|
wptU: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
i("e3/o");
|
|
const s = [];
|
|
let r = null;
|
|
|
|
function n(e) {
|
|
for (let t = 0; t < s.length; t++)
|
|
if (s[t].name === e) return t;
|
|
return -1
|
|
}
|
|
|
|
function o(e) {
|
|
if (!r)
|
|
for (let t = s.length - 1; t >= 0 && !0 !== s[t].func(e); t--);
|
|
}
|
|
window.addEventListener("keypress", o, !1);
|
|
var a = i("h24c"),
|
|
l = i("Kxc7"),
|
|
c = i("JpbW"),
|
|
h = i("6KAu"),
|
|
u = i("FA0h"),
|
|
d = i("JWMC");
|
|
i.d(t, "activateKeyPressHandler", (function() {
|
|
return m
|
|
})), i.d(t, "showDialog", (function() {
|
|
return f
|
|
}));
|
|
let p = null;
|
|
|
|
function _(e) {
|
|
if (!Object(a.b)(e)) return !1;
|
|
e.preventDefault();
|
|
const t = String.fromCharCode(e.charCode);
|
|
return l.enabled("show_interval_dialog_on_key_press") && function(e) {
|
|
return /[\d]/.test(e)
|
|
}(t) ? Object(c.showChangeIntervalDialogAsync)({
|
|
initVal: t
|
|
}) : l.enabled("symbol_search_hot_key") && (f({
|
|
defaultValue: t,
|
|
selectSearchOnInit: !1,
|
|
source: "keyboard"
|
|
}), Object(d.trackEvent)("GUI", "SS", "hotkey")), !0
|
|
}
|
|
|
|
function m() {
|
|
Object(h.a)(),
|
|
function(e, t) {
|
|
const i = {
|
|
name: e,
|
|
func: t
|
|
},
|
|
r = n(i.name);
|
|
r > -1 && s.splice(r, 1), s.unshift(i)
|
|
}("symbolEdit", _)
|
|
}
|
|
|
|
function f(e) {
|
|
const t = p = Object(u.a)().then(i => {
|
|
t === p && i.showDefaultSearchDialog(e)
|
|
});
|
|
return t
|
|
}
|
|
},
|
|
ww0J: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return l
|
|
}));
|
|
var s = i("X0WL"),
|
|
r = i("bmVy");
|
|
const n = {
|
|
NONE: "Default"
|
|
},
|
|
o = window.t("No volume data"),
|
|
a = new Map;
|
|
class l extends s.a {
|
|
constructor(e, t) {
|
|
super(t), this._source = e
|
|
}
|
|
getSplitTitle() {
|
|
return this._source.titleInParts(!0, n, void 0, !1)
|
|
}
|
|
text() {
|
|
return this._source.isActualInterval() ? this._source.isFailed() ?
|
|
`${this._source.title(!0, n, void 0, !1)}: ${this.sourceStatusText()}` :
|
|
`${this._source.title(!0, n, void 0, !1)} ${this.sourceStatusText()}` : this
|
|
._source.title(!0, n, void 0, !1)
|
|
}
|
|
sourceStatusText() {
|
|
return Object(r.convertStudyStatusToString)(this._source.status(), !0)
|
|
}
|
|
sourceStatusSolutionId() {
|
|
const e = this._source.status();
|
|
if (e.type === r.StudyStatusType.Error) return e.errorDescription.solution_id ?
|
|
e.errorDescription.solution_id : function(e) {
|
|
for (const t of Array.from(a.keys()))
|
|
if (e.includes(t)) return a.get(t)
|
|
}(e.errorDescription.error)
|
|
}
|
|
errorStatus() {
|
|
if (!this._source.isActualInterval() || this._source.isSymbolInvalid())
|
|
return null;
|
|
return this._source.status().type === r.StudyStatusType.Error ? {
|
|
error: this.sourceStatusText(),
|
|
solutionId: this.sourceStatusSolutionId(),
|
|
title: this.sourceStatusTitle()
|
|
} : null
|
|
}
|
|
sourceStatusTitle() {
|
|
const e = this._source.status();
|
|
if (e.type === r.StudyStatusType.Error) return -1 !== e.errorDescription.error
|
|
.toLowerCase().indexOf(
|
|
"the data vendor doesn't provide volume data for this symbol.") ?
|
|
o : void 0
|
|
}
|
|
}
|
|
},
|
|
x0JF: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("aO4+").Point,
|
|
r = i("vq8G").SelectionRenderer,
|
|
n = i("VdBB").HitTestResult,
|
|
o = i("29fS").PaneRendererBars,
|
|
a = i("gyZD").PaneRendererLine,
|
|
l = i("Zp8I").PaneRendererStepLine,
|
|
c = i("u0yd").PaneRendererArea,
|
|
h = i("/hKg").PaneRendererCandles,
|
|
u = i("M7/j").PaneRendererBaseline,
|
|
d = i("Zy3/").CompositeRenderer,
|
|
p = i("Tmoa"),
|
|
_ = i("k9/m").PlotRowSearchMode,
|
|
m = i("Kxc7"),
|
|
f = i("Zp/P"),
|
|
g = i("o2pV").SelectionIndexes;
|
|
|
|
function b(e, t) {
|
|
this.m_series = e, this.m_model = t, this.m_bars = [], this._invalidated = !0, this
|
|
._isMarkersEnabled = m.enabled("source_selection_markers"), this._selectionData = null,
|
|
this._selectionIndexer = new g(t.timeScale())
|
|
}
|
|
|
|
function v(e, t) {
|
|
return void 0 !== e[TradingView.OPEN_PLOT] && void 0 !== e[TradingView.HIGH_PLOT] &&
|
|
void 0 !== e[TradingView.LOW_PLOT] && void 0 !== e[TradingView.CLOSE_PLOT] && (t.open =
|
|
e[TradingView.OPEN_PLOT], t.high = e[TradingView.HIGH_PLOT], t.low = e[TradingView
|
|
.LOW_PLOT], t.close = e[TradingView.CLOSE_PLOT], !0)
|
|
}
|
|
|
|
function S(e, t) {
|
|
b.call(this, e, t)
|
|
}
|
|
|
|
function y(e, t) {
|
|
b.call(this, e, t)
|
|
}
|
|
|
|
function w(e, t) {
|
|
b.call(this, e, t)
|
|
}
|
|
|
|
function P(e, t) {
|
|
b.call(this, e, t)
|
|
}
|
|
|
|
function C(e, t) {
|
|
this.m_series = e, this.m_model = t, this.m_items = [], this._isMarkersEnabled = m.enabled(
|
|
"source_selection_markers"), this._selectionIndexer = new g(t.timeScale())
|
|
}
|
|
|
|
function x(e, t) {
|
|
C.call(this, e, t), this._invaidated = !0
|
|
}
|
|
|
|
function T(e, t) {
|
|
C.call(this, e, t), this._invaidated = !0
|
|
}
|
|
|
|
function I(e, t) {
|
|
C.call(this, e, t), this._invaidated = !0, this._renderer = new u
|
|
}
|
|
b.prototype._series = function() {
|
|
return this.m_series
|
|
}, b.prototype._model = function() {
|
|
return this.m_model
|
|
}, b.prototype._bars = function() {
|
|
return this.m_bars
|
|
}, b.prototype.update = function() {
|
|
this._invalidated = !0
|
|
}, b.prototype._updateImpl = function(e) {
|
|
var t = this;
|
|
if ((e = e || v, this.m_bars = [], !this.m_model.timeScale().isEmpty() && !this.m_series
|
|
.priceScale().isEmpty()) && (null !== (a = this.m_model.timeScale()
|
|
.visibleBarsStrictRange()) && 0 !== this.m_series.bars().size())) {
|
|
for (var i = this.m_series.nearestIndex(a.firstBar(), _.NearestRight), r = this
|
|
.m_series.nearestIndex(a.lastBar(), _.NearestLeft); i <= r; i++) {
|
|
if (null !== this.m_series.bars().valueAt(i)) break
|
|
}
|
|
if (!(i > r)) {
|
|
var o, a = this.m_series.bars().range(i, r),
|
|
l = this.m_series.priceScale(),
|
|
c = this.m_series.barColorer(),
|
|
h = {};
|
|
if (a.each((function(i, s) {
|
|
var r, n = {};
|
|
(n.time = Math.round(i), e(s, n)) && (h.value = s, r = s[
|
|
TradingView.STYLE_PLOT] ? s[TradingView.STYLE_PLOT] : c
|
|
.barStyle(i, !1, h), s[TradingView.STYLE_PLOT] = r, h
|
|
.previousValue = s, n.color = r.barColor, n.borderColor = r
|
|
.barBorderColor, n.wickColor = r.barWickColor, n.hollow = r
|
|
.isBarHollow, t.m_bars.push(n))
|
|
}), this), 0 !== this.m_bars.length && (o = this.m_series.firstValue(), l
|
|
.barPricesToCoordinates(this.m_bars, o)), this.m_model.timeScale()
|
|
.barIndexesToCoordinates(this.m_bars), this.m_model.selection().isSelected(
|
|
this.m_series)) {
|
|
var u = this._selectionIndexer.indexes();
|
|
this._selectionData = {
|
|
points: [],
|
|
bgColors: [],
|
|
visible: !0
|
|
};
|
|
var d = this.m_model.paneForSource(this.m_series).height();
|
|
this._selectionData.hittestResult = n.REGULAR;
|
|
for (var p = 0; p < u.length; p++) {
|
|
var m = u[p],
|
|
f = this.m_series.bars().valueAt(m);
|
|
if (null !== f) {
|
|
var g = .5 * (f[TradingView.OPEN_PLOT] + f[TradingView.CLOSE_PLOT]),
|
|
b = this.m_model.timeScale().indexToCoordinate(m),
|
|
S = this.m_series.priceScale().priceToCoordinate(g, o);
|
|
this._selectionData.points.push(new s(b, S)), this._selectionData
|
|
.bgColors.push(this.m_model.backgroundColorAtYPercentFromTop(S /
|
|
d))
|
|
}
|
|
}
|
|
} else this._selectionIndexer.clear()
|
|
}
|
|
}
|
|
}, b.prototype.items = function() {
|
|
return this.m_bars
|
|
}, inherit(S, b), S.prototype.renderer = function() {
|
|
this._invalidated && (this._updateImpl(), this._invalidated = !1);
|
|
var e = {};
|
|
e.bars = this.m_bars, e.barSpacing = this.m_model.timeScale().barSpacing();
|
|
var t = this.m_series.properties();
|
|
e.dontDrawOpen = t.barStyle.dontDrawOpen.value(), e.thinBars = t.style.value() ===
|
|
TradingView.Series.STYLE_RANGE ? t.rangeStyle.thinBars.value() : t.barStyle.thinBars
|
|
.value();
|
|
var i = new d;
|
|
return i.append(new o(e)), this.m_model.selection().isSelected(this.m_series) && this
|
|
._isMarkersEnabled && i.append(new r(this._selectionData)), i
|
|
}, inherit(y, b), y.prototype.renderer = function() {
|
|
this._invalidated && (this._updateImpl(), this._invalidated = !1);
|
|
var e = {};
|
|
e.bars = this.m_bars, e.barSpacing = this.m_model.timeScale().barSpacing(), e
|
|
.wickVisible = this.m_series.properties().candleStyle.drawWick.value(), e
|
|
.bodyVisible = this.m_series.properties().candleStyle.drawBody.value(), e
|
|
.borderVisible = this.m_series.properties().candleStyle.drawBorder.value(), e
|
|
.borderColor = this.m_series.properties().candleStyle.borderColor.value(), e
|
|
.wickColor = this.m_series.properties().candleStyle.wickColor.value(), e.barWidth =
|
|
f.optimalBarWidth(e.barSpacing);
|
|
var t = new d;
|
|
return t.append(new h(e)), this.m_model.selection().isSelected(this.m_series) && this
|
|
._isMarkersEnabled && t.append(new r(this._selectionData)), t
|
|
}, inherit(w, b), w.prototype.renderer = function() {
|
|
this._invalidated && (this._updateImpl(), this._invalidated = !1);
|
|
var e = {};
|
|
e.bars = this.m_bars, e.barSpacing = this.m_model.timeScale().barSpacing(), e
|
|
.wickVisible = this.m_series.properties().haStyle.drawWick.value(), e.bodyVisible =
|
|
this.m_series.properties().haStyle.drawBody.value(), e.borderVisible = this.m_series
|
|
.properties().haStyle.drawBorder.value(), e.borderColor = this.m_series.properties()
|
|
.haStyle.borderColor.value(), e.wickColor = this.m_series.properties().haStyle
|
|
.wickColor.value(), e.barWidth = f.optimalBarWidth(e.barSpacing);
|
|
var t = new d;
|
|
return t.append(new h(e)), this.m_model.selection().isSelected(this.m_series) && this
|
|
._isMarkersEnabled && t.append(new r(this._selectionData)), t
|
|
}, inherit(P, b), P.prototype.renderer = function() {
|
|
this._invalidated && (this._updateImpl(), this._invalidated = !1);
|
|
var e = {};
|
|
e.bars = this.m_bars, e.barSpacing = this.m_model.timeScale().barSpacing(), e
|
|
.wickVisible = this.m_series.properties().hollowCandleStyle.drawWick.value(), e
|
|
.bodyVisible = this.m_series.properties().hollowCandleStyle.drawBody.value(), e
|
|
.borderVisible = this.m_series.properties().hollowCandleStyle.drawBorder.value(), e
|
|
.borderColor = this.m_series.properties().hollowCandleStyle.borderColor.value(), e
|
|
.wickColor = this.m_series.properties().hollowCandleStyle.wickColor.value(), e
|
|
.barWidth = f.optimalBarWidth(e.barSpacing);
|
|
var t = new d;
|
|
return t.append(new h(e)),
|
|
this.m_model.selection().isSelected(this.m_series) && this._isMarkersEnabled && t
|
|
.append(new r(this._selectionData)), t
|
|
}, C.prototype.update = function() {
|
|
if (this.m_items = [], this.m_model.timeScale().isEmpty() || !this.m_series
|
|
.priceScale() || this.m_series.priceScale().isEmpty()) return;
|
|
const e = this.m_model.timeScale().visibleBarsStrictRange();
|
|
if (null === e) return;
|
|
if (0 === this.m_series.bars().size()) return;
|
|
var t = this.m_series.nearestIndex(e.firstBar() - 1, _.NearestLeft),
|
|
i = this.m_series.nearestIndex(e.lastBar() + 1, _.NearestRight);
|
|
const r = this.m_series.bars().range(t, i);
|
|
var o = this.m_series.priceScale(),
|
|
a = {
|
|
color: this.m_series.properties().lineStyle.color.value()
|
|
},
|
|
l = this.m_series.barFunction();
|
|
let c;
|
|
if (r.each(function(t, i) {
|
|
var r = l(i);
|
|
if (null == r) return !1;
|
|
void 0 === c && e.contains(t) && (c = r);
|
|
var n = new s(t, r);
|
|
return n.style = a, this.m_items.push(n), !1
|
|
}.bind(this)), o.pointsArrayToCoordinates(this.m_items, c), this.m_model.timeScale()
|
|
.timedValuesToCoordinates(this.m_items), this.m_model.selection().isSelected(this
|
|
.m_series)) {
|
|
var h = this._selectionIndexer.indexes();
|
|
this._selectionData = {
|
|
points: [],
|
|
isDark: this.m_model.isDark(),
|
|
bgColors: [],
|
|
visible: !0
|
|
};
|
|
var u = this.m_model.paneForSource(this.m_series).height();
|
|
this._selectionData.hittestResult = n.REGULAR;
|
|
for (var d = 0; d < h.length; d++) {
|
|
var p = h[d],
|
|
m = this.m_series.data().valueAt(p);
|
|
if (null !== m) {
|
|
var f = l(m),
|
|
g = this.m_model.timeScale().indexToCoordinate(p),
|
|
b = this.m_series.priceScale().priceToCoordinate(f, c);
|
|
this._selectionData.points.push(new s(g, b)), this._selectionData.bgColors
|
|
.push(this.m_model.backgroundColorAtYPercentFromTop(b / u))
|
|
}
|
|
}
|
|
} else this._selectionIndexer.clear()
|
|
}, inherit(x, C), x.prototype.update = function() {
|
|
this._invalidated = !0
|
|
}, x.prototype.renderer = function() {
|
|
this._invalidated && (C.prototype.update.call(this), this._invalidated = !1);
|
|
var e, t, i = this.m_series.properties().lineStyle,
|
|
s = {
|
|
barSpacing: this.m_model.timeScale().barSpacing(),
|
|
items: this.m_items,
|
|
lineColor: i.color.value(),
|
|
lineStyle: i.linestyle.value(),
|
|
withMarkers: i.styleType.value() === TradingView.Series.STYLE_LINE_TYPE_MARKERS,
|
|
lineWidth: i.linewidth.value(),
|
|
simpleMode: !0
|
|
};
|
|
return i.styleType.value() === TradingView.Series.STYLE_LINE_TYPE_STEP ? (e = new l)
|
|
.setData(s) : e = new a(s), this.m_model.selection().isSelected(this.m_series) ? ((
|
|
t = new d).append(e), this._isMarkersEnabled && t.append(new r(this
|
|
._selectionData))) : t = e, t
|
|
}, inherit(T, C), T.prototype.update = function() {
|
|
this._invalidated = !0
|
|
}, T.prototype.renderer = function() {
|
|
this._invalidated && (C.prototype.update.call(this), this._invalidated = !1);
|
|
var e = {
|
|
simpleMode: !1
|
|
};
|
|
e.barSpacing = this.m_model.timeScale().barSpacing(), e.items = this.m_items, e
|
|
.lineColor = this.m_series.properties().areaStyle.linecolor.value(), e.lineStyle =
|
|
this.m_series.properties().areaStyle.linestyle.value(), e.lineWidth = this.m_series
|
|
.properties().areaStyle.linewidth.value();
|
|
var t = this.m_series.properties().areaStyle.transparency.value();
|
|
e.isSeries = !0, e.color1 = p.generateColor(this.m_series.properties().areaStyle.color1
|
|
.value(), t), e.color2 = p.generateColor(this.m_series.properties().areaStyle
|
|
.color2.value(), t), e.bottom = this.m_series.priceScale().height();
|
|
var i = new d;
|
|
return i.append(new c(e)), this.m_model.selection().isSelected(this.m_series) && this
|
|
._isMarkersEnabled && i.append(new r(this._selectionData)), i
|
|
}, inherit(I, C), I.prototype.update = function() {
|
|
this._invalidated = !0
|
|
}, I.prototype._updateImpl = function() {
|
|
C.prototype.update.call(this);
|
|
var e = this.m_series.properties().baselineStyle,
|
|
t = e.transparency.value();
|
|
this._topFillColor1 = p.generateColor(e.topFillColor1.value(), t), this._topFillColor2 =
|
|
p.generateColor(e.topFillColor2.value(), t), this._bottomFillColor1 = p
|
|
.generateColor(e.bottomFillColor1.value(), t), this._bottomFillColor2 = p
|
|
.generateColor(e.bottomFillColor2.value(), t), this._topLineColor = e.topLineColor
|
|
.value(), this._bottomLineColor = e.bottomLineColor.value(), this._topLineWidth = e
|
|
.topLineWidth.value(), this._bottomLineWidth = e.bottomLineWidth.value(), this
|
|
._barSpacing = this.m_model.timeScale().barSpacing(), this._bottom = this.m_series
|
|
.priceScale().height(), this._baseLevelCoordinate = Math.round(this._bottom * (Math
|
|
.abs(100 - e.baseLevelPercentage.value()) / 100))
|
|
}, I.prototype.renderer = function() {
|
|
this._invalidated && (this._updateImpl(), this._invalidated = !1), this._renderer
|
|
.setData({
|
|
items: this.m_items,
|
|
topFillColor1: this._topFillColor1,
|
|
topFillColor2: this._topFillColor2,
|
|
bottomFillColor1: this._bottomFillColor1,
|
|
bottomFillColor2: this._bottomFillColor2,
|
|
topLineColor: this._topLineColor,
|
|
bottomLineColor: this._bottomLineColor,
|
|
topLineWidth: this._topLineWidth,
|
|
bottomLineWidth: this._bottomLineWidth,
|
|
lineStyle: CanvasEx.LINESTYLE_SOLID,
|
|
barSpacing: this._barSpacing,
|
|
baseLevelCoordinate: this._baseLevelCoordinate,
|
|
bottom: this._bottom
|
|
});
|
|
var e = new d;
|
|
return e.append(this._renderer), this.m_model.selection().isSelected(this.m_series) && e
|
|
.append(new r(this._selectionData)), e
|
|
}, t.SeriesBarsPaneView = S, t.SeriesCandlesPaneView = y, t.SeriesHollowCandlesPaneView = P,
|
|
t.SeriesLinePaneView = x, t.SeriesAreaPaneView = T, t.SeriesHeikenAshiPaneView = w, t
|
|
.SeriesBaselinePaneView = I, t.SeriesBarCandlesPaneView = b
|
|
},
|
|
"x2L+": function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "b", (function() {
|
|
return o
|
|
})), i.d(t, "a", (function() {
|
|
return a
|
|
}));
|
|
var s = i("m/cY"),
|
|
r = i("Vdly");
|
|
|
|
function n() {
|
|
return r.getBool("Chart.ShowMarketOpenStatus", !0)
|
|
}
|
|
const o = Object(s.a)(n());
|
|
|
|
function a() {
|
|
o.setValue(!0), r.remove("Chart.ShowMarketOpenStatus")
|
|
}
|
|
r.onSync.subscribe(null, () => o.setValue(n())), o.subscribe(null, () => r.setValue(
|
|
"Chart.ShowMarketOpenStatus", o.value()))
|
|
},
|
|
x5Tw: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "setupChartEventHint", (function() {
|
|
return u
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("YFKU"),
|
|
n = i("Vdly"),
|
|
o = i("mMWL"),
|
|
a = i("e92V"),
|
|
l = i("qFKp"),
|
|
c = i("/3z9"),
|
|
h = i("Kxc7");
|
|
|
|
function u(e, t = !1) {
|
|
if (!h.enabled("popup_hints")) return;
|
|
const u = e.getContainer();
|
|
let d = null,
|
|
p = null;
|
|
|
|
function _(e, t, r) {
|
|
if (d) d.show(e, r ? void 0 : m.bind(null, t));
|
|
else {
|
|
const n = o.tool.value();
|
|
Promise.all([i.e("react"), i.e(89), i.e("chart-event-hint")]).then(i.bind(null,
|
|
"PN5r")).then(i => {
|
|
d = new i.ChartEventHintRenderer(Object(s.ensureNotNull)(u)), n === o
|
|
.tool.value() && d.show(e, r ? void 0 : m.bind(null, t))
|
|
})
|
|
}
|
|
}
|
|
|
|
function m(e) {
|
|
n.setValue(e, !0, {
|
|
forceFlush: !0
|
|
}), Object(s.ensureNotNull)(d).destroy(), null !== p && p(), d = null
|
|
}
|
|
o.tool.subscribe((function() {
|
|
if (Boolean(n.getBool("hint.touchPainting"))) return;
|
|
const e = o.tool.value();
|
|
Object(a.isStudyLineToolName)(e) && "LineToolRegressionTrend" !== e && !l
|
|
.CheckMobile.any() ? _(Object(r.t)("Click to set a point"),
|
|
"hint.touchPainting") : l.CheckMobile.any() && !Object(a
|
|
.isLineDrawnWithPressedButton)(e) && Object(a.isLineToolName)(e) ?
|
|
_(Object(r.t)(
|
|
"Move the point to position the anchor then tap to place"),
|
|
"hint.touchPainting") : d && d.hide()
|
|
})), o.createdLineTool.subscribe(null, (function() {
|
|
const e = o.tool.value();
|
|
"LineToolPath" !== e || Boolean(n.getBool(
|
|
"hint.finishBuildPathByDblClick")) ? "LineToolPolyline" !== e ||
|
|
Boolean(n.getBool("hint.finishBuildPolylineByDblClick")) || _(Object(r
|
|
.t)("Double-click to finish Polyline"),
|
|
"hint.finishBuildPolylineByDblClick") : _(Object(r.t)(
|
|
"Double-click to finish Path"),
|
|
"hint.finishBuildPathByDblClick")
|
|
})), o.finishedLineTool.subscribe(null, (function() {
|
|
if (d) {
|
|
const e = o.tool.value();
|
|
"LineToolPath" === e ? m("hint.finishBuildPathByDblClick") :
|
|
"LineToolPolyline" === e && m("hint.finishBuildPolylineByDblClick")
|
|
}
|
|
})), t || l.CheckMobile.any() || Boolean(n.getBool("hint.startFocusedZoom")) || (p =
|
|
function(e, t) {
|
|
let i = !1;
|
|
const s = r => {
|
|
r ? (i && t(r), e.onZoom().unsubscribe(null, s)) : i || (t(r), i = !0)
|
|
};
|
|
return e.onZoom().subscribe(null, s), () => e.onZoom().unsubscribe(null, s)
|
|
}(e, (function(e) {
|
|
if (Boolean(n.getBool("hint.startFocusedZoom"))) return;
|
|
if (e) d && (p = null, m("hint.startFocusedZoom"));
|
|
else {
|
|
const e = c.isMacKeyboard ? "⌘" : "Ctrl";
|
|
_(Object(r.t)(
|
|
"Press and hold {key} while zooming to maintain the chart position"
|
|
).format({
|
|
key: e
|
|
}), "hint.startFocusedZoom")
|
|
}
|
|
})))
|
|
}
|
|
},
|
|
x8jL: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("Eyy1"),
|
|
r = i("MY2c"),
|
|
n = i("bOGh"),
|
|
o = i("RDU5");
|
|
class a extends o.UndoCommand {
|
|
constructor(e, t, i) {
|
|
super(i), this._wv = e, this._newValue = t, this._oldValue = e.value()
|
|
}
|
|
redo() {
|
|
this._wv.setValue(this._newValue)
|
|
}
|
|
undo() {
|
|
this._wv.setValue(this._oldValue)
|
|
}
|
|
}
|
|
var l = i("txPx"),
|
|
c = i("aIyQ"),
|
|
h = i.n(c);
|
|
i.d(t, "createUndoHistory", (function() {
|
|
return d
|
|
}));
|
|
const u = Object(l.getLogger)("Common.UndoHistory");
|
|
|
|
function d() {
|
|
const e = [],
|
|
t = new r.a,
|
|
i = new r.a,
|
|
o = new h.a;
|
|
|
|
function l(s) {
|
|
if (e.length > 0) e[e.length - 1].addCommand(s);
|
|
else {
|
|
i.clear();
|
|
const e = t.head(),
|
|
r = e && e.text();
|
|
e && e.canMerge(s) ? e.merge(s) : t.push(s);
|
|
const n = s.text();
|
|
"" !== n && n !== r && u.logNormal("DO: " + n)
|
|
}
|
|
s.executeOnPush() && s.redo(), e.length || o.fire(c())
|
|
}
|
|
|
|
function c() {
|
|
const e = t.head(),
|
|
s = i.head();
|
|
return {
|
|
enableUndo: !t.isEmpty(),
|
|
undoText: void 0 === e ? void 0 : e.text(),
|
|
enableRedo: !i.isEmpty(),
|
|
redoText: void 0 === s ? void 0 : s.text()
|
|
}
|
|
}
|
|
return {
|
|
beginUndoMacro: function(t) {
|
|
const i = new n.a(t);
|
|
return e.push(i), i
|
|
},
|
|
clearStack: function() {
|
|
t.clear(), i.clear(), o.fire(c())
|
|
},
|
|
createUndoCheckpoint: function() {
|
|
return {
|
|
lastActualCommand: t.isEmpty() ? null : t.head()
|
|
}
|
|
},
|
|
endUndoMacro: function() {
|
|
const t = Object(s.ensureDefined)(e.pop());
|
|
t.isEmpty() || l(t)
|
|
},
|
|
pushUndoCommand: l,
|
|
redo: function() {
|
|
if (i.isEmpty()) return !1;
|
|
const e = i.pop();
|
|
return !!e && (e.redo(), t.push(e), u.logNormal("REDO: " + e.text()), o.fire(
|
|
c()), !0)
|
|
},
|
|
redoStack: function() {
|
|
return i
|
|
},
|
|
setWatchedValue: function(e, t, i) {
|
|
if (e.value() !== t) {
|
|
const s = new a(e, t, i);
|
|
l(s), s.redo()
|
|
}
|
|
},
|
|
undo: function() {
|
|
if (t.isEmpty()) return !1;
|
|
const e = t.pop();
|
|
return !!e && (e.undo(),
|
|
i.push(e), u.logNormal("UNDO: " + e.text()), o.fire(c()), !0)
|
|
},
|
|
undoStack: function() {
|
|
return t
|
|
},
|
|
undoToCheckpoint: function(e) {
|
|
for (; !t.isEmpty() && e.lastActualCommand !== t.head();) t.pop().undo();
|
|
i.clear(), o.fire(c())
|
|
},
|
|
state: c,
|
|
onChange: function() {
|
|
return o
|
|
}
|
|
}
|
|
}
|
|
},
|
|
xCUR: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "b", (function() {
|
|
return n
|
|
})), i.d(t, "a", (function() {
|
|
return o
|
|
}));
|
|
var s = i("n5al"),
|
|
r = i("/tGj");
|
|
|
|
function n(e) {
|
|
const t = e.priceScale();
|
|
return !(null === t || !t.isPercentage()) && (!Object(r.isSymbolSource)(e) || Object(s
|
|
.isPriceSourceStyle)(e.style()))
|
|
}
|
|
|
|
function o(e) {
|
|
const t = e.priceScale();
|
|
if (n(e) && null !== t) return i => {
|
|
var s;
|
|
return t.formatPricePercentage(i, null !== (s = e.firstValue()) && void 0 !==
|
|
s ? s : 100)
|
|
};
|
|
const i = e.formatter();
|
|
return i.format.bind(i)
|
|
}
|
|
},
|
|
xDuj: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "translatedIntervalString", (function() {
|
|
return r
|
|
}));
|
|
i("YFKU");
|
|
var s = i("pPtI");
|
|
|
|
function r(e) {
|
|
const t = Object(s.getTranslatedResolutionModel)(e, !0);
|
|
return null === t ? e : t.multiplier + (t.mayOmitShortKind ? "" : t.shortKind)
|
|
}
|
|
},
|
|
xWfy: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return c
|
|
})), i.d(t, "b", (function() {
|
|
return p
|
|
})), i.d(t, "c", (function() {
|
|
return _
|
|
})), i.d(t, "d", (function() {
|
|
return m
|
|
}));
|
|
var s = i("tqok"),
|
|
r = i("fFKx"),
|
|
n = i("SqfW"),
|
|
o = i("KG+6"),
|
|
a = i("5vwb"),
|
|
l = i("7Fue");
|
|
class c {
|
|
constructor(e, t) {
|
|
if (this._indexes = [], this._horizlines = new Map, this._vertlines = new Map, this
|
|
._lines = new Map, this._hlines = new Map, this._textmarks = new Map, this
|
|
._shapemarks = new Map, this._backgrounds = new Map, this._polygons = new Map,
|
|
this._trendchannels = new Map, this._hhists = new Map, this._dwglabels =
|
|
new Map, this._dwglines = new Map, this._dwgboxes = new Map, this._dwgtables =
|
|
new Map, this._dwgtablecells = new Map, "data" === e) {
|
|
const e = t;
|
|
this._indexes = e.indexes, this._vertlines = h(e.vertlines, this._indexes, n.b),
|
|
this._horizlines = h(e.horizlines, this._indexes, r.b), this._polygons = h(e
|
|
.polygons, this._indexes, a.b), this._hhists = h(e.hhists, this
|
|
._indexes, o.d)
|
|
} else if ("state" === e) {
|
|
const e = t;
|
|
this._indexes = e.indexes || [], this._vertlines = u(e.vertlines, this._indexes,
|
|
n.b), this._horizlines = u(e.horizlines, this._indexes, r.b), this
|
|
._polygons = u(e.polygons, this._indexes, a.b), this._hhists = u(e.hhists,
|
|
this._indexes, o.d)
|
|
}
|
|
this._hhistsByTimePointIndex = Object(l.b)(this._hhists)
|
|
}
|
|
horizlines() {
|
|
return this._horizlines
|
|
}
|
|
vertlines() {
|
|
return this._vertlines
|
|
}
|
|
lines() {
|
|
return this._lines
|
|
}
|
|
hlines() {
|
|
return this._hlines
|
|
}
|
|
textmarks() {
|
|
return this._textmarks
|
|
}
|
|
shapemarks() {
|
|
return this._shapemarks
|
|
}
|
|
backgrounds() {
|
|
return this._backgrounds
|
|
}
|
|
polygons() {
|
|
return this._polygons
|
|
}
|
|
trendchannels() {
|
|
return this._trendchannels
|
|
}
|
|
hhists() {
|
|
return this._hhists
|
|
}
|
|
dwglabels() {
|
|
return this._dwglabels
|
|
}
|
|
dwglines() {
|
|
return this._dwglines
|
|
}
|
|
dwgboxes() {
|
|
return this._dwgboxes
|
|
}
|
|
dwgtables() {
|
|
return this._dwgtables
|
|
}
|
|
dwgtablecells() {
|
|
return this._dwgtablecells
|
|
}
|
|
hhistsByTimePointIndex() {
|
|
return this._hhistsByTimePointIndex
|
|
}
|
|
}
|
|
|
|
function h(e, t, i) {
|
|
const s = new Map;
|
|
return e.forEach((e, r) => {
|
|
const n = s.get(r) || new Set;
|
|
e.forEach(e => {
|
|
const s = i(e, t);
|
|
null !== s && n.add(s)
|
|
}), s.set(r, n)
|
|
}), s
|
|
}
|
|
|
|
function u(e, t, i) {
|
|
const s = new Map;
|
|
if (void 0 === e) return s;
|
|
for (const r of e) {
|
|
const e = r.styleId,
|
|
n = s.get(e) || new Set;
|
|
r.data.forEach(e => {
|
|
const s = i(e, t);
|
|
null !== s && n.add(s)
|
|
}), s.set(e, n)
|
|
}
|
|
return s
|
|
}
|
|
|
|
function d(e, t, i, s) {
|
|
const r = [];
|
|
return e.forEach((e, n) => {
|
|
e.forEach(e => {
|
|
! function(e, t, i) {
|
|
let s = null;
|
|
for (const i of e) i.styleId === t && (s = i);
|
|
null === s && (s = {
|
|
styleId: t,
|
|
data: []
|
|
}, e.push(s)), s.data.push(i)
|
|
}(r, n, s(e, t(e), i))
|
|
})
|
|
}), r.length > 0 ? r : void 0
|
|
}
|
|
|
|
function p() {
|
|
return new c
|
|
}
|
|
|
|
function _(e) {
|
|
return new c("state", e)
|
|
}
|
|
|
|
function m(e) {
|
|
const t = function(e) {
|
|
const t = new Set;
|
|
e.horizlines().forEach((e, i) => {
|
|
e.forEach(e => {
|
|
t.add(e.startIndex), t.add(e.endIndex)
|
|
})
|
|
}), e.vertlines().forEach((e, i) => {
|
|
e.forEach(e => {
|
|
t.add(e.index)
|
|
})
|
|
}), e.lines().forEach((e, i) => {
|
|
e.forEach(e => {
|
|
t.add(e.startIndex), t.add(e.endIndex)
|
|
})
|
|
}), e.textmarks().forEach((e, i) => {
|
|
e.forEach(e => {
|
|
t.add(e.time)
|
|
})
|
|
}), e.shapemarks().forEach((e, i) => {
|
|
e.forEach(e => {
|
|
t.add(e.time)
|
|
})
|
|
}), e.backgrounds().forEach((e, i) => {
|
|
e.forEach(e => {
|
|
t.add(null !== e.start ? e.start : s
|
|
.INVALID_TIME_POINT_INDEX), t.add(e.stop)
|
|
})
|
|
}), e.polygons().forEach((e, i) => {
|
|
e.forEach(e => {
|
|
e.points.forEach(e => {
|
|
t.add(e.index)
|
|
})
|
|
})
|
|
}), e.trendchannels().forEach((e, i) => {
|
|
e.forEach(e => {
|
|
t.add(e.startIndex), t.add(e.endIndex)
|
|
})
|
|
}), e.hhists().forEach((e, i) => {
|
|
e.forEach(e => {
|
|
t.add(e.firstBarTime), t.add(e.lastBarTime)
|
|
})
|
|
}), e.dwglabels().forEach((e, i) => {
|
|
e.forEach(e => {
|
|
t.add(e.x)
|
|
})
|
|
}), e.dwglines().forEach((e, i) => {
|
|
e.forEach(e => {
|
|
var i, r;
|
|
t.add(null !== (i = e.x1) && void 0 !== i ? i : s
|
|
.INVALID_TIME_POINT_INDEX), t.add(null !== (r = e
|
|
.x2) && void 0 !== r ? r : s
|
|
.INVALID_TIME_POINT_INDEX)
|
|
})
|
|
}), e.dwgboxes().forEach((e, i) => {
|
|
e.forEach(e => {
|
|
var i, r;
|
|
t.add(null !== (i = e.left) && void 0 !== i ? i : s
|
|
.INVALID_TIME_POINT_INDEX), t.add(null !== (r = e
|
|
.right) && void 0 !== r ? r : s
|
|
.INVALID_TIME_POINT_INDEX)
|
|
})
|
|
});
|
|
const i = Array.from(t);
|
|
return i.sort((e, t) => e - t), i
|
|
}(e),
|
|
i = {
|
|
indexes: t
|
|
};
|
|
let l = 0;
|
|
const c = () => ++l;
|
|
return i.vertlines = d(e.vertlines(), c, t, n.a), i.horizlines = d(e.horizlines(), c, t, r
|
|
.a), i.polygons = d(e.polygons(), c, t, a.a), i.hhists = d(e.hhists(), c, t, o.c), i
|
|
}
|
|
},
|
|
xdS3: function(e, t, i) {},
|
|
xnA2: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Ss5c").LineDataSource,
|
|
r = i("5rJj"),
|
|
n = i("j3hX").LineToolColorsProperty;
|
|
class o extends s {
|
|
constructor(e, t) {
|
|
super(e, t || o.createProperties()), this.version = o.version, i.e("lt-pane-views")
|
|
.then(i.t.bind(null, "CR3a", 7)).then(({
|
|
FibChannelPaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
levelsCount() {
|
|
return o.LevelsCount
|
|
}
|
|
migrateVersion(e, t, i) {
|
|
i.properties.removeProperty("reverse")
|
|
}
|
|
pointsCount() {
|
|
return 3
|
|
}
|
|
name() {
|
|
return "Fib Channel"
|
|
}
|
|
processErase(e, t) {
|
|
var i = "level" + t,
|
|
s = this.properties()[i].visible;
|
|
e.setProperty(s, !1, "Erase level line")
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "17v9")))
|
|
.FibDrawingsWith24LevelsDefinitionsViewModel
|
|
}
|
|
static createProperties(e) {
|
|
var t = new r("linetoolfibchannel", e, !1, {
|
|
range: [1, 24],
|
|
names: ["coeff", "color", "visible"]
|
|
});
|
|
return o._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
s._configureProperties(e);
|
|
var t = [];
|
|
for (let i = 1; i <= o.LevelsCount; i++) t.push(e.child("level" + i).child(
|
|
"color"));
|
|
e.addChild("linesColors", new n(t)), e.addExclusion("linesColors")
|
|
}
|
|
}
|
|
o.LevelsCount = 24, o.version = 2, t.LineToolFibChannel = o
|
|
},
|
|
xo8u: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return o
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("RDU5"),
|
|
n = i("n5al");
|
|
class o extends r.UndoCommand {
|
|
constructor(e, t, i, r) {
|
|
super(r), this._newSourcesCurrencies = new Map, this._oldSourcesCurrencies =
|
|
new Map, this._showFade = !1, this._chartWidget = i;
|
|
const o = i.model().mainSeries();
|
|
for (const i of e.seriesLikeSources()) {
|
|
if (!i.isVisible()) continue;
|
|
const e = t || Object(n.symbolOriginalCurrency)(Object(s.ensureNotNull)(i
|
|
.symbolInfo()));
|
|
this._newSourcesCurrencies.set(i.id(), e), this._oldSourcesCurrencies.set(i
|
|
.id(), i.currency()), this._showFade = this._showFade || i === o &&
|
|
i.currency() !== e
|
|
}
|
|
}
|
|
redo() {
|
|
this._applyCurrencies(this._newSourcesCurrencies)
|
|
}
|
|
undo() {
|
|
this._applyCurrencies(this._oldSourcesCurrencies)
|
|
}
|
|
_applyCurrencies(e) {
|
|
this._showFade && this._chartWidget.screen.show();
|
|
const t = this._chartWidget.model().model();
|
|
e.forEach((e, i) => {
|
|
Object(s.ensureNotNull)(t.dataSourceForId(i)).setCurrency(e)
|
|
}), this._chartWidget.model().selectionMacro(e => {
|
|
e.clearSelection()
|
|
})
|
|
}
|
|
}
|
|
},
|
|
xrEm: function(e, t, i) {},
|
|
xt3Q: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "TradingViewApiBase", (function() {
|
|
return s
|
|
}));
|
|
class s {
|
|
constructor(e) {
|
|
this._studyTemplatesDrawer = null;
|
|
const {
|
|
chartApiInstance: t,
|
|
chartWidgetCollection: i,
|
|
studyMarket: s,
|
|
financialsDialog: r,
|
|
saveChartService: n,
|
|
loadChartService: o
|
|
} = e;
|
|
this._chartWidgetCollection = i, this._studyMarket = s, this._financialsDialog = r,
|
|
this._saveChartService = n, this._loadChartLayoutDialog = o, this
|
|
._intervalsService = null
|
|
}
|
|
dialogs() {
|
|
var e, t, i, s, r, n;
|
|
return {
|
|
Indicators: this._studyMarket,
|
|
Financials: this._financialsDialog,
|
|
Compare: this._chartWidgetCollection.getCompareDialogRenderer(),
|
|
ObjectsTree: null,
|
|
ChartProperties: this._chartWidgetCollection.getChartPropertiesDialogRenderer(),
|
|
ChartLayoutSaveAs: null !== (t = null === (e = this._saveChartService) ||
|
|
void 0 === e ? void 0 : e.getSaveAsController()) && void 0 !== t ? t :
|
|
null,
|
|
ChartLayoutRename: null !== (s = null === (i = this._saveChartService) ||
|
|
void 0 === i ? void 0 : i.getRenameController()) && void 0 !== s ? s :
|
|
null,
|
|
ChartLayoutCreate: null !== (n = null === (r = this._saveChartService) ||
|
|
void 0 === r ? void 0 : r.getCreateController()) && void 0 !== n ? n :
|
|
null,
|
|
ChartLayoutLoad: this._loadChartLayoutDialog
|
|
}
|
|
}
|
|
studyTemplatesDrawerApi() {
|
|
throw new Error("not implemented")
|
|
}
|
|
intervalsService() {
|
|
throw new Error("not implemented")
|
|
}
|
|
setBrokerName(e) {
|
|
this._chartWidgetCollection.setBroker(e)
|
|
}
|
|
}
|
|
},
|
|
"xz+e": function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Ss5c").LineDataSource,
|
|
r = i("7KDR").Action,
|
|
n = i("Ocx9").DefaultProperty,
|
|
o = i("j3hX").LineToolColorsProperty,
|
|
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14],
|
|
l = [{
|
|
value: a[0],
|
|
title: window.t("Supermillennium")
|
|
}, {
|
|
value: a[1],
|
|
title: window.t("Millennium")
|
|
}, {
|
|
value: a[2],
|
|
title: window.t("Submillennium")
|
|
}, {
|
|
value: a[3],
|
|
title: window.t("Grand Supercycle")
|
|
}, {
|
|
value: a[4],
|
|
title: window.t("Supercycle")
|
|
}, {
|
|
value: a[5],
|
|
title: window.t("Cycle")
|
|
}, {
|
|
value: a[6],
|
|
title: window.t("Primary")
|
|
}, {
|
|
value: a[7],
|
|
title: window.t("Intermediate")
|
|
}, {
|
|
value: a[8],
|
|
title: window.t("Minor", {
|
|
context: "wave"
|
|
})
|
|
}, {
|
|
value: a[9],
|
|
title: window.t("Minute", {
|
|
context: "wave"
|
|
})
|
|
}, {
|
|
value: a[10],
|
|
title: window.t("Minuette")
|
|
}, {
|
|
value: a[11],
|
|
title: window.t("Subminuette")
|
|
}, {
|
|
value: a[12],
|
|
title: window.t("Micro")
|
|
}, {
|
|
value: a[13],
|
|
title: window.t("Submicro")
|
|
}, {
|
|
value: a[14],
|
|
title: window.t("Minuscule")
|
|
}];
|
|
class c extends s {
|
|
constructor(e, t) {
|
|
super(e, t || c.createProperties()), this.version = c.version, i.e("lt-pane-views")
|
|
.then(i.t.bind(null, "Ht/7", 7)).then(({
|
|
ElliottLabelsPaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
static migrateState(e) {
|
|
var t = {
|
|
0: 11,
|
|
1: 10,
|
|
2: 9,
|
|
3: 8,
|
|
4: 7,
|
|
5: 6,
|
|
6: 5,
|
|
7: 4,
|
|
8: 3
|
|
},
|
|
i = {
|
|
0: 11,
|
|
1: 8
|
|
};
|
|
"LineToolElliottSubminuette" === e.type && (e.type = "LineToolElliottImpulse", e
|
|
.state.degree = t[e.state.wavesize]), "LineToolElliottMinor" === e.type && (
|
|
e.type = "LineToolElliottImpulse", e.state.degree = t[e.state.wavesize]),
|
|
"LineToolElliottCircle" === e.type && (e.type = "LineToolElliottImpulse", e
|
|
.state.degree = t[e.state.wavesize]), "LineToolElliottMinorRetr" === e
|
|
.type && (e.type = "LineToolElliottCorrection", e.state.degree = i[e.state
|
|
.wavesize]), "LineToolElliottMajorRetr" === e.type && (e.type =
|
|
"LineToolElliottCorrection", e.state.degree = i[e.state.wavesize])
|
|
}
|
|
migrateVersion(e, t, i) {
|
|
if (i.properties.hasChild("background") && i.properties.removeProperty(
|
|
"background"), i.properties.hasChild("backgroundColor") && i.properties
|
|
.removeProperty("backgroundColor"), i.properties.hasChild("showBackground") && i
|
|
.properties.removeProperty("showBackground"), 1 === e) {
|
|
var s = Object.assign({}, this._timePoint[0]);
|
|
this._timePoint.unshift(s), this._points.length > 0 && (s = Object.assign({},
|
|
this._points[0]), this._points.unshift(s))
|
|
}
|
|
}
|
|
applyTemplate(e) {
|
|
delete e.background, delete e.backgroundColor, delete e.showBackground, super
|
|
.applyTemplate(e)
|
|
}
|
|
name() {
|
|
return "Elliott Labels"
|
|
}
|
|
additionalActions(e) {
|
|
var t = this;
|
|
return [new r({
|
|
label: window.t("Degree"),
|
|
subItems: a.map((function(i) {
|
|
var s = l.filter((function(e) {
|
|
return e.value === i
|
|
}))[0];
|
|
return new r({
|
|
label: s.title,
|
|
checkable: !0,
|
|
checked: t.properties().degree
|
|
.value() === i,
|
|
onExecute: function() {
|
|
e.setProperty(t.properties()
|
|
.degree, i,
|
|
"Change Elliott Degree")
|
|
}
|
|
})
|
|
}))
|
|
})]
|
|
}
|
|
label(e) {
|
|
var t = a.length - this.properties().degree.value() - 1,
|
|
i = Math.floor(t / 3);
|
|
return {
|
|
group: i,
|
|
bold: !!(i % 2),
|
|
decoration: ["", "brackets", "circle"][t % 3],
|
|
label: this.labelsGroup()[i][e]
|
|
}
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "UHSU")))
|
|
.ElliottPatternDefinitionsViewModel
|
|
}
|
|
availableDegreesValues() {
|
|
return l
|
|
}
|
|
static createProperties(e) {
|
|
var t = new n("linetoolelliott", e);
|
|
return c._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
s._configureProperties(e), e.addChild("linesColors", new o([e.color])), e
|
|
.addExclusion("linesColors")
|
|
}
|
|
}
|
|
c.version = 4;
|
|
class h extends c {
|
|
pointsCount() {
|
|
return 6
|
|
}
|
|
static _configureProperties(e) {
|
|
c._configureProperties(e)
|
|
}
|
|
}
|
|
class u extends h {
|
|
constructor(e, t) {
|
|
super(e, t || u.createProperties())
|
|
}
|
|
name() {
|
|
return "Elliott Impulse Wave (12345)"
|
|
}
|
|
labelsGroup() {
|
|
return u._labelsGroups
|
|
}
|
|
static createProperties(e) {
|
|
var t = new n("linetoolelliottimpulse", e);
|
|
return u._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
h._configureProperties(e)
|
|
}
|
|
}
|
|
u._labelsGroups = [
|
|
["0", "1", "2", "3", "4", "5"],
|
|
["0", "i", "ii", "iii", "iv", "v"],
|
|
["0", "1", "2", "3", "4", "5"],
|
|
["0", "I", "II", "III", "IV", "V"],
|
|
["0", "1", "2", "3", "4", "5"]
|
|
];
|
|
class d extends h {
|
|
constructor(e, t) {
|
|
super(e, t || d.createProperties())
|
|
}
|
|
name() {
|
|
return "Elliott Triangle Wave (ABCDE)"
|
|
}
|
|
labelsGroup() {
|
|
return d._labelsGroups
|
|
}
|
|
static createProperties(e) {
|
|
var t = new n("linetoolelliotttriangle", e);
|
|
return d._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
h._configureProperties(e)
|
|
}
|
|
}
|
|
d._labelsGroups = [
|
|
["0", "A", "B", "C", "D", "E"],
|
|
["0", "a", "b", "c", "d", "e"],
|
|
["0", "A", "B", "C", "D", "E"],
|
|
["0", "a", "b", "c", "d", "e"],
|
|
["0", "A", "B", "C", "D", "E"]
|
|
];
|
|
class p extends h {
|
|
constructor(e, t) {
|
|
super(e, t || p.createProperties())
|
|
}
|
|
name() {
|
|
return "Elliott Triple Combo Wave (WXYXZ)"
|
|
}
|
|
labelsGroup() {
|
|
return p._labelsGroups
|
|
}
|
|
static createProperties(e) {
|
|
var t = new n("linetoolelliotttriplecombo", e);
|
|
return p._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
h._configureProperties(e)
|
|
}
|
|
}
|
|
p._labelsGroups = [
|
|
["0", "W", "X", "Y", "X", "Z"],
|
|
["0", "w", "x", "y", "x", "z"],
|
|
["0", "W", "X", "Y", "X", "Z"],
|
|
["0", "w", "x", "y", "x", "z"],
|
|
["0", "W", "X", "Y", "X", "Z"]
|
|
];
|
|
class _ extends c {
|
|
pointsCount() {
|
|
return 4
|
|
}
|
|
static _configureProperties(e) {
|
|
c._configureProperties(e)
|
|
}
|
|
}
|
|
class m extends _ {
|
|
constructor(e, t) {
|
|
super(e, t || m.createProperties())
|
|
}
|
|
name() {
|
|
return "Elliott Correction Wave (ABC)"
|
|
}
|
|
labelsGroup() {
|
|
return m._labelsGroups
|
|
}
|
|
static createProperties(e) {
|
|
var t = new n("linetoolelliottcorrection", e);
|
|
return m._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
_._configureProperties(e)
|
|
}
|
|
}
|
|
m._labelsGroups = [
|
|
["0", "A", "B", "C"],
|
|
["0", "a", "b", "c"],
|
|
["0", "A", "B", "C"],
|
|
["0", "a", "b", "c"],
|
|
["0", "A", "B", "C"]
|
|
];
|
|
class f extends _ {
|
|
constructor(e, t) {
|
|
super(e, t || f.createProperties())
|
|
}
|
|
name() {
|
|
return "Elliott Double Combo Wave (WXY)"
|
|
}
|
|
labelsGroup() {
|
|
return f._labelsGroups
|
|
}
|
|
static createProperties(e) {
|
|
var t = new n("linetoolelliottdoublecombo", e);
|
|
return f._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
_._configureProperties(e)
|
|
}
|
|
}
|
|
f._labelsGroups = [
|
|
["0", "W", "X", "Y"],
|
|
["0", "w", "x", "y"],
|
|
["0", "W", "X", "Y"],
|
|
["0", "w", "x", "y"],
|
|
["0", "W", "X", "Y"]
|
|
], t.LineToolElliott = c, t.LineToolElliottImpulse = u, t.LineToolElliottTriangle = d, t
|
|
.LineToolElliottTripleCombo = p, t.LineToolElliottCorrection = m, t
|
|
.LineToolElliottDoubleCombo = f
|
|
},
|
|
xzdg: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("Eyy1"),
|
|
r = i("YFKU"),
|
|
n = i("EsvI"),
|
|
o = i("H0vP"),
|
|
a = i("ikwP"),
|
|
l = i("ogJP"),
|
|
c = i("jFln"),
|
|
h = i("u+0B"),
|
|
u = i("XlJ7"),
|
|
d = i("JWMC"),
|
|
p = i("zDbI"),
|
|
_ = i("CPmC"),
|
|
m = i("gAom"),
|
|
f = i("Hr11"),
|
|
g = i("+cnz"),
|
|
b = i("CxTi");
|
|
class v {
|
|
constructor() {
|
|
this._width = null, this._currencyInfo = null, this._unitInfo = null, this
|
|
._fontSize = 0, this._currencyAndUnitLabelsWrapper = document.createElement(
|
|
"div"), this._currencyAndUnitLabelsWrapper.className = b[
|
|
"price-axis-currency-label-wrapper"], this._controlsContainer = document
|
|
.createElement("table"), this._controlsContainer.className = b[
|
|
"price-axis-currency-label"], this._currencyAndUnitLabelsWrapper
|
|
.appendChild(this._controlsContainer), this._currencyLabelTr = document
|
|
.createElement("tr"), this._currencyLabelTr.className = b[
|
|
"price-axis-currency-label-dropdown"], this._currencyLabelTr.classList.add(
|
|
"apply-common-tooltip"), Object(_.b)(this._currencyLabelTr, "text", e =>
|
|
this._currencyTooltipContent());
|
|
const e = document.createElement("td");
|
|
this._currencyText = document.createElement("span"), this._currencyText.className =
|
|
b["price-axis-currency-label-text"],
|
|
e.appendChild(this._currencyText), this._currencyLabelTr.appendChild(e);
|
|
const t = document.createElement("td");
|
|
this._currencyArrowDown = document.createElement("span"), this._currencyArrowDown
|
|
.className = b["price-axis-currency-label-arrow-down"], this._currencyArrowDown
|
|
.innerHTML = g, t.appendChild(this._currencyArrowDown), this._currencyLabelTr
|
|
.appendChild(t), this._unitLabelTr = document.createElement("tr"), this
|
|
._unitLabelTr.className = b["price-axis-currency-label-dropdown"], this
|
|
._unitLabelTr.classList.add("apply-common-tooltip"), Object(_.b)(this
|
|
._unitLabelTr, "text", e => this._unitTooltipContent());
|
|
const i = document.createElement("td");
|
|
this._unitText = document.createElement("span"), this._unitText.className = b[
|
|
"price-axis-currency-label-text"], i.appendChild(this._unitText), this
|
|
._unitLabelTr.appendChild(i);
|
|
const s = document.createElement("td");
|
|
this._unitArrowDown = document.createElement("span"), this._unitArrowDown
|
|
.className = b["price-axis-currency-label-arrow-down"], this._unitArrowDown
|
|
.innerHTML = g, s.appendChild(this._unitArrowDown), this._unitLabelTr
|
|
.appendChild(s), this._controlsContainer.appendChild(this._currencyLabelTr),
|
|
this._controlsContainer.appendChild(this._unitLabelTr), this.hideCurrency(),
|
|
this.hideUnit()
|
|
}
|
|
element() {
|
|
return this._currencyAndUnitLabelsWrapper
|
|
}
|
|
currencyLabelElement() {
|
|
return this._currencyLabelTr
|
|
}
|
|
unitLabelElement() {
|
|
return this._unitLabelTr
|
|
}
|
|
isVisible() {
|
|
return this.currencyLabelVisible() || this.unitLabelVisible()
|
|
}
|
|
width() {
|
|
if (null !== this._width) return this._width;
|
|
let e = 0;
|
|
if (this.currencyLabelVisible()) {
|
|
const t = this._currencyLabelTr.getBoundingClientRect();
|
|
e = Math.max(e, t.right - t.left + 1 + 8)
|
|
}
|
|
if (this.unitLabelVisible()) {
|
|
const t = this._unitLabelTr.getBoundingClientRect();
|
|
e = Math.max(e, t.right - t.left + 1 + 8)
|
|
}
|
|
return this._width = e, e
|
|
}
|
|
drawLabel(e, t, i, s) {
|
|
if (!this.isVisible()) return;
|
|
const r = this.currencyLabelVisible() ? this._currencyText.textContent || "" : this
|
|
._unitText.textContent || "",
|
|
n = this._unitText.textContent || "";
|
|
e.font = Object(u.makeFont)(this._fontSize, p.CHART_FONT_FAMILY);
|
|
const o = new h.TextWidthCache,
|
|
l = 2 * Number(b.css_value_currency_label_text_horizontal_padding) + Math.max(o
|
|
.measureText(e, r), o.measureText(e, n)),
|
|
c = o.yMidCorrection(e, r),
|
|
d = o.yMidCorrection(e, n),
|
|
_ = Math.round(t / 2 * i),
|
|
g = Object(f.ceiledEven)(l * i / 2),
|
|
v = this._controlsContainer.style,
|
|
S = Math.round(this.labelTop() * i),
|
|
y = Math.round(this.labelBottom() * i),
|
|
w = y - S,
|
|
P = Math.round(Number(b.css_value_currency_label_radius) * i);
|
|
Object(m.drawRoundRect)(e, _ - g, S, 2 * g, w, P), e.fillStyle = v.backgroundColor,
|
|
e.fill();
|
|
const C = Math.max(1, Math.floor(i));
|
|
e.lineWidth = C, e.strokeStyle = s ? b.css_value_border_color_dark : b
|
|
.css_value_border_color_light, Object(m.drawRoundRect)(e, _ - g + C / 2, S + C /
|
|
2, 2 * g - C, w - C, P), e.stroke();
|
|
const x = S + (y - S - 1) / 2,
|
|
T = this._isMultiLine();
|
|
T && Object(m.drawHorizontalLine)(e, Math.floor(x + C / 2), _ - g, _ + g);
|
|
const I = this._oneLineHeight() / 2 * i,
|
|
M = T ? Math.ceil(x - I) : x,
|
|
O = Math.ceil(x + I);
|
|
e.fillStyle = v.color, e.textBaseline = "middle", e.textAlign = "center", Object(a
|
|
.drawScaled)(e, i, () => e.fillText(r, _ / i, (M + c) / i)), T && Object(a
|
|
.drawScaled)(e, i, () => e.fillText(n, _ / i, (O + d) / i))
|
|
}
|
|
showCurrency() {
|
|
this._currencyLabelTr.classList.remove("js-hidden"), this._width = null, this
|
|
._updateMultiLine(), this._updateVisibility()
|
|
}
|
|
hideCurrency() {
|
|
this._currencyLabelTr.classList.add("js-hidden"), this._width = null, this
|
|
._updateMultiLine(), this._updateVisibility()
|
|
}
|
|
showUnit() {
|
|
this._unitLabelTr.classList.remove("js-hidden"), this._width = null, this
|
|
._updateMultiLine(), this._updateVisibility()
|
|
}
|
|
hideUnit() {
|
|
this._unitLabelTr.classList.add("js-hidden"), this._width = null, this
|
|
._updateMultiLine(), this._updateVisibility()
|
|
}
|
|
currencyLabelVisible() {
|
|
return !this._currencyLabelTr.classList.contains("js-hidden")
|
|
}
|
|
unitLabelVisible() {
|
|
return !this._unitLabelTr.classList.contains("js-hidden")
|
|
}
|
|
setCurrencyInfo(e) {
|
|
if (this._currencyInfo === e) return !1;
|
|
this._currencyInfo = e;
|
|
const t = null === e.selectedCurrency ? Object(r.t)("Mixed") : Object(s
|
|
.ensureDefined)(e.displayedValues.get(e.selectedCurrency));
|
|
return this._currencyText.textContent !== t && (this._currencyText.textContent = t,
|
|
this._width = null), this._currencyArrowDown.classList.contains(
|
|
"js-hidden") !== e.readOnly && (this._currencyArrowDown.classList.toggle(
|
|
"js-hidden", e.readOnly), this._currencyLabelTr.classList.toggle(b
|
|
.readonly, e.readOnly), this._width = null), !0
|
|
}
|
|
setUnitInfo(e) {
|
|
if (null !== this._unitInfo && this._unitInfo.selectedUnit === e.selectedUnit &&
|
|
0 === this._unitInfo.availableGroups.size == (0 === e.availableGroups.size) &&
|
|
this._unitInfo.originalUnits.size === e.originalUnits.size) return this
|
|
._unitInfo = e, !1;
|
|
this._unitInfo = e;
|
|
const t = null === e.selectedUnit ? Object(r.t)("Mixed") : Object(s.ensureDefined)(e
|
|
.names.get(e.selectedUnit));
|
|
return this._unitText.textContent !== t && (this._unitText.textContent = t, this
|
|
._width = null), this._unitArrowDown.classList.contains("js-hidden") !== (
|
|
0 === e.availableGroups.size) && (this._unitArrowDown.classList.toggle(
|
|
"js-hidden", 0 === e.availableGroups.size), this._unitLabelTr.classList
|
|
.toggle(b.readonly, 0 === e.availableGroups.size), this._width = null), !0
|
|
}
|
|
updateColors(e, t) {
|
|
const i = this._controlsContainer.style;
|
|
i.background = e, i.color = t
|
|
}
|
|
currencyInfo() {
|
|
return this._currencyInfo
|
|
}
|
|
unitInfo() {
|
|
return this._unitInfo
|
|
}
|
|
setFontSize(e) {
|
|
this._fontSize !== e && (this._fontSize = e, this._currencyLabelTr.style.fontSize =
|
|
e + "px", this._unitLabelTr.style.fontSize = e + "px", this._width = null,
|
|
this._setLineHeight(this._oneLineHeight()))
|
|
}
|
|
labelTop() {
|
|
return Number(b.css_value_currency_label_top)
|
|
}
|
|
labelBottom() {
|
|
const e = this.labelTop(),
|
|
t = this._oneLineHeight();
|
|
let i = e + t;
|
|
return this._isMultiLine() && (i += t + 1), i
|
|
}
|
|
_currencyTooltipContent() {
|
|
const e = this._currencyInfo;
|
|
return null === e ? "" : null === e.selectedCurrency ? Array.from(e.currencies).map(
|
|
t => Object(s.ensureDefined)(e.displayedValues.get(t))).join(", ") : ""
|
|
}
|
|
_unitTooltipContent() {
|
|
const e = this._unitInfo;
|
|
return null === e ? "" : null === e.selectedUnit ? Array.from(e.units).map(t =>
|
|
Object(s.ensureDefined)(e.names.get(t))).join(", ") : e.descriptions.get(e
|
|
.selectedUnit) || ""
|
|
}
|
|
_setLineHeight(e) {
|
|
this._currencyLabelTr.style.lineHeight = e + "px", this._unitLabelTr.style
|
|
.lineHeight = e + "px"
|
|
}
|
|
_updateMultiLine() {
|
|
this._controlsContainer.classList.toggle(b.multiline, this._isMultiLine())
|
|
}
|
|
_updateVisibility() {
|
|
this._currencyAndUnitLabelsWrapper.classList.toggle("js-hidden", !this.isVisible())
|
|
}
|
|
_oneLineHeight() {
|
|
return 7 + this._fontSize
|
|
}
|
|
_isMultiLine() {
|
|
return this.unitLabelVisible() && this.currencyLabelVisible()
|
|
}
|
|
}
|
|
async function S(e, t, s) {
|
|
const [r, n] = await Promise.all([Promise.all([i.e("react"), i.e(1), i.e(3), i.e(4), i
|
|
.e(6), i.e(8), i.e(9), i.e(13), i.e(19), i.e(29), i.e(66), i.e(83),
|
|
i.e(0), i.e(2), i.e(5), i.e(18), i.e("currency-label-menu")
|
|
]).then(i.bind(null, "9agd")), t()]);
|
|
return r.showUnitConversion(e, s, n)
|
|
}
|
|
var y = i("5VQP");
|
|
var w = i("3/8U"),
|
|
P = i("nqXy");
|
|
i.d(t, "PriceAxisWidgetBase", (function() {
|
|
return x
|
|
}));
|
|
const C = {
|
|
contextMenuEnabled: !0,
|
|
currencyConversionEnabled: !1,
|
|
unitConversionEnabled: !1,
|
|
countdownEnabled: !0,
|
|
contextMenu: {
|
|
general: !0,
|
|
source: !0
|
|
},
|
|
pressedMouseMoveScale: !0,
|
|
mouseWheelScale: !0,
|
|
croppedTickMarks: !0
|
|
};
|
|
class x {
|
|
constructor(e, t, i, s, r, n, o) {
|
|
this._priceScale = null, this._widthCache = new h.TextWidthCache(500), this._color =
|
|
null, this._fontSize = null, this._currencyFontSize = 0, this
|
|
._currencyLabelWidth = null, this._isVisible = !0, this._updateTimeout = null,
|
|
this._currencyMenu = null, this._unitMenu = null, this._prevOptimalWidth = 0,
|
|
this._size = new a.Size(-1, -1), this._currentCursorClassName = "", this
|
|
._mouseDown = !1, this._destroyed = !1, this._highlighted = !1, this
|
|
._mouseWheelHelper = null, this._dragScaleActive = !1, this._pane = e, this
|
|
._undoModel = t, this._properties = i, this._isLeft = "left" === s, this
|
|
._options = Object(l.merge)(Object(l.clone)(C), r), this
|
|
._rendererOptionsProvider = n, this._backgroundBasedTheme = o, this._cell =
|
|
document.createElement("div"), this._cell.className = "price-axis", this._cell
|
|
.style.width = "25px", this._cell.style.left = "0", this
|
|
._canvasConfiguredHandler = () => {
|
|
this._undoModel.model().lightUpdate()
|
|
}, this._canvasBinding = Object(a.createBoundCanvas)(this._cell, new a.Size(16,
|
|
16)), this._canvasBinding.subscribeCanvasConfigured(this
|
|
._canvasConfiguredHandler);
|
|
const c = this._canvasBinding.canvas;
|
|
c.style.position = "absolute", c.style.zIndex = "1", c.style.left = "0", c.style
|
|
.top = "0", this._topCanvasConfiguredHandler = () => this._undoModel.model()
|
|
.lightUpdate(), this._topCanvasBinding = Object(a.createBoundCanvas)(this._cell,
|
|
new a.Size(16, 16)), this._topCanvasBinding.subscribeCanvasConfigured(this
|
|
._topCanvasConfiguredHandler);
|
|
const u = this._topCanvasBinding.canvas;
|
|
u.style.position = "absolute", u.style.zIndex = "2", u.style.left = "0", u.style
|
|
.top = "0", this._options.currencyConversionEnabled || this._options
|
|
.unitConversionEnabled ? (this._currencyLabel = new v, this._cell.appendChild(
|
|
this._currencyLabel.element()), this._currencyLabel
|
|
.currencyLabelElement().addEventListener("click", () => this
|
|
._showCurrenciesContextMenu()), this._currencyLabel.unitLabelElement()
|
|
.addEventListener("click", () => this._showUnitsContextMenu())) : this
|
|
._currencyLabel = null, this._properties.childs().fontSize.subscribe(this, this
|
|
._onFontSizeChanged), this._options.mouseWheelScale && (this
|
|
._mouseWheelHelper = new P.a, this._cell.addEventListener("wheel", this
|
|
._onMousewheel.bind(this), {
|
|
passive: !1
|
|
}))
|
|
}
|
|
getElement() {
|
|
return this._cell
|
|
}
|
|
onOptimalWidthNeedToBeRecalculated(e) {
|
|
const t = this.optimalWidth();
|
|
(this._prevOptimalWidth < t || e) && null === this._updateTimeout && (this
|
|
._updateTimeout = setTimeout(() => {
|
|
this._undoModel.model().fullUpdate(), this._updateTimeout = null
|
|
}, 100)), this._prevOptimalWidth = t
|
|
}
|
|
optimalWidth() {
|
|
var e;
|
|
if (!this.isVisible()) return 0;
|
|
let t = 0;
|
|
const i = this.rendererOptions();
|
|
if (this._pane.hasState()) {
|
|
const i = Object(a.getContext2D)(this._canvasBinding.canvas);
|
|
Object(c.setFont)(i, this.baseFont());
|
|
const s = this.backLabels(!0);
|
|
for (let e = s.length; e--;) {
|
|
if (!s[e].isAxisLabelVisible()) continue;
|
|
const r = this._widthCache.measureText(i, s[e].text());
|
|
t = Math.max(t, r);
|
|
const n = s[e].secondLineText();
|
|
n && (t = Math.max(t, this._widthCache.measureText(i, n)));
|
|
const o = s[e].thirdLineText();
|
|
o && (t = Math.max(t, this._widthCache.measureText(i, o)))
|
|
}
|
|
const r = this.priceScale(),
|
|
n = r.marks();
|
|
n.length > 0 && (t = Math.max(t, this._widthCache.measureText(i, n[0].label),
|
|
this._widthCache.measureText(i, n[n.length - 1].label)));
|
|
const o = (null === (e = r.mainSource()) || void 0 === e ? void 0 : e
|
|
.firstValue()) || null;
|
|
if (null !== o) {
|
|
const e = r.coordinateToPrice(1, o),
|
|
s = r.coordinateToPrice(this._size.h - 2, o);
|
|
t = Math.max(t, this._widthCache.measureText(i, r.formatPrice(Math.floor(
|
|
Math.min(e, s)) + .11111111111111, o)), this._widthCache
|
|
.measureText(i, r.formatPrice(Math.ceil(Math.max(e, s)) -
|
|
.11111111111111, o)))
|
|
}
|
|
}
|
|
let r = 0;
|
|
this._isCurrencyLabelVisible() && (null === this._currencyLabelWidth && (this
|
|
._currencyLabelWidth = Object(s.ensureNotNull)(this._currencyLabel)
|
|
.width()), r = this._currencyLabelWidth);
|
|
const n = t || 34;
|
|
let o = Math.max(r, Math.ceil(i.borderSize + i.offsetSize + i.paddingInner + i
|
|
.paddingOuter + n + 4));
|
|
return o += o % 2, o
|
|
}
|
|
backLabels(e) {
|
|
const t = [],
|
|
i = this._grouppedSources(),
|
|
s = s => {
|
|
for (const r of s) {
|
|
if (!e && i.topLevelSources.has(r)) continue;
|
|
const s = r.priceAxisViews(this._pane.state(), this.priceScale());
|
|
if (s)
|
|
for (const e of s) t.push(e)
|
|
}
|
|
};
|
|
return s(i.sources), s(this._pane.state().customSources()), t
|
|
}
|
|
getImage() {
|
|
const e = this._size,
|
|
t = Object(a.createDisconnectedCanvas)(document, e);
|
|
if (Object(a.getPrescaledContext2D)(t).drawImage(this._canvasBinding.canvas, 0, 0, e
|
|
.w, e.h), null !== this._currencyLabel && this._currencyLabel.isVisible()) {
|
|
const i = this._undoModel.model().isDark();
|
|
this._currencyLabel.drawLabel(Object(a.getContext2D)(t), e.w, Object(a
|
|
.getCanvasDevicePixelRatio)(t), i)
|
|
}
|
|
return t
|
|
}
|
|
paint(e) {
|
|
if (this._isVisible && e !== o.InvalidationLevel.None) {
|
|
if (e > o.InvalidationLevel.Cursor) {
|
|
const e = Object(a.getContext2D)(this._canvasBinding.canvas);
|
|
this._alignLabels(), this._drawBackground(e, this._canvasBinding
|
|
.pixelRatio), this._drawBorder(e, this._canvasBinding.pixelRatio),
|
|
this
|
|
._pane.hasState() && (this._updateCurrencyLabel(), this._drawTickMarks(
|
|
e, this._canvasBinding.pixelRatio), this._drawBackLabels(e, this
|
|
._canvasBinding.pixelRatio))
|
|
}
|
|
if (this._pane.hasState()) {
|
|
const e = Object(a.getContext2D)(this._topCanvasBinding.canvas),
|
|
t = this._topCanvasBinding.pixelRatio;
|
|
e.clearRect(0, 0, Math.ceil(this._size.w * t) + 1, Math.ceil(this._size.h *
|
|
t) + 1), this._drawCrossHairLabel(e, t)
|
|
}
|
|
}
|
|
}
|
|
priceScale() {
|
|
return Object(s.ensureNotNull)(this._priceScale)
|
|
}
|
|
setPriceScale(e) {
|
|
this._priceScale !== e && (null !== this._priceScale && (this._priceScale
|
|
.onMarksChanged().unsubscribe(this, this
|
|
.onOptimalWidthNeedToBeRecalculated), this._priceScale.modeChanged()
|
|
.unsubscribeAll(this)), this._priceScale = e, null !== e && (e
|
|
.onMarksChanged().subscribe(this, this
|
|
.onOptimalWidthNeedToBeRecalculated), e.modeChanged().subscribe(
|
|
this, () => this.onOptimalWidthNeedToBeRecalculated(!0))))
|
|
}
|
|
isVisible() {
|
|
return this._isVisible
|
|
}
|
|
setVisible(e) {
|
|
(e = !!e) !== this._isVisible && (this._cell.style.display = e ? "table-cell" :
|
|
"none", this._isVisible = e)
|
|
}
|
|
destroy() {
|
|
null !== this._currencyMenu && (this._currencyMenu.close(), this._currencyMenu =
|
|
null), null !== this._unitMenu && (this._unitMenu.close(), this._unitMenu =
|
|
null), this._topCanvasBinding.unsubscribeCanvasConfigured(this
|
|
._topCanvasConfiguredHandler), this._topCanvasBinding.destroy(), this
|
|
._canvasBinding.unsubscribeCanvasConfigured(this._canvasConfiguredHandler), this
|
|
._canvasBinding.destroy(), null !== this._priceScale && (this._priceScale
|
|
.onMarksChanged().unsubscribe(this, this
|
|
.onOptimalWidthNeedToBeRecalculated), this._priceScale.modeChanged()
|
|
.unsubscribeAll(this)), this._priceScale = null, this._updateTimeout && (
|
|
clearTimeout(this._updateTimeout), this._updateTimeout = null), this
|
|
._properties.childs().fontSize.unsubscribe(this, this._onFontSizeChanged), this
|
|
._destroyed = !0
|
|
}
|
|
setHighlighted(e) {
|
|
this._highlighted = e
|
|
}
|
|
backgroundColor() {
|
|
return this._pane.state().model().backgroundColor().value()
|
|
}
|
|
backgroundTopColor() {
|
|
return this._pane.state().model().backgroundTopColor().value()
|
|
}
|
|
lineColor() {
|
|
return this._properties.childs().lineColor.value()
|
|
}
|
|
textColor() {
|
|
return this._properties.childs().textColor.value()
|
|
}
|
|
fontSize() {
|
|
return this._properties.childs().fontSize.value()
|
|
}
|
|
baseFont() {
|
|
return Object(u.makeFont)(this.fontSize(), p.CHART_FONT_FAMILY, "")
|
|
}
|
|
rendererOptions() {
|
|
let e = this._rendererOptionsProvider.options();
|
|
return this._color === e.color && this._fontSize === e.fontSize || (this._color = e
|
|
.color), this._fontSize !== e.fontSize && (this._widthCache.reset(), this
|
|
._fontSize = e.fontSize, this._currencyLabelWidth = null, this
|
|
._currencyFontSize = 0, this._updateCurrencyLabelFont(), this
|
|
.onOptimalWidthNeedToBeRecalculated()), e
|
|
}
|
|
mouseEnterEvent(e) {
|
|
this._mouseEnterOrTouchStartEvent(e)
|
|
}
|
|
mouseMoveEvent(e) {
|
|
this._mouseOrTouchMoveEvent(e)
|
|
}
|
|
mouseDownEvent(e) {
|
|
this._mouseDownOrTouchStartEvent(e)
|
|
}
|
|
touchStartEvent(e) {
|
|
this._mouseOrTouchMoveEvent(e), this._mouseEnterOrTouchStartEvent(e), this
|
|
._mouseDownOrTouchStartEvent(e)
|
|
}
|
|
pressedMouseMoveEvent(e) {
|
|
this._pressedMouseOrTouchMoveEvent(e)
|
|
}
|
|
touchMoveEvent(e) {
|
|
this._pressedMouseOrTouchMoveEvent(e)
|
|
}
|
|
mouseDownOutsideEvent() {
|
|
if (this._dragScaleActive) {
|
|
const e = this._pane.state(),
|
|
t = this.priceScale();
|
|
this._mouseDown && (this._mouseDown = !1, this._undoModel.endScalePrice(e, t),
|
|
this.restoreDefaultCursor()), this._dragScaleActive = !1
|
|
}
|
|
}
|
|
mouseUpEvent(e) {
|
|
this._mouseUpOrTouchEndEvent(e)
|
|
}
|
|
touchEndEvent(e) {
|
|
this._mouseLeaveOrTouchEndEvent(e), this._mouseUpOrTouchEndEvent(e)
|
|
}
|
|
mouseClickEvent(e) {
|
|
this._mouseClickOrTapEvent(e)
|
|
}
|
|
tapEvent(e) {
|
|
this._mouseClickOrTapEvent(e)
|
|
}
|
|
mouseLeaveEvent(e) {
|
|
this._mouseLeaveOrTouchEndEvent(e)
|
|
}
|
|
mouseDoubleClickEvent(e) {
|
|
this._mouseDoubleClickOrDoubleTapEvent(e)
|
|
}
|
|
doubleTapEvent(e) {
|
|
this._mouseDoubleClickOrDoubleTapEvent(e)
|
|
}
|
|
contextMenuEvent(e) {
|
|
this._contextMenuOrTouchContextMenuEvent(e)
|
|
}
|
|
touchContextMenuEvent(e) {
|
|
this._contextMenuOrTouchContextMenuEvent(e)
|
|
}
|
|
reset() {
|
|
const e = this._pane.state(),
|
|
t = this.priceScale();
|
|
this._undoModel.resetPriceScale(e, t), this.onOptimalWidthNeedToBeRecalculated(!0)
|
|
}
|
|
sizeReady() {
|
|
return this.getWidth() >= this.optimalWidth() && null === this._updateTimeout
|
|
}
|
|
_grouppedSources() {
|
|
var e;
|
|
const t = this._pane,
|
|
i = t.state().model(),
|
|
s = this._sameSideSources().slice(),
|
|
r = t.state(),
|
|
n = this.priceScale(),
|
|
o = new Set,
|
|
a = null !== (e = i.lineBeingEdited()) && void 0 !== e ? e : i
|
|
.lineBeingCreated();
|
|
a && o.add(a);
|
|
const l = i.customSourceBeingMoved();
|
|
null !== l && o.add(l), i.sourcesBeingMoved().forEach(e => o.add(e)), i.selection()
|
|
.allSources().forEach(e => o.add(e));
|
|
const c = i.hoveredSource();
|
|
null !== c && o.add(c);
|
|
if (n === r.defaultPriceScale()) {
|
|
const e = this._pane.state().dataSources();
|
|
for (const t of e) r.isOverlay(t) && s.push(t)
|
|
}
|
|
return {
|
|
sources: s,
|
|
topLevelSources: o
|
|
}
|
|
}
|
|
_isCurrencyLabelVisible() {
|
|
return null !== this._currencyLabel && this._currencyLabel.isVisible()
|
|
}
|
|
_updateCurrencyLabel() {
|
|
if (null !== this._currencyLabel) {
|
|
if (this._options.currencyConversionEnabled) {
|
|
const e = this.priceScale().currency(this._undoModel.model()
|
|
.availableCurrencies());
|
|
null !== e && this._properties.childs().showCurrency.value() ? (this
|
|
._currencyLabel.showCurrency(), this._currencyLabel.updateColors(
|
|
this.backgroundTopColor(), this.textColor()), this
|
|
._currencyLabel.setCurrencyInfo(e) && (this._currencyLabelWidth =
|
|
null, this.onOptimalWidthNeedToBeRecalculated())) : this
|
|
._currencyLabel.hideCurrency()
|
|
}
|
|
if (this._options.unitConversionEnabled) {
|
|
const e = this.priceScale().unit(this._undoModel.model().availableUnits());
|
|
null !== e && this._properties.childs().showUnit.value() ? (this
|
|
._currencyLabel.showUnit(), this._currencyLabel.updateColors(this
|
|
.backgroundTopColor(), this.textColor()), this._currencyLabel
|
|
.setUnitInfo(e) && (this._currencyLabelWidth = null, this
|
|
.onOptimalWidthNeedToBeRecalculated())) : this._currencyLabel
|
|
.hideUnit()
|
|
}
|
|
this._updateCurrencyLabelFont()
|
|
}
|
|
}
|
|
_updateCurrencyLabelFont() {
|
|
if (null === this._currencyLabel) return;
|
|
const e = this.fontSize();
|
|
e !== this._currencyFontSize && (this._currencyLabel.setFontSize(e), this
|
|
._currencyFontSize = e, this._currencyLabelWidth = null, this
|
|
.onOptimalWidthNeedToBeRecalculated())
|
|
}
|
|
_alignLabels() {
|
|
let e = this._size.h / 2;
|
|
const t = [],
|
|
i = this.priceScale(),
|
|
s = i.orderedSources().slice(),
|
|
r = this._pane.state(),
|
|
n = this.rendererOptions();
|
|
if (i === r.defaultPriceScale()) {
|
|
const e = r.priceDataSources();
|
|
for (let t = 0; t < e.length; t++) r.isOverlay(e[t]) && s.push(e[t])
|
|
}
|
|
const o = i.mainSource();
|
|
for (const n of [s, r.customSources()])
|
|
for (let s = 0; s < n.length; ++s) {
|
|
const a = n[s],
|
|
l = a.priceAxisViews(r, i);
|
|
if (l) {
|
|
const i = l.filter(e => !e.ignoreAlignment() && e.isVisible());
|
|
if (!i.length) continue;
|
|
t.push(...i), o === a && (e = i[0].floatCoordinate())
|
|
}
|
|
}
|
|
const a = t.filter(t => t.floatCoordinate() <= e),
|
|
l = t.filter(t => t.floatCoordinate() > e);
|
|
a.sort((e, t) => t.floatCoordinate() - e.floatCoordinate()), a.length > 0 && l
|
|
.length > 0 && l.push(a[0]), l.sort((e, t) => e.floatCoordinate() - t
|
|
.floatCoordinate());
|
|
for (const e of t) e.setFixedCoordinate(e.coordinate());
|
|
if (i.properties().childs().alignLabels.value()) {
|
|
for (let e = 1; e < a.length; e++) {
|
|
const t = a[e],
|
|
i = a[e - 1],
|
|
s = t.height(n),
|
|
r = t.coordinate(),
|
|
o = i.getFixedCoordinate();
|
|
r > o - s && t.setFixedCoordinate(o - s)
|
|
}
|
|
for (let e = 1; e < l.length; e++) {
|
|
const t = l[e],
|
|
i = l[e - 1],
|
|
s = i.height(n),
|
|
r = t.coordinate(),
|
|
o = i.getFixedCoordinate();
|
|
r < o + s && t.setFixedCoordinate(o + s)
|
|
}
|
|
}
|
|
}
|
|
_drawTickMarks(e, t) {
|
|
const i = this.priceScale().marks();
|
|
e.save(), Object(c.setFont)(e, this.baseFont());
|
|
const r = this.rendererOptions(),
|
|
n = this._isLeft ? Math.floor((this._size.w - r.offsetSize) * t) : 0,
|
|
o = this._isLeft ? Math.round(n - r.paddingInner * t) : Math.round(n + (r
|
|
.offsetSize + r.paddingInner) * t),
|
|
l = this.fontSize(),
|
|
h = this._isCurrencyLabelVisible() ? Object(s.ensureNotNull)(this
|
|
._currencyLabel).labelBottom() : 0,
|
|
u = i.map(t => {
|
|
if (this._options.croppedTickMarks) return {
|
|
visible: !0,
|
|
yCorrection: this._widthCache.yMidCorrection(e, t.label)
|
|
};
|
|
const i = t.coord - l / 2,
|
|
s = t.coord + l / 2,
|
|
r = !(s > this._size.h || i < h);
|
|
return {
|
|
visible: !(s > this._size.h || i < h),
|
|
yCorrection: r ? this._widthCache.yMidCorrection(e, t.label) : 0
|
|
}
|
|
});
|
|
e.fillStyle = this.textColor(), e.textAlign = this._isLeft ? "right" : "left", e
|
|
.textBaseline = "middle", Object(a.drawScaled)(e, t, () => {
|
|
for (let s = i.length; s--;) {
|
|
if (!u[s].visible) continue;
|
|
const r = i[s];
|
|
e.fillText(r.label, o / t, r.coord + u[s].yCorrection)
|
|
}
|
|
}), e.restore()
|
|
}
|
|
_hasAlertLabel() {
|
|
return !1
|
|
}
|
|
_showCurrenciesContextMenu() {
|
|
if (null !== this._currencyMenu && this._currencyMenu.isOpened()) return void this
|
|
._currencyMenu.close();
|
|
Object(d.trackEvent)("GUI", "Currency conversion");
|
|
S(Object(r.t)("Currencies"), () => async function(e, t, s) {
|
|
return (await Promise.all([i.e("react"), i.e(1), i.e(3), i.e(4), i
|
|
.e(6), i.e(8), i.e(9), i.e(13), i.e(19), i.e(29), i
|
|
.e(66), i.e(83), i.e(0), i.e(2), i.e(5), i.e(18), i
|
|
.e("currency-label-menu")
|
|
]).then(i.bind(null, "aWqZ"))).currencyActions(e, t, s)
|
|
}(this._undoModel, Object(s.ensureNotNull)(this._currencyLabel)
|
|
.currencyInfo(), this.priceScale()), Object(s.ensureNotNull)(this
|
|
._currencyLabel).currencyLabelElement()).then(e => {
|
|
this._destroyed ? e.close() : this._currencyMenu = e
|
|
})
|
|
}
|
|
_showUnitsContextMenu() {
|
|
if (null !== this._unitMenu && this._unitMenu.isOpened()) return void this._unitMenu
|
|
.close();
|
|
Object(d.trackEvent)("GUI", "Unit conversion");
|
|
S(Object(r.t)("Units"), () => async function(e, t, s) {
|
|
return (await Promise.all([i.e("react"), i.e(1), i.e(3), i.e(4), i
|
|
.e(6), i.e(8), i.e(9), i.e(13), i.e(19), i.e(29), i
|
|
.e(66), i.e(83), i.e(0), i.e(2), i.e(5), i.e(18), i
|
|
.e("currency-label-menu")
|
|
]).then(i.bind(null, "hpdS"))).unitActions(e, t, s)
|
|
}(this._undoModel, Object(s.ensureNotNull)(this._currencyLabel)
|
|
.unitInfo(), this.priceScale()), Object(s.ensureNotNull)(this
|
|
._currencyLabel).unitLabelElement()).then(e => {
|
|
this._destroyed ? e.close() : this._unitMenu = e
|
|
})
|
|
}
|
|
_onFontSizeChanged() {
|
|
this._currencyLabelWidth = null, this._currencyFontSize = 0, this
|
|
._updateCurrencyLabelFont(), this.onOptimalWidthNeedToBeRecalculated()
|
|
}
|
|
_mouseOrTouchMoveEvent(e) {
|
|
if (!this._priceScale) return;
|
|
this.dataSourceAtPoint(e.localX, e.localY) ? this._setCursorClassName("pointer") :
|
|
this._setResizeCursor()
|
|
}
|
|
_mouseDownOrTouchStartEvent(e) {
|
|
this._zoomAvailable() && this._options.pressedMouseMoveScale && (this._mouseDown = !
|
|
0,
|
|
this._undoModel.startScalePrice(this._pane.state(), this.priceScale(), e
|
|
.localY), this._dragScaleActive = !0)
|
|
}
|
|
_mouseEnterOrTouchStartEvent(e) {
|
|
this._setResizeCursor()
|
|
}
|
|
_pressedMouseOrTouchMoveEvent(e) {
|
|
if (this._dragScaleActive) {
|
|
const t = this.priceScale();
|
|
this._undoModel.scalePriceTo(this._pane.state(), t, e.localY)
|
|
}
|
|
}
|
|
_mouseUpOrTouchEndEvent(e) {
|
|
if (this._dragScaleActive) {
|
|
const e = this.priceScale();
|
|
this._mouseDown = !1, this._undoModel.endScalePrice(this._pane.state(), e), this
|
|
.restoreDefaultCursor(), this._dragScaleActive = !1
|
|
}
|
|
}
|
|
_mouseClickOrTapEvent(e) {
|
|
const t = this.dataSourceAtPoint(e.localX, e.localY);
|
|
t && this._undoModel.selectionMacro(e => {
|
|
e.selection().isSelected(t) || (e.clearSelection(), e
|
|
.addSourceToSelection(t))
|
|
})
|
|
}
|
|
_mouseLeaveOrTouchEndEvent(e) {
|
|
this._setCursorClassName("")
|
|
}
|
|
_mouseDoubleClickOrDoubleTapEvent(e) {
|
|
const t = this.dataSourceAtPoint(e.localX, e.localY);
|
|
t ? this._pane.processDoubleClickOnSource(t) : (this.reset(), Object(d.trackEvent)(
|
|
"GUI", "Double click price scale"))
|
|
}
|
|
_contextMenuOrTouchContextMenuEvent(e) {
|
|
if (this._options.contextMenuEnabled) {
|
|
const t = this.dataSourceAtPoint(e.localX, e.localY);
|
|
if (null !== t && this._options.contextMenu.source) {
|
|
return void this._undoModel.model().selectionMacro(i => {
|
|
i.selection().isSelected(t) || (i.clearSelection(), i
|
|
.addSourceToSelection(t)), this._pane
|
|
.showContextMenuForSelection(e)
|
|
})
|
|
}
|
|
this._options.contextMenu.general && y.ContextMenuManager.createMenu(this
|
|
.getContextMenuActions(), {
|
|
statName: "PriceScaleContextMenu"
|
|
}).then(t => t.show(e))
|
|
}
|
|
}
|
|
_setResizeCursor() {
|
|
const e = this.priceScale();
|
|
e.isPercentage() || e.isIndexedTo100() ? this._setCursorClassName("") : this
|
|
._zoomAvailable() && (this._options.pressedMouseMoveScale || this._options
|
|
.mouseWheelScale) && this._setCursorClassName("ns-resize")
|
|
}
|
|
_setCursorClassName(e) {
|
|
let t = "";
|
|
e && (t = "price-axis--cursor-" + e), this._currentCursorClassName !== t && (this
|
|
._currentCursorClassName && this._cell.classList.remove(this
|
|
._currentCursorClassName), t && this._cell.classList.add(t), this
|
|
._currentCursorClassName = t)
|
|
}
|
|
_zoomAvailable() {
|
|
return !this.priceScale().isEmpty() && this._undoModel.model().zoomEnabled()
|
|
}
|
|
_onMousewheel(e) {
|
|
if (!this._zoomAvailable() || !this._options.mouseWheelScale) return;
|
|
const t = Object(s.ensureNotNull)(this._mouseWheelHelper).processWheel(e).deltaY;
|
|
if (0 === t) return;
|
|
e.cancelable && e.preventDefault();
|
|
const i = this._undoModel,
|
|
r = this._pane.state(),
|
|
n = this.priceScale(),
|
|
o = this._cell.getBoundingClientRect(),
|
|
a = e.clientY - o.top,
|
|
l = a + 15 * t;
|
|
i.startScalePrice(r, this.priceScale(), a, !0), i.scalePriceTo(r, n, l), i
|
|
.endScalePrice(r, n), e.stopPropagation()
|
|
}
|
|
_drawCrossHairLabel(e, t) {
|
|
var i, s;
|
|
e.save();
|
|
const r = this._pane.state(),
|
|
n = r.model(),
|
|
o = this.priceScale(),
|
|
a = [],
|
|
l = this.priceScale() === r.defaultPriceScale(),
|
|
c = null !== (i = n.lineBeingEdited()) && void 0 !== i ? i : n
|
|
.lineBeingCreated();
|
|
if (c && (c.priceScale() === o || l && r.isOverlay(c))) {
|
|
const e = c.priceAxisViews(r, o);
|
|
e && e.length && a.push(e)
|
|
}
|
|
const h = n.customSourceBeingMoved();
|
|
this._addViewsOrMaxMin(null === h ? [] : [h], a), this._addViewsOrMaxMin(n
|
|
.sourcesBeingMoved(), a), this._addViewsOrMaxMin(n.selection().allSources(),
|
|
a);
|
|
const u = n.hoveredSource();
|
|
if (u) {
|
|
const e = r.customSources().includes(u) ? o : u.priceScale();
|
|
if (!n.selection().isSelected(u) && (this._isFromSameSide(e) || l && r
|
|
.isOverlay(u))) {
|
|
const e = null === (s = n.hoveredSource()) || void 0 === s ? void 0 : s
|
|
.priceAxisViews(r, o);
|
|
e && e.length && a.push(e)
|
|
}
|
|
}
|
|
const d = n.crossHairSource().priceAxisViews(r, o);
|
|
d && d.length && a.push(d);
|
|
const p = this.rendererOptions(),
|
|
_ = this._isLeft ? "right" : "left";
|
|
a.forEach(i => {
|
|
i.forEach(i => {
|
|
e.save(), i.renderer().draw(e, p, this._widthCache, this
|
|
._size.w, _, t), e.restore()
|
|
})
|
|
}), e.restore()
|
|
}
|
|
_drawBackground(e, t) {
|
|
const i = Math.ceil(this._size.w * t),
|
|
s = Math.ceil(this._size.h * t),
|
|
r = this.backgroundTopColor(),
|
|
o = this.backgroundColor();
|
|
if (r === o ? Object(a.clearRect)(e, 0, 0, i + 1, s + 1, this.backgroundColor()) :
|
|
Object(m.clearRectWithGradient)(e, 0, 0, i + 1, s + 1, r, o), this._highlighted
|
|
) {
|
|
e.globalAlpha = .5;
|
|
const t = n.themes[this._backgroundBasedTheme.value()].getThemedColor(
|
|
"color-price-axis-highlight");
|
|
Object(a.fillRect)(e, 0, 0, i + 1, s + 1, t), e.globalAlpha = 1
|
|
}
|
|
const l = this._pane.state().model(),
|
|
c = this.priceScale(),
|
|
h = l.selection().lineDataSources().filter(e => e.priceScale() === c).reduce((e,
|
|
t) => {
|
|
const i = t.priceAxisPoints();
|
|
return 0 === i.length ? e : e.concat(i)
|
|
}, []);
|
|
h.length > 0 && this._hightlightBackground(e, h, this.priceScale().mainSource(), t);
|
|
const u = l.crossHairSource();
|
|
u.startMeasurePoint() && this._hightlightBackground(e, u.measurePoints(), this
|
|
.priceScale().mainSource(), t)
|
|
}
|
|
_drawBorder(e, t) {
|
|
e.save(), e.fillStyle = this.lineColor();
|
|
const i = Math.max(1, Math.floor(this.rendererOptions().borderSize * t)),
|
|
s = this._isLeft ? Math.floor(this._size.w * t) - i : 0;
|
|
e.fillRect(s, 0, i, Math.ceil(this._size.h * t) + 1), e.restore()
|
|
}
|
|
_drawBackLabels(e, t) {
|
|
e.save();
|
|
const i = this.backLabels(),
|
|
s = this.rendererOptions(),
|
|
r = this._isLeft ? "right" : "left";
|
|
for (const n of i) n.isAxisLabelVisible() && (e.save(), n.renderer().draw(e, s, this
|
|
._widthCache, this._size.w, r, t), e.restore());
|
|
e.restore()
|
|
}
|
|
_hightlightBackground(e, t, i, s) {
|
|
if (!i) return;
|
|
const r = i.firstValue();
|
|
if (null === r) return;
|
|
let n = t[0].price,
|
|
o = t[0].price;
|
|
for (let e = 1; e < t.length; e++) n = Math.min(n, t[e].price), o = Math.max(o, t[e]
|
|
.price);
|
|
const l = this.priceScale(),
|
|
c = Math.floor(l.priceToCoordinate(n, r) * s),
|
|
h = Math.ceil(l.priceToCoordinate(o, r) * s);
|
|
Object(a.fillRect)(e, Math.floor(s), c, Math.ceil((this._size.w - 1) * s) + 1, h -
|
|
c, w.a)
|
|
}
|
|
_addViewsOrMaxMin(e, t) {
|
|
const i = this._pane.state(),
|
|
s = this.priceScale();
|
|
if (s !== i.defaultPriceScale() && (e = e.filter(e => i.isOverlay(e) || this
|
|
._isFromSameSide(e.priceScale()))), 0 !== e.length)
|
|
if (1 === e.length) {
|
|
const r = e[0].priceAxisViews(i, s);
|
|
r && r.length && t.push(r)
|
|
} else t.push(this._minMaxViews(e))
|
|
}
|
|
_minMaxViews(e) {
|
|
const t = this._pane.state(),
|
|
i = this.priceScale(),
|
|
s = [];
|
|
let r = 1 / 0,
|
|
n = -1 / 0,
|
|
o = null,
|
|
a = null;
|
|
for (const s of e) {
|
|
const e = s.priceAxisViews(t, i);
|
|
if (e && e.length)
|
|
for (let t = 0; t < e.length; t++) {
|
|
const i = e[t],
|
|
s = i.coordinate();
|
|
s >= n && (n = s, a = i), s <= r && (r = s, o = i)
|
|
}
|
|
}
|
|
return a && s.push(a), o && s.push(o), s
|
|
}
|
|
_isFromSameSide(e) {
|
|
return null !== e && (this._isLeft ? this._pane.state().leftPriceScales() : this
|
|
._pane.state().rightPriceScales()).includes(e)
|
|
}
|
|
_sameSideSources() {
|
|
const e = this._pane.state().sourcesByGroup();
|
|
return this._isLeft ? e.leftPriceScalesSources() : e.rightPriceScalesSources()
|
|
}
|
|
}
|
|
},
|
|
"y/Xm": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "StudyOverlayBase", (function() {
|
|
return I
|
|
}));
|
|
var s = i("Eyy1"),
|
|
r = i("qFKp"),
|
|
n = i("txPx"),
|
|
o = i("GVHu"),
|
|
a = i("XPit"),
|
|
l = i("n5al"),
|
|
c = i("tc+8"),
|
|
h = i.n(c),
|
|
u = i("5fI3"),
|
|
d = i("Kxc7"),
|
|
p = i("wOSo"),
|
|
_ = i("WkOR"),
|
|
m = i("BZtw"),
|
|
f = i("pPtI"),
|
|
g = i("k9/m"),
|
|
b = i("ogJP"),
|
|
v = i("Qb4w");
|
|
const S = r.CheckMobile.any() && !1,
|
|
y = d.enabled("uppercase_instrument_names"),
|
|
w = d.enabled("study_overlay_compare_legend_option"),
|
|
P = d.enabled("secondary_series_extend_time_scale"),
|
|
C = d.enabled("hide_unresolved_symbols_in_legend"),
|
|
x = Object(n.getLogger)("Chart.StudyOverlay");
|
|
|
|
function T(e, t) {
|
|
return null == e[t]
|
|
}
|
|
class I extends o.Study {
|
|
constructor(e, t, i, s) {
|
|
t.hasChild("currencyId") || t.addChild("currencyId", new h.a(null)), t.hasChild(
|
|
"unitId") || t.addChild("unitId", new h.a(null)), t.addExclusion(
|
|
"currencyId"), t.addExclusion("unitId"), super(e, t, i, s), this
|
|
._seriesSource = null, this.m_data = new g.PlotList(Object(a
|
|
.seriesPlotFunctionMap)(), T), this._quotesProvider = new p.a, S && this
|
|
._quotesProvider.quotesUpdate().subscribe(this, this._onQuotesUpdate);
|
|
const r = this.properties().childs();
|
|
r.currencyId.subscribe(this, this._onCurrencyChanged), r.unitId.subscribe(this,
|
|
this._onUnitChanged), r.allowExtendTimeScale.subscribe(this, this
|
|
._onAllowExtendTimeScaleChanged), this._onAllowExtendTimeScaleChanged(),
|
|
r.style.subscribe(this, this._updateBarFunction), r.lineStyle.childs()
|
|
.priceSource.subscribe(this, this._updateBarFunction), r.areaStyle.childs()
|
|
.priceSource.subscribe(this, this._updateBarFunction), r.baselineStyle
|
|
.childs().priceSource.subscribe(this, this._updateBarFunction), this
|
|
._updateBarFunction()
|
|
}
|
|
destroy() {
|
|
super.destroy()
|
|
}
|
|
setSymbolCurrencyUnit(e, t, i) {
|
|
this._setSymbolCurrencyUnitInternal(e, t, i)
|
|
}
|
|
symbol() {
|
|
return this.properties().childs().inputs.childs().symbol.value()
|
|
}
|
|
setSymbol(e) {
|
|
this.setSymbolCurrencyUnit(e)
|
|
}
|
|
symbolInfo() {
|
|
if (!this._resolvedSymbols) return null;
|
|
const e = this._properties.inputs.symbol.value();
|
|
if (!e) return null;
|
|
let t;
|
|
return t = this._resolvedSymbols[this._getSymbolForResolve(e)] || null, t
|
|
}
|
|
data() {
|
|
return null === this._seriesSource ? super.data() : this._seriesSource.data()
|
|
.bars()
|
|
}
|
|
symbolResolved() {
|
|
return this.symbolsResolved()
|
|
}
|
|
symbolSameAsCurrent(e) {
|
|
return Object(_.b)(e, this.symbol(), this.symbolInfo())
|
|
}
|
|
priceSource() {
|
|
switch (this._properties.style.value()) {
|
|
case 2:
|
|
return this._properties.lineStyle.priceSource.value();
|
|
case 3:
|
|
return this._properties.areaStyle.priceSource.value();
|
|
case 10:
|
|
return this._properties.baselineStyle.priceSource.value()
|
|
}
|
|
return null
|
|
}
|
|
barFunction() {
|
|
return this._barFunction
|
|
}
|
|
quotes() {
|
|
return this._quotesProvider.quotes()
|
|
}
|
|
currency() {
|
|
return this._properties.currencyId.value() || null
|
|
}
|
|
setCurrency(e) {
|
|
this.setSymbolCurrencyUnit(void 0, e)
|
|
}
|
|
isConvertedToOtherCurrency() {
|
|
return Object(l.isConvertedToOtherCurrency)(this.symbolInfo())
|
|
}
|
|
unit() {
|
|
return this._properties.unitId.value() || null
|
|
}
|
|
setUnit(e) {
|
|
this._properties.unitId.setValue(e)
|
|
}
|
|
isConvertedToOtherUnit() {
|
|
return Object(l.isConvertedToOtherUnit)(this.symbolInfo())
|
|
}
|
|
style() {
|
|
return this.properties().childs().style.value()
|
|
}
|
|
symbolSource() {
|
|
return this
|
|
}
|
|
state(e, t) {
|
|
const i = super.state(e, t);
|
|
return e && (Object(s.ensureDefined)(i.data).symbols = {
|
|
___snapshot: this.symbolInfo() || void 0
|
|
}), i
|
|
}
|
|
symbolTitle(e, t) {
|
|
return this.title(!0, {}, !1, e)
|
|
}
|
|
title(e, t, i, s) {
|
|
const r = this._titleInParts(e, t, i, s).join(", ");
|
|
return y ? r.toUpperCase() : r
|
|
}
|
|
titleInParts(e, t, i, s) {
|
|
const r = this._titleInParts(e, t, i, s).join(", ");
|
|
return [y ? r.toUpperCase() : r]
|
|
}
|
|
isStarted() {
|
|
return null === this._seriesSource ? super.isStarted() : this._seriesSource
|
|
.isStarted()
|
|
}
|
|
sourceId() {
|
|
return null === this._seriesSource ? super.sourceId() : Object(s.ensureNotNull)(
|
|
this._seriesSource.instanceId())
|
|
}
|
|
moveData(e) {
|
|
null === this._seriesSource ? super.moveData(e) : this._seriesSource.moveData(e)
|
|
}
|
|
firstValue() {
|
|
const e = this._model.timeScale().visibleBarsStrictRange();
|
|
if (null === e) return null;
|
|
const t = e.firstBar();
|
|
if (0 === this.data().size()) return this._ownFirstValue;
|
|
const i = this.data().search(t, g.PlotRowSearchMode.NearestRight, 1);
|
|
return this._ownFirstValue = null !== i ? this._barFunction(i.value) : null,
|
|
this._ownFirstValue
|
|
}
|
|
lastValueData(e, t, i) {
|
|
const s = {
|
|
noData: !0
|
|
},
|
|
r = this.priceScale();
|
|
if (this._model.timeScale().isEmpty() || null === r || r.isEmpty() || this
|
|
.data().isEmpty()) return s;
|
|
const n = this._model.timeScale().visibleBarsStrictRange();
|
|
if (null === n) return s;
|
|
const o = this.properties().childs();
|
|
if (!o.visible.value()) return s;
|
|
const a = this.nearestIndex(n.lastBar(), g.PlotRowSearchMode.NearestLeft, 1);
|
|
if (void 0 === a) return s;
|
|
const l = this.firstValue();
|
|
if (null === l) return s;
|
|
const c = this._lastNonEmptyPlotRow(4),
|
|
h = null !== c && n.contains(c.index),
|
|
u = null !== c ? c.value : null,
|
|
d = t || h ? u : this.data().valueAt(a);
|
|
if (null === d) return s;
|
|
const p = this._barFunction(d);
|
|
if (!Object(b.isNumber)(p)) return s;
|
|
const _ = r.priceToCoordinate(p, l);
|
|
let m;
|
|
switch (o.style.value()) {
|
|
case 0:
|
|
m = d[1] <= d[4] ? o.barStyle.childs().upColor.value() : o.barStyle
|
|
.childs().downColor.value();
|
|
break;
|
|
case 1:
|
|
case 9:
|
|
m = d[1] <= d[4] ? o.candleStyle.childs().upColor.value() : o
|
|
.candleStyle.childs().downColor.value();
|
|
break;
|
|
case 2:
|
|
m = o.lineStyle.childs().color.value();
|
|
break;
|
|
case 3:
|
|
m = o.areaStyle.childs().color1.value();
|
|
break;
|
|
case 10: {
|
|
const e = o.baselineStyle.childs();
|
|
m = _ < Math.round(r.height() * (Math.abs(100 - e.baseLevelPercentage
|
|
.value()) / 100)) ? e.topLineColor.value() : e.bottomLineColor
|
|
.value();
|
|
break
|
|
}
|
|
default:
|
|
throw new Error("Not supported overlay style")
|
|
}
|
|
const f = {
|
|
noData: !1,
|
|
text: r.formatPrice(p, l),
|
|
formattedPriceAbsolute: r.formatPriceAbsolute(p),
|
|
formattedPricePercentage: r.formatPricePercentage(p, l, !0),
|
|
floatCoordinate: _,
|
|
coordinate: _,
|
|
color: m
|
|
};
|
|
return i && (f.price = p), f
|
|
}
|
|
priceRange(e, t) {
|
|
if (!Object(b.isInteger)(e)) return x.logDebug(
|
|
"priceRange: incorrect startBar"), null;
|
|
if (!Object(b.isInteger)(t)) return x.logDebug("priceRange: incorrect endBar"),
|
|
null;
|
|
if (0 === this.data().size()) return null;
|
|
const i = this.priceSource();
|
|
let s;
|
|
s = null !== i ? this.data().minMaxOnRangeCached(e, t, [{
|
|
name: i,
|
|
offset: 0
|
|
}]) : this.data().minMaxOnRangeCached(e, t, [{
|
|
name: "low",
|
|
offset: 0
|
|
}, {
|
|
name: "high",
|
|
offset: 0
|
|
}]);
|
|
const r = null !== s ? new v.PriceRange(s.min, s.max) : null;
|
|
return this._postProcessPriceRange(r)
|
|
}
|
|
bars() {
|
|
return this.data()
|
|
}
|
|
open(e) {
|
|
return Object(s.ensureNotNull)(this.bars().valueAt(e))[1]
|
|
}
|
|
high(e) {
|
|
return Object(s.ensureNotNull)(this.bars().valueAt(e))[2]
|
|
}
|
|
low(e) {
|
|
return Object(s.ensureNotNull)(this.bars().valueAt(e))[3]
|
|
}
|
|
close(e) {
|
|
return Object(s.ensureNotNull)(this.bars().valueAt(e))[4]
|
|
}
|
|
hl2(e) {
|
|
return (this.high(e) + this.low(e)) / 2
|
|
}
|
|
hlc3(e) {
|
|
return (this.high(e) + this.low(e) + this.close(e)) / 3
|
|
}
|
|
ohlc4(e) {
|
|
return (this.open(e) + this.high(e) + this.low(e) + this.close(e)) / 4
|
|
}
|
|
_onCurrencyChanged() {
|
|
this.isStarted() && this._tryChangeInputs(), this._currencyChanged.fire()
|
|
}
|
|
_onUnitChanged() {
|
|
this.isStarted() && this._tryChangeInputs(), this._unitChanged.fire()
|
|
}
|
|
_getSymbolObject(e) {
|
|
const t = super._getSymbolObject(e),
|
|
i = this.currency();
|
|
null !== i && (t["currency-id"] = i);
|
|
const s = this.unit();
|
|
return null !== s && (t["unit-id"] = s), t
|
|
}
|
|
_getSymbolForApi(e) {
|
|
return Object(l.symbolForApi)(this._resolvedSymbolsByInput[e] || null, e)
|
|
}
|
|
_onSymbolResolved(e, t, i) {
|
|
super._onSymbolResolved(e, t, i), this._recreatePriceFormattingDependencies();
|
|
const s = t === this.symbol() ? Object(l.extractSymbolNameFromSymbolInfo)(i,
|
|
this.symbol()) : null,
|
|
r = Object(l.symbolCurrency)(i),
|
|
n = Object(l.symbolUnit)(i);
|
|
this._setSymbolCurrencyUnitInternal(s || void 0, r, n, i), this.model()
|
|
.realignLineTools(), S && this._setQuotesSymbol(this._getSymbolForApi(this
|
|
.symbol()))
|
|
}
|
|
_changeInputsImpl(e, t) {
|
|
super._changeInputsImpl(e, t), e.symbol !== t.symbol && this._model
|
|
.realignLineTools()
|
|
}
|
|
_setQuotesSymbol(e) {
|
|
const t = this.symbolInfo(),
|
|
i = Object(l.extractSymbolNameFromSymbolInfo)(t, e);
|
|
this._quotesProvider.setQuotesSessionSymbol(i)
|
|
}
|
|
_createStudyOnServer() {
|
|
null === this._seriesSource ? super._createStudyOnServer() : this
|
|
._modifyStudyOnServer(Object(s.ensureDefined)(this._inputs)), this._model
|
|
.realignLineTools()
|
|
}
|
|
_modifyStudyOnServer(e) {
|
|
null === this._seriesSource ? super._modifyStudyOnServer(e) : (this
|
|
._seriesSource.modifySeries(Object(u.decodeExtendedSymbol)(e.symbol),
|
|
Object(f.getServerInterval)(this._series.properties().interval
|
|
.value())), this._seriesSource.isStarted() || this._seriesSource
|
|
.start())
|
|
}
|
|
_stopStudyOnServer() {
|
|
null === this._seriesSource ? super._stopStudyOnServer() : this._seriesSource
|
|
.stop()
|
|
}
|
|
_titleInParts(e, t, i, s) {
|
|
const r = this.properties().childs().inputs.childs().symbol.value(),
|
|
n = this.symbolInfo();
|
|
let o;
|
|
if (n) {
|
|
if (o = n.name, w) {
|
|
const e = this._model.mainSeries().properties().statusViewStyle
|
|
.symbolTextSource.value();
|
|
"description" === e ? o = n.description : "ticker-and-description" ===
|
|
e && (o = `${n.name}, ${n.description}`)
|
|
}
|
|
if (!s && n.exchange && 0 !== n.exchange.length) return [o, [n.exchange]]
|
|
} else o = C ? "" : r;
|
|
return [o]
|
|
}
|
|
_onAllowExtendTimeScaleChanged() {
|
|
const e = this.isStarted();
|
|
if (e && this.stop(!0), P && this.properties().childs().allowExtendTimeScale
|
|
.value()) {
|
|
this._seriesSource = new m.a(this._model.chartApi(), "st_o_");
|
|
const e = this._seriesSource.dataEvents();
|
|
e.seriesError().subscribe(this, e => {
|
|
this._onStudyError(this._convertSeriesErrorToStudy(e))
|
|
}), e.loading().subscribe(this, this._onStudyLoading), e.completed()
|
|
.subscribe(this, (e, t) => {
|
|
this._onStudyCompleted(t)
|
|
}), e.dataUpdated().subscribe(this, () => {
|
|
this._studyModified = !1;
|
|
const e = this._model.paneForSource(this);
|
|
this._model.recalculatePane(e), this._updateSources(), this
|
|
.priceRangeReady() || this._enablePriceRangeReady()
|
|
})
|
|
} else {
|
|
if (null !== this._seriesSource) {
|
|
const e = this._seriesSource.dataEvents();
|
|
e.seriesError().unsubscribeAll(this), e.loading().unsubscribeAll(this),
|
|
e.completed().unsubscribeAll(this), e.dataUpdated().unsubscribeAll(
|
|
this), this._seriesSource.destroy()
|
|
}
|
|
this._seriesSource = null
|
|
}
|
|
e && this.start(!0)
|
|
}
|
|
_convertSeriesErrorToStudy(e) {
|
|
return {
|
|
error: e.error,
|
|
ctx: e.ctx,
|
|
solution_id: e.solution_id
|
|
}
|
|
}
|
|
_setSymbolCurrencyUnitInternal(e, t, i, s) {
|
|
const r = this.properties().childs(),
|
|
n = r.inputs.childs().symbol.value(),
|
|
o = r.currencyId.value(),
|
|
a = r.unitId.value();
|
|
if (void 0 !== e && e !== n && r.inputs.childs().symbol.setValueSilently(e),
|
|
void 0 !== t && t !== o && r.currencyId.setValueSilently(t), void 0 !== i &&
|
|
i !== a && r.unitId.setValueSilently(i), s) this._resolvedSymbolsByInput[
|
|
this.symbol()] = s, this._resolvedSymbols[this._getSymbolForResolve(this
|
|
.symbol())] = s;
|
|
else {
|
|
const e = this.symbolInfo();
|
|
null !== e && (r.currencyId.setValueSilently(Object(l.symbolCurrency)(e)), r
|
|
.unitId.setValueSilently(Object(l.symbolUnit)(e)))
|
|
}
|
|
r.inputs.childs().symbol.value() !== n && r.inputs.childs().symbol.listeners()
|
|
.fire(r.inputs.childs().symbol), r.currencyId.value() !== o && r.currencyId
|
|
.listeners().fire(r.currencyId), r.unitId.value() !== a && r.unitId
|
|
.listeners().fire(r.unitId)
|
|
}
|
|
_updateBarFunction() {
|
|
var e;
|
|
const t = null !== (e = this.priceSource()) && void 0 !== e ? e : "close";
|
|
this._barFunction = Object(a.barFunction)(t)
|
|
}
|
|
}
|
|
},
|
|
yMne: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "b", (function() {
|
|
return r
|
|
})), i.d(t, "a", (function() {
|
|
return n
|
|
}));
|
|
var s = i("J2xC");
|
|
const r = parseInt(s["css-value-header-toolbar-height"]),
|
|
n = 3
|
|
},
|
|
yUly: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Ss5c").LineDataSource,
|
|
r = i("5rJj"),
|
|
n = i("j3hX"),
|
|
o = n.LineToolWidthsProperty,
|
|
a = n.LineToolColorsProperty;
|
|
class l extends s {
|
|
constructor(e, t) {
|
|
super(e, t || l.createProperties()), this.version = l.version, i.e("lt-pane-views")
|
|
.then(i.t.bind(null, "SvjA", 7)).then(({
|
|
TrendBasedFibTimePaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
levelsCount() {
|
|
return l.LevelsCount
|
|
}
|
|
pointsCount() {
|
|
return 3
|
|
}
|
|
name() {
|
|
return "Trend-Based Fib Time"
|
|
}
|
|
migrateVersion(e, t, i) {}
|
|
processErase(e, t) {
|
|
var i = "level" + t,
|
|
s = this.properties()[i].visible;
|
|
e.setProperty(s, !1, "Erase level line")
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "u52p")))
|
|
.TrendBasedFibTimeDefinitionsViewModel
|
|
}
|
|
static createProperties(e) {
|
|
var t = new r("linetooltrendbasedfibtime", e, !1, {
|
|
range: [1, 11]
|
|
});
|
|
return l._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
s._configureProperties(e);
|
|
for (var t = [e.child("trendline").child("linewidth")], i = [e.child("trendline")
|
|
.child("color")
|
|
], r = 1; r <= l.LevelsCount; r++) t.push(e.child("level" + r).child(
|
|
"linewidth")), i.push(e.child("level" + r).child("color"));
|
|
e.addChild("linesColors", new a(i)), e.addChild("linesWidths", new o(t))
|
|
}
|
|
}
|
|
l.LevelsCount = 11, l.version = 1, t.LineToolTrendBasedFibTime = l
|
|
},
|
|
yfAl: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t);
|
|
var s = i("aO4+"),
|
|
r = i("Eyy1"),
|
|
n = i("txPx"),
|
|
o = i("aIyQ"),
|
|
a = i.n(o),
|
|
l = i("e3/o"),
|
|
c = i("GxN8"),
|
|
h = i("7ktv"),
|
|
u = i("MWAT"),
|
|
d = i("CW80"),
|
|
p = i("s1Gx");
|
|
const _ = new Map([
|
|
["trading", e => Object(d.isTrading)(e)],
|
|
["drawing", e => Object(d.isLineTool)(e) && !Object(d.isTrading)(e) && !e
|
|
.isPhantom()
|
|
],
|
|
["drawingsForAllSymbols", e => Object(d.isLineTool)(e) && !Object(d.isTrading)(e) &&
|
|
!e.isPhantom()
|
|
],
|
|
["phantom", e => Object(d.isLineTool)(e) && e.isPhantom()],
|
|
["restRowSources", e => !Object(d.isLineTool)(e) && !Object(d.isTrading)(e)],
|
|
["leftPriceScale", (e, t) => "left" === f(e, t)],
|
|
["rightPriceScale", (e, t) => "right" === f(e, t)],
|
|
["overlayPriceScale", (e, t) => "overlay" === f(e, t)]
|
|
]),
|
|
m = new Map([
|
|
["trading", "visibleSorted"],
|
|
["drawing", "visibleSorted"],
|
|
["drawingsForAllSymbols", "allSorted"],
|
|
["phantom", "visibleSorted"],
|
|
["restRowSources", "visibleSorted"],
|
|
["leftPriceScale", "visibleSorted"],
|
|
["rightPriceScale", "visibleSorted"],
|
|
["overlayPriceScale", "visibleSorted"]
|
|
]);
|
|
|
|
function f(e, t) {
|
|
const i = e.priceScale();
|
|
return null === i ? "overlay" : t.priceScalePosition(i)
|
|
}
|
|
class g {
|
|
constructor(e) {
|
|
this._groupedSources = new Map, this._sources = null, this._pane = e
|
|
}
|
|
clear() {
|
|
this._groupedSources.clear(), this._sources = null
|
|
}
|
|
destroy() {
|
|
this.clear()
|
|
}
|
|
all() {
|
|
return this._groupedSources.has("visibleSorted") || this._sortSources(), Object(r
|
|
.ensureDefined)(this._groupedSources.get("visibleSorted"))
|
|
}
|
|
allIncludingHidden() {
|
|
return this._groupedSources.has("allSorted") || this._sortSources(), Object(r
|
|
.ensureDefined)(this._groupedSources.get("allSorted"))
|
|
}
|
|
allExceptSpecialSources() {
|
|
if (!this._groupedSources.has("exceptSpecial")) {
|
|
const e = this.allIncludingHidden().filter(e => !e.isSpeciallyZOrderedSource());
|
|
this._groupedSources.set("exceptSpecial", e)
|
|
}
|
|
return Object(r.ensureDefined)(this._groupedSources.get("exceptSpecial"))
|
|
}
|
|
tradingSources() {
|
|
return this._getSourcesByGroupType("trading")
|
|
}
|
|
lineSources() {
|
|
return this._getSourcesByGroupType("drawing")
|
|
}
|
|
lineSourcesForAllSymbols() {
|
|
return this._getSourcesByGroupType("drawingsForAllSymbols")
|
|
}
|
|
phantomSources() {
|
|
return this._getSourcesByGroupType("phantom")
|
|
}
|
|
allExceptLineAndTradingSources() {
|
|
return this._getSourcesByGroupType("restRowSources")
|
|
}
|
|
hitTestSources() {
|
|
if (!this._groupedSources.has("hitTest")) {
|
|
const e = this.allExceptLineAndTradingSources().concat(this.lineSources());
|
|
this._groupedSources.set("hitTest", e)
|
|
}
|
|
return Object(r.ensureDefined)(this._groupedSources.get("hitTest"))
|
|
}
|
|
generalSources() {
|
|
if (!this._groupedSources.has("general")) {
|
|
const e = this.allExceptLineAndTradingSources().concat(this.lineSources());
|
|
this._groupedSources.set("general", Object(p.sortSources)(e))
|
|
}
|
|
return Object(r.ensureDefined)(this._groupedSources.get("general"))
|
|
}
|
|
leftPriceScalesSources() {
|
|
return this._getSourcesByGroupType("leftPriceScale")
|
|
}
|
|
rightPriceScalesSources() {
|
|
return this._getSourcesByGroupType("rightPriceScale")
|
|
}
|
|
overlayPriceScaleSources() {
|
|
return this._getSourcesByGroupType("overlayPriceScale")
|
|
}
|
|
_getSourcesByGroupType(e) {
|
|
const t = Object(r.ensureDefined)(m.get(e));
|
|
return this._groupedSources.has(t) ? this._groupedSources.has(e) || this
|
|
._groupSources(e) : (this._sortSources(), this._groupSources(e)), Object(r
|
|
.ensureDefined)(this._groupedSources.get(e))
|
|
}
|
|
_sortSources() {
|
|
null === this._sources && (this._sources = this._pane.dataSources());
|
|
const e = Object(p.sortSources)(this._sources),
|
|
t = e.filter(e => !Object(d.isLineTool)(e) || e.isActualSymbol() && e
|
|
.isActualCurrency() && e.isActualUnit());
|
|
this._groupedSources.set("allSorted", e), this._groupedSources.set("visibleSorted",
|
|
t)
|
|
}
|
|
_groupSources(e) {
|
|
const t = Object(r.ensureDefined)(m.get(e)),
|
|
i = _.get(e);
|
|
if (void 0 !== i) {
|
|
const s = Object(r.ensureDefined)(this._groupedSources.get(t)).filter(e => i(e,
|
|
this._pane));
|
|
this._groupedSources.set(e, s)
|
|
}
|
|
}
|
|
}
|
|
var b = i("1Wlv"),
|
|
v = i("FaJS"),
|
|
S = i("Qb4w"),
|
|
y = i("3ClC"),
|
|
w = i("/tGj"),
|
|
P = i("2jby");
|
|
i.d(t, "PaneBase", (function() {
|
|
return T
|
|
}));
|
|
const C = Object(n.getLogger)("Chart.Pane");
|
|
|
|
function x(e, t, i) {
|
|
e.setMargins({
|
|
top: t,
|
|
bottom: i
|
|
})
|
|
}
|
|
class T {
|
|
constructor(e, t, i, s) {
|
|
this.m_dataSources = [], this._sourceWatchedValuesSubscriptions = new Map, this
|
|
.m_mainDataSource = null, this._cachedOrderedSources = new g(this), this
|
|
._sourcesById = new Map, this._dataSourcesCollectionChanged = new a.a, this
|
|
._dataSourceSymbolResolved = new a.a, this._sourcePropertiesChanged = new a.a,
|
|
this._sourcesZOrderChanged = new a.a, this._tagsChanged = new a.a, this
|
|
._stretchFactor = 1e3, this._isInInsertManyDataSourcesState = !1, this
|
|
._lastLineDataSourceZOrder = null, this._rightPriceScales = [], this
|
|
._leftPriceScales = [], this._lockedPriceScale = null, this
|
|
._currentPriceScaleRatio = null, this._onPriceScalesChanged = new a.a, this
|
|
._isRecalculatingScales = !1, this._priceDataSources = [], this
|
|
._bulkActionsActive = 0, this
|
|
._reorderZOrderOnAddingSourceToCollectionAllowed = !0, this
|
|
._priceScaleSelectionStrategy = Object(u.createPriceScaleSelectionStrategy)(i
|
|
.properties().priceScaleSelectionStrategyName.value()), this._id = null !=
|
|
s ? s : Object(l.randomHashN)(6)
|
|
}
|
|
id() {
|
|
return this._id
|
|
}
|
|
bulkActionMacro(e) {
|
|
this._bulkActionsActive += 1, e(), this._bulkActionsActive -= 1, 0 === this
|
|
._bulkActionsActive && this._dataSourcesCollectionChanged.fire()
|
|
}
|
|
sourcesByGroup() {
|
|
return this._cachedOrderedSources
|
|
}
|
|
dataSourceForId(e) {
|
|
return this._sourcesById.get(e) || null
|
|
}
|
|
changeSourceId(e, t) {
|
|
Object(r.assert)(this.hasDataSource(e)), this._sourcesById.delete(e.id()), e.setId(
|
|
t), this._sourcesById.set(t, e)
|
|
}
|
|
movePriceScale(e, t, i) {
|
|
const s = this.priceScalePosition(e);
|
|
if (s !== t) this.removePriceScale(e), this._placePriceScale(e, t, i), e
|
|
.invalidateMargins(), this._invalidateSourcesCache();
|
|
else if (void 0 !== i && "overlay" !== s) {
|
|
const t = "left" === s ? this._leftPriceScales : this._rightPriceScales,
|
|
r = t.indexOf(e);
|
|
t.splice(r, 1), t.splice(i, 0, e)
|
|
}
|
|
}
|
|
isEmpty() {
|
|
return null === this.m_mainDataSource
|
|
}
|
|
recalculatePriceScale(e) {
|
|
if (!e) return;
|
|
const t = e.sourcesForAutoscale();
|
|
if ((e.isAutoScale() || e.priceRangeShouldBeRecalculatedOnce()) && t && t.length >
|
|
0 && !this.timeScale().isEmpty()) {
|
|
const t = this.timeScale().visibleBarsStrictRange();
|
|
e.recalculatePriceRange(t)
|
|
}
|
|
e.updateAllViews()
|
|
}
|
|
onSourceTagsChanged() {
|
|
this._tagsChanged.fire()
|
|
}
|
|
insertDataSource(e, t, i) {
|
|
e.setZorder(i), t || (t = this.findSuitableScale(e)), this._addSourceToCollections(
|
|
e);
|
|
let s = !1;
|
|
(e === this.model().mainSeries() || null === this.m_mainDataSource) && (this
|
|
.m_mainDataSource = e, s = !0), t.addDataSource(e, this
|
|
._isInInsertManyDataSourcesState), e.setPriceScale(t), t
|
|
.invalidateMargins(), e.onTagsChanged && e.onTagsChanged().subscribe(this, this
|
|
.onSourceTagsChanged),
|
|
s && this._processMainSourceChange(), this._tagsChanged.fire(), e instanceof h
|
|
.PriceDataSource && this.recalculatePriceScale(t), this
|
|
._invalidateSourcesCache()
|
|
}
|
|
addDataSource(e, t, i) {
|
|
let s = e.zorder();
|
|
i || (Object(d.isLineTool)(e) && !e.isSpeciallyZOrderedSource() ? (s = null !== this
|
|
._lastLineDataSourceZOrder ? this._lastLineDataSourceZOrder + 1 : this
|
|
.newLineToolZOrder(), this._isInInsertManyDataSourcesState && (this
|
|
._lastLineDataSourceZOrder = s)) : Object(y.isStudy)(e) && !e
|
|
.isSpeciallyZOrderedSource() && (s = this.newStudyZOrder())), this
|
|
.insertDataSource(e, t, s)
|
|
}
|
|
removeDataSource(e, t, i) {
|
|
const s = this.m_dataSources.indexOf(e);
|
|
if (-1 === s) return void C.logDebug("removeDataSource: invalid data source");
|
|
this._removeSourceFromCollections(s, !!i), e !== this.m_mainDataSource || t || (this
|
|
.m_mainDataSource = null);
|
|
const r = e.priceScale();
|
|
this.removeSourceFromPriceScale(e), e.onTagsChanged && e.onTagsChanged()
|
|
.unsubscribe(this, this.onSourceTagsChanged), e instanceof h.PriceDataSource &&
|
|
!t && this._processMainSourceChange(), this._tagsChanged.fire(), r &&
|
|
e instanceof h.PriceDataSource && this.recalculatePriceScale(r), this
|
|
._invalidateSourcesCache()
|
|
}
|
|
hasDataSource(e) {
|
|
return this._sourcesById.has(e.id())
|
|
}
|
|
dataSources() {
|
|
return this.m_dataSources
|
|
}
|
|
priceDataSources() {
|
|
return this._priceDataSources
|
|
}
|
|
replaceSource(e, t, i) {
|
|
const s = this.m_mainDataSource === e,
|
|
r = e.zorder();
|
|
this.insertDataSource(t, i, r), this.removeDataSource(e, s), this._sourcesById.set(t
|
|
.id(), t), s && (this.m_mainDataSource = t, this._processMainSourceChange())
|
|
}
|
|
isOverlay(e) {
|
|
const t = e.priceScale();
|
|
return null === t || "overlay" === this.priceScalePosition(t)
|
|
}
|
|
updateAllViews() {
|
|
for (const e of this.m_dataSources) e.updateAllViews();
|
|
for (const e of this.model().customSources()) e.updateViewsForPane(this)
|
|
}
|
|
priceScalePosition(e) {
|
|
return this._leftPriceScales.includes(e) ? "left" : this._rightPriceScales.includes(
|
|
e) ? "right" : "overlay"
|
|
}
|
|
createPriceScaleAtPosition(e, t) {
|
|
const i = this.properties().childs().axisProperties.state();
|
|
i.autoScale = !0;
|
|
const s = new b.PriceScale(this.model().properties().scalesProperties, i);
|
|
return s.setHeight(this.height()), x(s, this._defaultTopMargin(), this
|
|
._defaultBottomMargin()), this._placePriceScale(s, e, t), s
|
|
}
|
|
removePriceScale(e) {
|
|
e.modeChanged().unsubscribeAll(this), e.priceRangeChanged().unsubscribeAll(this), e
|
|
.internalHeightChanged().unsubscribeAll(this), e === this._lockedPriceScale && (
|
|
this._lockedPriceScale = null, this._currentPriceScaleRatio = null);
|
|
const t = this._leftPriceScales.indexOf(e); - 1 !== t && (this._leftPriceScales[t]
|
|
.invalidateMargins(), this._leftPriceScales.splice(t, 1));
|
|
const i = this._rightPriceScales.indexOf(e);
|
|
if (-1 !== i && (this._rightPriceScales[i].invalidateMargins(), this
|
|
._rightPriceScales.splice(i, 1)), null === e.mainSource()) {
|
|
const t = e.dataSources().length;
|
|
0 !== t && C.logError(
|
|
"Invalid priceScale state: empty mainSource but non-empty data sources=" +
|
|
t)
|
|
}
|
|
this._onPriceScalesChanged.fire()
|
|
}
|
|
move(e, t, i) {
|
|
const s = e.priceScale();
|
|
this.removeSourceFromPriceScale(e), t.addDataSource(e), e.setPriceScale(t), t
|
|
.invalidateMargins(), this._processMainSourceChange(), this
|
|
._invalidateSourcesCache(), e.isIncludedInAutoScale() && (null !== s && this
|
|
.recalculatePriceScale(s),
|
|
this.recalculatePriceScale(t)), this._onPriceScalesChanged.fire()
|
|
}
|
|
setZOrders(e) {
|
|
e.forEach((e, t) => {
|
|
t.setZorder(e)
|
|
}), this._invalidateSourcesCache(), 0 === this._bulkActionsActive && this
|
|
._dataSourcesCollectionChanged.fire(), this.model().lightUpdate()
|
|
}
|
|
isMainPane() {
|
|
const e = this.model().mainSeries();
|
|
for (const t of this.m_dataSources)
|
|
if (t === e) return !0;
|
|
return !1
|
|
}
|
|
isLast() {
|
|
const e = this.model().panes();
|
|
return e[e.length - 1] === this
|
|
}
|
|
newStudyZOrder() {
|
|
return Object(P.newStudyZOrder)(this._priceDataSources)
|
|
}
|
|
newLineToolZOrder(e) {
|
|
return Object(P.newLineToolZOrder)(this.m_dataSources, e)
|
|
}
|
|
containsMainSeries() {
|
|
return this._sourcesById.has(this.model().mainSeries().id())
|
|
}
|
|
applyPriceScaleRatio(e, t) {
|
|
var i;
|
|
null !== this._lockedPriceScale && this._lockedPriceScale !== e || this
|
|
._currentPriceScaleRatio === t || !this.isMainPane() || null === this
|
|
._lockedPriceScale && e !== (null === (i = this.mainDataSource()) || void 0 ===
|
|
i ? void 0 : i.priceScale()) || (this._setNewPriceRangeByScaleRatio(e, t,
|
|
this._mainSourceVisiblePriceRange(e), !0, !0), null !== this
|
|
._lockedPriceScale ? this._tryToApplyNewPriceScaleRatio() : e.isLog() ||
|
|
this.model().mainSeriesScaleRatioPropertyOnChanged())
|
|
}
|
|
sendToBack(e) {
|
|
const t = this.sourcesByGroup().allExceptSpecialSources();
|
|
this._batchReorder(e, t[0], P.moveBeforeSource)
|
|
}
|
|
bringToFront(e) {
|
|
const t = this.sourcesByGroup().allExceptSpecialSources();
|
|
this._batchReorder(e, t[t.length - 1], P.moveAfterSource)
|
|
}
|
|
sendBackward(e) {
|
|
const t = this.sourcesByGroup().allIncludingHidden(),
|
|
i = t.indexOf(e[0]);
|
|
if (0 === i) this.bringToFront(e);
|
|
else {
|
|
const s = t[i - 1];
|
|
this.insertBefore(e, s)
|
|
}
|
|
}
|
|
bringForward(e) {
|
|
const t = this.sourcesByGroup().allExceptSpecialSources(),
|
|
i = t.indexOf(e[e.length - 1]);
|
|
if (i === t.length - 1) this.sendToBack(e);
|
|
else {
|
|
const s = t[i + 1];
|
|
this.insertAfter(e, s)
|
|
}
|
|
}
|
|
insertAfter(e, t) {
|
|
this._batchReorder(e, t, P.moveAfterSource)
|
|
}
|
|
insertBefore(e, t) {
|
|
this._batchReorder(e, t, P.moveBeforeSource)
|
|
}
|
|
priceScaleSelectionStrategy() {
|
|
return this._priceScaleSelectionStrategy
|
|
}
|
|
findTargetPriceAxisViews(e, t, i, s) {
|
|
if (Object(c.a)(e) && this.model().paneForSource(e) !== this) return [];
|
|
const r = e.priceScale();
|
|
if (t === r) return i;
|
|
if (null === r) return [];
|
|
if ("overlay" === this.priceScalePosition(r)) return t === this
|
|
.defaultPriceScale() ? i : [];
|
|
const n = this.priceScalePosition(t);
|
|
if (n !== this.priceScalePosition(r)) return [];
|
|
const o = "left" === n ? this.leftPriceScales() : this.rightPriceScales();
|
|
return o.indexOf(t) < o.indexOf(r) ? s : []
|
|
}
|
|
onPriceScalesChanged() {
|
|
return this._onPriceScalesChanged
|
|
}
|
|
setPaneSize(e) {
|
|
let t;
|
|
switch (e) {
|
|
case "large":
|
|
t = 1;
|
|
break;
|
|
case "medium":
|
|
t = .6;
|
|
break;
|
|
case "small":
|
|
t = .3;
|
|
break;
|
|
case "tiny":
|
|
t = .15;
|
|
break;
|
|
default:
|
|
throw new Error("Unknown size enum value: " + e)
|
|
}
|
|
this._stretchFactor = 1e3 * t
|
|
}
|
|
stretchFactor() {
|
|
return this._stretchFactor
|
|
}
|
|
setStretchFactor(e) {
|
|
this._stretchFactor = e
|
|
}
|
|
customSources(e) {
|
|
return this.model().customSources(e)
|
|
}
|
|
onTagsChanged() {
|
|
return this._tagsChanged
|
|
}
|
|
dataSourcesCollectionChanged() {
|
|
return this._dataSourcesCollectionChanged
|
|
}
|
|
symbolSourceResolved() {
|
|
return this._dataSourceSymbolResolved
|
|
}
|
|
sourcePropertiesChanged() {
|
|
return this._sourcePropertiesChanged
|
|
}
|
|
sourceZOrderChanged() {
|
|
return this._sourcesZOrderChanged
|
|
}
|
|
lineToolsForArea(e) {
|
|
const t = this.height(),
|
|
i = this.width(),
|
|
s = this.logicalRectToPixels(e);
|
|
return [...this.m_dataSources, ...this.model().multiPaneSources(this)].filter(d
|
|
.isLineTool).filter(e => (e.paneViews(this) || []).some(e => {
|
|
const r = e.renderer(t, i);
|
|
return r && r.doesIntersectWithBox && r.doesIntersectWithBox(s)
|
|
}))
|
|
}
|
|
logicalRectToPixels(e) {
|
|
const t = this.defaultPriceScale(),
|
|
i = this.timeScale(),
|
|
n = Object(r.ensureNotNull)(Object(r.ensureNotNull)(t.mainSource())
|
|
.firstValue()),
|
|
o = t.priceToCoordinate(e.p1.price, n),
|
|
a = i.indexToCoordinate(e.p1.index),
|
|
l = t.priceToCoordinate(e.p2.price, n),
|
|
c = i.indexToCoordinate(e.p2.index),
|
|
h = new s.Point(Math.min(a, c), Math.min(o, l)),
|
|
u = new s.Point(Math.max(a, c), Math.max(o, l));
|
|
return Object(s.box)(h, u)
|
|
}
|
|
clipboardLineToolOwnerSource(e) {
|
|
const t = this.dataSourceForId(e);
|
|
if (null !== t) {
|
|
const e = t.ownerSource();
|
|
if (null !== e && null !== e.firstValue()) return e
|
|
}
|
|
const i = this.mainDataSource();
|
|
if (null !== i && null !== i.firstValue()) return i;
|
|
for (const e of this.dataSources())
|
|
if (e instanceof h.PriceDataSource && null !== e.firstValue()) return e;
|
|
return null
|
|
}
|
|
realignLineTools() {
|
|
let e = !1;
|
|
for (const t of this.m_dataSources) Object(d.isLineTool)(t) && (t
|
|
.calcIsActualSymbol(), t.updateAllViews(), e = !0);
|
|
return this._invalidateSourcesCache(), e
|
|
}
|
|
startScalePrice(e, t) {
|
|
e.startScale(t)
|
|
}
|
|
scalePriceTo(e, t) {
|
|
e.scaleTo(t), this.updateAllViews()
|
|
}
|
|
endScalePrice(e) {
|
|
e.endScale()
|
|
}
|
|
resetPriceScale(e) {
|
|
const t = this.timeScale().visibleBarsStrictRange();
|
|
e.isLockScale() || e.setMode({
|
|
autoScale: !0
|
|
}), e.recalculatePriceRange(t), this.updateAllViews()
|
|
}
|
|
restorePriceScaleState(e, t) {
|
|
e.restoreState(t), this.updateAllViews()
|
|
}
|
|
beginInsertManyLineDataSources() {
|
|
this._isInInsertManyDataSourcesState = !0, this._lastLineDataSourceZOrder = null
|
|
}
|
|
endInsertManyLineDataSources() {
|
|
this._isInInsertManyDataSourcesState = !1, this._lastLineDataSourceZOrder = null
|
|
}
|
|
removeSourceFromPriceScale(e) {
|
|
const t = e.priceScale();
|
|
if (null !== t) {
|
|
const i = t.dataSources();
|
|
i.indexOf(e) >= 0 && t.removeDataSource(e), 0 === i.length && this
|
|
.removePriceScale(t)
|
|
}
|
|
}
|
|
_addSourceToCollections(e, t) {
|
|
this.m_dataSources.push(e), this._sourcesById.set(e.id(), e), this
|
|
._invalidateSourcesCache(), t || 0 !== this._bulkActionsActive || this
|
|
._dataSourcesCollectionChanged.fire();
|
|
const i = () => {
|
|
this._sourcePropertiesChanged.fire(e)
|
|
};
|
|
e.properties().subscribe(this, i), e.zOrderChanged().subscribe(this, t => this
|
|
._sourcesZOrderChanged.fire(e, t)), Object(d.isLineTool)(e) && (e
|
|
.normalizedPointsChanged().subscribe(this, i), e.fixedPointsChanged()
|
|
.subscribe(this, i), e.hasAlert.subscribe(i), e.linkKey().subscribe(i), this
|
|
._sourceWatchedValuesSubscriptions.set(e.id(), i)), e instanceof h
|
|
.PriceDataSource && (e.currencyChanged().subscribe(this, () => this
|
|
._invalidateSourcesCache()), e.unitChanged().subscribe(this, () => this
|
|
._invalidateSourcesCache()), this._priceDataSources.push(e), Object(w
|
|
.isSymbolSource)(e) && e.symbolResolved().subscribe(this, () => this
|
|
._dataSourceSymbolResolved.fire(e))), e.isMultiPaneAvailable() && this
|
|
.model().addMultiPaneSource(e),
|
|
!e.isSpeciallyZOrderedSource() && this
|
|
._reorderZOrderOnAddingSourceToCollectionAllowed && (Object(d.isLineTool)(e) &&
|
|
Object(P.isReorderRequired)(null, e.zorder()) || Object(y.isStudy)(e) &&
|
|
Object(P.isReorderRequired)(e.zorder(), null)) && (this
|
|
._reorderZOrderOnAddingSourceToCollectionAllowed = Object(P
|
|
.reorderDataSourcesZOrder)(this.m_dataSources))
|
|
}
|
|
_removeSourceFromCollections(e, t) {
|
|
const i = this.m_dataSources[e];
|
|
i.properties().unsubscribeAll(this), i.zOrderChanged().unsubscribeAll(this), this
|
|
.m_dataSources.splice(e, 1), this._sourcesById.delete(i.id());
|
|
const s = i.id();
|
|
if (Object(d.isLineTool)(i) && (i.normalizedPointsChanged().unsubscribeAll(this), i
|
|
.fixedPointsChanged().unsubscribeAll(this), this
|
|
._sourceWatchedValuesSubscriptions.has(s))) {
|
|
const e = this._sourceWatchedValuesSubscriptions.get(s);
|
|
i.hasAlert.unsubscribe(e), i.linkKey().unsubscribe(e)
|
|
}
|
|
if (this._invalidateSourcesCache(), i instanceof h.PriceDataSource) {
|
|
i.currencyChanged().unsubscribeAll(this), i.unitChanged().unsubscribeAll(this);
|
|
const e = this._priceDataSources.indexOf(i);
|
|
Object(r.assert)(-1 !== e), this._priceDataSources.splice(e, 1), Object(w
|
|
.isSymbolSource)(i) && i.symbolResolved().unsubscribeAll(this)
|
|
}
|
|
t || 0 !== this._bulkActionsActive || this._dataSourcesCollectionChanged.fire(), i
|
|
.isMultiPaneAvailable() && this.model().removeMultiPaneSource(i), this
|
|
._reorderZOrderOnAddingSourceToCollectionAllowed = !0
|
|
}
|
|
_recalculatePriceScaleByScaleRatio(e) {
|
|
this.isMainPane() && e === this._lockedPriceScale && (null !== this
|
|
._currentPriceScaleRatio ? this._applyOldScaleRatioToPriceScale() : this
|
|
._tryToApplyNewPriceScaleRatio())
|
|
}
|
|
_defaultBottomMargin() {
|
|
return .01 * this.properties().childs().bottomMargin.value()
|
|
}
|
|
_defaultTopMargin() {
|
|
return .01 * this.properties().childs().topMargin.value()
|
|
}
|
|
_updateMargins() {
|
|
const e = this._defaultTopMargin(),
|
|
t = this._defaultBottomMargin();
|
|
for (const i of this._leftPriceScales) x(i, e, t);
|
|
for (const i of this._rightPriceScales) x(i, e, t);
|
|
for (const i of this.m_dataSources)
|
|
if (this.isOverlay(i)) {
|
|
const s = i.priceScale();
|
|
null !== s && (x(s, e, t), this.recalculatePriceScale(s))
|
|
} for (const e of this._leftPriceScales) this.recalculatePriceScale(e);
|
|
for (const e of this._rightPriceScales) this.recalculatePriceScale(e);
|
|
this.updateAllViews()
|
|
}
|
|
_batchReorder(e, t, i) {
|
|
i(this.sourcesByGroup().allExceptSpecialSources(), e, t), this
|
|
._invalidateSourcesCache(), this._dataSourcesCollectionChanged.fire(), this
|
|
.model().fullUpdate()
|
|
}
|
|
_placePriceScale(e, t, i) {
|
|
if ("overlay" === t) return void e.invalidateMargins();
|
|
const s = "left" === t ? this._leftPriceScales : this._rightPriceScales,
|
|
n = void 0 === i ? s.length : i;
|
|
s.splice(n, 0, e), e.modeChanged().subscribe(this, this._onPriceScaleModeChanged
|
|
.bind(this, e)), e.internalHeightChanged().subscribe(this, this
|
|
._recalculatePriceScaleByScaleRatio.bind(this, e)), e.priceRangeChanged()
|
|
.subscribe(this, this._recalculateTimeScaleByScaleRatio.bind(this, e)), e
|
|
.priceRangeChanged().subscribe(this, this._onPriceScaleSetMinMaxPriceRange.bind(
|
|
this, e)), e.isLockScale() && (Object(r.assert)(null === this
|
|
._lockedPriceScale), this._lockedPriceScale = e, this
|
|
._currentPriceScaleRatio = null), e.invalidateMargins(), this
|
|
._onPriceScalesChanged.fire()
|
|
}
|
|
_onPriceScaleModeChanged(e, t, i) {
|
|
if (i.lockScale && (this._lockedPriceScale !== e && null !== this
|
|
._lockedPriceScale && this._lockedPriceScale.setMode({
|
|
lockScale: !1
|
|
}), this._lockedPriceScale = e, this._currentPriceScaleRatio = Object(v
|
|
.scaleRatio)(this.timeScale(), e)), t.lockScale && !i.lockScale && (this
|
|
._lockedPriceScale = null, this._currentPriceScaleRatio = null), t
|
|
.percentage === i.percentage && t.indexedTo100 === i.indexedTo100) return;
|
|
const s = this.timeScale().visibleBarsStrictRange();
|
|
null !== s && (e.recalculatePriceRange(s), e.updateAllViews())
|
|
}
|
|
_applyOldScaleRatioToPriceScale() {
|
|
this._isRecalculatingScales || null === this._currentPriceScaleRatio || null ===
|
|
this._lockedPriceScale || (this._isRecalculatingScales = !0, this
|
|
._setNewPriceRangeByScaleRatio(this._lockedPriceScale, this
|
|
._currentPriceScaleRatio, this._mainSourceVisiblePriceRange(this
|
|
._lockedPriceScale)), this._isRecalculatingScales = !1)
|
|
}
|
|
_setNewPriceRangeByScaleRatio(e, t, i, s, r) {
|
|
const n = Object(v.priceRangeByScaleRatio)(e, this.timeScale().barSpacing(), t);
|
|
e.setPriceRange(null !== n ? n : i, s, r)
|
|
}
|
|
_applyOldScaleRatioToTimeScale() {
|
|
this._isRecalculatingScales || null === this._currentPriceScaleRatio || (this
|
|
._isRecalculatingScales = !0, this._setNewBarSpacingByScaleRatio(), this
|
|
._isRecalculatingScales = !1)
|
|
}
|
|
_tryToApplyNewPriceScaleRatio() {
|
|
const e = Object(r.ensureNotNull)(this._lockedPriceScale),
|
|
t = Object(v.scaleRatio)(this.timeScale(), e);
|
|
this._currentPriceScaleRatio === t || e.isLog() || (this._currentPriceScaleRatio =
|
|
t, this.model().mainSeriesScaleRatioPropertyOnChanged())
|
|
}
|
|
_recalculateTimeScaleByScaleRatio(e) {
|
|
e === this._lockedPriceScale && (null !== this._currentPriceScaleRatio ? this
|
|
._applyOldScaleRatioToTimeScale() : this._tryToApplyNewPriceScaleRatio())
|
|
}
|
|
_setNewBarSpacingByScaleRatio() {
|
|
const e = this.timeScale().getValidBarSpacing(Object(v.barSpacingByScaleRatio)(
|
|
Object(r.ensureNotNull)(this._lockedPriceScale), this
|
|
._currentPriceScaleRatio));
|
|
this.timeScale().isValidBarSpacing(e) && this.timeScale().setBarSpacing(e)
|
|
}
|
|
_mainSourceVisiblePriceRange(e) {
|
|
const t = this.timeScale().visibleBarsStrictRange();
|
|
return null !== t ? Object(r.ensureNotNull)(Object(r.ensureNotNull)(e.mainSource())
|
|
.priceRange(t.firstBar(), t.lastBar())) : new S.PriceRange(-.5, .5)
|
|
}
|
|
_setMinMaxPriceRange() {
|
|
const e = Object(r.ensureNotNull)(this._lockedPriceScale),
|
|
t = Object(v.priceRangeByScaleRatio)(e, this.timeScale().maxBarSpacing(), this
|
|
._currentPriceScaleRatio),
|
|
i = Object(v.priceRangeByScaleRatio)(e, this.timeScale().minBarSpacing(), this
|
|
._currentPriceScaleRatio);
|
|
null !== t && e.setMaxPriceRange(t), null !== i && e.setMinPriceRange(i)
|
|
}
|
|
_onPriceScaleSetMinMaxPriceRange(e) {
|
|
e === this._lockedPriceScale && this._setMinMaxPriceRange()
|
|
}
|
|
}
|
|
},
|
|
yi8X: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "LineToolInfoLine", (function() {
|
|
return n
|
|
}));
|
|
var s = i("Ocx9"),
|
|
r = i("WPQD");
|
|
class n extends r.LineToolTrendLine {
|
|
constructor(e, t) {
|
|
super(e, t || n.createProperties())
|
|
}
|
|
pointsCount() {
|
|
return 2
|
|
}
|
|
name() {
|
|
return "Info Line"
|
|
}
|
|
static createProperties(e) {
|
|
const t = new s.DefaultProperty("linetoolinfoline", e);
|
|
return n._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
r.LineToolTrendLine._configureProperties(e)
|
|
}
|
|
}
|
|
},
|
|
"z+Sa": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t),
|
|
i.d(t, "SeriesHorizontalBaseLinePaneView", (function() {
|
|
return r
|
|
}));
|
|
var s = i("k4w6");
|
|
class r extends s.a {
|
|
constructor(e) {
|
|
super(e)
|
|
}
|
|
_updateImpl() {
|
|
this._lineRendererData.visible = !1;
|
|
const e = this._series.priceScale().mode();
|
|
if (!e.percentage && !e.indexedTo100) return;
|
|
const t = this._series.firstValue();
|
|
null !== t && (this._lineRendererData.visible = !0, this._lineRendererData.y =
|
|
this._series.priceScale().priceToCoordinate(t, t), this
|
|
._lineRendererData.color = this._series.properties().baseLineColor
|
|
.value())
|
|
}
|
|
}
|
|
},
|
|
"z+cS": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "VerticalLineRenderer", (function() {
|
|
return a
|
|
}));
|
|
var s = i("VdBB"),
|
|
r = i("jFln"),
|
|
n = i("gAom"),
|
|
o = i("Zp/P");
|
|
class a {
|
|
constructor() {
|
|
this._data = null, this._hitTest = null
|
|
}
|
|
setData(e) {
|
|
this._data = e
|
|
}
|
|
setHitTest(e) {
|
|
this._hitTest = e
|
|
}
|
|
hitTest(e) {
|
|
if (null === this._data) return null;
|
|
const t = Object(o.interactionTolerance)().line,
|
|
i = this._hitTest || new s.HitTestResult(s.HitTestResult.MOVEPOINT),
|
|
r = Math.abs(e.x - this._data.x) <= t + this._data.linewidth / 2,
|
|
n = void 0 === this._data.top || this._data.top - e.y <= t,
|
|
a = void 0 === this._data.bottom || e.y - this._data.bottom <= t;
|
|
return r && n && a ? i : null
|
|
}
|
|
draw(e, t) {
|
|
if (null === this._data) return;
|
|
if (this._data.linewidth <= 0) return;
|
|
if (this._data.x < -this._data.linewidth / 2 || this._data.x > t.cssWidth + this
|
|
._data.linewidth / 2) return;
|
|
const i = t.pixelRatio;
|
|
e.lineCap = "butt", e.strokeStyle = this._data.color, e.lineWidth = Math.max(1, Math
|
|
.floor(this._data.linewidth * i)), void 0 !== this._data.linestyle &&
|
|
Object(r.setLineStyle)(e, this._data.linestyle);
|
|
const s = void 0 !== this._data.top ? Math.max(this._data.top, 0) : 0,
|
|
o = void 0 !== this._data.bottom ? Math.min(this._data.bottom, t.cssHeight) : t
|
|
.cssHeight,
|
|
a = Math.round(this._data.x * i),
|
|
l = Math.floor(s * i),
|
|
c = Math.ceil(o * i);
|
|
Object(n.drawVerticalLine)(e, a, l, c)
|
|
}
|
|
}
|
|
},
|
|
"z61+": function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Eyy1"),
|
|
r = i("0YCj"),
|
|
n = i.n(r),
|
|
o = i("23IT"),
|
|
a = i("ogJP"),
|
|
l = i("txPx");
|
|
const c = ["first_visible_bar_time", "last_visible_bar_time"];
|
|
|
|
function h(e) {
|
|
return !e.groupId && !e.isHidden && !c.includes(e.id)
|
|
}
|
|
var u = i("Ecpn");
|
|
i.d(t, "a", (function() {
|
|
return p
|
|
}));
|
|
const d = Object(l.getLogger)("Platform.GUI.PropertyDialog.Indicators.MetaInfo");
|
|
class p {
|
|
constructor(e) {
|
|
this._metaInfo = e
|
|
}
|
|
hasUserEditableInputs() {
|
|
return this._metaInfo.inputs.some(h)
|
|
}
|
|
getUserEditableInputs() {
|
|
return this._metaInfo.inputs.filter(h)
|
|
}
|
|
hasUserEditableProperties() {
|
|
return n.a.isScriptStrategy(this._metaInfo)
|
|
}
|
|
hasUserEditableStyles() {
|
|
const e = this._metaInfo;
|
|
return e.plots.length > 0 || void 0 !== e.bands || void 0 !== e.filledAreas ||
|
|
Object(u.a)(e.shortId) || n.a.isScriptStrategy(this._metaInfo) || Object.values(
|
|
e.graphics).some(e => void 0 !== e)
|
|
}
|
|
getUserEditablePlots() {
|
|
const e = new Set,
|
|
t = this._metaInfo;
|
|
return t.plots.filter(i => {
|
|
if (Object(o.isColorerPlot)(i) || Object(o.isTextColorerPlot)(i) ||
|
|
Object(o.isDataOffsetPlot)(i) || Object(o.isOhlcColorerPlot)(i) ||
|
|
Object(o.isAlertConditionPlot)(i)) return !1;
|
|
if (Object(o.isOhlcPlot)(i)) {
|
|
const r = i.target;
|
|
if (e.has(r)) return !1;
|
|
e.add(r);
|
|
const n = Object(s.ensureDefined)(t.ohlcPlots);
|
|
return !Object(s.ensureDefined)(n[r]).isHidden
|
|
} {
|
|
const e = t.styles ? t.styles[i.id] : void 0;
|
|
return void 0 === e || !e.isHidden
|
|
}
|
|
})
|
|
}
|
|
hasUserEditableOptions() {
|
|
return this.hasUserEditableInputs() || this.hasUserEditableProperties() || this
|
|
.hasUserEditableStyles()
|
|
}
|
|
getStrategyProperties() {
|
|
const e = this._metaInfo,
|
|
t = e.inputs.filter(m),
|
|
i = {
|
|
..._
|
|
};
|
|
for (const s of t) {
|
|
const t = s.internalID;
|
|
i[t] = s, _.hasOwnProperty(t) || d.logWarn(
|
|
`Unknown strategy input internal id ${t} in ${e.fullId}`)
|
|
}
|
|
return Object(a.clone)(i)
|
|
}
|
|
}
|
|
const _ = {
|
|
currency: void 0,
|
|
backtest_fill_limits_assumption: void 0,
|
|
calc_on_every_tick: void 0,
|
|
calc_on_order_fills: void 0,
|
|
commission_value: void 0,
|
|
commission_type: void 0,
|
|
initial_capital: void 0,
|
|
pyramiding: void 0,
|
|
slippage: void 0,
|
|
default_qty_type: void 0,
|
|
default_qty_value: void 0,
|
|
margin_long: void 0,
|
|
margin_short: void 0
|
|
};
|
|
|
|
function m(e) {
|
|
return "strategy_props" === e.groupId
|
|
}
|
|
},
|
|
"z8/4": function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "OverlayLegendView", (function() {
|
|
return n
|
|
}));
|
|
var s = i("JjUe"),
|
|
r = i("qXYw");
|
|
class n extends s.OverlayDataWindowView {
|
|
constructor(e, t) {
|
|
super(e, t), this._additional = null, this._showBarChange = t.properties()
|
|
.paneProperties.legendProperties.showBarChange, this._showSeriesOHLC = t
|
|
.properties().paneProperties.legendProperties.showSeriesOHLC, this
|
|
._studyOverlay = e, this._showBarChange.subscribe(this, this.update), this
|
|
._showSeriesOHLC.subscribe(this, this.update)
|
|
}
|
|
isValuesVisible() {
|
|
return this._showSeriesOHLC.value() || this._showBarChange.value()
|
|
}
|
|
additional() {
|
|
return this._additional
|
|
}
|
|
destroy() {
|
|
this._showBarChange.unsubscribeAll(this), this._showSeriesOHLC.unsubscribeAll(
|
|
this)
|
|
}
|
|
_updateImpl() {
|
|
super._updateImpl()
|
|
}
|
|
_createValuesProvider(e, t) {
|
|
return new r.OverlayLegendValuesProvider(e, t)
|
|
}
|
|
}
|
|
},
|
|
zDbI: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "CHART_FONT_FAMILY", (function() {
|
|
return r
|
|
}));
|
|
var s = i("mNbo");
|
|
const r = Object(s.isOnMobileAppPage)("old") ? "system-ui, -apple-system" :
|
|
"'Trebuchet MS', Roboto, Ubuntu, sans-serif"
|
|
},
|
|
zL3Q: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "a", (function() {
|
|
return _
|
|
})), i.d(t, "b", (function() {
|
|
return m
|
|
}));
|
|
var s = i("hY0g"),
|
|
r = i.n(s),
|
|
n = i("4o++"),
|
|
o = i("mMWL"),
|
|
a = i("CW80"),
|
|
l = i("m/3z");
|
|
const c = new r.a(!1),
|
|
h = new r.a(n.MagnetMode.WeakMagnet),
|
|
u = Object(l.c)(),
|
|
d = Object(l.d)();
|
|
|
|
function p() {
|
|
const e = u.value();
|
|
if (d.value() && (o.isToolEditingNow.value() || o.isToolCreatingNow.value())) return void c
|
|
.setValue(!1);
|
|
const t = o.tool.value(),
|
|
i = e && (Object(a.isLineToolName)(t) || o.isToolEditingNow.value() || Object(o
|
|
.toolIsMeasure)(t)),
|
|
s = Object(o.properties)().childs().magnet.value();
|
|
h.setValue(!s && i ? n.MagnetMode.StrongMagnet : Object(o.properties)().childs().magnetMode
|
|
.value()), c.setValue(i ? !s : s)
|
|
}
|
|
|
|
function _() {
|
|
return c
|
|
}
|
|
|
|
function m() {
|
|
return h
|
|
}
|
|
Object(o.runOnDrawingStateReady)(() => {
|
|
Object(o.properties)().childs().magnet.subscribe(null, p), Object(o.properties)()
|
|
.childs().magnetMode.subscribe(null, p), u.subscribe(p), d.subscribe(p), o.tool
|
|
.subscribe(p), o.isToolEditingNow.subscribe(p), p()
|
|
})
|
|
},
|
|
zM7N: function(e, t, i) {
|
|
"use strict";
|
|
i.d(t, "c", (function() {
|
|
return c
|
|
})), i.d(t, "b", (function() {
|
|
return h
|
|
})), i.d(t, "e", (function() {
|
|
return u
|
|
})), i.d(t, "d", (function() {
|
|
return d
|
|
}));
|
|
var s = i("YFKU"),
|
|
r = i("eJTA"),
|
|
n = i("/McG"),
|
|
o = i("8pII"),
|
|
a = i("FZIs");
|
|
|
|
function l() {
|
|
return {
|
|
[a.a.Light]: JSON.parse(JSON.stringify(n)),
|
|
[a.a.Dark]: JSON.parse(JSON.stringify(o))
|
|
}
|
|
}
|
|
|
|
function c() {
|
|
return [a.a.Light, a.a.Dark]
|
|
}
|
|
|
|
function h(e) {
|
|
return l()[e]
|
|
}
|
|
|
|
function u(e) {
|
|
return {
|
|
[a.a.Light]: s.t("Light", {
|
|
context: "colorThemeName"
|
|
}),
|
|
[a.a.Dark]: s.t("Dark", {
|
|
context: "colorThemeName"
|
|
})
|
|
} [e] || e
|
|
}
|
|
|
|
function d(e) {
|
|
const t = l();
|
|
return c().some(i => p(t[i], e))
|
|
}
|
|
|
|
function p(e, t) {
|
|
let i = e.content === t.content;
|
|
return function(e = {}, t) {
|
|
try {
|
|
! function e(t, i, s) {
|
|
for (const r in t)
|
|
if (t.hasOwnProperty(r)) {
|
|
const n = i.concat(r);
|
|
if ("object" == typeof t[r]) e(t[r], n, s);
|
|
else if (s(n, t[r])) throw new Error("exit")
|
|
}
|
|
}(e, [], t)
|
|
} catch (e) {
|
|
return
|
|
}
|
|
}(e.content, (e, s) => {
|
|
const n = function(e, t = {}) {
|
|
let i = t;
|
|
for (let t = 0; t < e.length; t++) {
|
|
if (!i || "object" != typeof i) return;
|
|
i = i[e[t]]
|
|
}
|
|
if ("string" == typeof i || "number" == typeof i) return i;
|
|
return
|
|
}(e, t.content);
|
|
return i = function(e, t) {
|
|
if ("string" == typeof e && "string" == typeof t) try {
|
|
return Object(r.areEqualRgb)(Object(r.parseRgb)(e), Object(r
|
|
.parseRgb)(t))
|
|
} catch (i) {
|
|
return e === t
|
|
}
|
|
return e === t
|
|
}(s, n), !i
|
|
}), i
|
|
}
|
|
i.d(t, "a", (function() {
|
|
return a.a
|
|
}))
|
|
},
|
|
zRdu: function(e, t, i) {
|
|
"use strict";
|
|
var s;
|
|
i.d(t, "a", (function() {
|
|
return s
|
|
})),
|
|
function(e) {
|
|
e[e.Separator = 0] = "Separator", e[e.Action = 1] = "Action", e[e.ActionAsync = 2] =
|
|
"ActionAsync", e[e.Loader = 3] = "Loader"
|
|
}(s || (s = {}))
|
|
},
|
|
zUrt: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "backend", (function() {
|
|
return s
|
|
}));
|
|
const s = i("Ery9")
|
|
},
|
|
zXvd: function(e, t, i) {
|
|
"use strict";
|
|
i.r(t), i.d(t, "NumericFormatter", (function() {
|
|
return n
|
|
}));
|
|
var s = i("kcTO"),
|
|
r = i("nc0P");
|
|
class n {
|
|
constructor(e) {
|
|
this._precision = e
|
|
}
|
|
format(e) {
|
|
return (void 0 !== this._precision ? e.toFixed(this._precision) : n.formatNoE(e))
|
|
.replace(".", s.formatterOptions.decimalSign)
|
|
}
|
|
parse(e) {
|
|
const t = e.replace(s.formatterOptions.decimalSign, ".");
|
|
let i = parseFloat(t);
|
|
return this._precision && (i = +i.toFixed(this._precision)), i
|
|
}
|
|
static formatNoE(e) {
|
|
if (!Number.isFinite(e)) return String(e);
|
|
const t = new r.Big(e);
|
|
return t.lt(1) ? t.toFixed() : t.toString()
|
|
}
|
|
}
|
|
},
|
|
zZ5f: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Ss5c").LineDataSource,
|
|
r = i("5rJj"),
|
|
n = i("j3hX").LineToolColorsProperty;
|
|
class o extends s {
|
|
constructor(e, t) {
|
|
super(e, t || o.createProperties()), i.e("lt-pane-views").then(i.t.bind(null,
|
|
"xp9B", 7)).then(({
|
|
FibSpeedResistanceFanPaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
hLevelsCount() {
|
|
return o.HLevelsCount
|
|
}
|
|
vLevelsCount() {
|
|
return o.VLevelsCount
|
|
}
|
|
pointsCount() {
|
|
return 2
|
|
}
|
|
name() {
|
|
return "Fib Speed Resistance Fan"
|
|
}
|
|
processErase(e, t) {
|
|
var i = "h" === t.type ? "hlevel" + t.index : "vlevel" + t.index,
|
|
s = this.properties()[i].visible;
|
|
e.setProperty(s, !1, "Erase level line")
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "2PB4")))
|
|
.FibSpeedResistanceFanDefinitionsViewModel
|
|
}
|
|
_snapTo45DegreesAvailable() {
|
|
return !0
|
|
}
|
|
static createProperties(e) {
|
|
void 0 !== e && void 0 === e.reverse && (e.reverse = !0);
|
|
var t = new r("linetoolfibspeedresistancefan", e, !1, {
|
|
range: [1, 7],
|
|
prefixes: ["h", "v"],
|
|
names: ["coeff", "color", "visible"]
|
|
});
|
|
return o._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
s._configureProperties(e);
|
|
var t = [e.child("grid").child("color")];
|
|
for (let i = 1; i <= o.HLevelsCount; i++) t.push(e.child("hlevel" + i).child(
|
|
"color"));
|
|
for (let i = 1; i <= o.VLevelsCount; i++) t.push(e.child("vlevel" + i).child(
|
|
"color"));
|
|
e.addChild("linesColors", new n(t)), e.addExclusion("linesColors")
|
|
}
|
|
}
|
|
o.HLevelsCount = 7, o.VLevelsCount = 7, t.LineToolFibSpeedResistanceFan = o
|
|
},
|
|
ziJ5: function(e, t, i) {
|
|
"use strict";
|
|
(function(e) {
|
|
var s = i("QIuV").LineToolTrading,
|
|
r = i("Ss5c").LineDataSource,
|
|
n = i("RTYN").PositionAveragePriceAxisView,
|
|
o = i("jkoZ"),
|
|
a = i("Ocx9").DefaultProperty,
|
|
l = i("kcTO").PriceFormatter,
|
|
c = i("s1Gx").sortSourcesPreOrdered.LineToolPosition;
|
|
|
|
function h(e) {
|
|
return null == e ? e = "" : e += "", e
|
|
}
|
|
class u {
|
|
constructor(e) {
|
|
this._line = e, this._data = {
|
|
bodyText: "position",
|
|
quantityText: "0"
|
|
}, this._closeEnabled = !0, this._direction = "buy", this._profitState =
|
|
"neutral"
|
|
}
|
|
setDirection(e) {
|
|
return this._direction = e, this._line.updateAllViewsAndRedraw(), this
|
|
}
|
|
setProfitState(e) {
|
|
return this._profitState = e, this._line.updateAllViewsAndRedraw(), this
|
|
}
|
|
getPrice() {
|
|
return this._line.points().length > 0 ? this._line.points()[0].price : this
|
|
._line._timePoint.length > 0 ? this._line._timePoint[0].price : void 0
|
|
}
|
|
setPrice(e) {
|
|
if (this._line.points().length > 0) {
|
|
var t = this._line.points()[0];
|
|
t.price = e, this._line._points[0] = t, this._line.normalizePoints(),
|
|
this._line.updateAllViewsAndRedraw()
|
|
}
|
|
return this._line._timePoint.length > 0 && (this._line._timePoint[0].price =
|
|
e), this
|
|
}
|
|
getText() {
|
|
return this._data.bodyText
|
|
}
|
|
setText(e) {
|
|
return this._data.bodyText = e || "", this._line.updateAllViewsAndRedraw(),
|
|
this
|
|
}
|
|
setTooltip(e) {
|
|
return this._line.properties().tooltip.setValue(h(e)), this
|
|
}
|
|
getTooltip() {
|
|
return this._line.properties().tooltip.value()
|
|
}
|
|
setProtectTooltip(e) {
|
|
return this._line.properties().protectTooltip.setValue(h(e)), this
|
|
}
|
|
getProtectTooltip() {
|
|
return this._line.properties().protectTooltip.value()
|
|
}
|
|
setCloseTooltip(e) {
|
|
return this._line.properties().closeTooltip.setValue(h(e)), this
|
|
}
|
|
getCloseTooltip() {
|
|
return this._line.properties().closeTooltip.value()
|
|
}
|
|
setReverseTooltip(e) {
|
|
return this._line.properties().reverseTooltip.setValue(h(e)), this
|
|
}
|
|
getReverseTooltip() {
|
|
return this._line.properties().reverseTooltip.value()
|
|
}
|
|
getQuantity() {
|
|
return this._data.quantityText
|
|
}
|
|
setQuantity(e) {
|
|
return this._data.quantityText = e || "", this._line
|
|
.updateAllViewsAndRedraw(), this
|
|
}
|
|
getExtendLeft() {
|
|
var e = this._line.properties().extendLeft.value();
|
|
return "inherit" === e ? this._line._model.properties().tradingProperties
|
|
.extendLeft.value() : e
|
|
}
|
|
setExtendLeft(e) {
|
|
return this._line.properties().extendLeft.setValue(e), this
|
|
}
|
|
getLineLength() {
|
|
var e = this._line.properties().lineLength.value();
|
|
return "inherit" === e ? this._line._model.properties().tradingProperties
|
|
.lineLength.value() : e
|
|
}
|
|
setLineLength(e) {
|
|
return this._line.properties().lineLength.setValue(Math.max(0, Math.min(e,
|
|
100))), this
|
|
}
|
|
getLineColor() {
|
|
var e = this._line.properties();
|
|
return ("buy" === this._direction ? e.lineBuyColor : e.lineSellColor)
|
|
.value()
|
|
}
|
|
setLineColor(e) {
|
|
return "buy" === this._direction ? this.setLineBuyColor(e) : this
|
|
.setLineSellColor(e), this
|
|
}
|
|
setLineBuyColor(e) {
|
|
return this._line.properties().lineBuyColor.setValue(e), this
|
|
}
|
|
setLineSellColor(e) {
|
|
return this._line.properties().lineSellColor.setValue(e), this
|
|
}
|
|
getLineStyle() {
|
|
var e = this._line.properties().lineStyle.value();
|
|
return "inherit" === e ? this._line._model.properties().tradingProperties
|
|
.lineStyle.value() : e
|
|
}
|
|
setLineStyle(e) {
|
|
return this._line.properties().lineStyle.setValue(e), this
|
|
}
|
|
getLineWidth() {
|
|
var e = this._line.properties().lineWidth.value();
|
|
return "inherit" === e ? this._line._model.properties().tradingProperties
|
|
.lineWidth.value() : e
|
|
}
|
|
setLineWidth(e) {
|
|
return this._line.properties().lineWidth.setValue(e), this
|
|
}
|
|
getBodyBorderColor() {
|
|
var e = this._line.properties();
|
|
return ("buy" === this._direction ? e.bodyBorderBuyColor : e
|
|
.bodyBorderSellColor).value()
|
|
}
|
|
setBodyBorderColor(e) {
|
|
return "buy" === this._direction ? this.setBodyBorderBuyColor(e) : this
|
|
.setBodyBorderSellColor(e), this
|
|
}
|
|
setBodyBorderBuyColor(e) {
|
|
return this._line.properties().bodyBorderBuyColor.setValue(e), this
|
|
}
|
|
setBodyBorderSellColor(e) {
|
|
return this._line.properties().bodyBorderSellColor.setValue(e), this
|
|
}
|
|
getBodyBackgroundColor() {
|
|
return o.getColorFromProperties(this._line.properties().bodyBackgroundColor,
|
|
this._line.properties().bodyBackgroundTransparency)
|
|
}
|
|
setBodyBackgroundColor(e) {
|
|
return o.setColorToProperties(e, this._line.properties()
|
|
.bodyBackgroundColor, this._line.properties()
|
|
.bodyBackgroundTransparency), this
|
|
}
|
|
getBodyTextColor() {
|
|
var e = this._line.properties();
|
|
return ("positive" === this._profitState ? e.bodyTextPositiveColor :
|
|
"negative" === this._profitState ? e.bodyTextNegativeColor : e
|
|
.bodyTextNeutralColor).value()
|
|
}
|
|
setBodyTextColor(e) {
|
|
return "positive" === this._profitState ? this.setBodyTextPositiveColor(e) :
|
|
"negative" === this._profitState ? this.setBodyTextNegativeColor(e) :
|
|
this.setBodyTextNeutralColor(e), this
|
|
}
|
|
setBodyTextPositiveColor(e) {
|
|
return this._line.properties().bodyTextPositiveColor.setValue(e), this
|
|
}
|
|
setBodyTextNegativeColor(e) {
|
|
return this._line.properties().bodyTextNegativeColor.setValue(e), this
|
|
}
|
|
setBodyTextNeutralColor(e) {
|
|
return this._line.properties().bodyTextNeutralColor.setValue(e), this
|
|
}
|
|
getBodyFont() {
|
|
return o.getFontFromProperties(this._line.properties().bodyFontFamily, this
|
|
._line.properties().bodyFontSize, this._line.properties()
|
|
.bodyFontBold, this._line.properties().bodyFontItalic)
|
|
}
|
|
setBodyFont(e) {
|
|
return o.setFontToProperties(e, this._line.properties().bodyFontFamily, this
|
|
._line.properties().bodyFontSize, this._line.properties()
|
|
.bodyFontBold, this._line.properties().bodyFontItalic), this
|
|
}
|
|
getQuantityBorderColor() {
|
|
var e = this._line.properties();
|
|
return ("buy" === this._direction ? e.quantityBorderBuyColor : e
|
|
.quantityBorderSellColor).value()
|
|
}
|
|
setQuantityBorderColor(e) {
|
|
return "buy" === this._direction ? this.setQuantityBorderBuyColor(e) : this
|
|
.setQuantityBorderSellColor(e), this
|
|
}
|
|
setQuantityBorderBuyColor(e) {
|
|
return this._line.properties().quantityBorderBuyColor.setValue(e), this
|
|
}
|
|
setQuantityBorderSellColor(e) {
|
|
return this._line.properties().quantityBorderSellColor.setValue(e), this
|
|
}
|
|
getQuantityBackgroundColor() {
|
|
var e = this._line.properties();
|
|
return ("buy" === this._direction ? e.quantityBackgroundBuyColor : e
|
|
.quantityBackgroundSellColor).value()
|
|
}
|
|
setQuantityBackgroundColor(e) {
|
|
return "buy" === this._direction ? this.setQuantityBackgroundBuyColor(e) :
|
|
this.setQuantityBackgroundSellColor(e), this
|
|
}
|
|
setQuantityBackgroundBuyColor(e) {
|
|
return this._line.properties().quantityBackgroundBuyColor.setValue(e), this
|
|
}
|
|
setQuantityBackgroundSellColor(e) {
|
|
return this._line.properties().quantityBackgroundSellColor.setValue(e), this
|
|
}
|
|
getQuantityTextColor() {
|
|
return o.getColorFromProperties(this._line.properties().quantityTextColor,
|
|
this._line.properties().quantityTextTransparency)
|
|
}
|
|
setQuantityTextColor(e) {
|
|
return o.setColorToProperties(e, this._line.properties().quantityTextColor,
|
|
this._line.properties().quantityTextTransparency), this
|
|
}
|
|
getQuantityFont() {
|
|
return o.getFontFromProperties(this._line.properties().quantityFontFamily,
|
|
this._line.properties().quantityFontSize, this._line.properties()
|
|
.quantityFontBold, this._line.properties().quantityFontItalic)
|
|
}
|
|
setQuantityFont(e) {
|
|
return o.setFontToProperties(e, this._line.properties().quantityFontFamily,
|
|
this._line.properties().quantityFontSize, this._line.properties()
|
|
.quantityFontBold, this._line.properties().quantityFontItalic), this
|
|
}
|
|
getReverseButtonBorderColor() {
|
|
var e = this._line.properties();
|
|
return ("buy" === this._direction ? e.reverseButtonBorderBuyColor : e
|
|
.reverseButtonBorderSellColor).value()
|
|
}
|
|
setReverseButtonBorderColor(e) {
|
|
return "buy" === this._direction ? this.setReverseButtonBorderBuyColor(e) :
|
|
this.setReverseButtonBorderSellColor(e), this
|
|
}
|
|
setReverseButtonBorderBuyColor(e) {
|
|
return this._line.properties().reverseButtonBorderBuyColor.setValue(e), this
|
|
}
|
|
setReverseButtonBorderSellColor(e) {
|
|
return this._line.properties().reverseButtonBorderSellColor.setValue(e),
|
|
this
|
|
}
|
|
getReverseButtonBackgroundColor() {
|
|
return o.getColorFromProperties(this._line.properties()
|
|
.reverseButtonBackgroundColor, this._line.properties()
|
|
.reverseButtonBackgroundTransparency)
|
|
}
|
|
setReverseButtonBackgroundColor(e) {
|
|
return o.setColorToProperties(e, this._line.properties()
|
|
.reverseButtonBackgroundColor, this._line.properties()
|
|
.reverseButtonBackgroundTransparency), this
|
|
}
|
|
getReverseButtonIconColor() {
|
|
var e = this._line.properties();
|
|
return ("buy" === this._direction ? e.reverseButtonIconBuyColor : e
|
|
.reverseButtonIconSellColor).value()
|
|
}
|
|
setReverseButtonIconColor(e) {
|
|
return "buy" === this._direction ? this.setReverseButtonIconBuyColor(e) :
|
|
this.setReverseButtonIconSellColor(e), this
|
|
}
|
|
setReverseButtonIconBuyColor(e) {
|
|
return this._line.properties().reverseButtonIconBuyColor.setValue(e), this
|
|
}
|
|
setReverseButtonIconSellColor(e) {
|
|
return this._line.properties().reverseButtonIconSellColor.setValue(e), this
|
|
}
|
|
getCloseButtonBorderColor() {
|
|
var e = this._line.properties();
|
|
return ("buy" === this._direction ? e.closeButtonBorderBuyColor : e
|
|
.closeButtonBorderSellColor).value()
|
|
}
|
|
setCloseButtonBorderColor(e) {
|
|
return "buy" === this._direction ? this.setCloseButtonBorderBuyColor(e) :
|
|
this.setCloseButtonBorderSellColor(e), this
|
|
}
|
|
setCloseButtonBorderBuyColor(e) {
|
|
return this._line.properties().closeButtonBorderBuyColor.setValue(e), this
|
|
}
|
|
setCloseButtonBorderSellColor(e) {
|
|
return this._line.properties().closeButtonBorderSellColor.setValue(e), this
|
|
}
|
|
getCloseButtonBackgroundColor() {
|
|
return o.getColorFromProperties(this._line.properties()
|
|
.closeButtonBackgroundColor, this._line.properties()
|
|
.closeButtonBackgroundTransparency)
|
|
}
|
|
setCloseButtonBackgroundColor(e) {
|
|
return o.setColorToProperties(e, this._line.properties()
|
|
.closeButtonBackgroundColor, this._line.properties()
|
|
.closeButtonBackgroundTransparency), this
|
|
}
|
|
getCloseButtonIconColor() {
|
|
var e = this._line.properties();
|
|
return ("buy" === this._direction ? e.closeButtonIconBuyColor : e
|
|
.closeButtonIconSellColor).value()
|
|
}
|
|
setCloseButtonIconColor(e) {
|
|
return "buy" === this._direction ? this.setCloseButtonIconBuyColor(e) : this
|
|
.setCloseButtonIconSellColor(e), this
|
|
}
|
|
setCloseButtonIconBuyColor(e) {
|
|
return this._line.properties().closeButtonIconBuyColor.setValue(e), this
|
|
}
|
|
setCloseButtonIconSellColor(e) {
|
|
return this._line.properties().closeButtonIconSellColor.setValue(e), this
|
|
}
|
|
block() {
|
|
this._blocked = !0, this._line.updateAllViewsAndRedraw()
|
|
}
|
|
unblock() {
|
|
this._blocked = !1, this._line.updateAllViewsAndRedraw()
|
|
}
|
|
isFunction(e) {
|
|
return "function" == typeof e
|
|
}
|
|
onReverse(e, t) {
|
|
return t ? this.isFunction(t) && (this._onReverseData = e, this
|
|
._onReverseCallback = t) : this.isFunction(e) && (this
|
|
._onReverseCallback = e), this
|
|
}
|
|
callOnReverse() {
|
|
this.isFunction(this._onReverseCallback) && this._onReverseCallback.call(
|
|
this, this._onReverseData)
|
|
}
|
|
isOnReverseCallbackPresent() {
|
|
return this.isFunction(this._onReverseCallback)
|
|
}
|
|
onClose(e, t) {
|
|
return t ? this.isFunction(t) && (this._onCloseData = e, this
|
|
._onCloseCallback = t) : this.isFunction(e) && (this
|
|
._onCloseCallback = e), this
|
|
}
|
|
setCloseEnabled(e) {
|
|
return this._closeEnabled === e || (this._closeEnabled = e, this
|
|
._onCloseCallback && this._line.updateAllViewsAndRedraw()), this
|
|
}
|
|
isCloseEnabled() {
|
|
return this._closeEnabled
|
|
}
|
|
callOnClose() {
|
|
this.isFunction(this._onCloseCallback) && this._closeEnabled && this
|
|
._onCloseCallback.call(this, this._onCloseData)
|
|
}
|
|
isOnCloseCallbackPresent() {
|
|
return this._closeEnabled && this.isFunction(this._onCloseCallback)
|
|
}
|
|
onModify(e, t) {
|
|
return t ? this.isFunction(t) && (this._onModifyData = e, this
|
|
._onModifyCallback = t) : this.isFunction(e) && (this
|
|
._onModifyCallback = e), this
|
|
}
|
|
callOnModify() {
|
|
this.isFunction(this._onModifyCallback) && this._onModifyCallback.call(this,
|
|
this._onModifyData)
|
|
}
|
|
onContextMenu(e, t) {
|
|
return t ? this.isFunction(t) && (this._onContextMenuData = e, this
|
|
._onContextMenuCallback = t) : this.isFunction(e) && (this
|
|
._onContextMenuCallback = e), this
|
|
}
|
|
shouldShowContextMenu() {
|
|
return this.isFunction(this._onContextMenuCallback)
|
|
}
|
|
callOnContextMenu() {
|
|
if (this.isFunction(this._onContextMenuCallback)) return this
|
|
._onContextMenuCallback.call(this, this._onContextMenuData)
|
|
}
|
|
remove() {
|
|
this._line._model.removeSource(this._line), delete this._line
|
|
}
|
|
}
|
|
class d extends s {
|
|
constructor(e, t) {
|
|
super(e, t || d.createProperties()), this._adapter = new u(this), i.e(
|
|
"lt-pane-views").then(i.t.bind(null, "GzSs", 7)).then(({
|
|
PositionPaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
});
|
|
var s = e.mainSeries().symbolInfo(),
|
|
r = null !== s ? s.pricescale : 100,
|
|
n = null !== s && s.fractional ? s.minmov : 1,
|
|
o = null !== s && s.fractional,
|
|
a = null !== s ? s.minmove2 : void 0;
|
|
this._formatter = new l(r, n, o, a)
|
|
}
|
|
zorder() {
|
|
return c
|
|
}
|
|
isSpeciallyZOrderedSource() {
|
|
return !0
|
|
}
|
|
setPoint(e, t, i) {
|
|
this._points[e] = t, this.normalizePoints()
|
|
}
|
|
addPoint(e, t) {
|
|
return this._points.push(e), this._lastPoint = null, this.normalizePoints(),
|
|
this.createServerPoints(), !0
|
|
}
|
|
name() {
|
|
return "Position"
|
|
}
|
|
createPriceAxisView(e) {
|
|
return this._priceAxisView = new n(this, {
|
|
pointIndex: e,
|
|
backgroundPropertyGetter: () => this._adapter.getLineColor()
|
|
}), this._priceAxisView
|
|
}
|
|
paneViews() {
|
|
return TradingView.printing && !e.enabled("snapshot_trading_drawings") ?
|
|
null : this._model.properties().tradingProperties.showPositions
|
|
.value() ? r.prototype.paneViews.call(this) : null
|
|
}
|
|
priceAxisViews(t, i) {
|
|
return TradingView.printing && !e.enabled("snapshot_trading_drawings") ?
|
|
null : this._model.properties().tradingProperties.showPositions
|
|
.value() ? r.prototype.priceAxisViews.call(this, t, i) : null
|
|
}
|
|
hasContextMenu() {
|
|
return this._adapter.shouldShowContextMenu()
|
|
}
|
|
contextMenuItems() {
|
|
return this._adapter.callOnContextMenu()
|
|
}
|
|
formatter() {
|
|
return this._formatter
|
|
}
|
|
static createProperties(e) {
|
|
var t = new a("linetoolposition", e, !1, !1);
|
|
return d._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
s._configureProperties(e)
|
|
}
|
|
}
|
|
t.LineToolPosition = d
|
|
}).call(this, i("Kxc7"))
|
|
},
|
|
zqZp: function(e, t, i) {
|
|
"use strict";
|
|
var s = i("Ss5c").LineDataSource,
|
|
r = i("Ocx9").DefaultProperty,
|
|
n = i("j3hX").LineToolColorsProperty;
|
|
class o extends s {
|
|
constructor(e, t) {
|
|
super(e, t || o.createProperties()), i.e("lt-pane-views").then(i.t.bind(null,
|
|
"Ni7V", 7)).then(({
|
|
PriceLabelPaneView: e
|
|
}) => {
|
|
this._setPaneViews([new e(this, this._model)])
|
|
})
|
|
}
|
|
pointsCount() {
|
|
return 1
|
|
}
|
|
name() {
|
|
return "Price Label"
|
|
}
|
|
async _getPropertyDefinitionsViewModelClass() {
|
|
return (await Promise.all([i.e(27), i.e(62), i.e(
|
|
"lt-property-pages-with-definitions")]).then(i.bind(null, "hQgR")))
|
|
.PriceLabelDefinitionsViewModel
|
|
}
|
|
static createProperties(e) {
|
|
var t = new r("linetoolpricelabel", e);
|
|
return o._configureProperties(t), t
|
|
}
|
|
static _configureProperties(e) {
|
|
s._configureProperties(e), e.addChild("linesColors", new n([e.childs()
|
|
.borderColor
|
|
])), e.addChild("textsColors", new n([e.childs().color]))
|
|
}
|
|
}
|
|
t.LineToolPriceLabel = o
|
|
}
|
|
},
|
|
[
|
|
["/G2Z", "runtime", "vendors"]
|
|
]
|
|
]);
|