@tradecanvas/core 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/axis/TimeAxis.d.ts.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +742 -742
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { DARK_THEME as e, DEFAULT_BAR_SPACING as t, DEFAULT_BAR_WIDTH as n, DEFAULT_RECONNECT as r, DEFAULT_SIGNAL_STYLE as i, DEFAULT_STREAM_CONFIG as a, DEFAULT_TRADE_ZONE_STYLE as o, DEFAULT_TRADING_CONFIG as s, LIGHT_THEME as c, LayerType as l, PRICE_AXIS_WIDTH as u, TIME_AXIS_HEIGHT as d, clamp as f, computePriceRange as p, computeTickStep as m, formatPrice as h, formatPriceScaleLabel as g,
|
|
1
|
+
import { DARK_THEME as e, DEFAULT_BAR_SPACING as t, DEFAULT_BAR_WIDTH as n, DEFAULT_RECONNECT as r, DEFAULT_SIGNAL_STYLE as i, DEFAULT_STREAM_CONFIG as a, DEFAULT_TRADE_ZONE_STYLE as o, DEFAULT_TRADING_CONFIG as s, LIGHT_THEME as c, LayerType as l, PRICE_AXIS_WIDTH as u, TIME_AXIS_HEIGHT as d, clamp as f, computePriceRange as p, computeTickStep as m, formatPrice as h, formatPriceScaleLabel as g, isDateOnly as _, lerpColor as v, sliceVisibleData as y, timeParts as b, timeframeBucketStart as x, timeframeToMs as S, tzLabel as C, withAlpha as w } from "@tradecanvas/commons";
|
|
2
2
|
//#region src/engine/CanvasLayer.ts
|
|
3
|
-
var
|
|
3
|
+
var T = class {
|
|
4
4
|
canvas;
|
|
5
5
|
ctx;
|
|
6
6
|
dpr = 1;
|
|
@@ -24,7 +24,7 @@ var w = class {
|
|
|
24
24
|
destroy() {
|
|
25
25
|
this.canvas.remove();
|
|
26
26
|
}
|
|
27
|
-
},
|
|
27
|
+
}, E = class {
|
|
28
28
|
layers = /* @__PURE__ */ new Map();
|
|
29
29
|
constructor(e) {
|
|
30
30
|
this.container = e;
|
|
@@ -36,7 +36,7 @@ var w = class {
|
|
|
36
36
|
l.Main,
|
|
37
37
|
l.Overlay,
|
|
38
38
|
l.UI
|
|
39
|
-
]) this.layers.set(e, new
|
|
39
|
+
]) this.layers.set(e, new T(this.container, e));
|
|
40
40
|
}
|
|
41
41
|
getLayer(e) {
|
|
42
42
|
return this.layers.get(e);
|
|
@@ -48,7 +48,7 @@ var w = class {
|
|
|
48
48
|
for (let e of this.layers.values()) e.destroy();
|
|
49
49
|
this.layers.clear();
|
|
50
50
|
}
|
|
51
|
-
},
|
|
51
|
+
}, D = class {
|
|
52
52
|
animFrameId = 0;
|
|
53
53
|
running = !1;
|
|
54
54
|
dirtyLayers = /* @__PURE__ */ new Set();
|
|
@@ -77,7 +77,7 @@ var w = class {
|
|
|
77
77
|
}
|
|
78
78
|
});
|
|
79
79
|
}
|
|
80
|
-
},
|
|
80
|
+
}, O = class {
|
|
81
81
|
observer = null;
|
|
82
82
|
callback = null;
|
|
83
83
|
currentDpr = 1;
|
|
@@ -120,10 +120,10 @@ var w = class {
|
|
|
120
120
|
};
|
|
121
121
|
//#endregion
|
|
122
122
|
//#region src/viewport/ScaleMapping.ts
|
|
123
|
-
function
|
|
123
|
+
function k(e, t) {
|
|
124
124
|
return e * (t.barWidth + t.barSpacing) - t.offset + t.chartRect.x + t.barWidth / 2;
|
|
125
125
|
}
|
|
126
|
-
function
|
|
126
|
+
function A(e, t) {
|
|
127
127
|
let { min: n, max: r } = t.priceRange;
|
|
128
128
|
if (t.logScale && n > 0 && r > 0) {
|
|
129
129
|
let i = Math.log(n), a = Math.log(r) - i;
|
|
@@ -136,11 +136,11 @@ function k(e, t) {
|
|
|
136
136
|
let a = (e - n) / i;
|
|
137
137
|
return t.chartRect.y + t.chartRect.height * (1 - a);
|
|
138
138
|
}
|
|
139
|
-
function
|
|
139
|
+
function j(e, t) {
|
|
140
140
|
let n = t.barWidth + t.barSpacing;
|
|
141
141
|
return Math.round((e - t.chartRect.x - t.barWidth / 2 + t.offset) / n);
|
|
142
142
|
}
|
|
143
|
-
function
|
|
143
|
+
function M(e, t) {
|
|
144
144
|
let { min: n, max: r } = t.priceRange, i = 1 - (e - t.chartRect.y) / t.chartRect.height;
|
|
145
145
|
if (t.logScale && n > 0 && r > 0) {
|
|
146
146
|
let e = Math.log(n);
|
|
@@ -148,7 +148,7 @@ function j(e, t) {
|
|
|
148
148
|
}
|
|
149
149
|
return n + (r - n) * i;
|
|
150
150
|
}
|
|
151
|
-
function
|
|
151
|
+
function N(e, t) {
|
|
152
152
|
if (t.length === 0) return -1;
|
|
153
153
|
if (e <= t[0].time) return 0;
|
|
154
154
|
if (e >= t[t.length - 1].time) return t.length - 1;
|
|
@@ -163,15 +163,15 @@ function M(e, t) {
|
|
|
163
163
|
let i = t[r].time, a = t[n].time, o = a === i ? 0 : (e - i) / (a - i);
|
|
164
164
|
return r + o;
|
|
165
165
|
}
|
|
166
|
-
function N(e, t) {
|
|
167
|
-
let n = t.data;
|
|
168
|
-
return n && n.length > 0 ? M(e, n) : e;
|
|
169
|
-
}
|
|
170
166
|
function P(e, t) {
|
|
171
|
-
|
|
167
|
+
let n = t.data;
|
|
168
|
+
return n && n.length > 0 ? N(e, n) : e;
|
|
172
169
|
}
|
|
173
170
|
function F(e, t) {
|
|
174
|
-
|
|
171
|
+
return k(P(e, t), t);
|
|
172
|
+
}
|
|
173
|
+
function I(e, t) {
|
|
174
|
+
let n = j(e, t), r = t.data;
|
|
175
175
|
return r && r.length > 0 ? r[Math.max(0, Math.min(r.length - 1, n))].time : n;
|
|
176
176
|
}
|
|
177
177
|
//#endregion
|
|
@@ -187,7 +187,7 @@ var ee = class {
|
|
|
187
187
|
uiLayer;
|
|
188
188
|
onContainerResize = null;
|
|
189
189
|
constructor(e) {
|
|
190
|
-
this.layerManager = new
|
|
190
|
+
this.layerManager = new E(e), this.renderLoop = new D(), this.dprManager = new O(e), this.layerManager.createLayers(), this.cacheLayerRefs(), this.renderLoop.setCallback((e) => this.render(e)), this.dprManager.onResize((e, t) => {
|
|
191
191
|
this.layerManager.resize(e, t), this.renderLoop.markAllDirty(), this.onContainerResize?.(e);
|
|
192
192
|
});
|
|
193
193
|
let t = this.dprManager.getContainerSize(), n = this.dprManager.getDpr();
|
|
@@ -237,8 +237,8 @@ var ee = class {
|
|
|
237
237
|
if (i && t.panels.length > 0) for (let n of t.panels) {
|
|
238
238
|
let a = n.rect;
|
|
239
239
|
if (i.x >= a.x && i.x <= a.x + a.width && i.y >= a.y && i.y <= a.y + a.height) {
|
|
240
|
-
let o = n.viewport, s = i.x, c =
|
|
241
|
-
s =
|
|
240
|
+
let o = n.viewport, s = i.x, c = j(s, o);
|
|
241
|
+
s = k(Math.max(0, Math.min((t.data?.length ?? 1) - 1, Math.round(c))), o), e.save(), e.beginPath(), e.rect(a.x, a.y, a.width, a.height), e.clip(), e.setLineDash([4, 4]), e.strokeStyle = r.crosshair, e.lineWidth = 1, e.beginPath(), e.moveTo(Math.round(s) + .5, a.y), e.lineTo(Math.round(s) + .5, a.y + a.height), e.stroke(), e.beginPath(), e.moveTo(a.x, Math.round(i.y) + .5), e.lineTo(a.x + a.width, Math.round(i.y) + .5), e.stroke(), e.setLineDash([]), e.restore();
|
|
242
242
|
break;
|
|
243
243
|
}
|
|
244
244
|
}
|
|
@@ -261,17 +261,17 @@ var ee = class {
|
|
|
261
261
|
let v = m(f, p, 4), y = Math.ceil(f / v) * v, b = v < 1 ? Math.ceil(-Math.log10(v)) + 1 : +(v < 10);
|
|
262
262
|
e.font = s, e.textBaseline = "middle", e.textAlign = "left";
|
|
263
263
|
for (let n = y; n <= p; n += v) {
|
|
264
|
-
let i =
|
|
264
|
+
let i = A(n, t);
|
|
265
265
|
i < _.y || i > _.y + _.height || (e.strokeStyle = r.axisLine, e.beginPath(), e.moveTo(g, Math.round(i) + .5), e.lineTo(g + 4, Math.round(i) + .5), e.stroke(), e.fillStyle = r.axisLabel, e.fillText(h(n, b, a), g + 6, i));
|
|
266
266
|
}
|
|
267
267
|
if (n && n.x >= d.x && n.x <= d.x + d.width && n.y >= d.y && n.y <= d.y + d.height) {
|
|
268
|
-
let i = h(
|
|
268
|
+
let i = h(M(n.y, t), b, a);
|
|
269
269
|
e.font = `bold ${r.font.sizeSmall}px ${r.font.family}`;
|
|
270
270
|
let o = e.measureText(i).width, s = Math.min(o + 10, u - 2);
|
|
271
271
|
e.fillStyle = r.crosshair, e.fillRect(g + 1, n.y - 9, s, 18), e.fillStyle = r.background, e.textBaseline = "middle", e.textAlign = "left", e.fillText(i, g + 5, n.y);
|
|
272
272
|
}
|
|
273
273
|
if (n && o) {
|
|
274
|
-
let a =
|
|
274
|
+
let a = j(n.x, t), u = Math.max(0, Math.min((i?.length ?? 1) - 1, Math.round(a))), f = o.getOutput(l.instanceId);
|
|
275
275
|
if (f?.series && u < f.series.length) {
|
|
276
276
|
let t = f.series[u];
|
|
277
277
|
if (t) {
|
|
@@ -311,7 +311,7 @@ var ee = class {
|
|
|
311
311
|
}
|
|
312
312
|
], o = `bold 9px ${n.font.family}`, s = `10px ${n.font.family}`;
|
|
313
313
|
for (let { price: n, color: r, label: c } of a) {
|
|
314
|
-
let a =
|
|
314
|
+
let a = A(n, t);
|
|
315
315
|
if (a < i.y || a > i.y + i.height) continue;
|
|
316
316
|
e.setLineDash([8, 4]), e.strokeStyle = r, e.lineWidth = 1, e.beginPath(), e.moveTo(i.x, Math.round(a) + .5), e.lineTo(i.x + i.width, Math.round(a) + .5), e.stroke(), e.setLineDash([]), e.font = o, e.fillStyle = r, e.textBaseline = "bottom", e.textAlign = "left", e.fillText(`${c} ${n.toFixed(2)}`, i.x + 4, a - 2);
|
|
317
317
|
let l = i.x + i.width + 1;
|
|
@@ -472,7 +472,7 @@ var ee = class {
|
|
|
472
472
|
//#endregion
|
|
473
473
|
//#region src/viewport/DataWindow.ts
|
|
474
474
|
function ne(e, t) {
|
|
475
|
-
return
|
|
475
|
+
return y(e, t.visibleRange.from, t.visibleRange.to);
|
|
476
476
|
}
|
|
477
477
|
//#endregion
|
|
478
478
|
//#region src/charts/CandlestickRenderer.ts
|
|
@@ -923,7 +923,7 @@ function Ee(e, t, n, r = 48) {
|
|
|
923
923
|
}
|
|
924
924
|
function De(e, t, n, r = {}) {
|
|
925
925
|
if (e.length === 0 || n - t <= 0) return [];
|
|
926
|
-
let i = [], a = 0, o =
|
|
926
|
+
let i = [], a = 0, o = x(e[0].time, "1d"), s = (a, o, s) => {
|
|
927
927
|
let c = we(e.slice(a, o + 1), t, n, r);
|
|
928
928
|
c && i.push({
|
|
929
929
|
startIndex: a,
|
|
@@ -933,7 +933,7 @@ function De(e, t, n, r = {}) {
|
|
|
933
933
|
});
|
|
934
934
|
};
|
|
935
935
|
for (let t = 1; t < e.length; t++) {
|
|
936
|
-
let n =
|
|
936
|
+
let n = x(e[t].time, "1d");
|
|
937
937
|
n !== o && (s(a, t - 1, o), a = t, o = n);
|
|
938
938
|
}
|
|
939
939
|
return s(a, e.length - 1, o), i;
|
|
@@ -1040,7 +1040,7 @@ var Oe = class {
|
|
|
1040
1040
|
let c = o.max - o.min, l = (e) => a.y + a.height * (1 - (e - o.min) / c), u = r.barWidth / 2;
|
|
1041
1041
|
e.save();
|
|
1042
1042
|
for (let c of s) {
|
|
1043
|
-
let s = c.profile, d = s.buckets.length, f = a.height / d, p =
|
|
1043
|
+
let s = c.profile, d = s.buckets.length, f = a.height / d, p = k(n + c.startIndex, r) - u, m = k(n + c.endIndex, r) + u, h = Math.max(2, m - p), g = 1 / s.maxCount, _ = this.letters && f >= 7, v = _ ? Ee(t.slice(c.startIndex, c.endIndex + 1), o.min, o.max, this.buckets) : null;
|
|
1044
1044
|
if (_ && v) {
|
|
1045
1045
|
e.font = `${Math.min(11, Math.floor(f))}px ui-monospace, monospace`, e.textBaseline = "middle", e.textAlign = "left";
|
|
1046
1046
|
let t = Math.max(1, Math.floor(h / 6));
|
|
@@ -1105,7 +1105,7 @@ function Ae(e, t, n, r, i, a) {
|
|
|
1105
1105
|
function je(e, t) {
|
|
1106
1106
|
let n = t === "day" ? "1d" : "1w", r = [];
|
|
1107
1107
|
for (let t of e) {
|
|
1108
|
-
let e =
|
|
1108
|
+
let e = x(t.time, n), i = r[r.length - 1];
|
|
1109
1109
|
i && i.key === e ? (i.high = Math.max(i.high, t.high), i.low = Math.min(i.low, t.low), i.close = t.close) : r.push({
|
|
1110
1110
|
key: e,
|
|
1111
1111
|
open: t.open,
|
|
@@ -1167,7 +1167,7 @@ var Ne = class {
|
|
|
1167
1167
|
let { chartRect: a } = n, o = a.y, s = a.y + a.height;
|
|
1168
1168
|
e.save(), e.font = `600 10px ${r.font.family}`, e.textBaseline = "middle";
|
|
1169
1169
|
for (let t of i) {
|
|
1170
|
-
let i =
|
|
1170
|
+
let i = A(t.price, n);
|
|
1171
1171
|
if (i < o || i > s) continue;
|
|
1172
1172
|
let c = Pe(t, r);
|
|
1173
1173
|
e.strokeStyle = c, e.globalAlpha = .7, e.lineWidth = 1, e.setLineDash([5, 4]), e.beginPath(), e.moveTo(a.x, Math.round(i) + .5), e.lineTo(a.x + a.width, Math.round(i) + .5), e.stroke(), e.setLineDash([]), e.globalAlpha = 1;
|
|
@@ -1240,7 +1240,7 @@ var Le = class {
|
|
|
1240
1240
|
e.save(), e.font = `10px ${r.font.family}`, e.textAlign = "center";
|
|
1241
1241
|
for (let t of a) {
|
|
1242
1242
|
if (t.index < o - 1 || t.index > s + 1) continue;
|
|
1243
|
-
let i =
|
|
1243
|
+
let i = k(t.index, n), a = A(t.price, n), c = t.type === "high", l = c ? r.candleDown : r.candleUp, u = c ? a - 8 : a + 8;
|
|
1244
1244
|
e.fillStyle = l, e.beginPath(), c ? (e.moveTo(i - 5, u - 5), e.lineTo(i + 5, u - 5), e.lineTo(i, u)) : (e.moveTo(i - 5, u + 5), e.lineTo(i + 5, u + 5), e.lineTo(i, u)), e.closePath(), e.fill();
|
|
1245
1245
|
let d = this.structureLabels && "label" in t ? String(t.label) : this.showLabels ? Re(t.price) : null;
|
|
1246
1246
|
d && (e.textBaseline = c ? "bottom" : "top", e.fillText(d, i, c ? u - 5 - 1 : u + 5 + 1));
|
|
@@ -1318,7 +1318,7 @@ var ze = class {
|
|
|
1318
1318
|
let a = 1 / i, { chartRect: o } = t, s = Math.max(2, t.barWidth + t.barSpacing), c = o.x, l = o.x + o.width, u = o.y, d = o.y + o.height;
|
|
1319
1319
|
e.save();
|
|
1320
1320
|
for (let i of r) {
|
|
1321
|
-
let r =
|
|
1321
|
+
let r = F(i.time, t);
|
|
1322
1322
|
if (r < c - s || r > l + s) continue;
|
|
1323
1323
|
let o = r - s / 2;
|
|
1324
1324
|
this.drawSide(e, i.bids, n.candleUp, o, s, t, a, u, d), this.drawSide(e, i.asks, n.candleDown, o, s, t, a, u, d);
|
|
@@ -1330,7 +1330,7 @@ var ze = class {
|
|
|
1330
1330
|
let l = Ve(t, a);
|
|
1331
1331
|
e.fillStyle = n;
|
|
1332
1332
|
for (let n of t) {
|
|
1333
|
-
let t =
|
|
1333
|
+
let t = A(n.price, a);
|
|
1334
1334
|
t < s - l || t > c + l || (e.globalAlpha = Math.min(1, Math.sqrt(n.volume * o)) * this.opacity, e.fillRect(r, t - l / 2, i, l));
|
|
1335
1335
|
}
|
|
1336
1336
|
e.globalAlpha = 1;
|
|
@@ -1345,7 +1345,7 @@ function Ve(e, t) {
|
|
|
1345
1345
|
}
|
|
1346
1346
|
if (r.length === 0) return 3;
|
|
1347
1347
|
r.sort((e, t) => e - t);
|
|
1348
|
-
let i = r[Math.floor(r.length / 2)], a = Math.abs(
|
|
1348
|
+
let i = r[Math.floor(r.length / 2)], a = Math.abs(A(n[0], t) - A(n[0] + i, t));
|
|
1349
1349
|
return Math.max(2, Math.min(a, 12));
|
|
1350
1350
|
}
|
|
1351
1351
|
//#endregion
|
|
@@ -1391,15 +1391,15 @@ var He = class {
|
|
|
1391
1391
|
e.strokeStyle = t.color, e.lineWidth = t.lineWidth ?? 1.5, e.lineJoin = "round", e.beginPath();
|
|
1392
1392
|
let u = !1, d = Math.min(n.length, t.data.length);
|
|
1393
1393
|
for (let n = s; n < d; n++) {
|
|
1394
|
-
let i =
|
|
1394
|
+
let i = k(n, r);
|
|
1395
1395
|
if (i < a.x - o) continue;
|
|
1396
1396
|
if (i > a.x + a.width + o) break;
|
|
1397
1397
|
let s;
|
|
1398
|
-
s = this.mode === "percent" ?
|
|
1398
|
+
s = this.mode === "percent" ? A(c * (1 + (t.data[n].close - l) / l), r) : A(t.data[n].close, r), u ? e.lineTo(i, s) : (e.moveTo(i, s), u = !0);
|
|
1399
1399
|
}
|
|
1400
1400
|
if (e.stroke(), u) {
|
|
1401
|
-
let n = Math.min(s + 2, d - 1), i =
|
|
1402
|
-
a = this.mode === "percent" ?
|
|
1401
|
+
let n = Math.min(s + 2, d - 1), i = k(n, r) + 4, a;
|
|
1402
|
+
a = this.mode === "percent" ? A(c * (1 + (t.data[n].close - l) / l), r) - 4 : A(t.data[n].close, r) - 4, e.fillStyle = t.color, e.font = "bold 10px sans-serif", e.textBaseline = "bottom", e.textAlign = "left", e.fillText(t.label, i, a);
|
|
1403
1403
|
}
|
|
1404
1404
|
}
|
|
1405
1405
|
};
|
|
@@ -1601,7 +1601,7 @@ function Ye(e, t) {
|
|
|
1601
1601
|
}
|
|
1602
1602
|
//#endregion
|
|
1603
1603
|
//#region src/indicators/IndicatorBase.ts
|
|
1604
|
-
var
|
|
1604
|
+
var L = class {
|
|
1605
1605
|
drawLine(e, t, n, r) {
|
|
1606
1606
|
if (!(t.length < 2)) {
|
|
1607
1607
|
e.beginPath(), e.strokeStyle = n, e.lineWidth = r, e.lineJoin = "round", e.moveTo(t[0].x, t[0].y);
|
|
@@ -1630,8 +1630,8 @@ var I = class {
|
|
|
1630
1630
|
for (let s = a; s <= o && s < n.length; s++) {
|
|
1631
1631
|
let a = e.values.get(n[s].time);
|
|
1632
1632
|
a && a[t] !== void 0 && i.push({
|
|
1633
|
-
x:
|
|
1634
|
-
y:
|
|
1633
|
+
x: k(s, r),
|
|
1634
|
+
y: A(a[t], r)
|
|
1635
1635
|
});
|
|
1636
1636
|
}
|
|
1637
1637
|
return i;
|
|
@@ -1751,7 +1751,7 @@ var I = class {
|
|
|
1751
1751
|
};
|
|
1752
1752
|
//#endregion
|
|
1753
1753
|
//#region src/indicators/params.ts
|
|
1754
|
-
function
|
|
1754
|
+
function R(e, t, n) {
|
|
1755
1755
|
let r = e.params[t];
|
|
1756
1756
|
if (typeof r == "number" && Number.isFinite(r)) return r;
|
|
1757
1757
|
if (typeof r == "string") {
|
|
@@ -1760,13 +1760,13 @@ function L(e, t, n) {
|
|
|
1760
1760
|
}
|
|
1761
1761
|
return n;
|
|
1762
1762
|
}
|
|
1763
|
-
function
|
|
1764
|
-
let i =
|
|
1763
|
+
function z(e, t, n, r = 1) {
|
|
1764
|
+
let i = R(e, t, n);
|
|
1765
1765
|
return Math.max(r, Math.floor(i));
|
|
1766
1766
|
}
|
|
1767
1767
|
//#endregion
|
|
1768
1768
|
//#region src/indicators/overlay/SMA.ts
|
|
1769
|
-
var Qe = class extends
|
|
1769
|
+
var Qe = class extends L {
|
|
1770
1770
|
descriptor = {
|
|
1771
1771
|
id: "sma",
|
|
1772
1772
|
name: "Simple Moving Average",
|
|
@@ -1774,7 +1774,7 @@ var Qe = class extends I {
|
|
|
1774
1774
|
defaultConfig: { period: 20 }
|
|
1775
1775
|
};
|
|
1776
1776
|
calculate(e, t) {
|
|
1777
|
-
let n =
|
|
1777
|
+
let n = z(t, "period", 20, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null), a = 0;
|
|
1778
1778
|
for (let t = 0; t < e.length; t++) if (a += e[t].close, t >= n && (a -= e[t - n].close), t >= n - 1) {
|
|
1779
1779
|
let o = { value: a / n };
|
|
1780
1780
|
r.set(e[t].time, o), i[t] = o;
|
|
@@ -1793,12 +1793,12 @@ var Qe = class extends I {
|
|
|
1793
1793
|
for (let t = a; t <= o && t < i.length; t++) {
|
|
1794
1794
|
let r = i[t];
|
|
1795
1795
|
if (!r || r.value === void 0) continue;
|
|
1796
|
-
let a =
|
|
1796
|
+
let a = k(t, n), o = A(r.value, n);
|
|
1797
1797
|
s ? e.lineTo(a, o) : (e.moveTo(a, o), s = !0);
|
|
1798
1798
|
}
|
|
1799
1799
|
e.stroke();
|
|
1800
1800
|
}
|
|
1801
|
-
}, $e = class extends
|
|
1801
|
+
}, $e = class extends L {
|
|
1802
1802
|
descriptor = {
|
|
1803
1803
|
id: "ema",
|
|
1804
1804
|
name: "Exponential Moving Average",
|
|
@@ -1806,7 +1806,7 @@ var Qe = class extends I {
|
|
|
1806
1806
|
defaultConfig: { period: 20 }
|
|
1807
1807
|
};
|
|
1808
1808
|
calculate(e, t) {
|
|
1809
|
-
let n =
|
|
1809
|
+
let n = z(t, "period", 20, 1), r = 2 / (n + 1), i = /* @__PURE__ */ new Map(), a = Array(e.length).fill(null), o = 0;
|
|
1810
1810
|
for (let t = 0; t < e.length; t++) {
|
|
1811
1811
|
if (t < n - 1) {
|
|
1812
1812
|
o += e[t].close;
|
|
@@ -1830,12 +1830,12 @@ var Qe = class extends I {
|
|
|
1830
1830
|
for (let t = a; t <= o && t < i.length; t++) {
|
|
1831
1831
|
let r = i[t];
|
|
1832
1832
|
if (!r || r.value === void 0) continue;
|
|
1833
|
-
let a =
|
|
1833
|
+
let a = k(t, n), o = A(r.value, n);
|
|
1834
1834
|
s ? e.lineTo(a, o) : (e.moveTo(a, o), s = !0);
|
|
1835
1835
|
}
|
|
1836
1836
|
e.stroke();
|
|
1837
1837
|
}
|
|
1838
|
-
}, et = class extends
|
|
1838
|
+
}, et = class extends L {
|
|
1839
1839
|
descriptor = {
|
|
1840
1840
|
id: "bb",
|
|
1841
1841
|
name: "Bollinger Bands",
|
|
@@ -1846,7 +1846,7 @@ var Qe = class extends I {
|
|
|
1846
1846
|
}
|
|
1847
1847
|
};
|
|
1848
1848
|
calculate(e, t) {
|
|
1849
|
-
let n =
|
|
1849
|
+
let n = z(t, "period", 20, 1), r = R(t, "stdDev", 2), i = /* @__PURE__ */ new Map(), a = Array(e.length).fill(null), o = 0, s = 0;
|
|
1850
1850
|
for (let t = 0; t < e.length; t++) {
|
|
1851
1851
|
let c = e[t].close;
|
|
1852
1852
|
if (o += c, s += c * c, t >= n) {
|
|
@@ -1874,14 +1874,14 @@ var Qe = class extends I {
|
|
|
1874
1874
|
for (let e = a; e <= o && e < i.length; e++) {
|
|
1875
1875
|
let t = i[e];
|
|
1876
1876
|
if (!t || t.upper === void 0) continue;
|
|
1877
|
-
let r =
|
|
1878
|
-
l[s] = r, u[s] =
|
|
1877
|
+
let r = k(e, n);
|
|
1878
|
+
l[s] = r, u[s] = A(t.upper, n), d[s] = r, f[s] = A(t.middle, n), p[s] = r, m[s] = A(t.lower, n), s++;
|
|
1879
1879
|
}
|
|
1880
1880
|
if (!(s < 2)) {
|
|
1881
1881
|
e.beginPath(), e.moveTo(l[0], u[0]);
|
|
1882
1882
|
for (let t = 1; t < s; t++) e.lineTo(l[t], u[t]);
|
|
1883
1883
|
for (let t = s - 1; t >= 0; t--) e.lineTo(p[t], m[t]);
|
|
1884
|
-
e.closePath(), e.fillStyle =
|
|
1884
|
+
e.closePath(), e.fillStyle = w(r.colors[0], .1), e.fill(), e.beginPath(), e.strokeStyle = r.colors[0], e.lineWidth = r.lineWidths[0], e.lineJoin = "round", e.moveTo(l[0], u[0]);
|
|
1885
1885
|
for (let t = 1; t < s; t++) e.lineTo(l[t], u[t]);
|
|
1886
1886
|
e.stroke(), e.beginPath(), e.strokeStyle = r.colors[1] ?? r.colors[0], e.moveTo(d[0], f[0]);
|
|
1887
1887
|
for (let t = 1; t < s; t++) e.lineTo(d[t], f[t]);
|
|
@@ -1890,7 +1890,7 @@ var Qe = class extends I {
|
|
|
1890
1890
|
e.stroke();
|
|
1891
1891
|
}
|
|
1892
1892
|
}
|
|
1893
|
-
}, tt = class extends
|
|
1893
|
+
}, tt = class extends L {
|
|
1894
1894
|
descriptor = {
|
|
1895
1895
|
id: "vwap",
|
|
1896
1896
|
name: "Volume Weighted Average Price",
|
|
@@ -1920,12 +1920,12 @@ var Qe = class extends I {
|
|
|
1920
1920
|
for (let t = a; t <= o && t < i.length; t++) {
|
|
1921
1921
|
let r = i[t];
|
|
1922
1922
|
if (!r || r.value === void 0) continue;
|
|
1923
|
-
let a =
|
|
1923
|
+
let a = k(t, n), o = A(r.value, n);
|
|
1924
1924
|
s ? e.lineTo(a, o) : (e.moveTo(a, o), s = !0);
|
|
1925
1925
|
}
|
|
1926
1926
|
e.stroke();
|
|
1927
1927
|
}
|
|
1928
|
-
}, nt = class extends
|
|
1928
|
+
}, nt = class extends L {
|
|
1929
1929
|
descriptor = {
|
|
1930
1930
|
id: "ichimoku",
|
|
1931
1931
|
name: "Ichimoku Cloud",
|
|
@@ -1938,7 +1938,7 @@ var Qe = class extends I {
|
|
|
1938
1938
|
}
|
|
1939
1939
|
};
|
|
1940
1940
|
calculate(e, t) {
|
|
1941
|
-
let n =
|
|
1941
|
+
let n = z(t, "tenkan", 9, 1), r = z(t, "kijun", 26, 1), i = z(t, "senkou", 52, 1), a = /* @__PURE__ */ new Map(), o = Array(e.length).fill(null), s = (t) => {
|
|
1942
1942
|
let n = new Float64Array(e.length), r = new Float64Array(e.length);
|
|
1943
1943
|
for (let i = 0; i < e.length; i++) {
|
|
1944
1944
|
let a = -Infinity, o = Infinity, s = Math.max(0, i - t + 1);
|
|
@@ -1966,15 +1966,15 @@ var Qe = class extends I {
|
|
|
1966
1966
|
for (let e = a; e <= o && e < i.length; e++) {
|
|
1967
1967
|
let t = i[e];
|
|
1968
1968
|
if (!t) continue;
|
|
1969
|
-
let r =
|
|
1970
|
-
t.tenkan !== void 0 && (c[u] = r, l[u] =
|
|
1969
|
+
let r = k(e, n);
|
|
1970
|
+
t.tenkan !== void 0 && (c[u] = r, l[u] = A(t.tenkan, n), u++), t.kijun !== void 0 && (d[p] = r, f[p] = A(t.kijun, n), p++), t.senkouA !== void 0 && (m[g] = r, h[g] = A(t.senkouA, n), g++), t.senkouB !== void 0 && (_[y] = r, v[y] = A(t.senkouB, n), y++);
|
|
1971
1971
|
}
|
|
1972
1972
|
if (g > 1 && y > 1) {
|
|
1973
1973
|
let t = Math.min(g, y);
|
|
1974
1974
|
e.beginPath(), e.moveTo(m[0], h[0]);
|
|
1975
1975
|
for (let n = 1; n < t; n++) e.lineTo(m[n], h[n]);
|
|
1976
1976
|
for (let n = t - 1; n >= 0; n--) e.lineTo(_[n], v[n]);
|
|
1977
|
-
e.closePath(), e.fillStyle =
|
|
1977
|
+
e.closePath(), e.fillStyle = w(r.colors[2] ?? "#26A69A", .15), e.fill();
|
|
1978
1978
|
}
|
|
1979
1979
|
let b = (t, n, r, i, a) => {
|
|
1980
1980
|
if (!(r < 2)) {
|
|
@@ -1985,7 +1985,7 @@ var Qe = class extends I {
|
|
|
1985
1985
|
};
|
|
1986
1986
|
b(c, l, u, r.colors[0], r.lineWidths[0]), b(d, f, p, r.colors[1] ?? "#FF9800", r.lineWidths[0]), b(m, h, g, r.colors[2] ?? "#26A69A", 1), b(_, v, y, r.colors[3] ?? "#EF5350", 1);
|
|
1987
1987
|
}
|
|
1988
|
-
}, rt = class extends
|
|
1988
|
+
}, rt = class extends L {
|
|
1989
1989
|
descriptor = {
|
|
1990
1990
|
id: "psar",
|
|
1991
1991
|
name: "Parabolic SAR",
|
|
@@ -1996,7 +1996,7 @@ var Qe = class extends I {
|
|
|
1996
1996
|
}
|
|
1997
1997
|
};
|
|
1998
1998
|
calculate(e, t) {
|
|
1999
|
-
let n =
|
|
1999
|
+
let n = R(t, "step", .02), r = R(t, "max", .2), i = /* @__PURE__ */ new Map(), a = Array(e.length).fill(null);
|
|
2000
2000
|
if (e.length < 2) return {
|
|
2001
2001
|
values: i,
|
|
2002
2002
|
series: a
|
|
@@ -2027,11 +2027,11 @@ var Qe = class extends I {
|
|
|
2027
2027
|
for (let t = a; t <= o && t < i.length; t++) {
|
|
2028
2028
|
let a = i[t];
|
|
2029
2029
|
if (!a || a.value === void 0) continue;
|
|
2030
|
-
let o =
|
|
2030
|
+
let o = k(t, n), c = A(a.value, n);
|
|
2031
2031
|
e.beginPath(), e.arc(o, c, s, 0, Math.PI * 2), e.fillStyle = a.trend === 1 ? r.colors[0] : r.colors[1] ?? "#EF5350", e.fill();
|
|
2032
2032
|
}
|
|
2033
2033
|
}
|
|
2034
|
-
}, it = class extends
|
|
2034
|
+
}, it = class extends L {
|
|
2035
2035
|
descriptor = {
|
|
2036
2036
|
id: "supertrend",
|
|
2037
2037
|
name: "Supertrend",
|
|
@@ -2042,7 +2042,7 @@ var Qe = class extends I {
|
|
|
2042
2042
|
}
|
|
2043
2043
|
};
|
|
2044
2044
|
calculate(e, t) {
|
|
2045
|
-
let n =
|
|
2045
|
+
let n = z(t, "period", 10, 1), r = R(t, "multiplier", 3), i = /* @__PURE__ */ new Map(), a = Array(e.length).fill(null);
|
|
2046
2046
|
if (e.length < n) return {
|
|
2047
2047
|
values: i,
|
|
2048
2048
|
series: a
|
|
@@ -2075,11 +2075,11 @@ var Qe = class extends I {
|
|
|
2075
2075
|
for (let t = a; t <= o && t < i.length; t++) {
|
|
2076
2076
|
let a = i[t];
|
|
2077
2077
|
if (!a || a.value === void 0) continue;
|
|
2078
|
-
let o =
|
|
2078
|
+
let o = k(t, n), f = A(a.value, n), p = a.trend ?? 1;
|
|
2079
2079
|
d !== 0 && (e.beginPath(), e.strokeStyle = p === 1 ? s : c, e.lineWidth = r.lineWidths[0] + .5, e.moveTo(l, u), e.lineTo(o, f), e.stroke()), l = o, u = f, d = p;
|
|
2080
2080
|
}
|
|
2081
2081
|
}
|
|
2082
|
-
}, at = class extends
|
|
2082
|
+
}, at = class extends L {
|
|
2083
2083
|
descriptor = {
|
|
2084
2084
|
id: "keltner",
|
|
2085
2085
|
name: "Keltner Channel",
|
|
@@ -2091,7 +2091,7 @@ var Qe = class extends I {
|
|
|
2091
2091
|
}
|
|
2092
2092
|
};
|
|
2093
2093
|
calculate(e, t) {
|
|
2094
|
-
let n =
|
|
2094
|
+
let n = z(t, "emaPeriod", 20, 1), r = z(t, "atrPeriod", 10, 1), i = R(t, "multiplier", 1.5), a = /* @__PURE__ */ new Map();
|
|
2095
2095
|
if (e.length < Math.max(n, r)) return { values: a };
|
|
2096
2096
|
let o = 2 / (n + 1), s = e[0].close, c = [s];
|
|
2097
2097
|
for (let t = 1; t < e.length; t++) s = (e[t].close - s) * o + s, c.push(s);
|
|
@@ -2122,21 +2122,21 @@ var Qe = class extends I {
|
|
|
2122
2122
|
for (let e = a; e <= o && e < i.length; e++) {
|
|
2123
2123
|
let t = i[e];
|
|
2124
2124
|
if (!t) continue;
|
|
2125
|
-
let r =
|
|
2125
|
+
let r = k(e, n);
|
|
2126
2126
|
t.upper !== void 0 && s.push({
|
|
2127
2127
|
x: r,
|
|
2128
|
-
y:
|
|
2128
|
+
y: A(t.upper, n)
|
|
2129
2129
|
}), t.middle !== void 0 && c.push({
|
|
2130
2130
|
x: r,
|
|
2131
|
-
y:
|
|
2131
|
+
y: A(t.middle, n)
|
|
2132
2132
|
}), t.lower !== void 0 && l.push({
|
|
2133
2133
|
x: r,
|
|
2134
|
-
y:
|
|
2134
|
+
y: A(t.lower, n)
|
|
2135
2135
|
});
|
|
2136
2136
|
}
|
|
2137
|
-
this.drawBand(e, s, l,
|
|
2137
|
+
this.drawBand(e, s, l, w(r.colors[0], .08)), this.drawLine(e, s, r.colors[0], r.lineWidths[0]), this.drawLine(e, c, r.colors[1] ?? r.colors[0], r.lineWidths[0]), this.drawLine(e, l, r.colors[0], r.lineWidths[0]);
|
|
2138
2138
|
}
|
|
2139
|
-
}, ot = class extends
|
|
2139
|
+
}, ot = class extends L {
|
|
2140
2140
|
descriptor = {
|
|
2141
2141
|
id: "donchian",
|
|
2142
2142
|
name: "Donchian Channel",
|
|
@@ -2144,7 +2144,7 @@ var Qe = class extends I {
|
|
|
2144
2144
|
defaultConfig: { period: 20 }
|
|
2145
2145
|
};
|
|
2146
2146
|
calculate(e, t) {
|
|
2147
|
-
let n =
|
|
2147
|
+
let n = z(t, "period", 20, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null);
|
|
2148
2148
|
for (let t = n - 1; t < e.length; t++) {
|
|
2149
2149
|
let a = -Infinity, o = Infinity;
|
|
2150
2150
|
for (let r = t - n + 1; r <= t; r++) e[r].high > a && (a = e[r].high), e[r].low < o && (o = e[r].low);
|
|
@@ -2167,19 +2167,19 @@ var Qe = class extends I {
|
|
|
2167
2167
|
for (let e = a; e <= o && e < i.length; e++) {
|
|
2168
2168
|
let t = i[e];
|
|
2169
2169
|
if (!t) continue;
|
|
2170
|
-
let r =
|
|
2170
|
+
let r = k(e, n);
|
|
2171
2171
|
t.upper !== void 0 && s.push({
|
|
2172
2172
|
x: r,
|
|
2173
|
-
y:
|
|
2173
|
+
y: A(t.upper, n)
|
|
2174
2174
|
}), t.middle !== void 0 && c.push({
|
|
2175
2175
|
x: r,
|
|
2176
|
-
y:
|
|
2176
|
+
y: A(t.middle, n)
|
|
2177
2177
|
}), t.lower !== void 0 && l.push({
|
|
2178
2178
|
x: r,
|
|
2179
|
-
y:
|
|
2179
|
+
y: A(t.lower, n)
|
|
2180
2180
|
});
|
|
2181
2181
|
}
|
|
2182
|
-
this.drawBand(e, s, l,
|
|
2182
|
+
this.drawBand(e, s, l, w(r.colors[0], .08)), this.drawLine(e, s, r.colors[0], r.lineWidths[0]), this.drawLine(e, c, r.colors[1] ?? "#787B86", 1), this.drawLine(e, l, r.colors[0], r.lineWidths[0]);
|
|
2183
2183
|
}
|
|
2184
2184
|
}, st = [
|
|
2185
2185
|
"s3",
|
|
@@ -2189,7 +2189,7 @@ var Qe = class extends I {
|
|
|
2189
2189
|
"r1",
|
|
2190
2190
|
"r2",
|
|
2191
2191
|
"r3"
|
|
2192
|
-
], ct = class extends
|
|
2192
|
+
], ct = class extends L {
|
|
2193
2193
|
descriptor = {
|
|
2194
2194
|
id: "pivots",
|
|
2195
2195
|
name: "Pivot Points (Classic)",
|
|
@@ -2197,7 +2197,7 @@ var Qe = class extends I {
|
|
|
2197
2197
|
defaultConfig: { lookback: 24 }
|
|
2198
2198
|
};
|
|
2199
2199
|
calculate(e, t) {
|
|
2200
|
-
let n =
|
|
2200
|
+
let n = z(t, "lookback", 24, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null);
|
|
2201
2201
|
if (e.length <= n) return {
|
|
2202
2202
|
values: r,
|
|
2203
2203
|
series: i
|
|
@@ -2231,13 +2231,13 @@ var Qe = class extends I {
|
|
|
2231
2231
|
for (let s = a; s <= o && s < i.length; s++) {
|
|
2232
2232
|
let a = i[s]?.[t];
|
|
2233
2233
|
if (a === void 0) continue;
|
|
2234
|
-
let o =
|
|
2234
|
+
let o = k(s, n), c = A(a, n);
|
|
2235
2235
|
r ? e.lineTo(o, c) : (e.moveTo(o, c), r = !0);
|
|
2236
2236
|
}
|
|
2237
2237
|
e.stroke(), e.setLineDash([]);
|
|
2238
2238
|
}
|
|
2239
2239
|
}
|
|
2240
|
-
}, lt = class extends
|
|
2240
|
+
}, lt = class extends L {
|
|
2241
2241
|
descriptor = {
|
|
2242
2242
|
id: "avwap",
|
|
2243
2243
|
name: "Anchored VWAP",
|
|
@@ -2245,7 +2245,7 @@ var Qe = class extends I {
|
|
|
2245
2245
|
defaultConfig: { anchorTime: 0 }
|
|
2246
2246
|
};
|
|
2247
2247
|
calculate(e, t) {
|
|
2248
|
-
let n =
|
|
2248
|
+
let n = R(t, "anchorTime", 0), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null), a = 0;
|
|
2249
2249
|
if (n > 0 && (a = e.findIndex((e) => e.time >= n), a < 0)) return {
|
|
2250
2250
|
values: r,
|
|
2251
2251
|
series: i
|
|
@@ -2272,12 +2272,12 @@ var Qe = class extends I {
|
|
|
2272
2272
|
for (let t = a; t <= o && t < i.length; t++) {
|
|
2273
2273
|
let r = i[t];
|
|
2274
2274
|
if (!r || r.value === void 0) continue;
|
|
2275
|
-
let a =
|
|
2275
|
+
let a = k(t, n), o = A(r.value, n);
|
|
2276
2276
|
s ? e.lineTo(a, o) : (e.moveTo(a, o), s = !0);
|
|
2277
2277
|
}
|
|
2278
2278
|
e.stroke();
|
|
2279
2279
|
}
|
|
2280
|
-
}, ut = class extends
|
|
2280
|
+
}, ut = class extends L {
|
|
2281
2281
|
descriptor = {
|
|
2282
2282
|
id: "zigzag",
|
|
2283
2283
|
name: "ZigZag",
|
|
@@ -2285,7 +2285,7 @@ var Qe = class extends I {
|
|
|
2285
2285
|
defaultConfig: { deviation: 5 }
|
|
2286
2286
|
};
|
|
2287
2287
|
calculate(e, t) {
|
|
2288
|
-
let n = Math.max(.01,
|
|
2288
|
+
let n = Math.max(.01, R(t, "deviation", 5)) / 100, r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null);
|
|
2289
2289
|
if (e.length < 2) return {
|
|
2290
2290
|
values: r,
|
|
2291
2291
|
series: i,
|
|
@@ -2336,13 +2336,13 @@ var Qe = class extends I {
|
|
|
2336
2336
|
if (!(!i || i.length < 2)) {
|
|
2337
2337
|
e.beginPath(), e.strokeStyle = r.colors[0], e.lineWidth = r.lineWidths[0], e.lineJoin = "round";
|
|
2338
2338
|
for (let t = 0; t < i.length; t++) {
|
|
2339
|
-
let r = i[t], a =
|
|
2339
|
+
let r = i[t], a = k(r.idx, n), o = A(r.price, n);
|
|
2340
2340
|
t === 0 ? e.moveTo(a, o) : e.lineTo(a, o);
|
|
2341
2341
|
}
|
|
2342
2342
|
e.stroke();
|
|
2343
2343
|
}
|
|
2344
2344
|
}
|
|
2345
|
-
}, dt = class extends
|
|
2345
|
+
}, dt = class extends L {
|
|
2346
2346
|
descriptor = {
|
|
2347
2347
|
id: "lrc",
|
|
2348
2348
|
name: "Linear Regression Channel",
|
|
@@ -2353,7 +2353,7 @@ var Qe = class extends I {
|
|
|
2353
2353
|
}
|
|
2354
2354
|
};
|
|
2355
2355
|
calculate(e, t) {
|
|
2356
|
-
let n =
|
|
2356
|
+
let n = z(t, "period", 100, 2), r = R(t, "stdDev", 2), i = /* @__PURE__ */ new Map(), a = Array(e.length).fill(null);
|
|
2357
2357
|
if (e.length < n) return {
|
|
2358
2358
|
values: i,
|
|
2359
2359
|
series: a
|
|
@@ -2391,21 +2391,21 @@ var Qe = class extends I {
|
|
|
2391
2391
|
for (let e = a; e <= o && e < i.length; e++) {
|
|
2392
2392
|
let t = i[e];
|
|
2393
2393
|
if (!t) continue;
|
|
2394
|
-
let r =
|
|
2394
|
+
let r = k(e, n);
|
|
2395
2395
|
t.middle !== void 0 && c.push({
|
|
2396
2396
|
x: r,
|
|
2397
|
-
y:
|
|
2397
|
+
y: A(t.middle, n)
|
|
2398
2398
|
}), t.upper !== void 0 && s.push({
|
|
2399
2399
|
x: r,
|
|
2400
|
-
y:
|
|
2400
|
+
y: A(t.upper, n)
|
|
2401
2401
|
}), t.lower !== void 0 && l.push({
|
|
2402
2402
|
x: r,
|
|
2403
|
-
y:
|
|
2403
|
+
y: A(t.lower, n)
|
|
2404
2404
|
});
|
|
2405
2405
|
}
|
|
2406
|
-
this.drawBand(e, s, l,
|
|
2406
|
+
this.drawBand(e, s, l, w(r.colors[0], .08)), this.drawLine(e, s, r.colors[0], r.lineWidths[0]), this.drawLine(e, c, r.colors[1] ?? r.colors[0], r.lineWidths[0]), this.drawLine(e, l, r.colors[0], r.lineWidths[0]);
|
|
2407
2407
|
}
|
|
2408
|
-
}, ft = class extends
|
|
2408
|
+
}, ft = class extends L {
|
|
2409
2409
|
descriptor = {
|
|
2410
2410
|
id: "hma",
|
|
2411
2411
|
name: "Hull Moving Average",
|
|
@@ -2413,7 +2413,7 @@ var Qe = class extends I {
|
|
|
2413
2413
|
defaultConfig: { period: 21 }
|
|
2414
2414
|
};
|
|
2415
2415
|
calculate(e, t) {
|
|
2416
|
-
let n =
|
|
2416
|
+
let n = z(t, "period", 21, 2), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null);
|
|
2417
2417
|
if (e.length < n) return {
|
|
2418
2418
|
values: r,
|
|
2419
2419
|
series: i
|
|
@@ -2438,7 +2438,7 @@ var Qe = class extends I {
|
|
|
2438
2438
|
for (let t = a; t <= o && t < i.length; t++) {
|
|
2439
2439
|
let r = i[t];
|
|
2440
2440
|
if (!r || r.value === void 0) continue;
|
|
2441
|
-
let a =
|
|
2441
|
+
let a = k(t, n), o = A(r.value, n);
|
|
2442
2442
|
s ? e.lineTo(a, o) : (e.moveTo(a, o), s = !0);
|
|
2443
2443
|
}
|
|
2444
2444
|
e.stroke();
|
|
@@ -2473,7 +2473,7 @@ function mt(e, t) {
|
|
|
2473
2473
|
}
|
|
2474
2474
|
//#endregion
|
|
2475
2475
|
//#region src/indicators/overlay/MTFMovingAverage.ts
|
|
2476
|
-
var ht = class extends
|
|
2476
|
+
var ht = class extends L {
|
|
2477
2477
|
descriptor = {
|
|
2478
2478
|
id: "mtfma",
|
|
2479
2479
|
name: "MTF Moving Average",
|
|
@@ -2484,19 +2484,19 @@ var ht = class extends I {
|
|
|
2484
2484
|
}
|
|
2485
2485
|
};
|
|
2486
2486
|
calculate(e, t) {
|
|
2487
|
-
let n =
|
|
2487
|
+
let n = z(t, "period", 50, 1), r = String(t.params.timeframe ?? "1d"), i = /* @__PURE__ */ new Map(), a = Array(e.length).fill(null);
|
|
2488
2488
|
if (e.length === 0) return {
|
|
2489
2489
|
values: i,
|
|
2490
2490
|
series: a
|
|
2491
2491
|
};
|
|
2492
|
-
let o = [], s =
|
|
2492
|
+
let o = [], s = x(e[0].time, r), c = e[0].close, l = null, u = () => {
|
|
2493
2493
|
if (o.length < n) return;
|
|
2494
2494
|
let e = 0;
|
|
2495
2495
|
for (let t = o.length - n; t < o.length; t++) e += o[t];
|
|
2496
2496
|
l = e / n;
|
|
2497
2497
|
};
|
|
2498
2498
|
for (let t = 0; t < e.length; t++) {
|
|
2499
|
-
let n =
|
|
2499
|
+
let n = x(e[t].time, r);
|
|
2500
2500
|
if (n !== s && (o.push(c), u(), s = n), c = e[t].close, l !== null) {
|
|
2501
2501
|
let n = { value: l };
|
|
2502
2502
|
i.set(e[t].time, n), a[t] = n;
|
|
@@ -2516,12 +2516,12 @@ var ht = class extends I {
|
|
|
2516
2516
|
for (let t = a; t <= o && t < i.length; t++) {
|
|
2517
2517
|
let r = i[t];
|
|
2518
2518
|
if (!r || r.value === void 0) continue;
|
|
2519
|
-
let a =
|
|
2519
|
+
let a = k(t, n), o = A(r.value, n);
|
|
2520
2520
|
s ? e.lineTo(a, o) : (e.moveTo(a, o), s = !0);
|
|
2521
2521
|
}
|
|
2522
2522
|
e.stroke();
|
|
2523
2523
|
}
|
|
2524
|
-
}, gt = class extends
|
|
2524
|
+
}, gt = class extends L {
|
|
2525
2525
|
descriptor = {
|
|
2526
2526
|
id: "svwap",
|
|
2527
2527
|
name: "Session VWAP",
|
|
@@ -2529,14 +2529,14 @@ var ht = class extends I {
|
|
|
2529
2529
|
defaultConfig: { bands: 1 }
|
|
2530
2530
|
};
|
|
2531
2531
|
calculate(e, t) {
|
|
2532
|
-
let n = Math.min(3,
|
|
2532
|
+
let n = Math.min(3, z(t, "bands", 1, 0)), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null);
|
|
2533
2533
|
if (e.length === 0) return {
|
|
2534
2534
|
values: r,
|
|
2535
2535
|
series: i
|
|
2536
2536
|
};
|
|
2537
|
-
let a =
|
|
2537
|
+
let a = x(e[0].time, "1d"), o = 0, s = 0, c = 0;
|
|
2538
2538
|
for (let t = 0; t < e.length; t++) {
|
|
2539
|
-
let l = e[t], u =
|
|
2539
|
+
let l = e[t], u = x(l.time, "1d");
|
|
2540
2540
|
u !== a && (o = 0, s = 0, c = 0, a = u);
|
|
2541
2541
|
let d = (l.high + l.low + l.close) / 3;
|
|
2542
2542
|
if (o += d * l.volume, s += d * d * l.volume, c += l.volume, c > 0) {
|
|
@@ -2573,12 +2573,12 @@ var ht = class extends I {
|
|
|
2573
2573
|
s = !1;
|
|
2574
2574
|
continue;
|
|
2575
2575
|
}
|
|
2576
|
-
let l =
|
|
2576
|
+
let l = k(c, n), u = A(i, n), d = r.session !== o;
|
|
2577
2577
|
!s || d ? (e.moveTo(l, u), s = !0) : e.lineTo(l, u), o = r.session;
|
|
2578
2578
|
}
|
|
2579
2579
|
e.stroke();
|
|
2580
2580
|
}
|
|
2581
|
-
}, _t = class extends
|
|
2581
|
+
}, _t = class extends L {
|
|
2582
2582
|
descriptor = {
|
|
2583
2583
|
id: "chandelier",
|
|
2584
2584
|
name: "Chandelier Exit",
|
|
@@ -2589,7 +2589,7 @@ var ht = class extends I {
|
|
|
2589
2589
|
}
|
|
2590
2590
|
};
|
|
2591
2591
|
calculate(e, t) {
|
|
2592
|
-
let n =
|
|
2592
|
+
let n = z(t, "period", 22, 1), r = R(t, "multiplier", 3), i = /* @__PURE__ */ new Map(), a = Array(e.length).fill(null), o = e.length;
|
|
2593
2593
|
if (o <= n) return {
|
|
2594
2594
|
values: i,
|
|
2595
2595
|
series: a
|
|
@@ -2629,14 +2629,14 @@ var ht = class extends I {
|
|
|
2629
2629
|
c = !1;
|
|
2630
2630
|
continue;
|
|
2631
2631
|
}
|
|
2632
|
-
let o =
|
|
2632
|
+
let o = k(r, n), s = A(a[t], n);
|
|
2633
2633
|
c ? e.lineTo(o, s) : (e.moveTo(o, s), c = !0);
|
|
2634
2634
|
}
|
|
2635
2635
|
e.stroke(), e.setLineDash([]);
|
|
2636
2636
|
};
|
|
2637
2637
|
s("long", r.colors[0] ?? "#26A69A"), s("short", r.colors[1] ?? "#EF5350");
|
|
2638
2638
|
}
|
|
2639
|
-
}, vt = class extends
|
|
2639
|
+
}, vt = class extends L {
|
|
2640
2640
|
descriptor = {
|
|
2641
2641
|
id: "alligator",
|
|
2642
2642
|
name: "Alligator",
|
|
@@ -2651,7 +2651,7 @@ var ht = class extends I {
|
|
|
2651
2651
|
}
|
|
2652
2652
|
};
|
|
2653
2653
|
calculate(e, t) {
|
|
2654
|
-
let n =
|
|
2654
|
+
let n = z(t, "jaw", 13, 1), r = z(t, "teeth", 8, 1), i = z(t, "lips", 5, 1), a = z(t, "jawShift", 8, 0), o = z(t, "teethShift", 5, 0), s = z(t, "lipsShift", 3, 0), c = /* @__PURE__ */ new Map(), l = e.length, u = Array(l).fill(null);
|
|
2655
2655
|
if (l === 0) return {
|
|
2656
2656
|
values: c,
|
|
2657
2657
|
series: u
|
|
@@ -2680,7 +2680,7 @@ var ht = class extends I {
|
|
|
2680
2680
|
c = !1;
|
|
2681
2681
|
continue;
|
|
2682
2682
|
}
|
|
2683
|
-
let o =
|
|
2683
|
+
let o = k(r, n), s = A(a[t], n);
|
|
2684
2684
|
c ? e.lineTo(o, s) : (e.moveTo(o, s), c = !0);
|
|
2685
2685
|
}
|
|
2686
2686
|
e.stroke();
|
|
@@ -2700,7 +2700,7 @@ function yt(e, t) {
|
|
|
2700
2700
|
}
|
|
2701
2701
|
//#endregion
|
|
2702
2702
|
//#region src/indicators/panel/AwesomeOscillator.ts
|
|
2703
|
-
var bt = class extends
|
|
2703
|
+
var bt = class extends L {
|
|
2704
2704
|
descriptor = {
|
|
2705
2705
|
id: "ao",
|
|
2706
2706
|
name: "Awesome Oscillator",
|
|
@@ -2711,7 +2711,7 @@ var bt = class extends I {
|
|
|
2711
2711
|
}
|
|
2712
2712
|
};
|
|
2713
2713
|
calculate(e, t) {
|
|
2714
|
-
let n =
|
|
2714
|
+
let n = z(t, "fast", 5, 1), r = z(t, "slow", 34, 1), i = /* @__PURE__ */ new Map(), a = Array(e.length).fill(null);
|
|
2715
2715
|
if (e.length < r) return {
|
|
2716
2716
|
values: i,
|
|
2717
2717
|
series: a
|
|
@@ -2744,11 +2744,11 @@ var bt = class extends I {
|
|
|
2744
2744
|
for (let t = o; t <= s && t < i.length; t++) {
|
|
2745
2745
|
let r = i[t];
|
|
2746
2746
|
if (!r || r.value === void 0) continue;
|
|
2747
|
-
let a =
|
|
2747
|
+
let a = k(t, n), o = d(r.value), s = Math.min(o, f), c = Math.max(Math.abs(o - f), 1);
|
|
2748
2748
|
e.fillStyle = r.up ? m : h, e.fillRect(a - p, s, n.barWidth, c);
|
|
2749
2749
|
}
|
|
2750
2750
|
}
|
|
2751
|
-
}, xt = class extends
|
|
2751
|
+
}, xt = class extends L {
|
|
2752
2752
|
descriptor = {
|
|
2753
2753
|
id: "chaikinOsc",
|
|
2754
2754
|
name: "Chaikin Oscillator",
|
|
@@ -2759,7 +2759,7 @@ var bt = class extends I {
|
|
|
2759
2759
|
}
|
|
2760
2760
|
};
|
|
2761
2761
|
calculate(e, t) {
|
|
2762
|
-
let n =
|
|
2762
|
+
let n = z(t, "fast", 3, 1), r = z(t, "slow", 10, 1), i = /* @__PURE__ */ new Map(), a = Array(e.length).fill(null);
|
|
2763
2763
|
if (e.length < r) return {
|
|
2764
2764
|
values: i,
|
|
2765
2765
|
series: a
|
|
@@ -2793,11 +2793,11 @@ var bt = class extends I {
|
|
|
2793
2793
|
for (let t = o; t <= s && t < i.length; t++) {
|
|
2794
2794
|
let r = i[t];
|
|
2795
2795
|
if (!r || r.value === void 0) continue;
|
|
2796
|
-
let a =
|
|
2796
|
+
let a = k(t, n), o = d(r.value), s = Math.min(o, f), c = Math.max(Math.abs(o - f), 1);
|
|
2797
2797
|
e.fillStyle = r.value >= 0 ? m : h, e.fillRect(a - p, s, n.barWidth, c);
|
|
2798
2798
|
}
|
|
2799
2799
|
}
|
|
2800
|
-
}, St = class extends
|
|
2800
|
+
}, St = class extends L {
|
|
2801
2801
|
descriptor = {
|
|
2802
2802
|
id: "rsi",
|
|
2803
2803
|
name: "Relative Strength Index",
|
|
@@ -2805,7 +2805,7 @@ var bt = class extends I {
|
|
|
2805
2805
|
defaultConfig: { period: 14 }
|
|
2806
2806
|
};
|
|
2807
2807
|
calculate(e, t) {
|
|
2808
|
-
let n =
|
|
2808
|
+
let n = z(t, "period", 14, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null);
|
|
2809
2809
|
if (e.length < n + 1) return {
|
|
2810
2810
|
values: r,
|
|
2811
2811
|
series: i
|
|
@@ -2843,12 +2843,12 @@ var bt = class extends I {
|
|
|
2843
2843
|
for (let t = o; t <= s && t < i.length; t++) {
|
|
2844
2844
|
let r = i[t];
|
|
2845
2845
|
if (!r || r.value === void 0) continue;
|
|
2846
|
-
let a =
|
|
2846
|
+
let a = k(t, n), o = c(r.value);
|
|
2847
2847
|
l ? e.lineTo(a, o) : (e.moveTo(a, o), l = !0);
|
|
2848
2848
|
}
|
|
2849
2849
|
e.stroke();
|
|
2850
2850
|
}
|
|
2851
|
-
}, Ct = class extends
|
|
2851
|
+
}, Ct = class extends L {
|
|
2852
2852
|
descriptor = {
|
|
2853
2853
|
id: "macd",
|
|
2854
2854
|
name: "MACD",
|
|
@@ -2860,7 +2860,7 @@ var bt = class extends I {
|
|
|
2860
2860
|
}
|
|
2861
2861
|
};
|
|
2862
2862
|
calculate(e, t) {
|
|
2863
|
-
let n =
|
|
2863
|
+
let n = z(t, "fast", 12, 1), r = z(t, "slow", 26, 1), i = z(t, "signal", 9, 1), a = /* @__PURE__ */ new Map(), o = Array(e.length).fill(null);
|
|
2864
2864
|
if (e.length < r) return {
|
|
2865
2865
|
values: a,
|
|
2866
2866
|
series: o
|
|
@@ -2899,7 +2899,7 @@ var bt = class extends I {
|
|
|
2899
2899
|
for (let e = o; e <= s && e < i.length; e++) {
|
|
2900
2900
|
let t = i[e];
|
|
2901
2901
|
if (!t) continue;
|
|
2902
|
-
let r =
|
|
2902
|
+
let r = k(e, n);
|
|
2903
2903
|
if (t.histogram !== void 0) {
|
|
2904
2904
|
let e = d(t.histogram), i = Math.min(e, f), a = Math.max(Math.abs(e - f), 1);
|
|
2905
2905
|
t.histogram >= 0 ? v.rect(r - p, i, n.barWidth, a) : y.rect(r - p, i, n.barWidth, a);
|
|
@@ -2915,7 +2915,7 @@ var bt = class extends I {
|
|
|
2915
2915
|
}
|
|
2916
2916
|
e.fillStyle = m, e.fill(v), e.fillStyle = h, e.fill(y), e.strokeStyle = g, e.lineWidth = r.lineWidths[0], e.lineJoin = "round", e.stroke(S), e.strokeStyle = _, e.stroke(C);
|
|
2917
2917
|
}
|
|
2918
|
-
}, wt = class extends
|
|
2918
|
+
}, wt = class extends L {
|
|
2919
2919
|
descriptor = {
|
|
2920
2920
|
id: "stochastic",
|
|
2921
2921
|
name: "Stochastic Oscillator",
|
|
@@ -2927,7 +2927,7 @@ var bt = class extends I {
|
|
|
2927
2927
|
}
|
|
2928
2928
|
};
|
|
2929
2929
|
calculate(e, t) {
|
|
2930
|
-
let n =
|
|
2930
|
+
let n = z(t, "kPeriod", 14, 1), r = z(t, "dPeriod", 3, 1), i = z(t, "smooth", 3, 1), a = /* @__PURE__ */ new Map(), o = Array(e.length).fill(null);
|
|
2931
2931
|
if (e.length < n) return {
|
|
2932
2932
|
values: a,
|
|
2933
2933
|
series: o
|
|
@@ -2983,14 +2983,14 @@ var bt = class extends I {
|
|
|
2983
2983
|
for (let r = o; r <= s && r < i.length; r++) {
|
|
2984
2984
|
let a = i[r];
|
|
2985
2985
|
if (!a || a[t] === void 0) continue;
|
|
2986
|
-
let o =
|
|
2986
|
+
let o = k(r, n), s = c(a[t]);
|
|
2987
2987
|
l ? e.lineTo(o, s) : (e.moveTo(o, s), l = !0);
|
|
2988
2988
|
}
|
|
2989
2989
|
e.stroke();
|
|
2990
2990
|
};
|
|
2991
2991
|
l("k", r.colors[0]), l("d", r.colors[1] ?? "#FF9800");
|
|
2992
2992
|
}
|
|
2993
|
-
}, Tt = class extends
|
|
2993
|
+
}, Tt = class extends L {
|
|
2994
2994
|
descriptor = {
|
|
2995
2995
|
id: "atr",
|
|
2996
2996
|
name: "Average True Range",
|
|
@@ -2998,7 +2998,7 @@ var bt = class extends I {
|
|
|
2998
2998
|
defaultConfig: { period: 14 }
|
|
2999
2999
|
};
|
|
3000
3000
|
calculate(e, t) {
|
|
3001
|
-
let n =
|
|
3001
|
+
let n = z(t, "period", 14, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null);
|
|
3002
3002
|
if (e.length < 2) return {
|
|
3003
3003
|
values: r,
|
|
3004
3004
|
series: i
|
|
@@ -3038,13 +3038,13 @@ var bt = class extends I {
|
|
|
3038
3038
|
for (let t = o; t <= s && t < i.length; t++) {
|
|
3039
3039
|
let r = i[t];
|
|
3040
3040
|
if (r && r.value !== void 0) {
|
|
3041
|
-
let i =
|
|
3041
|
+
let i = k(t, n), a = p(r.value);
|
|
3042
3042
|
m ? e.lineTo(i, a) : (e.moveTo(i, a), m = !0);
|
|
3043
3043
|
}
|
|
3044
3044
|
}
|
|
3045
3045
|
e.stroke();
|
|
3046
3046
|
}
|
|
3047
|
-
}, Et = class extends
|
|
3047
|
+
}, Et = class extends L {
|
|
3048
3048
|
descriptor = {
|
|
3049
3049
|
id: "adx",
|
|
3050
3050
|
name: "Average Directional Index",
|
|
@@ -3052,7 +3052,7 @@ var bt = class extends I {
|
|
|
3052
3052
|
defaultConfig: { period: 14 }
|
|
3053
3053
|
};
|
|
3054
3054
|
calculate(e, t) {
|
|
3055
|
-
let n =
|
|
3055
|
+
let n = z(t, "period", 14, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null);
|
|
3056
3056
|
if (e.length < n * 2) return {
|
|
3057
3057
|
values: r,
|
|
3058
3058
|
series: i
|
|
@@ -3110,14 +3110,14 @@ var bt = class extends I {
|
|
|
3110
3110
|
for (let r = o; r <= s && r < i.length; r++) {
|
|
3111
3111
|
let a = i[r];
|
|
3112
3112
|
if (!a || a[t] === void 0) continue;
|
|
3113
|
-
let o =
|
|
3113
|
+
let o = k(r, n), s = c(a[t]);
|
|
3114
3114
|
l ? e.lineTo(o, s) : (e.moveTo(o, s), l = !0);
|
|
3115
3115
|
}
|
|
3116
3116
|
e.stroke();
|
|
3117
3117
|
};
|
|
3118
3118
|
l("adx", r.colors[0]), l("plusDI", r.colors[1] ?? "#26A69A"), l("minusDI", r.colors[2] ?? "#EF5350");
|
|
3119
3119
|
}
|
|
3120
|
-
}, Dt = class extends
|
|
3120
|
+
}, Dt = class extends L {
|
|
3121
3121
|
descriptor = {
|
|
3122
3122
|
id: "obv",
|
|
3123
3123
|
name: "On Balance Volume",
|
|
@@ -3157,13 +3157,13 @@ var bt = class extends I {
|
|
|
3157
3157
|
for (let t = o; t <= s && t < i.length; t++) {
|
|
3158
3158
|
let r = i[t];
|
|
3159
3159
|
if (r && r.value !== void 0) {
|
|
3160
|
-
let i =
|
|
3160
|
+
let i = k(t, n), a = p(r.value);
|
|
3161
3161
|
m ? e.lineTo(i, a) : (e.moveTo(i, a), m = !0);
|
|
3162
3162
|
}
|
|
3163
3163
|
}
|
|
3164
3164
|
e.stroke();
|
|
3165
3165
|
}
|
|
3166
|
-
}, Ot = class extends
|
|
3166
|
+
}, Ot = class extends L {
|
|
3167
3167
|
descriptor = {
|
|
3168
3168
|
id: "williamsR",
|
|
3169
3169
|
name: "Williams %R",
|
|
@@ -3171,7 +3171,7 @@ var bt = class extends I {
|
|
|
3171
3171
|
defaultConfig: { period: 14 }
|
|
3172
3172
|
};
|
|
3173
3173
|
calculate(e, t) {
|
|
3174
|
-
let n =
|
|
3174
|
+
let n = z(t, "period", 14, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null);
|
|
3175
3175
|
for (let t = n - 1; t < e.length; t++) {
|
|
3176
3176
|
let a = -Infinity, o = Infinity;
|
|
3177
3177
|
for (let r = t - n + 1; r <= t; r++) e[r].high > a && (a = e[r].high), e[r].low < o && (o = e[r].low);
|
|
@@ -3197,13 +3197,13 @@ var bt = class extends I {
|
|
|
3197
3197
|
for (let t = o; t <= s && t < i.length; t++) {
|
|
3198
3198
|
let r = i[t];
|
|
3199
3199
|
if (r && r.value !== void 0) {
|
|
3200
|
-
let i =
|
|
3200
|
+
let i = k(t, n), a = c(r.value);
|
|
3201
3201
|
l ? e.lineTo(i, a) : (e.moveTo(i, a), l = !0);
|
|
3202
3202
|
}
|
|
3203
3203
|
}
|
|
3204
3204
|
e.stroke();
|
|
3205
3205
|
}
|
|
3206
|
-
}, kt = class extends
|
|
3206
|
+
}, kt = class extends L {
|
|
3207
3207
|
descriptor = {
|
|
3208
3208
|
id: "cci",
|
|
3209
3209
|
name: "Commodity Channel Index",
|
|
@@ -3211,7 +3211,7 @@ var bt = class extends I {
|
|
|
3211
3211
|
defaultConfig: { period: 20 }
|
|
3212
3212
|
};
|
|
3213
3213
|
calculate(e, t) {
|
|
3214
|
-
let n =
|
|
3214
|
+
let n = z(t, "period", 20, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null);
|
|
3215
3215
|
for (let t = n - 1; t < e.length; t++) {
|
|
3216
3216
|
let a = 0;
|
|
3217
3217
|
for (let r = t - n + 1; r <= t; r++) a += (e[r].high + e[r].low + e[r].close) / 3;
|
|
@@ -3252,13 +3252,13 @@ var bt = class extends I {
|
|
|
3252
3252
|
for (let t = o; t <= s && t < i.length; t++) {
|
|
3253
3253
|
let r = i[t];
|
|
3254
3254
|
if (r && r.value !== void 0) {
|
|
3255
|
-
let i =
|
|
3255
|
+
let i = k(t, n), a = m(r.value);
|
|
3256
3256
|
h ? e.lineTo(i, a) : (e.moveTo(i, a), h = !0);
|
|
3257
3257
|
}
|
|
3258
3258
|
}
|
|
3259
3259
|
e.stroke();
|
|
3260
3260
|
}
|
|
3261
|
-
}, At = class extends
|
|
3261
|
+
}, At = class extends L {
|
|
3262
3262
|
descriptor = {
|
|
3263
3263
|
id: "mfi",
|
|
3264
3264
|
name: "Money Flow Index",
|
|
@@ -3266,7 +3266,7 @@ var bt = class extends I {
|
|
|
3266
3266
|
defaultConfig: { period: 14 }
|
|
3267
3267
|
};
|
|
3268
3268
|
calculate(e, t) {
|
|
3269
|
-
let n =
|
|
3269
|
+
let n = z(t, "period", 14, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null);
|
|
3270
3270
|
if (e.length < n + 1) return {
|
|
3271
3271
|
values: r,
|
|
3272
3272
|
series: i
|
|
@@ -3297,13 +3297,13 @@ var bt = class extends I {
|
|
|
3297
3297
|
for (let t = o; t <= s && t < i.length; t++) {
|
|
3298
3298
|
let r = i[t];
|
|
3299
3299
|
if (r && r.value !== void 0) {
|
|
3300
|
-
let i =
|
|
3300
|
+
let i = k(t, n), a = c(r.value);
|
|
3301
3301
|
l ? e.lineTo(i, a) : (e.moveTo(i, a), l = !0);
|
|
3302
3302
|
}
|
|
3303
3303
|
}
|
|
3304
3304
|
e.stroke();
|
|
3305
3305
|
}
|
|
3306
|
-
}, jt = class extends
|
|
3306
|
+
}, jt = class extends L {
|
|
3307
3307
|
descriptor = {
|
|
3308
3308
|
id: "aroon",
|
|
3309
3309
|
name: "Aroon",
|
|
@@ -3311,7 +3311,7 @@ var bt = class extends I {
|
|
|
3311
3311
|
defaultConfig: { period: 25 }
|
|
3312
3312
|
};
|
|
3313
3313
|
calculate(e, t) {
|
|
3314
|
-
let n =
|
|
3314
|
+
let n = z(t, "period", 25, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null);
|
|
3315
3315
|
for (let t = n; t < e.length; t++) {
|
|
3316
3316
|
let a = 0, o = 0, s = -Infinity, c = Infinity;
|
|
3317
3317
|
for (let r = 0; r <= n; r++) {
|
|
@@ -3338,14 +3338,14 @@ var bt = class extends I {
|
|
|
3338
3338
|
for (let r = o; r <= s && r < i.length; r++) {
|
|
3339
3339
|
let a = i[r];
|
|
3340
3340
|
if (!a || a[t] === void 0) continue;
|
|
3341
|
-
let o =
|
|
3341
|
+
let o = k(r, n), s = c(a[t]);
|
|
3342
3342
|
l ? e.lineTo(o, s) : (e.moveTo(o, s), l = !0);
|
|
3343
3343
|
}
|
|
3344
3344
|
e.stroke();
|
|
3345
3345
|
};
|
|
3346
3346
|
l("up", r.colors[0]), l("down", r.colors[1] ?? "#EF5350");
|
|
3347
3347
|
}
|
|
3348
|
-
}, Mt = class extends
|
|
3348
|
+
}, Mt = class extends L {
|
|
3349
3349
|
descriptor = {
|
|
3350
3350
|
id: "roc",
|
|
3351
3351
|
name: "Rate of Change",
|
|
@@ -3353,7 +3353,7 @@ var bt = class extends I {
|
|
|
3353
3353
|
defaultConfig: { period: 12 }
|
|
3354
3354
|
};
|
|
3355
3355
|
calculate(e, t) {
|
|
3356
|
-
let n =
|
|
3356
|
+
let n = z(t, "period", 12, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null);
|
|
3357
3357
|
for (let t = n; t < e.length; t++) {
|
|
3358
3358
|
let a = e[t - n].close, o = { value: a === 0 ? 0 : (e[t].close - a) / a * 100 };
|
|
3359
3359
|
r.set(e[t].time, o), i[t] = o;
|
|
@@ -3383,13 +3383,13 @@ var bt = class extends I {
|
|
|
3383
3383
|
for (let t = o; t <= s && t < i.length; t++) {
|
|
3384
3384
|
let r = i[t];
|
|
3385
3385
|
if (r && r.value !== void 0) {
|
|
3386
|
-
let i =
|
|
3386
|
+
let i = k(t, n), a = m(r.value);
|
|
3387
3387
|
h ? e.lineTo(i, a) : (e.moveTo(i, a), h = !0);
|
|
3388
3388
|
}
|
|
3389
3389
|
}
|
|
3390
3390
|
e.stroke();
|
|
3391
3391
|
}
|
|
3392
|
-
}, Nt = class extends
|
|
3392
|
+
}, Nt = class extends L {
|
|
3393
3393
|
descriptor = {
|
|
3394
3394
|
id: "tsi",
|
|
3395
3395
|
name: "True Strength Index",
|
|
@@ -3406,7 +3406,7 @@ var bt = class extends I {
|
|
|
3406
3406
|
return r;
|
|
3407
3407
|
}
|
|
3408
3408
|
calculate(e, t) {
|
|
3409
|
-
let n =
|
|
3409
|
+
let n = z(t, "longPeriod", 25, 1), r = z(t, "shortPeriod", 13, 1), i = z(t, "signalPeriod", 7, 1), a = /* @__PURE__ */ new Map(), o = Array(e.length).fill(null);
|
|
3410
3410
|
if (e.length < 2) return {
|
|
3411
3411
|
values: a,
|
|
3412
3412
|
series: o
|
|
@@ -3451,14 +3451,14 @@ var bt = class extends I {
|
|
|
3451
3451
|
for (let r = o; r <= s && r < i.length; r++) {
|
|
3452
3452
|
let a = i[r];
|
|
3453
3453
|
if (!a || a[t] === void 0) continue;
|
|
3454
|
-
let o =
|
|
3454
|
+
let o = k(r, n), s = m(a[t]);
|
|
3455
3455
|
c ? e.lineTo(o, s) : (e.moveTo(o, s), c = !0);
|
|
3456
3456
|
}
|
|
3457
3457
|
e.stroke();
|
|
3458
3458
|
};
|
|
3459
3459
|
h("tsi", r.colors[0]), h("signal", r.colors[1] ?? "#FF9800");
|
|
3460
3460
|
}
|
|
3461
|
-
}, Pt = class extends
|
|
3461
|
+
}, Pt = class extends L {
|
|
3462
3462
|
descriptor = {
|
|
3463
3463
|
id: "cmf",
|
|
3464
3464
|
name: "Chaikin Money Flow",
|
|
@@ -3466,7 +3466,7 @@ var bt = class extends I {
|
|
|
3466
3466
|
defaultConfig: { period: 20 }
|
|
3467
3467
|
};
|
|
3468
3468
|
calculate(e, t) {
|
|
3469
|
-
let n =
|
|
3469
|
+
let n = z(t, "period", 20, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null);
|
|
3470
3470
|
for (let t = n - 1; t < e.length; t++) {
|
|
3471
3471
|
let a = 0, o = 0;
|
|
3472
3472
|
for (let r = t - n + 1; r <= t; r++) {
|
|
@@ -3496,14 +3496,14 @@ var bt = class extends I {
|
|
|
3496
3496
|
for (let t = o; t <= s && t < i.length; t++) {
|
|
3497
3497
|
let a = i[t];
|
|
3498
3498
|
if (a && a.value !== void 0) {
|
|
3499
|
-
let i =
|
|
3499
|
+
let i = k(t, n), o = m(a.value), s = m(0);
|
|
3500
3500
|
e.fillStyle = a.value >= 0 ? r.colors[0] : r.colors[1] ?? "#EF5350";
|
|
3501
3501
|
let c = Math.min(o, s);
|
|
3502
3502
|
e.fillRect(i - h, c, n.barWidth, Math.max(Math.abs(o - s), 1));
|
|
3503
3503
|
}
|
|
3504
3504
|
}
|
|
3505
3505
|
}
|
|
3506
|
-
}, Ft = class extends
|
|
3506
|
+
}, Ft = class extends L {
|
|
3507
3507
|
descriptor = {
|
|
3508
3508
|
id: "voldelta",
|
|
3509
3509
|
name: "Volume Delta",
|
|
@@ -3511,7 +3511,7 @@ var bt = class extends I {
|
|
|
3511
3511
|
defaultConfig: { mode: 0 }
|
|
3512
3512
|
};
|
|
3513
3513
|
calculate(e, t) {
|
|
3514
|
-
let n =
|
|
3514
|
+
let n = R(t, "mode", 0) >= 1, r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null), a = 0;
|
|
3515
3515
|
for (let t = 0; t < e.length; t++) {
|
|
3516
3516
|
let o = e[t], s = o.close >= o.open, c = s ? o.volume : -o.volume;
|
|
3517
3517
|
a += c;
|
|
@@ -3539,11 +3539,11 @@ var bt = class extends I {
|
|
|
3539
3539
|
for (let t = o; t <= s && t < i.length; t++) {
|
|
3540
3540
|
let r = i[t];
|
|
3541
3541
|
if (!r || r.value === void 0) continue;
|
|
3542
|
-
let a =
|
|
3542
|
+
let a = k(t, n), o = l(r.value), s = Math.min(o, u), c = Math.max(Math.abs(o - u), 1);
|
|
3543
3543
|
e.fillStyle = r.up ? f : p, e.fillRect(a - d, s, n.barWidth, c);
|
|
3544
3544
|
}
|
|
3545
3545
|
}
|
|
3546
|
-
}, It = class extends
|
|
3546
|
+
}, It = class extends L {
|
|
3547
3547
|
descriptor = {
|
|
3548
3548
|
id: "vortex",
|
|
3549
3549
|
name: "Vortex Indicator",
|
|
@@ -3551,7 +3551,7 @@ var bt = class extends I {
|
|
|
3551
3551
|
defaultConfig: { period: 14 }
|
|
3552
3552
|
};
|
|
3553
3553
|
calculate(e, t) {
|
|
3554
|
-
let n =
|
|
3554
|
+
let n = z(t, "period", 14, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null);
|
|
3555
3555
|
if (e.length <= n) return {
|
|
3556
3556
|
values: r,
|
|
3557
3557
|
series: i
|
|
@@ -3601,14 +3601,14 @@ var bt = class extends I {
|
|
|
3601
3601
|
for (let r = o; r <= s && r < i.length; r++) {
|
|
3602
3602
|
let a = i[r];
|
|
3603
3603
|
if (!a || a[t] === void 0) continue;
|
|
3604
|
-
let o =
|
|
3604
|
+
let o = k(r, n), s = f(a[t]);
|
|
3605
3605
|
c ? e.lineTo(o, s) : (e.moveTo(o, s), c = !0);
|
|
3606
3606
|
}
|
|
3607
3607
|
e.stroke();
|
|
3608
3608
|
};
|
|
3609
3609
|
p("viPlus", r.colors[0] ?? "#26A69A"), p("viMinus", r.colors[1] ?? "#EF5350");
|
|
3610
3610
|
}
|
|
3611
|
-
}, Lt = class extends
|
|
3611
|
+
}, Lt = class extends L {
|
|
3612
3612
|
descriptor = {
|
|
3613
3613
|
id: "chop",
|
|
3614
3614
|
name: "Choppiness Index",
|
|
@@ -3616,7 +3616,7 @@ var bt = class extends I {
|
|
|
3616
3616
|
defaultConfig: { period: 14 }
|
|
3617
3617
|
};
|
|
3618
3618
|
calculate(e, t) {
|
|
3619
|
-
let n =
|
|
3619
|
+
let n = z(t, "period", 14, 2), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null);
|
|
3620
3620
|
if (e.length <= n) return {
|
|
3621
3621
|
values: r,
|
|
3622
3622
|
series: i
|
|
@@ -3655,12 +3655,12 @@ var bt = class extends I {
|
|
|
3655
3655
|
for (let t = o; t <= s && t < i.length; t++) {
|
|
3656
3656
|
let r = i[t];
|
|
3657
3657
|
if (!r || r.value === void 0) continue;
|
|
3658
|
-
let a =
|
|
3658
|
+
let a = k(t, n), o = c(r.value);
|
|
3659
3659
|
l ? e.lineTo(a, o) : (e.moveTo(a, o), l = !0);
|
|
3660
3660
|
}
|
|
3661
3661
|
e.stroke();
|
|
3662
3662
|
}
|
|
3663
|
-
}, Rt = class extends
|
|
3663
|
+
}, Rt = class extends L {
|
|
3664
3664
|
descriptor = {
|
|
3665
3665
|
id: "uo",
|
|
3666
3666
|
name: "Ultimate Oscillator",
|
|
@@ -3672,7 +3672,7 @@ var bt = class extends I {
|
|
|
3672
3672
|
}
|
|
3673
3673
|
};
|
|
3674
3674
|
calculate(e, t) {
|
|
3675
|
-
let n =
|
|
3675
|
+
let n = z(t, "fast", 7, 1), r = z(t, "mid", 14, 1), i = z(t, "slow", 28, 1), a = /* @__PURE__ */ new Map(), o = Array(e.length).fill(null);
|
|
3676
3676
|
if (e.length <= i) return {
|
|
3677
3677
|
values: a,
|
|
3678
3678
|
series: o
|
|
@@ -3710,7 +3710,7 @@ var bt = class extends I {
|
|
|
3710
3710
|
for (let t = o; t <= s && t < i.length; t++) {
|
|
3711
3711
|
let r = i[t];
|
|
3712
3712
|
if (!r || r.value === void 0) continue;
|
|
3713
|
-
let a =
|
|
3713
|
+
let a = k(t, n), o = c(r.value);
|
|
3714
3714
|
l ? e.lineTo(a, o) : (e.moveTo(a, o), l = !0);
|
|
3715
3715
|
}
|
|
3716
3716
|
e.stroke();
|
|
@@ -3721,7 +3721,7 @@ function zt(e, t) {
|
|
|
3721
3721
|
}
|
|
3722
3722
|
//#endregion
|
|
3723
3723
|
//#region src/indicators/panel/ForceIndex.ts
|
|
3724
|
-
var Bt = class extends
|
|
3724
|
+
var Bt = class extends L {
|
|
3725
3725
|
descriptor = {
|
|
3726
3726
|
id: "fi",
|
|
3727
3727
|
name: "Force Index",
|
|
@@ -3729,7 +3729,7 @@ var Bt = class extends I {
|
|
|
3729
3729
|
defaultConfig: { period: 13 }
|
|
3730
3730
|
};
|
|
3731
3731
|
calculate(e, t) {
|
|
3732
|
-
let n =
|
|
3732
|
+
let n = z(t, "period", 13, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null);
|
|
3733
3733
|
if (e.length < 2) return {
|
|
3734
3734
|
values: r,
|
|
3735
3735
|
series: i
|
|
@@ -3762,12 +3762,12 @@ var Bt = class extends I {
|
|
|
3762
3762
|
for (let t = o; t <= s && t < i.length; t++) {
|
|
3763
3763
|
let r = i[t];
|
|
3764
3764
|
if (!r || r.value === void 0) continue;
|
|
3765
|
-
let a =
|
|
3765
|
+
let a = k(t, n), o = l(r.value);
|
|
3766
3766
|
d ? e.lineTo(a, o) : (e.moveTo(a, o), d = !0);
|
|
3767
3767
|
}
|
|
3768
3768
|
e.stroke();
|
|
3769
3769
|
}
|
|
3770
|
-
}, Vt = class extends
|
|
3770
|
+
}, Vt = class extends L {
|
|
3771
3771
|
descriptor = {
|
|
3772
3772
|
id: "crsi",
|
|
3773
3773
|
name: "Connors RSI",
|
|
@@ -3779,7 +3779,7 @@ var Bt = class extends I {
|
|
|
3779
3779
|
}
|
|
3780
3780
|
};
|
|
3781
3781
|
calculate(e, t) {
|
|
3782
|
-
let n =
|
|
3782
|
+
let n = z(t, "rsiPeriod", 3, 1), r = z(t, "streakPeriod", 2, 1), i = z(t, "rankPeriod", 100, 1), a = /* @__PURE__ */ new Map(), o = Array(e.length).fill(null), s = e.length;
|
|
3783
3783
|
if (s < 2) return {
|
|
3784
3784
|
values: a,
|
|
3785
3785
|
series: o
|
|
@@ -3816,7 +3816,7 @@ var Bt = class extends I {
|
|
|
3816
3816
|
for (let t = o; t <= s && t < i.length; t++) {
|
|
3817
3817
|
let r = i[t];
|
|
3818
3818
|
if (!r || r.value === void 0) continue;
|
|
3819
|
-
let a =
|
|
3819
|
+
let a = k(t, n), o = c(r.value);
|
|
3820
3820
|
l ? e.lineTo(a, o) : (e.moveTo(a, o), l = !0);
|
|
3821
3821
|
}
|
|
3822
3822
|
e.stroke();
|
|
@@ -3839,7 +3839,7 @@ function Ht(e, t) {
|
|
|
3839
3839
|
}
|
|
3840
3840
|
//#endregion
|
|
3841
3841
|
//#region src/indicators/panel/Coppock.ts
|
|
3842
|
-
var Ut = class extends
|
|
3842
|
+
var Ut = class extends L {
|
|
3843
3843
|
descriptor = {
|
|
3844
3844
|
id: "coppock",
|
|
3845
3845
|
name: "Coppock Curve",
|
|
@@ -3851,7 +3851,7 @@ var Ut = class extends I {
|
|
|
3851
3851
|
}
|
|
3852
3852
|
};
|
|
3853
3853
|
calculate(e, t) {
|
|
3854
|
-
let n =
|
|
3854
|
+
let n = z(t, "longRoc", 14, 1), r = z(t, "shortRoc", 11, 1), i = z(t, "wma", 10, 1), a = /* @__PURE__ */ new Map(), o = Array(e.length).fill(null), s = e.length, c = Math.max(n, r);
|
|
3855
3855
|
if (s <= c + i) return {
|
|
3856
3856
|
values: a,
|
|
3857
3857
|
series: o
|
|
@@ -3893,12 +3893,12 @@ var Ut = class extends I {
|
|
|
3893
3893
|
for (let t = o; t <= s && t < i.length; t++) {
|
|
3894
3894
|
let r = i[t];
|
|
3895
3895
|
if (!r || r.value === void 0) continue;
|
|
3896
|
-
let a =
|
|
3896
|
+
let a = k(t, n), o = l(r.value);
|
|
3897
3897
|
d ? e.lineTo(a, o) : (e.moveTo(a, o), d = !0);
|
|
3898
3898
|
}
|
|
3899
3899
|
e.stroke();
|
|
3900
3900
|
}
|
|
3901
|
-
}, Wt = class extends
|
|
3901
|
+
}, Wt = class extends L {
|
|
3902
3902
|
descriptor = {
|
|
3903
3903
|
id: "kst",
|
|
3904
3904
|
name: "Know Sure Thing",
|
|
@@ -3916,14 +3916,14 @@ var Ut = class extends I {
|
|
|
3916
3916
|
}
|
|
3917
3917
|
};
|
|
3918
3918
|
calculate(e, t) {
|
|
3919
|
-
let n =
|
|
3919
|
+
let n = z(t, "roc1", 10, 1), r = z(t, "roc2", 15, 1), i = z(t, "roc3", 20, 1), a = z(t, "roc4", 30, 1), o = z(t, "sma1", 10, 1), s = z(t, "sma2", 10, 1), c = z(t, "sma3", 10, 1), l = z(t, "sma4", 15, 1), u = z(t, "signal", 9, 1), d = /* @__PURE__ */ new Map(), f = Array(e.length).fill(null), p = e.length;
|
|
3920
3920
|
if (p < 2) return {
|
|
3921
3921
|
values: d,
|
|
3922
3922
|
series: f
|
|
3923
3923
|
};
|
|
3924
|
-
let m = e.map((e) => e.close), h =
|
|
3924
|
+
let m = e.map((e) => e.close), h = B(Gt(m, n), o), g = B(Gt(m, r), s), _ = B(Gt(m, i), c), v = B(Gt(m, a), l), y = Array(p).fill(void 0);
|
|
3925
3925
|
for (let e = 0; e < p; e++) h[e] === void 0 || g[e] === void 0 || _[e] === void 0 || v[e] === void 0 || (y[e] = h[e] * 1 + g[e] * 2 + _[e] * 3 + v[e] * 4);
|
|
3926
|
-
let b =
|
|
3926
|
+
let b = B(y, u);
|
|
3927
3927
|
for (let t = 0; t < p; t++) {
|
|
3928
3928
|
if (y[t] === void 0) continue;
|
|
3929
3929
|
let n = { value: y[t] };
|
|
@@ -3957,7 +3957,7 @@ var Ut = class extends I {
|
|
|
3957
3957
|
c = !1;
|
|
3958
3958
|
continue;
|
|
3959
3959
|
}
|
|
3960
|
-
let o =
|
|
3960
|
+
let o = k(r, n), s = l(a[t]);
|
|
3961
3961
|
c ? e.lineTo(o, s) : (e.moveTo(o, s), c = !0);
|
|
3962
3962
|
}
|
|
3963
3963
|
e.stroke();
|
|
@@ -3970,7 +3970,7 @@ function Gt(e, t) {
|
|
|
3970
3970
|
for (let r = t; r < e.length; r++) n[r] = e[r - t] === 0 ? 0 : (e[r] - e[r - t]) / e[r - t] * 100;
|
|
3971
3971
|
return n;
|
|
3972
3972
|
}
|
|
3973
|
-
function
|
|
3973
|
+
function B(e, t) {
|
|
3974
3974
|
let n = Array(e.length).fill(void 0);
|
|
3975
3975
|
for (let r = t - 1; r < e.length; r++) {
|
|
3976
3976
|
let i = 0, a = !0;
|
|
@@ -3988,7 +3988,7 @@ function z(e, t) {
|
|
|
3988
3988
|
}
|
|
3989
3989
|
//#endregion
|
|
3990
3990
|
//#region src/indicators/panel/ElderRay.ts
|
|
3991
|
-
var Kt = class extends
|
|
3991
|
+
var Kt = class extends L {
|
|
3992
3992
|
descriptor = {
|
|
3993
3993
|
id: "elderray",
|
|
3994
3994
|
name: "Elder Ray",
|
|
@@ -3996,7 +3996,7 @@ var Kt = class extends I {
|
|
|
3996
3996
|
defaultConfig: { period: 13 }
|
|
3997
3997
|
};
|
|
3998
3998
|
calculate(e, t) {
|
|
3999
|
-
let n =
|
|
3999
|
+
let n = z(t, "period", 13, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null), a = e.length;
|
|
4000
4000
|
if (a === 0) return {
|
|
4001
4001
|
values: r,
|
|
4002
4002
|
series: i
|
|
@@ -4032,7 +4032,7 @@ var Kt = class extends I {
|
|
|
4032
4032
|
for (let t = o; t <= s && t < i.length; t++) {
|
|
4033
4033
|
let r = i[t];
|
|
4034
4034
|
if (!r) continue;
|
|
4035
|
-
let a =
|
|
4035
|
+
let a = k(t, n);
|
|
4036
4036
|
if (r.bull !== void 0) {
|
|
4037
4037
|
let t = l(r.bull);
|
|
4038
4038
|
e.fillStyle = f, e.globalAlpha = .8, e.fillRect(a - d, Math.min(t, u), Math.max(1, d), Math.abs(t - u));
|
|
@@ -4044,7 +4044,7 @@ var Kt = class extends I {
|
|
|
4044
4044
|
}
|
|
4045
4045
|
e.globalAlpha = 1;
|
|
4046
4046
|
}
|
|
4047
|
-
}, qt = class extends
|
|
4047
|
+
}, qt = class extends L {
|
|
4048
4048
|
descriptor = {
|
|
4049
4049
|
id: "stc",
|
|
4050
4050
|
name: "Schaff Trend Cycle",
|
|
@@ -4056,7 +4056,7 @@ var Kt = class extends I {
|
|
|
4056
4056
|
}
|
|
4057
4057
|
};
|
|
4058
4058
|
calculate(e, t) {
|
|
4059
|
-
let n =
|
|
4059
|
+
let n = z(t, "fast", 23, 1), r = z(t, "slow", 50, 1), i = z(t, "cycle", 10, 1), a = /* @__PURE__ */ new Map(), o = Array(e.length).fill(null), s = e.length;
|
|
4060
4060
|
if (s === 0) return {
|
|
4061
4061
|
values: a,
|
|
4062
4062
|
series: o
|
|
@@ -4089,7 +4089,7 @@ var Kt = class extends I {
|
|
|
4089
4089
|
for (let t = o; t <= s && t < i.length; t++) {
|
|
4090
4090
|
let r = i[t];
|
|
4091
4091
|
if (!r || r.value === void 0) continue;
|
|
4092
|
-
let a =
|
|
4092
|
+
let a = k(t, n), o = c(r.value);
|
|
4093
4093
|
l ? e.lineTo(a, o) : (e.moveTo(a, o), l = !0);
|
|
4094
4094
|
}
|
|
4095
4095
|
e.stroke();
|
|
@@ -4116,7 +4116,7 @@ function Jt(e, t) {
|
|
|
4116
4116
|
}
|
|
4117
4117
|
//#endregion
|
|
4118
4118
|
//#region src/indicators/panel/Klinger.ts
|
|
4119
|
-
var Yt = class extends
|
|
4119
|
+
var Yt = class extends L {
|
|
4120
4120
|
descriptor = {
|
|
4121
4121
|
id: "kvo",
|
|
4122
4122
|
name: "Klinger Oscillator",
|
|
@@ -4128,7 +4128,7 @@ var Yt = class extends I {
|
|
|
4128
4128
|
}
|
|
4129
4129
|
};
|
|
4130
4130
|
calculate(e, t) {
|
|
4131
|
-
let n =
|
|
4131
|
+
let n = z(t, "fast", 34, 1), r = z(t, "slow", 55, 1), i = z(t, "signal", 13, 1), a = /* @__PURE__ */ new Map(), o = Array(e.length).fill(null), s = e.length;
|
|
4132
4132
|
if (s < 2) return {
|
|
4133
4133
|
values: a,
|
|
4134
4134
|
series: o
|
|
@@ -4176,14 +4176,14 @@ var Yt = class extends I {
|
|
|
4176
4176
|
c = !1;
|
|
4177
4177
|
continue;
|
|
4178
4178
|
}
|
|
4179
|
-
let o =
|
|
4179
|
+
let o = k(r, n), s = l(a[t]);
|
|
4180
4180
|
c ? e.lineTo(o, s) : (e.moveTo(o, s), c = !0);
|
|
4181
4181
|
}
|
|
4182
4182
|
e.stroke();
|
|
4183
4183
|
};
|
|
4184
4184
|
d("value", r.colors[0] ?? "#2962FF"), d("signal", r.colors[1] ?? "#FF9800");
|
|
4185
4185
|
}
|
|
4186
|
-
}, Xt = class extends
|
|
4186
|
+
}, Xt = class extends L {
|
|
4187
4187
|
descriptor = {
|
|
4188
4188
|
id: "fisher",
|
|
4189
4189
|
name: "Fisher Transform",
|
|
@@ -4191,7 +4191,7 @@ var Yt = class extends I {
|
|
|
4191
4191
|
defaultConfig: { period: 9 }
|
|
4192
4192
|
};
|
|
4193
4193
|
calculate(e, t) {
|
|
4194
|
-
let n =
|
|
4194
|
+
let n = z(t, "period", 9, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null), a = e.length;
|
|
4195
4195
|
if (a < n) return {
|
|
4196
4196
|
values: r,
|
|
4197
4197
|
series: i
|
|
@@ -4237,14 +4237,14 @@ var Yt = class extends I {
|
|
|
4237
4237
|
c = !1;
|
|
4238
4238
|
continue;
|
|
4239
4239
|
}
|
|
4240
|
-
let o =
|
|
4240
|
+
let o = k(r, n), s = l(a[t]);
|
|
4241
4241
|
c ? e.lineTo(o, s) : (e.moveTo(o, s), c = !0);
|
|
4242
4242
|
}
|
|
4243
4243
|
e.stroke();
|
|
4244
4244
|
};
|
|
4245
4245
|
d("value", r.colors[0] ?? "#2962FF"), d("trigger", r.colors[1] ?? "#FF9800");
|
|
4246
4246
|
}
|
|
4247
|
-
}, Zt = class extends
|
|
4247
|
+
}, Zt = class extends L {
|
|
4248
4248
|
descriptor = {
|
|
4249
4249
|
id: "dpo",
|
|
4250
4250
|
name: "Detrended Price Oscillator",
|
|
@@ -4252,7 +4252,7 @@ var Yt = class extends I {
|
|
|
4252
4252
|
defaultConfig: { period: 20 }
|
|
4253
4253
|
};
|
|
4254
4254
|
calculate(e, t) {
|
|
4255
|
-
let n =
|
|
4255
|
+
let n = z(t, "period", 20, 2), r = Math.floor(n / 2) + 1, i = /* @__PURE__ */ new Map(), a = Array(e.length).fill(null), o = e.length;
|
|
4256
4256
|
if (o < n) return {
|
|
4257
4257
|
values: i,
|
|
4258
4258
|
series: a
|
|
@@ -4282,11 +4282,11 @@ var Yt = class extends I {
|
|
|
4282
4282
|
for (let t = o; t <= s && t < i.length; t++) {
|
|
4283
4283
|
let r = i[t];
|
|
4284
4284
|
if (!r || r.value === void 0) continue;
|
|
4285
|
-
let a =
|
|
4285
|
+
let a = k(t, n), o = l(r.value);
|
|
4286
4286
|
e.fillStyle = r.value >= 0 ? f : p, e.fillRect(a - d, Math.min(o, u), n.barWidth, Math.max(1, Math.abs(o - u)));
|
|
4287
4287
|
}
|
|
4288
4288
|
}
|
|
4289
|
-
}, Qt = class extends
|
|
4289
|
+
}, Qt = class extends L {
|
|
4290
4290
|
descriptor = {
|
|
4291
4291
|
id: "bop",
|
|
4292
4292
|
name: "Balance of Power",
|
|
@@ -4294,7 +4294,7 @@ var Yt = class extends I {
|
|
|
4294
4294
|
defaultConfig: { smooth: 14 }
|
|
4295
4295
|
};
|
|
4296
4296
|
calculate(e, t) {
|
|
4297
|
-
let n =
|
|
4297
|
+
let n = z(t, "smooth", 14, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null), a = e.length;
|
|
4298
4298
|
if (a === 0) return {
|
|
4299
4299
|
values: r,
|
|
4300
4300
|
series: i
|
|
@@ -4323,12 +4323,12 @@ var Yt = class extends I {
|
|
|
4323
4323
|
for (let t = o; t <= s && t < i.length; t++) {
|
|
4324
4324
|
let r = i[t];
|
|
4325
4325
|
if (!r || r.value === void 0) continue;
|
|
4326
|
-
let a =
|
|
4326
|
+
let a = k(t, n), o = c(Math.max(-1, Math.min(1, r.value)));
|
|
4327
4327
|
u ? e.lineTo(a, o) : (e.moveTo(a, o), u = !0);
|
|
4328
4328
|
}
|
|
4329
4329
|
e.stroke();
|
|
4330
4330
|
}
|
|
4331
|
-
}, $t = class extends
|
|
4331
|
+
}, $t = class extends L {
|
|
4332
4332
|
descriptor = {
|
|
4333
4333
|
id: "massindex",
|
|
4334
4334
|
name: "Mass Index",
|
|
@@ -4339,7 +4339,7 @@ var Yt = class extends I {
|
|
|
4339
4339
|
}
|
|
4340
4340
|
};
|
|
4341
4341
|
calculate(e, t) {
|
|
4342
|
-
let n =
|
|
4342
|
+
let n = z(t, "ema", 9, 1), r = z(t, "sum", 25, 1), i = /* @__PURE__ */ new Map(), a = Array(e.length).fill(null), o = e.length;
|
|
4343
4343
|
if (o < r) return {
|
|
4344
4344
|
values: i,
|
|
4345
4345
|
series: a
|
|
@@ -4380,12 +4380,12 @@ var Yt = class extends I {
|
|
|
4380
4380
|
for (let t = o; t <= s && t < i.length; t++) {
|
|
4381
4381
|
let r = i[t];
|
|
4382
4382
|
if (!r || r.value === void 0) continue;
|
|
4383
|
-
let a =
|
|
4383
|
+
let a = k(t, n), o = d(r.value);
|
|
4384
4384
|
f ? e.lineTo(a, o) : (e.moveTo(a, o), f = !0);
|
|
4385
4385
|
}
|
|
4386
4386
|
e.stroke();
|
|
4387
4387
|
}
|
|
4388
|
-
}, en = class extends
|
|
4388
|
+
}, en = class extends L {
|
|
4389
4389
|
descriptor = {
|
|
4390
4390
|
id: "cmo",
|
|
4391
4391
|
name: "Chande Momentum",
|
|
@@ -4393,7 +4393,7 @@ var Yt = class extends I {
|
|
|
4393
4393
|
defaultConfig: { period: 9 }
|
|
4394
4394
|
};
|
|
4395
4395
|
calculate(e, t) {
|
|
4396
|
-
let n =
|
|
4396
|
+
let n = z(t, "period", 9, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null), a = e.length;
|
|
4397
4397
|
if (a <= n) return {
|
|
4398
4398
|
values: r,
|
|
4399
4399
|
series: i
|
|
@@ -4431,12 +4431,12 @@ var Yt = class extends I {
|
|
|
4431
4431
|
for (let t = o; t <= s && t < i.length; t++) {
|
|
4432
4432
|
let r = i[t];
|
|
4433
4433
|
if (!r || r.value === void 0) continue;
|
|
4434
|
-
let a =
|
|
4434
|
+
let a = k(t, n), o = c(r.value);
|
|
4435
4435
|
l ? e.lineTo(a, o) : (e.moveTo(a, o), l = !0);
|
|
4436
4436
|
}
|
|
4437
4437
|
e.stroke();
|
|
4438
4438
|
}
|
|
4439
|
-
}, tn = class extends
|
|
4439
|
+
}, tn = class extends L {
|
|
4440
4440
|
descriptor = {
|
|
4441
4441
|
id: "trix",
|
|
4442
4442
|
name: "TRIX",
|
|
@@ -4447,14 +4447,14 @@ var Yt = class extends I {
|
|
|
4447
4447
|
}
|
|
4448
4448
|
};
|
|
4449
4449
|
calculate(e, t) {
|
|
4450
|
-
let n =
|
|
4450
|
+
let n = z(t, "period", 15, 1), r = z(t, "signal", 9, 1), i = /* @__PURE__ */ new Map(), a = Array(e.length).fill(null), o = e.length;
|
|
4451
4451
|
if (o < 2) return {
|
|
4452
4452
|
values: i,
|
|
4453
4453
|
series: a
|
|
4454
4454
|
};
|
|
4455
|
-
let s =
|
|
4455
|
+
let s = nn(nn(nn(e.map((e) => e.close), n), n), n), c = Array(o).fill(0);
|
|
4456
4456
|
for (let e = 1; e < o; e++) c[e] = s[e - 1] === 0 ? 0 : (s[e] - s[e - 1]) / s[e - 1] * 100;
|
|
4457
|
-
let l =
|
|
4457
|
+
let l = nn(c, r), u = 3 * n;
|
|
4458
4458
|
for (let t = u; t < o; t++) {
|
|
4459
4459
|
let n = {
|
|
4460
4460
|
value: c[t],
|
|
@@ -4490,7 +4490,7 @@ var Yt = class extends I {
|
|
|
4490
4490
|
c = !1;
|
|
4491
4491
|
continue;
|
|
4492
4492
|
}
|
|
4493
|
-
let o =
|
|
4493
|
+
let o = k(r, n), s = l(a[t]);
|
|
4494
4494
|
c ? e.lineTo(o, s) : (e.moveTo(o, s), c = !0);
|
|
4495
4495
|
}
|
|
4496
4496
|
e.stroke();
|
|
@@ -4498,7 +4498,7 @@ var Yt = class extends I {
|
|
|
4498
4498
|
d("value", r.colors[0] ?? "#2962FF"), d("signal", r.colors[1] ?? "#FF9800");
|
|
4499
4499
|
}
|
|
4500
4500
|
};
|
|
4501
|
-
function
|
|
4501
|
+
function nn(e, t) {
|
|
4502
4502
|
let n = 2 / (t + 1), r = Array(e.length).fill(0), i = e[0] ?? 0;
|
|
4503
4503
|
r[0] = i;
|
|
4504
4504
|
for (let t = 1; t < e.length; t++) i = e[t] * n + i * (1 - n), r[t] = i;
|
|
@@ -4506,7 +4506,7 @@ function B(e, t) {
|
|
|
4506
4506
|
}
|
|
4507
4507
|
//#endregion
|
|
4508
4508
|
//#region src/indicators/panel/EaseOfMovement.ts
|
|
4509
|
-
var
|
|
4509
|
+
var rn = class extends L {
|
|
4510
4510
|
descriptor = {
|
|
4511
4511
|
id: "emv",
|
|
4512
4512
|
name: "Ease of Movement",
|
|
@@ -4514,7 +4514,7 @@ var nn = class extends I {
|
|
|
4514
4514
|
defaultConfig: { period: 14 }
|
|
4515
4515
|
};
|
|
4516
4516
|
calculate(e, t) {
|
|
4517
|
-
let n =
|
|
4517
|
+
let n = z(t, "period", 14, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null), a = e.length;
|
|
4518
4518
|
if (a < 2) return {
|
|
4519
4519
|
values: r,
|
|
4520
4520
|
series: i
|
|
@@ -4535,10 +4535,10 @@ var nn = class extends I {
|
|
|
4535
4535
|
};
|
|
4536
4536
|
}
|
|
4537
4537
|
render(e, t, n, r) {
|
|
4538
|
-
|
|
4538
|
+
an(e, t, n, r);
|
|
4539
4539
|
}
|
|
4540
4540
|
};
|
|
4541
|
-
function
|
|
4541
|
+
function an(e, t, n, r) {
|
|
4542
4542
|
let i = t.series;
|
|
4543
4543
|
if (!i) return;
|
|
4544
4544
|
let { chartRect: a } = n, { from: o, to: s } = n.visibleRange, c = 0;
|
|
@@ -4553,14 +4553,14 @@ function rn(e, t, n, r) {
|
|
|
4553
4553
|
for (let t = o; t <= s && t < i.length; t++) {
|
|
4554
4554
|
let r = i[t];
|
|
4555
4555
|
if (!r || r.value === void 0) continue;
|
|
4556
|
-
let a =
|
|
4556
|
+
let a = k(t, n), o = l(r.value);
|
|
4557
4557
|
d ? e.lineTo(a, o) : (e.moveTo(a, o), d = !0);
|
|
4558
4558
|
}
|
|
4559
4559
|
e.stroke();
|
|
4560
4560
|
}
|
|
4561
4561
|
//#endregion
|
|
4562
4562
|
//#region src/indicators/panel/WilliamsAD.ts
|
|
4563
|
-
var
|
|
4563
|
+
var on = class extends L {
|
|
4564
4564
|
descriptor = {
|
|
4565
4565
|
id: "wad",
|
|
4566
4566
|
name: "Williams A/D",
|
|
@@ -4587,10 +4587,10 @@ var an = class extends I {
|
|
|
4587
4587
|
};
|
|
4588
4588
|
}
|
|
4589
4589
|
render(e, t, n, r) {
|
|
4590
|
-
|
|
4590
|
+
sn(e, t, n, r, k);
|
|
4591
4591
|
}
|
|
4592
4592
|
};
|
|
4593
|
-
function
|
|
4593
|
+
function sn(e, t, n, r, i) {
|
|
4594
4594
|
let a = t.series;
|
|
4595
4595
|
if (!a) return;
|
|
4596
4596
|
let { chartRect: o } = n, { from: s, to: c } = n.visibleRange, l = Infinity, u = -Infinity;
|
|
@@ -4612,7 +4612,7 @@ function on(e, t, n, r, i) {
|
|
|
4612
4612
|
}
|
|
4613
4613
|
//#endregion
|
|
4614
4614
|
//#region src/indicators/panel/PriceVolumeTrend.ts
|
|
4615
|
-
var
|
|
4615
|
+
var cn = class extends L {
|
|
4616
4616
|
descriptor = {
|
|
4617
4617
|
id: "pvt",
|
|
4618
4618
|
name: "Price Volume Trend",
|
|
@@ -4639,9 +4639,9 @@ var sn = class extends I {
|
|
|
4639
4639
|
};
|
|
4640
4640
|
}
|
|
4641
4641
|
render(e, t, n, r) {
|
|
4642
|
-
|
|
4642
|
+
sn(e, t, n, r, k);
|
|
4643
4643
|
}
|
|
4644
|
-
},
|
|
4644
|
+
}, ln = class extends L {
|
|
4645
4645
|
descriptor = {
|
|
4646
4646
|
id: "chaikinvol",
|
|
4647
4647
|
name: "Chaikin Volatility",
|
|
@@ -4652,7 +4652,7 @@ var sn = class extends I {
|
|
|
4652
4652
|
}
|
|
4653
4653
|
};
|
|
4654
4654
|
calculate(e, t) {
|
|
4655
|
-
let n =
|
|
4655
|
+
let n = z(t, "ema", 10, 1), r = z(t, "roc", 10, 1), i = /* @__PURE__ */ new Map(), a = Array(e.length).fill(null), o = e.length;
|
|
4656
4656
|
if (o <= r) return {
|
|
4657
4657
|
values: i,
|
|
4658
4658
|
series: a
|
|
@@ -4670,9 +4670,9 @@ var sn = class extends I {
|
|
|
4670
4670
|
};
|
|
4671
4671
|
}
|
|
4672
4672
|
render(e, t, n, r) {
|
|
4673
|
-
|
|
4673
|
+
an(e, t, n, r);
|
|
4674
4674
|
}
|
|
4675
|
-
},
|
|
4675
|
+
}, un = class extends L {
|
|
4676
4676
|
descriptor = {
|
|
4677
4677
|
id: "rvi",
|
|
4678
4678
|
name: "Relative Vigor Index",
|
|
@@ -4680,7 +4680,7 @@ var sn = class extends I {
|
|
|
4680
4680
|
defaultConfig: { period: 10 }
|
|
4681
4681
|
};
|
|
4682
4682
|
calculate(e, t) {
|
|
4683
|
-
let n =
|
|
4683
|
+
let n = z(t, "period", 10, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null), a = e.length;
|
|
4684
4684
|
if (a < n + 3) return {
|
|
4685
4685
|
values: r,
|
|
4686
4686
|
series: i
|
|
@@ -4728,14 +4728,14 @@ var sn = class extends I {
|
|
|
4728
4728
|
c = !1;
|
|
4729
4729
|
continue;
|
|
4730
4730
|
}
|
|
4731
|
-
let o =
|
|
4731
|
+
let o = k(r, n), s = l(a[t]);
|
|
4732
4732
|
c ? e.lineTo(o, s) : (e.moveTo(o, s), c = !0);
|
|
4733
4733
|
}
|
|
4734
4734
|
e.stroke();
|
|
4735
4735
|
};
|
|
4736
4736
|
d("value", r.colors[0] ?? "#2962FF"), d("signal", r.colors[1] ?? "#FF9800");
|
|
4737
4737
|
}
|
|
4738
|
-
},
|
|
4738
|
+
}, dn = class extends L {
|
|
4739
4739
|
descriptor = {
|
|
4740
4740
|
id: "stochrsi",
|
|
4741
4741
|
name: "Stochastic RSI",
|
|
@@ -4748,12 +4748,12 @@ var sn = class extends I {
|
|
|
4748
4748
|
}
|
|
4749
4749
|
};
|
|
4750
4750
|
calculate(e, t) {
|
|
4751
|
-
let n =
|
|
4751
|
+
let n = z(t, "rsiPeriod", 14, 1), r = z(t, "stochPeriod", 14, 1), i = z(t, "k", 3, 1), a = z(t, "d", 3, 1), o = /* @__PURE__ */ new Map(), s = Array(e.length).fill(null), c = e.length;
|
|
4752
4752
|
if (c <= n + r) return {
|
|
4753
4753
|
values: o,
|
|
4754
4754
|
series: s
|
|
4755
4755
|
};
|
|
4756
|
-
let l =
|
|
4756
|
+
let l = fn(e.map((e) => e.close), n), u = Array(c).fill(void 0);
|
|
4757
4757
|
for (let e = 0; e < c; e++) {
|
|
4758
4758
|
if (l[e] === void 0) continue;
|
|
4759
4759
|
let t = Infinity, n = -Infinity, i = !0;
|
|
@@ -4766,7 +4766,7 @@ var sn = class extends I {
|
|
|
4766
4766
|
}
|
|
4767
4767
|
i && (u[e] = n - t > 0 ? (l[e] - t) / (n - t) * 100 : 0);
|
|
4768
4768
|
}
|
|
4769
|
-
let d =
|
|
4769
|
+
let d = pn(u, i), f = pn(d, a);
|
|
4770
4770
|
for (let t = 0; t < c; t++) {
|
|
4771
4771
|
if (d[t] === void 0) continue;
|
|
4772
4772
|
let n = { k: d[t] };
|
|
@@ -4796,7 +4796,7 @@ var sn = class extends I {
|
|
|
4796
4796
|
l = !1;
|
|
4797
4797
|
continue;
|
|
4798
4798
|
}
|
|
4799
|
-
let o =
|
|
4799
|
+
let o = k(r, n), s = c(a[t]);
|
|
4800
4800
|
l ? e.lineTo(o, s) : (e.moveTo(o, s), l = !0);
|
|
4801
4801
|
}
|
|
4802
4802
|
e.stroke();
|
|
@@ -4804,7 +4804,7 @@ var sn = class extends I {
|
|
|
4804
4804
|
l("k", r.colors[0] ?? "#2962FF"), l("d", r.colors[1] ?? "#FF9800");
|
|
4805
4805
|
}
|
|
4806
4806
|
};
|
|
4807
|
-
function
|
|
4807
|
+
function fn(e, t) {
|
|
4808
4808
|
let n = e.length, r = Array(n).fill(void 0);
|
|
4809
4809
|
if (n <= t) return r;
|
|
4810
4810
|
let i = 0, a = 0;
|
|
@@ -4819,7 +4819,7 @@ function dn(e, t) {
|
|
|
4819
4819
|
}
|
|
4820
4820
|
return r;
|
|
4821
4821
|
}
|
|
4822
|
-
function
|
|
4822
|
+
function pn(e, t) {
|
|
4823
4823
|
let n = Array(e.length).fill(void 0);
|
|
4824
4824
|
for (let r = t - 1; r < e.length; r++) {
|
|
4825
4825
|
let i = 0, a = !0;
|
|
@@ -4836,7 +4836,7 @@ function fn(e, t) {
|
|
|
4836
4836
|
}
|
|
4837
4837
|
//#endregion
|
|
4838
4838
|
//#region src/indicators/panel/PercentagePriceOscillator.ts
|
|
4839
|
-
var
|
|
4839
|
+
var mn = class extends L {
|
|
4840
4840
|
descriptor = {
|
|
4841
4841
|
id: "ppo",
|
|
4842
4842
|
name: "Percentage Price Oscillator",
|
|
@@ -4848,14 +4848,14 @@ var pn = class extends I {
|
|
|
4848
4848
|
}
|
|
4849
4849
|
};
|
|
4850
4850
|
calculate(e, t) {
|
|
4851
|
-
let n =
|
|
4851
|
+
let n = z(t, "fast", 12, 1), r = z(t, "slow", 26, 1), i = z(t, "signal", 9, 1), a = /* @__PURE__ */ new Map(), o = Array(e.length).fill(null), s = e.length;
|
|
4852
4852
|
if (s <= r) return {
|
|
4853
4853
|
values: a,
|
|
4854
4854
|
series: o
|
|
4855
4855
|
};
|
|
4856
|
-
let c = e.map((e) => e.close), l =
|
|
4856
|
+
let c = e.map((e) => e.close), l = hn(c, n), u = hn(c, r), d = Array(s).fill(void 0);
|
|
4857
4857
|
for (let e = 0; e < s; e++) l[e] === void 0 || u[e] === void 0 || u[e] === 0 || (d[e] = (l[e] - u[e]) / u[e] * 100);
|
|
4858
|
-
let f =
|
|
4858
|
+
let f = hn(d, i);
|
|
4859
4859
|
for (let t = 0; t < s; t++) {
|
|
4860
4860
|
if (d[t] === void 0) continue;
|
|
4861
4861
|
let n = { value: d[t] };
|
|
@@ -4886,7 +4886,7 @@ var pn = class extends I {
|
|
|
4886
4886
|
for (let t = o; t <= s && t < i.length; t++) {
|
|
4887
4887
|
let r = i[t]?.hist;
|
|
4888
4888
|
if (r === void 0) continue;
|
|
4889
|
-
let a =
|
|
4889
|
+
let a = k(t, n), o = l(r);
|
|
4890
4890
|
e.fillStyle = r >= 0 ? "rgba(38,166,154,0.5)" : "rgba(239,83,80,0.5)";
|
|
4891
4891
|
let s = Math.min(o, u);
|
|
4892
4892
|
e.fillRect(a - d / 2, s, d, Math.max(1, Math.abs(o - u)));
|
|
@@ -4901,7 +4901,7 @@ var pn = class extends I {
|
|
|
4901
4901
|
c = !1;
|
|
4902
4902
|
continue;
|
|
4903
4903
|
}
|
|
4904
|
-
let o =
|
|
4904
|
+
let o = k(r, n), s = l(a[t]);
|
|
4905
4905
|
c ? e.lineTo(o, s) : (e.moveTo(o, s), c = !0);
|
|
4906
4906
|
}
|
|
4907
4907
|
e.stroke();
|
|
@@ -4909,7 +4909,7 @@ var pn = class extends I {
|
|
|
4909
4909
|
f("value", r.colors[0] ?? "#2962FF"), f("signal", r.colors[1] ?? "#FF9800");
|
|
4910
4910
|
}
|
|
4911
4911
|
};
|
|
4912
|
-
function
|
|
4912
|
+
function hn(e, t) {
|
|
4913
4913
|
let n = e.length, r = Array(n).fill(void 0), i = 2 / (t + 1), a, o = 0, s = 0;
|
|
4914
4914
|
for (let c = 0; c < n; c++) {
|
|
4915
4915
|
let n = e[c];
|
|
@@ -4919,7 +4919,7 @@ function mn(e, t) {
|
|
|
4919
4919
|
}
|
|
4920
4920
|
//#endregion
|
|
4921
4921
|
//#region src/indicators/panel/AcceleratorOscillator.ts
|
|
4922
|
-
var
|
|
4922
|
+
var gn = class extends L {
|
|
4923
4923
|
descriptor = {
|
|
4924
4924
|
id: "ac",
|
|
4925
4925
|
name: "Accelerator Oscillator",
|
|
@@ -4933,7 +4933,7 @@ var hn = class extends I {
|
|
|
4933
4933
|
series: n
|
|
4934
4934
|
};
|
|
4935
4935
|
let i = e.map((e) => (e.high + e.low) / 2), a = Array(r).fill(void 0);
|
|
4936
|
-
for (let e = 33; e < r; e++) a[e] =
|
|
4936
|
+
for (let e = 33; e < r; e++) a[e] = _n(i, e, 5) - _n(i, e, 34);
|
|
4937
4937
|
for (let i = 37; i < r; i++) {
|
|
4938
4938
|
let r = 0;
|
|
4939
4939
|
for (let e = i - 4; e <= i; e++) r += a[e];
|
|
@@ -4963,21 +4963,21 @@ var hn = class extends I {
|
|
|
4963
4963
|
f = void 0;
|
|
4964
4964
|
continue;
|
|
4965
4965
|
}
|
|
4966
|
-
let a =
|
|
4966
|
+
let a = k(t, n), o = l(r);
|
|
4967
4967
|
e.fillStyle = (f === void 0 ? r >= 0 : r >= f) ? "rgba(38,166,154,0.85)" : "rgba(239,83,80,0.85)";
|
|
4968
4968
|
let s = Math.min(o, u);
|
|
4969
4969
|
e.fillRect(a - d / 2, s, d, Math.max(1, Math.abs(o - u))), f = r;
|
|
4970
4970
|
}
|
|
4971
4971
|
}
|
|
4972
4972
|
};
|
|
4973
|
-
function
|
|
4973
|
+
function _n(e, t, n) {
|
|
4974
4974
|
let r = 0;
|
|
4975
4975
|
for (let i = t - n + 1; i <= t; i++) r += e[i];
|
|
4976
4976
|
return r / n;
|
|
4977
4977
|
}
|
|
4978
4978
|
//#endregion
|
|
4979
4979
|
//#region src/indicators/panel/RelativeMomentumIndex.ts
|
|
4980
|
-
var
|
|
4980
|
+
var vn = class extends L {
|
|
4981
4981
|
descriptor = {
|
|
4982
4982
|
id: "rmi",
|
|
4983
4983
|
name: "Relative Momentum Index",
|
|
@@ -4988,7 +4988,7 @@ var _n = class extends I {
|
|
|
4988
4988
|
}
|
|
4989
4989
|
};
|
|
4990
4990
|
calculate(e, t) {
|
|
4991
|
-
let n =
|
|
4991
|
+
let n = z(t, "period", 20, 1), r = z(t, "momentum", 5, 1), i = /* @__PURE__ */ new Map(), a = Array(e.length).fill(null), o = e.length;
|
|
4992
4992
|
if (o <= n + r) return {
|
|
4993
4993
|
values: i,
|
|
4994
4994
|
series: a
|
|
@@ -5029,12 +5029,12 @@ var _n = class extends I {
|
|
|
5029
5029
|
l = !1;
|
|
5030
5030
|
continue;
|
|
5031
5031
|
}
|
|
5032
|
-
let a =
|
|
5032
|
+
let a = k(t, n), o = c(r.value);
|
|
5033
5033
|
l ? e.lineTo(a, o) : (e.moveTo(a, o), l = !0);
|
|
5034
5034
|
}
|
|
5035
5035
|
e.stroke();
|
|
5036
5036
|
}
|
|
5037
|
-
},
|
|
5037
|
+
}, yn = class extends L {
|
|
5038
5038
|
descriptor = {
|
|
5039
5039
|
id: "disparity",
|
|
5040
5040
|
name: "Disparity Index",
|
|
@@ -5042,7 +5042,7 @@ var _n = class extends I {
|
|
|
5042
5042
|
defaultConfig: { period: 14 }
|
|
5043
5043
|
};
|
|
5044
5044
|
calculate(e, t) {
|
|
5045
|
-
let n =
|
|
5045
|
+
let n = z(t, "period", 14, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null), a = e.length;
|
|
5046
5046
|
if (a < n) return {
|
|
5047
5047
|
values: r,
|
|
5048
5048
|
series: i
|
|
@@ -5058,9 +5058,9 @@ var _n = class extends I {
|
|
|
5058
5058
|
};
|
|
5059
5059
|
}
|
|
5060
5060
|
render(e, t, n, r) {
|
|
5061
|
-
|
|
5061
|
+
an(e, t, n, r);
|
|
5062
5062
|
}
|
|
5063
|
-
},
|
|
5063
|
+
}, bn = class extends L {
|
|
5064
5064
|
descriptor = {
|
|
5065
5065
|
id: "qstick",
|
|
5066
5066
|
name: "Qstick",
|
|
@@ -5068,7 +5068,7 @@ var _n = class extends I {
|
|
|
5068
5068
|
defaultConfig: { period: 8 }
|
|
5069
5069
|
};
|
|
5070
5070
|
calculate(e, t) {
|
|
5071
|
-
let n =
|
|
5071
|
+
let n = z(t, "period", 8, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null), a = e.length;
|
|
5072
5072
|
if (a < n) return {
|
|
5073
5073
|
values: r,
|
|
5074
5074
|
series: i
|
|
@@ -5087,9 +5087,9 @@ var _n = class extends I {
|
|
|
5087
5087
|
};
|
|
5088
5088
|
}
|
|
5089
5089
|
render(e, t, n, r) {
|
|
5090
|
-
|
|
5090
|
+
an(e, t, n, r);
|
|
5091
5091
|
}
|
|
5092
|
-
},
|
|
5092
|
+
}, xn = class extends L {
|
|
5093
5093
|
descriptor = {
|
|
5094
5094
|
id: "pgo",
|
|
5095
5095
|
name: "Pretty Good Oscillator",
|
|
@@ -5097,7 +5097,7 @@ var _n = class extends I {
|
|
|
5097
5097
|
defaultConfig: { period: 14 }
|
|
5098
5098
|
};
|
|
5099
5099
|
calculate(e, t) {
|
|
5100
|
-
let n =
|
|
5100
|
+
let n = z(t, "period", 14, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null), a = e.length;
|
|
5101
5101
|
if (a <= n) return {
|
|
5102
5102
|
values: r,
|
|
5103
5103
|
series: i
|
|
@@ -5151,12 +5151,12 @@ var _n = class extends I {
|
|
|
5151
5151
|
u = !1;
|
|
5152
5152
|
continue;
|
|
5153
5153
|
}
|
|
5154
|
-
let a =
|
|
5154
|
+
let a = k(t, n), o = l(r.value);
|
|
5155
5155
|
u ? e.lineTo(a, o) : (e.moveTo(a, o), u = !0);
|
|
5156
5156
|
}
|
|
5157
5157
|
e.stroke();
|
|
5158
5158
|
}
|
|
5159
|
-
},
|
|
5159
|
+
}, Sn = class extends L {
|
|
5160
5160
|
descriptor = {
|
|
5161
5161
|
id: "stddev",
|
|
5162
5162
|
name: "Standard Deviation",
|
|
@@ -5164,7 +5164,7 @@ var _n = class extends I {
|
|
|
5164
5164
|
defaultConfig: { period: 20 }
|
|
5165
5165
|
};
|
|
5166
5166
|
calculate(e, t) {
|
|
5167
|
-
let n =
|
|
5167
|
+
let n = z(t, "period", 20, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null);
|
|
5168
5168
|
for (let t = n - 1; t < e.length; t++) {
|
|
5169
5169
|
let a = 0;
|
|
5170
5170
|
for (let r = t - n + 1; r <= t; r++) a += e[r].close;
|
|
@@ -5196,13 +5196,13 @@ var _n = class extends I {
|
|
|
5196
5196
|
for (let t = o; t <= s && t < i.length; t++) {
|
|
5197
5197
|
let r = i[t];
|
|
5198
5198
|
if (r && r.value !== void 0) {
|
|
5199
|
-
let i =
|
|
5199
|
+
let i = k(t, n), a = p(r.value);
|
|
5200
5200
|
m ? e.lineTo(i, a) : (e.moveTo(i, a), m = !0);
|
|
5201
5201
|
}
|
|
5202
5202
|
}
|
|
5203
5203
|
e.stroke();
|
|
5204
5204
|
}
|
|
5205
|
-
},
|
|
5205
|
+
}, Cn = class extends L {
|
|
5206
5206
|
descriptor = {
|
|
5207
5207
|
id: "volumeProfile",
|
|
5208
5208
|
name: "Volume Profile",
|
|
@@ -5210,7 +5210,7 @@ var _n = class extends I {
|
|
|
5210
5210
|
defaultConfig: { rows: 24 }
|
|
5211
5211
|
};
|
|
5212
5212
|
calculate(e, t) {
|
|
5213
|
-
let n =
|
|
5213
|
+
let n = z(t, "rows", 24, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null);
|
|
5214
5214
|
if (e.length === 0) return {
|
|
5215
5215
|
values: r,
|
|
5216
5216
|
series: i
|
|
@@ -5252,7 +5252,7 @@ var _n = class extends I {
|
|
|
5252
5252
|
e.fillStyle = l[t] > u * .7 ? r.colors[1] ?? "rgba(255, 152, 0, 0.5)" : r.colors[0] ?? "rgba(33, 150, 243, 0.3)", e.fillRect(i.x, s - d / 2, p, Math.max(d - 1, 1));
|
|
5253
5253
|
}
|
|
5254
5254
|
}
|
|
5255
|
-
},
|
|
5255
|
+
}, wn = class extends L {
|
|
5256
5256
|
descriptor = {
|
|
5257
5257
|
id: "ad",
|
|
5258
5258
|
name: "Accumulation/Distribution",
|
|
@@ -5292,13 +5292,13 @@ var _n = class extends I {
|
|
|
5292
5292
|
for (let t = o; t <= s && t < i.length; t++) {
|
|
5293
5293
|
let r = i[t];
|
|
5294
5294
|
if (r && r.value !== void 0) {
|
|
5295
|
-
let i =
|
|
5295
|
+
let i = k(t, n), a = p(r.value);
|
|
5296
5296
|
m ? e.lineTo(i, a) : (e.moveTo(i, a), m = !0);
|
|
5297
5297
|
}
|
|
5298
5298
|
}
|
|
5299
5299
|
e.stroke();
|
|
5300
5300
|
}
|
|
5301
|
-
},
|
|
5301
|
+
}, Tn = class extends L {
|
|
5302
5302
|
descriptor = {
|
|
5303
5303
|
id: "vroc",
|
|
5304
5304
|
name: "Volume Rate of Change",
|
|
@@ -5306,7 +5306,7 @@ var _n = class extends I {
|
|
|
5306
5306
|
defaultConfig: { period: 14 }
|
|
5307
5307
|
};
|
|
5308
5308
|
calculate(e, t) {
|
|
5309
|
-
let n =
|
|
5309
|
+
let n = z(t, "period", 14, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null);
|
|
5310
5310
|
for (let t = n; t < e.length; t++) {
|
|
5311
5311
|
let a = e[t - n].volume, o = { value: a === 0 ? 0 : (e[t].volume - a) / a * 100 };
|
|
5312
5312
|
r.set(e[t].time, o), i[t] = o;
|
|
@@ -5331,7 +5331,7 @@ var _n = class extends I {
|
|
|
5331
5331
|
for (let t = o; t <= s && t < i.length; t++) {
|
|
5332
5332
|
let r = i[t];
|
|
5333
5333
|
if (r && r.value !== void 0) {
|
|
5334
|
-
let i =
|
|
5334
|
+
let i = k(t, n), a = m(r.value);
|
|
5335
5335
|
h ? e.lineTo(i, a) : (e.moveTo(i, a), h = !0);
|
|
5336
5336
|
}
|
|
5337
5337
|
}
|
|
@@ -5340,19 +5340,19 @@ var _n = class extends I {
|
|
|
5340
5340
|
};
|
|
5341
5341
|
//#endregion
|
|
5342
5342
|
//#region src/indicators/registry.ts
|
|
5343
|
-
function
|
|
5344
|
-
e.register(new Qe()), e.register(new $e()), e.register(new et()), e.register(new tt()), e.register(new nt()), e.register(new rt()), e.register(new it()), e.register(new at()), e.register(new ot()), e.register(new ct()), e.register(new lt()), e.register(new ut()), e.register(new dt()), e.register(new ft()), e.register(new ht()), e.register(new gt()), e.register(new _t()), e.register(new vt()), e.register(new St()), e.register(new Ct()), e.register(new wt()), e.register(new Tt()), e.register(new Et()), e.register(new Dt()), e.register(new Ot()), e.register(new kt()), e.register(new At()), e.register(new jt()), e.register(new Mt()), e.register(new Nt()), e.register(new Pt()), e.register(new
|
|
5343
|
+
function En(e) {
|
|
5344
|
+
e.register(new Qe()), e.register(new $e()), e.register(new et()), e.register(new tt()), e.register(new nt()), e.register(new rt()), e.register(new it()), e.register(new at()), e.register(new ot()), e.register(new ct()), e.register(new lt()), e.register(new ut()), e.register(new dt()), e.register(new ft()), e.register(new ht()), e.register(new gt()), e.register(new _t()), e.register(new vt()), e.register(new St()), e.register(new Ct()), e.register(new wt()), e.register(new Tt()), e.register(new Et()), e.register(new Dt()), e.register(new Ot()), e.register(new kt()), e.register(new At()), e.register(new jt()), e.register(new Mt()), e.register(new Nt()), e.register(new Pt()), e.register(new Sn()), e.register(new Cn()), e.register(new wn()), e.register(new Tn()), e.register(new bt()), e.register(new xt()), e.register(new Ft()), e.register(new It()), e.register(new Lt()), e.register(new Rt()), e.register(new Bt()), e.register(new Vt()), e.register(new Ut()), e.register(new Wt()), e.register(new Kt()), e.register(new qt()), e.register(new Yt()), e.register(new Xt()), e.register(new Zt()), e.register(new Qt()), e.register(new $t()), e.register(new en()), e.register(new tn()), e.register(new rn()), e.register(new cn()), e.register(new on()), e.register(new ln()), e.register(new un()), e.register(new dn()), e.register(new mn()), e.register(new gn()), e.register(new vn()), e.register(new yn()), e.register(new bn()), e.register(new xn());
|
|
5345
5345
|
}
|
|
5346
5346
|
//#endregion
|
|
5347
5347
|
//#region src/indicators/worker/messages.ts
|
|
5348
|
-
function
|
|
5348
|
+
function Dn(e) {
|
|
5349
5349
|
if (typeof e != "object" || !e) return !1;
|
|
5350
5350
|
let t = e;
|
|
5351
5351
|
return typeof t.requestId == "number" ? t.type === "result" || t.type === "pong" || t.type === "error" : !1;
|
|
5352
5352
|
}
|
|
5353
5353
|
//#endregion
|
|
5354
5354
|
//#region src/indicators/worker/IndicatorWorkerHost.ts
|
|
5355
|
-
var
|
|
5355
|
+
var On = class {
|
|
5356
5356
|
worker;
|
|
5357
5357
|
fallbackPlugins;
|
|
5358
5358
|
timeoutMs;
|
|
@@ -5417,7 +5417,7 @@ var Dn = class {
|
|
|
5417
5417
|
handleMessage(e) {
|
|
5418
5418
|
let t = e.data;
|
|
5419
5419
|
if (t !== void 0) {
|
|
5420
|
-
if (!
|
|
5420
|
+
if (!Dn(t)) return;
|
|
5421
5421
|
this.dispatchResponse(t);
|
|
5422
5422
|
return;
|
|
5423
5423
|
}
|
|
@@ -5438,7 +5438,7 @@ var Dn = class {
|
|
|
5438
5438
|
t.resolve(e.output);
|
|
5439
5439
|
}
|
|
5440
5440
|
}
|
|
5441
|
-
},
|
|
5441
|
+
}, kn = class {
|
|
5442
5442
|
visible = !0;
|
|
5443
5443
|
setVisible(e) {
|
|
5444
5444
|
this.visible = e;
|
|
@@ -5467,7 +5467,7 @@ var Dn = class {
|
|
|
5467
5467
|
}
|
|
5468
5468
|
e.stroke();
|
|
5469
5469
|
}
|
|
5470
|
-
},
|
|
5470
|
+
}, An = class {
|
|
5471
5471
|
locale = "en-US";
|
|
5472
5472
|
setLocale(e) {
|
|
5473
5473
|
this.locale = e;
|
|
@@ -5490,7 +5490,7 @@ var Dn = class {
|
|
|
5490
5490
|
e.stroke(), e.globalAlpha = 1, e.fillStyle = n.axisLabel;
|
|
5491
5491
|
for (let { y: t, text: n } of h) e.fillText(n, a + 8, t);
|
|
5492
5492
|
}
|
|
5493
|
-
},
|
|
5493
|
+
}, jn = (e) => e < 10 ? "0" + e : "" + e, Mn = class {
|
|
5494
5494
|
tzOffsetMinutes = null;
|
|
5495
5495
|
setTimezoneOffset(e) {
|
|
5496
5496
|
this.tzOffsetMinutes = e;
|
|
@@ -5503,13 +5503,13 @@ var Dn = class {
|
|
|
5503
5503
|
let f = -1;
|
|
5504
5504
|
for (let t = l; t <= u && t < r.length; t++) {
|
|
5505
5505
|
if (t % c !== 0) continue;
|
|
5506
|
-
let n = t * s + d, i = r[t].time,
|
|
5507
|
-
a === f ?
|
|
5506
|
+
let n = t * s + d, i = r[t].time, a = b(i > 0xe8d4a51000 ? i : i * 1e3, this.tzOffsetMinutes), { year: l, day: u, month: p, hours: m, minutes: h } = a, g;
|
|
5507
|
+
_(a) ? g = `${p}/${u}/${l}` : u === f ? g = `${jn(m)}:${jn(h)}` : (g = `${p}/${u}`, f = u), e.fillText(g, n, o + 7);
|
|
5508
5508
|
}
|
|
5509
5509
|
let p = a.x + a.width - 4, m = o + 7;
|
|
5510
|
-
e.font = `500 ${n.font.sizeSmall - 1}px ${n.font.family}`, e.textAlign = "right", e.textBaseline = "top", e.globalAlpha = .75, e.fillStyle = n.textSecondary, e.fillText(
|
|
5510
|
+
e.font = `500 ${n.font.sizeSmall - 1}px ${n.font.family}`, e.textAlign = "right", e.textBaseline = "top", e.globalAlpha = .75, e.fillStyle = n.textSecondary, e.fillText(C(this.tzOffsetMinutes), p, m), e.globalAlpha = 1;
|
|
5511
5511
|
}
|
|
5512
|
-
},
|
|
5512
|
+
}, Nn = class {
|
|
5513
5513
|
panHandler = null;
|
|
5514
5514
|
zoomHandler = null;
|
|
5515
5515
|
crosshairHandler = null;
|
|
@@ -5793,7 +5793,7 @@ var Dn = class {
|
|
|
5793
5793
|
y: (e.clientY + t.clientY) / 2 - n.top
|
|
5794
5794
|
};
|
|
5795
5795
|
}
|
|
5796
|
-
},
|
|
5796
|
+
}, Pn = class {
|
|
5797
5797
|
dragging = !1;
|
|
5798
5798
|
lastX = 0;
|
|
5799
5799
|
lastY = 0;
|
|
@@ -5832,7 +5832,7 @@ var Dn = class {
|
|
|
5832
5832
|
stopMomentum() {
|
|
5833
5833
|
this.momentumId &&= (cancelAnimationFrame(this.momentumId), 0);
|
|
5834
5834
|
}
|
|
5835
|
-
},
|
|
5835
|
+
}, Fn = class {
|
|
5836
5836
|
callback;
|
|
5837
5837
|
sensitivity;
|
|
5838
5838
|
pendingDelta = 0;
|
|
@@ -5851,7 +5851,7 @@ var Dn = class {
|
|
|
5851
5851
|
dispose() {
|
|
5852
5852
|
this.rafId &&= (cancelAnimationFrame(this.rafId), 0);
|
|
5853
5853
|
}
|
|
5854
|
-
},
|
|
5854
|
+
}, In = class {
|
|
5855
5855
|
dragging = !1;
|
|
5856
5856
|
axis = null;
|
|
5857
5857
|
startPos = {
|
|
@@ -5891,7 +5891,7 @@ var Dn = class {
|
|
|
5891
5891
|
isActive() {
|
|
5892
5892
|
return this.dragging;
|
|
5893
5893
|
}
|
|
5894
|
-
},
|
|
5894
|
+
}, Ln = class {
|
|
5895
5895
|
draggingId = null;
|
|
5896
5896
|
constructor(e, t) {
|
|
5897
5897
|
this.alerts = e, this.viewportGetter = t;
|
|
@@ -5909,7 +5909,7 @@ var Dn = class {
|
|
|
5909
5909
|
move(e) {
|
|
5910
5910
|
if (this.draggingId === null) return;
|
|
5911
5911
|
let t = this.viewportGetter();
|
|
5912
|
-
t && this.alerts.updateAlertPrice(this.draggingId,
|
|
5912
|
+
t && this.alerts.updateAlertPrice(this.draggingId, M(e.y, t));
|
|
5913
5913
|
}
|
|
5914
5914
|
end() {
|
|
5915
5915
|
this.draggingId = null;
|
|
@@ -5917,7 +5917,7 @@ var Dn = class {
|
|
|
5917
5917
|
isActive() {
|
|
5918
5918
|
return this.draggingId !== null;
|
|
5919
5919
|
}
|
|
5920
|
-
},
|
|
5920
|
+
}, Rn = class {
|
|
5921
5921
|
state = null;
|
|
5922
5922
|
layoutGetter = null;
|
|
5923
5923
|
onResize = null;
|
|
@@ -5928,7 +5928,7 @@ var Dn = class {
|
|
|
5928
5928
|
this.layoutGetter = e, this.onResize = t;
|
|
5929
5929
|
}
|
|
5930
5930
|
hitTest(e, t) {
|
|
5931
|
-
for (let n of t.dividers) if (
|
|
5931
|
+
for (let n of t.dividers) if (zn(e, n.rect, this.tolerance)) {
|
|
5932
5932
|
let e = t.panels.find((e) => e.config.id === n.panelId);
|
|
5933
5933
|
if (e) return {
|
|
5934
5934
|
panelId: n.panelId,
|
|
@@ -5990,12 +5990,12 @@ var Dn = class {
|
|
|
5990
5990
|
return this.state !== null;
|
|
5991
5991
|
}
|
|
5992
5992
|
};
|
|
5993
|
-
function
|
|
5993
|
+
function zn(e, t, n) {
|
|
5994
5994
|
return e.x >= t.x - n && e.x <= t.x + t.width + n && e.y >= t.y - n && e.y <= t.y + t.height + n;
|
|
5995
5995
|
}
|
|
5996
5996
|
//#endregion
|
|
5997
5997
|
//#region src/interaction/CrosshairHandler.ts
|
|
5998
|
-
var
|
|
5998
|
+
var Bn = class {
|
|
5999
5999
|
position = null;
|
|
6000
6000
|
callback = null;
|
|
6001
6001
|
data = [];
|
|
@@ -6045,8 +6045,8 @@ var zn = class {
|
|
|
6045
6045
|
if (!this.position || this.mode === "hidden") return;
|
|
6046
6046
|
let { chartRect: r } = t, { x: i, y: a } = this.position;
|
|
6047
6047
|
if (i < r.x || i > r.x + r.width || a < r.y || a > r.y + r.height) return;
|
|
6048
|
-
let o =
|
|
6049
|
-
if (o = Math.max(0, Math.min(this.data.length - 1, o)), this.magnetMode && o >= 0 && o < this.data.length && (i =
|
|
6048
|
+
let o = j(i, t);
|
|
6049
|
+
if (o = Math.max(0, Math.min(this.data.length - 1, o)), this.magnetMode && o >= 0 && o < this.data.length && (i = k(o, t)), o !== this.lastCallbackBarIndex && (this.pendingBarIndex = o, this.pendingPoint = {
|
|
6050
6050
|
x: i,
|
|
6051
6051
|
y: a
|
|
6052
6052
|
}, this.lastCallbackBarIndex = o, this.scheduleCallback()), this.magnetMode && o >= 0 && o < this.data.length) {
|
|
@@ -6059,11 +6059,11 @@ var zn = class {
|
|
|
6059
6059
|
if (!this.position || this.mode === "hidden") return;
|
|
6060
6060
|
let { chartRect: a } = t, { x: o, y: s } = this.position;
|
|
6061
6061
|
if (o < a.x || o > a.x + a.width || s < a.y || s > a.y + a.height) return;
|
|
6062
|
-
let c =
|
|
6063
|
-
c = Math.max(0, Math.min(r.length - 1, c)), this.magnetMode && c >= 0 && c < r.length && (o =
|
|
6062
|
+
let c = j(o, t);
|
|
6063
|
+
c = Math.max(0, Math.min(r.length - 1, c)), this.magnetMode && c >= 0 && c < r.length && (o = k(c, t));
|
|
6064
6064
|
let l = `600 ${n.font.sizeSmall}px ${n.font.family}`;
|
|
6065
|
-
if (
|
|
6066
|
-
text: h(
|
|
6065
|
+
if (Vn(e, {
|
|
6066
|
+
text: h(M(s, t), this.pricePrecision, this.locale),
|
|
6067
6067
|
anchorX: a.x + a.width,
|
|
6068
6068
|
anchorY: s,
|
|
6069
6069
|
orientation: "right",
|
|
@@ -6071,8 +6071,8 @@ var zn = class {
|
|
|
6071
6071
|
fg: n.background,
|
|
6072
6072
|
font: l
|
|
6073
6073
|
}), c >= 0 && c < r.length) {
|
|
6074
|
-
let t =
|
|
6075
|
-
|
|
6074
|
+
let t = Hn(r[c].time, this.tzOffsetMinutes), s = i ?? a.y + a.height;
|
|
6075
|
+
Vn(e, {
|
|
6076
6076
|
text: t,
|
|
6077
6077
|
anchorX: o,
|
|
6078
6078
|
anchorY: s,
|
|
@@ -6092,7 +6092,7 @@ var zn = class {
|
|
|
6092
6092
|
this.callback?.(e, t);
|
|
6093
6093
|
}
|
|
6094
6094
|
};
|
|
6095
|
-
function
|
|
6095
|
+
function Vn(e, t) {
|
|
6096
6096
|
e.save(), e.font = t.font;
|
|
6097
6097
|
let n = Math.ceil(e.measureText(t.text).width) + 16;
|
|
6098
6098
|
if (t.orientation === "right") {
|
|
@@ -6104,13 +6104,13 @@ function Bn(e, t) {
|
|
|
6104
6104
|
}
|
|
6105
6105
|
e.restore();
|
|
6106
6106
|
}
|
|
6107
|
-
function
|
|
6108
|
-
let
|
|
6109
|
-
return `${
|
|
6107
|
+
function Hn(e, t) {
|
|
6108
|
+
let n = b(e > 0xe8d4a51000 ? e : e * 1e3, t), { year: r, month: i, day: a, hours: o, minutes: s } = n;
|
|
6109
|
+
return _(n) ? `${i}/${a}/${r}` : `${i}/${a} ${o < 10 ? "0" + o : o}:${s < 10 ? "0" + s : s}`;
|
|
6110
6110
|
}
|
|
6111
6111
|
//#endregion
|
|
6112
6112
|
//#region src/interaction/KeyboardHandler.ts
|
|
6113
|
-
var
|
|
6113
|
+
var Un = class {
|
|
6114
6114
|
callbacks;
|
|
6115
6115
|
enabled = !0;
|
|
6116
6116
|
constructor(e) {
|
|
@@ -6136,7 +6136,7 @@ var Hn = class {
|
|
|
6136
6136
|
default: return !1;
|
|
6137
6137
|
}
|
|
6138
6138
|
}
|
|
6139
|
-
},
|
|
6139
|
+
}, Wn = class {
|
|
6140
6140
|
el = null;
|
|
6141
6141
|
visible = !1;
|
|
6142
6142
|
timeEl;
|
|
@@ -6175,8 +6175,8 @@ var Hn = class {
|
|
|
6175
6175
|
this.changeEl.textContent = `${l}${a(s)} (${l}${c.toFixed(2)}%)`, this.changeEl.style.color = i;
|
|
6176
6176
|
let u = t.volume;
|
|
6177
6177
|
this.volEl.textContent = `Vol ${u >= 1e6 ? (u / 1e6).toFixed(1) + "M" : u >= 1e3 ? (u / 1e3).toFixed(1) + "K" : u.toFixed(0)}`, this.volEl.style.color = n.textSecondary;
|
|
6178
|
-
let d =
|
|
6179
|
-
this.el.style.background = d ?
|
|
6178
|
+
let d = Gn(n.background);
|
|
6179
|
+
this.el.style.background = d ? Kn(n.background, .95) : Kn(n.background, .97), this.el.style.border = `1px solid ${n.axisLine}`, this.el.style.boxShadow = d ? "0 4px 12px rgba(0,0,0,0.5)" : "0 4px 12px rgba(0,0,0,0.15)", this.el.style.color = n.text, this.el.style.backdropFilter = "blur(8px)", !this.measured && this.visible && (this.measuredWidth = this.el.offsetWidth, this.measuredHeight = this.el.offsetHeight, this.measured = !0);
|
|
6180
6180
|
let f = e.x + 16, p = e.y - 40;
|
|
6181
6181
|
f + this.measuredWidth > r.width - 80 && (f = e.x - this.measuredWidth - 16), p < 4 && (p = 4), p + this.measuredHeight > r.height && (p = r.height - this.measuredHeight - 4), this.el.style.transform = `translate(${Math.round(f)}px, ${Math.round(p)}px)`, this.el.style.left = "0", this.el.style.top = "0", this.visible ||= (this.el.style.display = "block", !0);
|
|
6182
6182
|
}
|
|
@@ -6201,7 +6201,7 @@ var Hn = class {
|
|
|
6201
6201
|
return document.createElement("span");
|
|
6202
6202
|
}
|
|
6203
6203
|
};
|
|
6204
|
-
function
|
|
6204
|
+
function Gn(e) {
|
|
6205
6205
|
if (e.startsWith("#")) {
|
|
6206
6206
|
let t = e.slice(1), n = t.length === 3 ? t.split("").map((e) => e + e).join("") : t.slice(0, 6), r = parseInt(n.slice(0, 2), 16), i = parseInt(n.slice(2, 4), 16), a = parseInt(n.slice(4, 6), 16);
|
|
6207
6207
|
return (.299 * r + .587 * i + .114 * a) / 255 < .5;
|
|
@@ -6213,7 +6213,7 @@ function Wn(e) {
|
|
|
6213
6213
|
}
|
|
6214
6214
|
return !0;
|
|
6215
6215
|
}
|
|
6216
|
-
function
|
|
6216
|
+
function Kn(e, t) {
|
|
6217
6217
|
if (e.startsWith("#")) {
|
|
6218
6218
|
let n = e.slice(1), r = n.length === 3 ? n.split("").map((e) => e + e).join("") : n.slice(0, 6);
|
|
6219
6219
|
return `rgba(${parseInt(r.slice(0, 2), 16)}, ${parseInt(r.slice(2, 4), 16)}, ${parseInt(r.slice(4, 6), 16)}, ${t})`;
|
|
@@ -6222,7 +6222,7 @@ function Gn(e, t) {
|
|
|
6222
6222
|
}
|
|
6223
6223
|
//#endregion
|
|
6224
6224
|
//#region src/interaction/PinnedTooltip.ts
|
|
6225
|
-
var
|
|
6225
|
+
var qn = class {
|
|
6226
6226
|
el = null;
|
|
6227
6227
|
deltaEl = null;
|
|
6228
6228
|
timeEl = null;
|
|
@@ -6252,14 +6252,14 @@ var Kn = class {
|
|
|
6252
6252
|
if (!this.el || !this.timeEl || !this.ohlcEl) return;
|
|
6253
6253
|
this.pinnedBar = e, this.pinnedIndex = t;
|
|
6254
6254
|
let r = e.close >= e.open ? n.candleUp : n.candleDown, i = new Date(e.time > 0xe8d4a51000 ? e.time : e.time * 1e3);
|
|
6255
|
-
this.timeEl.textContent = `${i.getMonth() + 1}/${i.getDate()} ${
|
|
6255
|
+
this.timeEl.textContent = `${i.getMonth() + 1}/${i.getDate()} ${Jn(i.getHours())}:${Jn(i.getMinutes())}`, this.timeEl.style.color = n.textSecondary, this.ohlcEl.innerHTML = `
|
|
6256
6256
|
<span style="opacity:.6">O </span><span style="color:${r}">${V(e.open)}</span>
|
|
6257
6257
|
<span style="opacity:.6"> H </span><span style="color:${r}">${V(e.high)}</span>
|
|
6258
6258
|
<span style="opacity:.6"> L </span><span style="color:${r}">${V(e.low)}</span>
|
|
6259
6259
|
<span style="opacity:.6"> C </span><span style="color:${r}">${V(e.close)}</span>
|
|
6260
6260
|
`;
|
|
6261
|
-
let a =
|
|
6262
|
-
this.el.style.background =
|
|
6261
|
+
let a = Yn(n.background);
|
|
6262
|
+
this.el.style.background = Xn(n.background, a ? .96 : .97), this.el.style.border = `1px solid ${r}`, this.el.style.boxShadow = a ? "0 4px 12px rgba(0,0,0,0.55)" : "0 4px 12px rgba(0,0,0,0.18)", this.el.style.color = n.text, this.el.style.backdropFilter = "blur(8px)", this.el.style.display = "block";
|
|
6263
6263
|
}
|
|
6264
6264
|
unpin() {
|
|
6265
6265
|
this.pinnedBar = null, this.pinnedIndex = -1, this.el && (this.el.style.display = "none");
|
|
@@ -6272,7 +6272,7 @@ var Kn = class {
|
|
|
6272
6272
|
}
|
|
6273
6273
|
reposition(e, t, n, r) {
|
|
6274
6274
|
if (!this.el || !this.pinnedBar) return;
|
|
6275
|
-
let i =
|
|
6275
|
+
let i = k(this.pinnedIndex, e), a = A(this.pinnedBar.close, e), o = e.chartRect, s = i >= o.x - 4 && i <= o.x + o.width + 4;
|
|
6276
6276
|
this.el.style.opacity = s ? "1" : "0.35";
|
|
6277
6277
|
let c = Math.max(o.x, Math.min(o.x + o.width - 180, i + 8)), l = Math.max(o.y, Math.min(o.y + o.height - 90, a - 64));
|
|
6278
6278
|
if (this.el.style.transform = `translate(${Math.round(c)}px, ${Math.round(l)}px)`, this.el.style.left = "0", this.el.style.top = "0", this.deltaEl) if (t && n !== null && n !== this.pinnedIndex) {
|
|
@@ -6287,17 +6287,17 @@ var Kn = class {
|
|
|
6287
6287
|
function V(e) {
|
|
6288
6288
|
return e.toFixed(2);
|
|
6289
6289
|
}
|
|
6290
|
-
function
|
|
6290
|
+
function Jn(e) {
|
|
6291
6291
|
return e < 10 ? "0" + e : "" + e;
|
|
6292
6292
|
}
|
|
6293
|
-
function
|
|
6293
|
+
function Yn(e) {
|
|
6294
6294
|
if (e.startsWith("#")) {
|
|
6295
6295
|
let t = e.slice(1), n = t.length === 3 ? t.split("").map((e) => e + e).join("") : t.slice(0, 6), r = parseInt(n.slice(0, 2), 16), i = parseInt(n.slice(2, 4), 16), a = parseInt(n.slice(4, 6), 16);
|
|
6296
6296
|
return (.299 * r + .587 * i + .114 * a) / 255 < .5;
|
|
6297
6297
|
}
|
|
6298
6298
|
return !0;
|
|
6299
6299
|
}
|
|
6300
|
-
function
|
|
6300
|
+
function Xn(e, t) {
|
|
6301
6301
|
if (e.startsWith("#")) {
|
|
6302
6302
|
let n = e.slice(1), r = n.length === 3 ? n.split("").map((e) => e + e).join("") : n.slice(0, 6);
|
|
6303
6303
|
return `rgba(${parseInt(r.slice(0, 2), 16)}, ${parseInt(r.slice(2, 4), 16)}, ${parseInt(r.slice(4, 6), 16)}, ${t})`;
|
|
@@ -6306,7 +6306,7 @@ function Yn(e, t) {
|
|
|
6306
6306
|
}
|
|
6307
6307
|
//#endregion
|
|
6308
6308
|
//#region src/events/EventBus.ts
|
|
6309
|
-
var
|
|
6309
|
+
var Zn = class {
|
|
6310
6310
|
listeners = /* @__PURE__ */ new Map();
|
|
6311
6311
|
tauriBridge = null;
|
|
6312
6312
|
on(e, t) {
|
|
@@ -6347,14 +6347,14 @@ var Xn = class {
|
|
|
6347
6347
|
}
|
|
6348
6348
|
anchorToPixel(e, t) {
|
|
6349
6349
|
return {
|
|
6350
|
-
x:
|
|
6351
|
-
y:
|
|
6350
|
+
x: F(e.time, t),
|
|
6351
|
+
y: A(e.price, t)
|
|
6352
6352
|
};
|
|
6353
6353
|
}
|
|
6354
6354
|
pixelToAnchor(e, t) {
|
|
6355
6355
|
return {
|
|
6356
|
-
time:
|
|
6357
|
-
price:
|
|
6356
|
+
time: I(e.x, t),
|
|
6357
|
+
price: M(e.y, t)
|
|
6358
6358
|
};
|
|
6359
6359
|
}
|
|
6360
6360
|
applyLineStyle(e, t) {
|
|
@@ -6392,7 +6392,7 @@ var Xn = class {
|
|
|
6392
6392
|
let r = n.x - t.x, i = n.y - t.y, a = Math.hypot(r, i);
|
|
6393
6393
|
return a === 0 ? Math.hypot(e.x - t.x, e.y - t.y) : Math.abs(r * (t.y - e.y) - i * (t.x - e.x)) / a;
|
|
6394
6394
|
}
|
|
6395
|
-
},
|
|
6395
|
+
}, Qn = 1;
|
|
6396
6396
|
function U(e) {
|
|
6397
6397
|
return {
|
|
6398
6398
|
...e,
|
|
@@ -6401,7 +6401,7 @@ function U(e) {
|
|
|
6401
6401
|
meta: e.meta ? { ...e.meta } : void 0
|
|
6402
6402
|
};
|
|
6403
6403
|
}
|
|
6404
|
-
var
|
|
6404
|
+
var $n = class {
|
|
6405
6405
|
registry = /* @__PURE__ */ new Map();
|
|
6406
6406
|
drawings = [];
|
|
6407
6407
|
state = "idle";
|
|
@@ -6462,7 +6462,7 @@ var Qn = class {
|
|
|
6462
6462
|
time: e,
|
|
6463
6463
|
price: t
|
|
6464
6464
|
};
|
|
6465
|
-
let i = !!(n?.data && n.data.length > 0), a = Math.max(0, Math.min(r.length - 1, Math.round(i ?
|
|
6465
|
+
let i = !!(n?.data && n.data.length > 0), a = Math.max(0, Math.min(r.length - 1, Math.round(i ? N(e, r) : e))), o = r[a], s = [
|
|
6466
6466
|
o.open,
|
|
6467
6467
|
o.high,
|
|
6468
6468
|
o.low,
|
|
@@ -6586,7 +6586,7 @@ var Qn = class {
|
|
|
6586
6586
|
if (this.state === "creating" && this.creatingDrawing) {
|
|
6587
6587
|
let n = this.registry.get(this.creatingDrawing.type);
|
|
6588
6588
|
if (n && this.committedAnchors < n.descriptor.requiredAnchors) {
|
|
6589
|
-
let n =
|
|
6589
|
+
let n = I(e.x, t), r = M(e.y, t);
|
|
6590
6590
|
return this.previewAnchor = this.snapToOHLC(n, r, t), this.requestRender?.(), !0;
|
|
6591
6591
|
}
|
|
6592
6592
|
}
|
|
@@ -6621,7 +6621,7 @@ var Qn = class {
|
|
|
6621
6621
|
this.drawings = this.upgradeLegacyAnchors(e), this.requestRender?.();
|
|
6622
6622
|
}
|
|
6623
6623
|
addDrawing(e) {
|
|
6624
|
-
let t = e.id ?? `tc_drawing_${
|
|
6624
|
+
let t = e.id ?? `tc_drawing_${Qn++}`, n = {
|
|
6625
6625
|
id: t,
|
|
6626
6626
|
type: e.type,
|
|
6627
6627
|
anchors: e.anchors.map((e) => ({ ...e })),
|
|
@@ -6668,7 +6668,7 @@ var Qn = class {
|
|
|
6668
6668
|
let t = this.drawings.find((t) => t.id === e);
|
|
6669
6669
|
if (!t) return null;
|
|
6670
6670
|
let n = structuredClone(t);
|
|
6671
|
-
n.id = `tc_drawing_${
|
|
6671
|
+
n.id = `tc_drawing_${Qn++}`;
|
|
6672
6672
|
let r = this.computeBarOffsetTime(3);
|
|
6673
6673
|
return n.anchors = n.anchors.map((e) => ({
|
|
6674
6674
|
...e,
|
|
@@ -6717,9 +6717,9 @@ var Qn = class {
|
|
|
6717
6717
|
if (!this.activeTool) return !1;
|
|
6718
6718
|
let n = this.registry.get(this.activeTool);
|
|
6719
6719
|
if (!n) return !1;
|
|
6720
|
-
let r =
|
|
6720
|
+
let r = I(e.x, t), i = M(e.y, t), a = this.snapToOHLC(r, i, t);
|
|
6721
6721
|
return this.creatingDrawing ? (this.creatingDrawing.anchors.push(a), this.committedAnchors++, this.previewAnchor = null, this.committedAnchors >= n.descriptor.requiredAnchors && this.finalizeCreation(), this.requestRender?.(), !0) : (this.creatingDrawing = {
|
|
6722
|
-
id: `tc_drawing_${
|
|
6722
|
+
id: `tc_drawing_${Qn++}`,
|
|
6723
6723
|
type: this.activeTool,
|
|
6724
6724
|
anchors: [a],
|
|
6725
6725
|
style: { ...this.activeStyle },
|
|
@@ -6757,7 +6757,7 @@ var Qn = class {
|
|
|
6757
6757
|
handleMove(e, t) {
|
|
6758
6758
|
let n = this.drawings.find((e) => e.id === this.selectedDrawingId);
|
|
6759
6759
|
if (!n || !this.dragStartPoint) return !1;
|
|
6760
|
-
let r =
|
|
6760
|
+
let r = I(e.x, t) - I(this.dragStartPoint.x, t), i = M(e.y, t) - M(this.dragStartPoint.y, t);
|
|
6761
6761
|
return n.anchors = this.dragStartAnchors.map((e) => ({
|
|
6762
6762
|
time: e.time + r,
|
|
6763
6763
|
price: e.price + i
|
|
@@ -6766,11 +6766,11 @@ var Qn = class {
|
|
|
6766
6766
|
handleResize(e, t) {
|
|
6767
6767
|
let n = this.drawings.find((e) => e.id === this.selectedDrawingId);
|
|
6768
6768
|
return !n || this.dragAnchorIndex < 0 ? !1 : (n.anchors[this.dragAnchorIndex] = {
|
|
6769
|
-
time:
|
|
6770
|
-
price:
|
|
6769
|
+
time: I(e.x, t),
|
|
6770
|
+
price: M(e.y, t)
|
|
6771
6771
|
}, this.requestRender?.(), !0);
|
|
6772
6772
|
}
|
|
6773
|
-
},
|
|
6773
|
+
}, er = class {
|
|
6774
6774
|
constructor(e) {
|
|
6775
6775
|
this.manager = e;
|
|
6776
6776
|
}
|
|
@@ -6780,7 +6780,7 @@ var Qn = class {
|
|
|
6780
6780
|
};
|
|
6781
6781
|
//#endregion
|
|
6782
6782
|
//#region src/drawings/autoFib.ts
|
|
6783
|
-
function
|
|
6783
|
+
function tr(e, t, n) {
|
|
6784
6784
|
let r = Math.max(0, t), i = Math.min(e.length - 1, n);
|
|
6785
6785
|
if (i <= r) return null;
|
|
6786
6786
|
let a = r, o = r;
|
|
@@ -6797,7 +6797,7 @@ function er(e, t, n) {
|
|
|
6797
6797
|
}
|
|
6798
6798
|
//#endregion
|
|
6799
6799
|
//#region src/drawings/tools/TrendLine.ts
|
|
6800
|
-
var
|
|
6800
|
+
var nr = class extends H {
|
|
6801
6801
|
descriptor = {
|
|
6802
6802
|
type: "trendLine",
|
|
6803
6803
|
name: "Trend Line",
|
|
@@ -6813,7 +6813,7 @@ var tr = class extends H {
|
|
|
6813
6813
|
let i = this.anchorToPixel(t.anchors[0], n), a = this.anchorToPixel(t.anchors[1], n);
|
|
6814
6814
|
return this.distanceToLine(e, i, a) <= r;
|
|
6815
6815
|
}
|
|
6816
|
-
},
|
|
6816
|
+
}, rr = class extends H {
|
|
6817
6817
|
descriptor = {
|
|
6818
6818
|
type: "horizontalLine",
|
|
6819
6819
|
name: "Horizontal Line",
|
|
@@ -6821,15 +6821,15 @@ var tr = class extends H {
|
|
|
6821
6821
|
};
|
|
6822
6822
|
render(e, t, n, r) {
|
|
6823
6823
|
if (t.anchors.length < 1) return;
|
|
6824
|
-
let i =
|
|
6824
|
+
let i = A(t.anchors[0].price, n), { chartRect: a } = n;
|
|
6825
6825
|
this.applyLineStyle(e, t.style), e.beginPath(), e.moveTo(a.x, i), e.lineTo(a.x + a.width, i), e.stroke(), this.resetLineStyle(e), e.fillStyle = t.style.color, e.font = "11px sans-serif", e.textBaseline = "bottom", e.fillText(t.anchors[0].price.toFixed(2), a.x + 4, i - 3), r && this.renderAnchorHandles(e, t, n);
|
|
6826
6826
|
}
|
|
6827
6827
|
hitTest(e, t, n, r) {
|
|
6828
6828
|
if (t.anchors.length < 1) return !1;
|
|
6829
|
-
let i =
|
|
6829
|
+
let i = A(t.anchors[0].price, n);
|
|
6830
6830
|
return Math.abs(e.y - i) <= r && e.x >= n.chartRect.x && e.x <= n.chartRect.x + n.chartRect.width;
|
|
6831
6831
|
}
|
|
6832
|
-
},
|
|
6832
|
+
}, ir = class extends H {
|
|
6833
6833
|
descriptor = {
|
|
6834
6834
|
type: "verticalLine",
|
|
6835
6835
|
name: "Vertical Line",
|
|
@@ -6845,7 +6845,7 @@ var tr = class extends H {
|
|
|
6845
6845
|
let i = this.anchorToPixel(t.anchors[0], n), { chartRect: a } = n;
|
|
6846
6846
|
return Math.abs(e.x - i.x) <= r && e.y >= a.y && e.y <= a.y + a.height;
|
|
6847
6847
|
}
|
|
6848
|
-
},
|
|
6848
|
+
}, ar = class extends H {
|
|
6849
6849
|
descriptor = {
|
|
6850
6850
|
type: "ray",
|
|
6851
6851
|
name: "Ray",
|
|
@@ -6863,7 +6863,7 @@ var tr = class extends H {
|
|
|
6863
6863
|
let i = this.anchorToPixel(t.anchors[0], n), a = this.anchorToPixel(t.anchors[1], n), o = a.x - i.x, s = a.y - i.y;
|
|
6864
6864
|
return ((e.x - i.x) * o + (e.y - i.y) * s) / (o * o + s * s) < 0 ? !1 : this.distanceToInfiniteLine(e, i, a) <= r;
|
|
6865
6865
|
}
|
|
6866
|
-
},
|
|
6866
|
+
}, or = class extends H {
|
|
6867
6867
|
descriptor = {
|
|
6868
6868
|
type: "extendedLine",
|
|
6869
6869
|
name: "Extended Line",
|
|
@@ -6881,7 +6881,7 @@ var tr = class extends H {
|
|
|
6881
6881
|
let i = this.anchorToPixel(t.anchors[0], n), a = this.anchorToPixel(t.anchors[1], n);
|
|
6882
6882
|
return this.distanceToInfiniteLine(e, i, a) <= r;
|
|
6883
6883
|
}
|
|
6884
|
-
},
|
|
6884
|
+
}, sr = class extends H {
|
|
6885
6885
|
descriptor = {
|
|
6886
6886
|
type: "parallelChannel",
|
|
6887
6887
|
name: "Parallel Channel",
|
|
@@ -6918,7 +6918,7 @@ var tr = class extends H {
|
|
|
6918
6918
|
}
|
|
6919
6919
|
return !1;
|
|
6920
6920
|
}
|
|
6921
|
-
},
|
|
6921
|
+
}, cr = class extends H {
|
|
6922
6922
|
descriptor = {
|
|
6923
6923
|
type: "regressionChannel",
|
|
6924
6924
|
name: "Regression Channel",
|
|
@@ -6949,7 +6949,7 @@ var tr = class extends H {
|
|
|
6949
6949
|
.618,
|
|
6950
6950
|
.786,
|
|
6951
6951
|
1
|
|
6952
|
-
],
|
|
6952
|
+
], lr = class extends H {
|
|
6953
6953
|
descriptor = {
|
|
6954
6954
|
type: "fibRetracement",
|
|
6955
6955
|
name: "Fibonacci Retracement",
|
|
@@ -6960,12 +6960,12 @@ var tr = class extends H {
|
|
|
6960
6960
|
let { chartRect: i } = n, a = t.anchors[0].price, o = t.anchors[1].price, s = a - o;
|
|
6961
6961
|
e.font = "11px sans-serif", e.textBaseline = "middle";
|
|
6962
6962
|
for (let r of W) {
|
|
6963
|
-
let a = o + s * (1 - r), c =
|
|
6963
|
+
let a = o + s * (1 - r), c = A(a, n);
|
|
6964
6964
|
this.applyLineStyle(e, t.style), e.globalAlpha = r === 0 || r === 1 ? 1 : .7, e.beginPath(), e.moveTo(i.x, c), e.lineTo(i.x + i.width, c), e.stroke(), e.fillStyle = t.style.color, e.textAlign = "left", e.fillText(`${(r * 100).toFixed(1)}% (${a.toFixed(2)})`, i.x + 4, c - 2);
|
|
6965
6965
|
}
|
|
6966
6966
|
if (e.globalAlpha = 1, t.style.fillColor) {
|
|
6967
6967
|
for (let r = 0; r < W.length - 1; r++) {
|
|
6968
|
-
let a = o + s * (1 - W[r]), c = o + s * (1 - W[r + 1]), l =
|
|
6968
|
+
let a = o + s * (1 - W[r]), c = o + s * (1 - W[r + 1]), l = A(a, n), u = A(c, n);
|
|
6969
6969
|
e.fillStyle = t.style.fillColor, e.globalAlpha = .05 + r * .02, e.fillRect(i.x, Math.min(l, u), i.width, Math.abs(u - l));
|
|
6970
6970
|
}
|
|
6971
6971
|
e.globalAlpha = 1;
|
|
@@ -6978,12 +6978,12 @@ var tr = class extends H {
|
|
|
6978
6978
|
if (e.x < i.x - r || e.x > i.x + i.width + r) return !1;
|
|
6979
6979
|
let a = t.anchors[0].price, o = t.anchors[1].price, s = a - o;
|
|
6980
6980
|
for (let t of W) {
|
|
6981
|
-
let i =
|
|
6981
|
+
let i = A(o + s * (1 - t), n);
|
|
6982
6982
|
if (Math.abs(e.y - i) <= r) return !0;
|
|
6983
6983
|
}
|
|
6984
6984
|
return !1;
|
|
6985
6985
|
}
|
|
6986
|
-
},
|
|
6986
|
+
}, ur = [
|
|
6987
6987
|
0,
|
|
6988
6988
|
.618,
|
|
6989
6989
|
1,
|
|
@@ -6992,7 +6992,7 @@ var tr = class extends H {
|
|
|
6992
6992
|
2.618,
|
|
6993
6993
|
3.618,
|
|
6994
6994
|
4.236
|
|
6995
|
-
],
|
|
6995
|
+
], dr = class extends H {
|
|
6996
6996
|
descriptor = {
|
|
6997
6997
|
type: "fibExtension",
|
|
6998
6998
|
name: "Fibonacci Extension",
|
|
@@ -7008,8 +7008,8 @@ var tr = class extends H {
|
|
|
7008
7008
|
}
|
|
7009
7009
|
let { chartRect: i } = n, a = t.anchors[0].price, o = t.anchors[1].price, s = t.anchors[2].price, c = a - o;
|
|
7010
7010
|
e.font = "11px sans-serif", e.textBaseline = "middle", e.textAlign = "left";
|
|
7011
|
-
for (let r of
|
|
7012
|
-
let a =
|
|
7011
|
+
for (let r of ur) {
|
|
7012
|
+
let a = A(s + c * r, n);
|
|
7013
7013
|
this.applyLineStyle(e, t.style), e.globalAlpha = r === 0 || r === 1 ? 1 : .6, e.beginPath(), e.moveTo(i.x, a), e.lineTo(i.x + i.width, a), e.stroke(), e.fillStyle = t.style.color, e.fillText(`${(r * 100).toFixed(1)}%`, i.x + 4, a - 2);
|
|
7014
7014
|
}
|
|
7015
7015
|
e.globalAlpha = 1, this.resetLineStyle(e), r && this.renderAnchorHandles(e, t, n);
|
|
@@ -7019,13 +7019,13 @@ var tr = class extends H {
|
|
|
7019
7019
|
let { chartRect: i } = n;
|
|
7020
7020
|
if (e.x < i.x - r || e.x > i.x + i.width + r) return !1;
|
|
7021
7021
|
let a = t.anchors[0].price - t.anchors[1].price;
|
|
7022
|
-
for (let i of
|
|
7023
|
-
let o =
|
|
7022
|
+
for (let i of ur) {
|
|
7023
|
+
let o = A(t.anchors[2].price + a * i, n);
|
|
7024
7024
|
if (Math.abs(e.y - o) <= r) return !0;
|
|
7025
7025
|
}
|
|
7026
7026
|
return !1;
|
|
7027
7027
|
}
|
|
7028
|
-
},
|
|
7028
|
+
}, fr = class extends H {
|
|
7029
7029
|
descriptor = {
|
|
7030
7030
|
type: "rectangle",
|
|
7031
7031
|
name: "Rectangle",
|
|
@@ -7043,7 +7043,7 @@ var tr = class extends H {
|
|
|
7043
7043
|
let u = Math.min(i.x, a.x) + r, d = Math.min(i.y, a.y) + r, f = Math.max(i.x, a.x) - r, p = Math.max(i.y, a.y) - r;
|
|
7044
7044
|
return !(e.x > u && e.x < f && e.y > d && e.y < p) || !!t.style.fillColor;
|
|
7045
7045
|
}
|
|
7046
|
-
},
|
|
7046
|
+
}, pr = class extends H {
|
|
7047
7047
|
descriptor = {
|
|
7048
7048
|
type: "ellipse",
|
|
7049
7049
|
name: "Ellipse",
|
|
@@ -7059,7 +7059,7 @@ var tr = class extends H {
|
|
|
7059
7059
|
let i = this.anchorToPixel(t.anchors[0], n), a = this.anchorToPixel(t.anchors[1], n), o = (i.x + a.x) / 2, s = (i.y + a.y) / 2, c = Math.max(Math.abs(a.x - i.x) / 2, 1), l = Math.max(Math.abs(a.y - i.y) / 2, 1), u = (e.x - o) / c, d = (e.y - s) / l, f = Math.sqrt(u * u + d * d), p = r / Math.max(Math.min(c, l), 4);
|
|
7060
7060
|
return t.style.fillColor ? f <= 1 + p : Math.abs(f - 1) <= p;
|
|
7061
7061
|
}
|
|
7062
|
-
},
|
|
7062
|
+
}, mr = class extends H {
|
|
7063
7063
|
descriptor = {
|
|
7064
7064
|
type: "triangle",
|
|
7065
7065
|
name: "Triangle",
|
|
@@ -7085,7 +7085,7 @@ var tr = class extends H {
|
|
|
7085
7085
|
}
|
|
7086
7086
|
return !1;
|
|
7087
7087
|
}
|
|
7088
|
-
},
|
|
7088
|
+
}, hr = class extends H {
|
|
7089
7089
|
descriptor = {
|
|
7090
7090
|
type: "pitchfork",
|
|
7091
7091
|
name: "Andrews' Pitchfork",
|
|
@@ -7121,7 +7121,7 @@ var tr = class extends H {
|
|
|
7121
7121
|
};
|
|
7122
7122
|
return this.distanceToInfiniteLine(e, a, u) <= r || this.distanceToInfiniteLine(e, o, d) <= r;
|
|
7123
7123
|
}
|
|
7124
|
-
},
|
|
7124
|
+
}, gr = [
|
|
7125
7125
|
"1",
|
|
7126
7126
|
"2",
|
|
7127
7127
|
"3",
|
|
@@ -7130,7 +7130,7 @@ var tr = class extends H {
|
|
|
7130
7130
|
"A",
|
|
7131
7131
|
"B",
|
|
7132
7132
|
"C"
|
|
7133
|
-
],
|
|
7133
|
+
], _r = class extends H {
|
|
7134
7134
|
descriptor = {
|
|
7135
7135
|
type: "elliottWave",
|
|
7136
7136
|
name: "Elliott Wave",
|
|
@@ -7142,9 +7142,9 @@ var tr = class extends H {
|
|
|
7142
7142
|
this.applyLineStyle(e, t.style), e.beginPath(), e.moveTo(i[0].x, i[0].y);
|
|
7143
7143
|
for (let t = 1; t < i.length; t++) e.lineTo(i[t].x, i[t].y);
|
|
7144
7144
|
e.stroke(), this.resetLineStyle(e), e.font = "bold 12px sans-serif", e.fillStyle = t.style.color, e.textAlign = "center";
|
|
7145
|
-
for (let t = 0; t < i.length && t <
|
|
7145
|
+
for (let t = 0; t < i.length && t < gr.length; t++) {
|
|
7146
7146
|
let n = t % 2 == 0 ? -12 : 12;
|
|
7147
|
-
e.textBaseline = n < 0 ? "bottom" : "top", e.fillText(
|
|
7147
|
+
e.textBaseline = n < 0 ? "bottom" : "top", e.fillText(gr[t], i[t].x, i[t].y + n);
|
|
7148
7148
|
}
|
|
7149
7149
|
r && this.renderAnchorHandles(e, t, n);
|
|
7150
7150
|
}
|
|
@@ -7154,7 +7154,7 @@ var tr = class extends H {
|
|
|
7154
7154
|
for (let t = 0; t < i.length - 1; t++) if (this.distanceToLine(e, i[t], i[t + 1]) <= r) return !0;
|
|
7155
7155
|
return !1;
|
|
7156
7156
|
}
|
|
7157
|
-
},
|
|
7157
|
+
}, vr = class extends H {
|
|
7158
7158
|
descriptor = {
|
|
7159
7159
|
type: "priceRange",
|
|
7160
7160
|
name: "Price Range",
|
|
@@ -7172,7 +7172,7 @@ var tr = class extends H {
|
|
|
7172
7172
|
let i = this.anchorToPixel(t.anchors[0], n), a = this.anchorToPixel(t.anchors[1], n), o = Math.min(i.x, a.x), s = Math.max(i.x, a.x), c = Math.min(i.y, a.y), l = Math.max(i.y, a.y);
|
|
7173
7173
|
return e.x >= o - r && e.x <= s + r && e.y >= c - r && e.y <= l + r;
|
|
7174
7174
|
}
|
|
7175
|
-
},
|
|
7175
|
+
}, yr = class extends H {
|
|
7176
7176
|
descriptor = {
|
|
7177
7177
|
type: "dateRange",
|
|
7178
7178
|
name: "Date Range",
|
|
@@ -7182,7 +7182,7 @@ var tr = class extends H {
|
|
|
7182
7182
|
if (t.anchors.length < 2) return;
|
|
7183
7183
|
let i = this.anchorToPixel(t.anchors[0], n), a = this.anchorToPixel(t.anchors[1], n), { chartRect: o } = n, s = Math.min(i.x, a.x), c = Math.max(i.x, a.x);
|
|
7184
7184
|
e.fillStyle = "rgba(33, 150, 243, 0.08)", e.fillRect(s, o.y, c - s, o.height), this.applyLineStyle(e, t.style), e.beginPath(), e.moveTo(s, o.y), e.lineTo(s, o.y + o.height), e.stroke(), e.beginPath(), e.moveTo(c, o.y), e.lineTo(c, o.y + o.height), e.stroke(), this.resetLineStyle(e);
|
|
7185
|
-
let l =
|
|
7185
|
+
let l = P(t.anchors[0].time, n), u = P(t.anchors[1].time, n), d = Math.max(0, Math.round(Math.abs(u - l)));
|
|
7186
7186
|
e.font = "12px sans-serif", e.fillStyle = t.style.color, e.textAlign = "center", e.textBaseline = "top", e.fillText(`${d} bars`, (s + c) / 2, o.y + 4), r && this.renderAnchorHandles(e, t, n);
|
|
7187
7187
|
}
|
|
7188
7188
|
hitTest(e, t, n, r) {
|
|
@@ -7190,7 +7190,7 @@ var tr = class extends H {
|
|
|
7190
7190
|
let i = this.anchorToPixel(t.anchors[0], n), a = this.anchorToPixel(t.anchors[1], n), { chartRect: o } = n, s = Math.min(i.x, a.x), c = Math.max(i.x, a.x);
|
|
7191
7191
|
return e.x >= s - r && e.x <= c + r && e.y >= o.y && e.y <= o.y + o.height;
|
|
7192
7192
|
}
|
|
7193
|
-
},
|
|
7193
|
+
}, br = class extends H {
|
|
7194
7194
|
descriptor = {
|
|
7195
7195
|
type: "measure",
|
|
7196
7196
|
name: "Measure",
|
|
@@ -7200,7 +7200,7 @@ var tr = class extends H {
|
|
|
7200
7200
|
if (t.anchors.length < 2) return;
|
|
7201
7201
|
let i = this.anchorToPixel(t.anchors[0], n), a = this.anchorToPixel(t.anchors[1], n);
|
|
7202
7202
|
this.applyLineStyle(e, t.style), e.setLineDash([4, 4]), e.beginPath(), e.moveTo(i.x, i.y), e.lineTo(a.x, a.y), e.stroke(), this.resetLineStyle(e);
|
|
7203
|
-
let o = t.anchors[1].price - t.anchors[0].price, s =
|
|
7203
|
+
let o = t.anchors[1].price - t.anchors[0].price, s = P(t.anchors[0].time, n), c = P(t.anchors[1].time, n), l = Math.max(0, Math.round(Math.abs(c - s))), u = t.anchors[0].price === 0 ? 0 : o / t.anchors[0].price * 100, d = [`Price: ${o >= 0 ? "+" : ""}${o.toFixed(2)} (${u >= 0 ? "+" : ""}${u.toFixed(2)}%)`, `Bars: ${l}`], f = (i.x + a.x) / 2, p = (i.y + a.y) / 2;
|
|
7204
7204
|
e.font = "11px sans-serif", e.textAlign = "center", e.textBaseline = "bottom";
|
|
7205
7205
|
let m = Math.max(...d.map((t) => e.measureText(t).width));
|
|
7206
7206
|
e.fillStyle = "rgba(0, 0, 0, 0.7)", e.fillRect(f - m / 2 - 6, p - d.length * 14 - 4, m + 12, d.length * 14 + 8), e.fillStyle = "#FFFFFF";
|
|
@@ -7215,12 +7215,12 @@ var tr = class extends H {
|
|
|
7215
7215
|
};
|
|
7216
7216
|
//#endregion
|
|
7217
7217
|
//#region src/drawings/tools/TextAnnotation.ts
|
|
7218
|
-
function
|
|
7218
|
+
function xr(e, t = "Text") {
|
|
7219
7219
|
if (typeof e.style.text == "string" && e.style.text.length > 0) return e.style.text;
|
|
7220
7220
|
let n = e.meta?.text;
|
|
7221
7221
|
return typeof n == "string" && n.length > 0 ? n : t;
|
|
7222
7222
|
}
|
|
7223
|
-
var
|
|
7223
|
+
var Sr = class extends H {
|
|
7224
7224
|
descriptor = {
|
|
7225
7225
|
type: "text",
|
|
7226
7226
|
name: "Text",
|
|
@@ -7228,7 +7228,7 @@ var xr = class extends H {
|
|
|
7228
7228
|
};
|
|
7229
7229
|
render(e, t, n, r) {
|
|
7230
7230
|
if (t.anchors.length < 1) return;
|
|
7231
|
-
let i = this.anchorToPixel(t.anchors[0], n), a =
|
|
7231
|
+
let i = this.anchorToPixel(t.anchors[0], n), a = xr(t), o = t.style.fontSize || 14;
|
|
7232
7232
|
if (e.font = `${o}px sans-serif`, e.fillStyle = t.style.color, e.textAlign = "left", e.textBaseline = "top", r) {
|
|
7233
7233
|
let n = e.measureText(a);
|
|
7234
7234
|
e.strokeStyle = t.style.color, e.lineWidth = 1, e.setLineDash([3, 3]), e.strokeRect(i.x - 2, i.y - 2, n.width + 4, o + 4), e.setLineDash([]);
|
|
@@ -7240,7 +7240,7 @@ var xr = class extends H {
|
|
|
7240
7240
|
let i = this.anchorToPixel(t.anchors[0], n), a = t.style.fontSize || 14;
|
|
7241
7241
|
return e.x >= i.x - r && e.x <= i.x + 80 + r && e.y >= i.y - r && e.y <= i.y + a + r;
|
|
7242
7242
|
}
|
|
7243
|
-
},
|
|
7243
|
+
}, Cr = class extends H {
|
|
7244
7244
|
descriptor = {
|
|
7245
7245
|
type: "arrow",
|
|
7246
7246
|
name: "Arrow",
|
|
@@ -7258,7 +7258,7 @@ var xr = class extends H {
|
|
|
7258
7258
|
let i = this.anchorToPixel(t.anchors[0], n), a = this.anchorToPixel(t.anchors[1], n);
|
|
7259
7259
|
return this.distanceToLine(e, i, a) <= r;
|
|
7260
7260
|
}
|
|
7261
|
-
},
|
|
7261
|
+
}, wr = [
|
|
7262
7262
|
{
|
|
7263
7263
|
label: "8x1",
|
|
7264
7264
|
ratio: 8
|
|
@@ -7295,7 +7295,7 @@ var xr = class extends H {
|
|
|
7295
7295
|
label: "1x8",
|
|
7296
7296
|
ratio: .125
|
|
7297
7297
|
}
|
|
7298
|
-
],
|
|
7298
|
+
], Tr = class extends H {
|
|
7299
7299
|
descriptor = {
|
|
7300
7300
|
type: "gannFan",
|
|
7301
7301
|
name: "Gann Fan",
|
|
@@ -7307,7 +7307,7 @@ var xr = class extends H {
|
|
|
7307
7307
|
if (Math.abs(o) < 1) return;
|
|
7308
7308
|
let c = s / o, l = o > 0 ? 1 : -1, { chartRect: u } = n, d = l > 0 ? u.x + u.width : u.x;
|
|
7309
7309
|
this.applyLineStyle(e, t.style);
|
|
7310
|
-
for (let { label: n, ratio: r } of
|
|
7310
|
+
for (let { label: n, ratio: r } of wr) {
|
|
7311
7311
|
let a = c * r, o = d, s = i.y + a * (o - i.x);
|
|
7312
7312
|
e.globalAlpha = r === 1 ? 1 : .5, e.lineWidth = r === 1 ? t.style.lineWidth : Math.max(.5, t.style.lineWidth * .7), e.beginPath(), e.moveTo(i.x, i.y), e.lineTo(o, s), e.stroke();
|
|
7313
7313
|
let f = o - l * 4, p = s;
|
|
@@ -7320,7 +7320,7 @@ var xr = class extends H {
|
|
|
7320
7320
|
let i = this.anchorToPixel(t.anchors[0], n), a = this.anchorToPixel(t.anchors[1], n), o = a.x - i.x, s = a.y - i.y;
|
|
7321
7321
|
if (Math.abs(o) < 1) return !1;
|
|
7322
7322
|
let c = s / o, l = o > 0 ? 1 : -1, { chartRect: u } = n, d = l > 0 ? u.x + u.width : u.x;
|
|
7323
|
-
for (let { ratio: t } of
|
|
7323
|
+
for (let { ratio: t } of wr) {
|
|
7324
7324
|
let n = c * t, a = d, o = i.y + n * (a - i.x);
|
|
7325
7325
|
if (this.distanceToLine(e, i, {
|
|
7326
7326
|
x: a,
|
|
@@ -7329,7 +7329,7 @@ var xr = class extends H {
|
|
|
7329
7329
|
}
|
|
7330
7330
|
return !1;
|
|
7331
7331
|
}
|
|
7332
|
-
},
|
|
7332
|
+
}, Er = [
|
|
7333
7333
|
0,
|
|
7334
7334
|
.25,
|
|
7335
7335
|
.333,
|
|
@@ -7337,7 +7337,7 @@ var xr = class extends H {
|
|
|
7337
7337
|
.667,
|
|
7338
7338
|
.75,
|
|
7339
7339
|
1
|
|
7340
|
-
],
|
|
7340
|
+
], Dr = class extends H {
|
|
7341
7341
|
descriptor = {
|
|
7342
7342
|
type: "gannBox",
|
|
7343
7343
|
name: "Gann Box",
|
|
@@ -7348,18 +7348,18 @@ var xr = class extends H {
|
|
|
7348
7348
|
let i = this.anchorToPixel(t.anchors[0], n), a = this.anchorToPixel(t.anchors[1], n), o = Math.min(i.x, a.x), s = Math.max(i.x, a.x), c = Math.min(i.y, a.y), l = Math.max(i.y, a.y), u = s - o, d = l - c;
|
|
7349
7349
|
if (!(u < 2 || d < 2)) {
|
|
7350
7350
|
this.applyLineStyle(e, t.style), e.strokeRect(o, c, u, d), e.save(), e.globalAlpha = .35;
|
|
7351
|
-
for (let t of
|
|
7351
|
+
for (let t of Er) {
|
|
7352
7352
|
if (t === 0 || t === 1) continue;
|
|
7353
7353
|
let n = c + d * t;
|
|
7354
7354
|
e.beginPath(), e.moveTo(o, n), e.lineTo(s, n), e.stroke();
|
|
7355
7355
|
}
|
|
7356
|
-
for (let t of
|
|
7356
|
+
for (let t of Er) {
|
|
7357
7357
|
if (t === 0 || t === 1) continue;
|
|
7358
7358
|
let n = o + u * t;
|
|
7359
7359
|
e.beginPath(), e.moveTo(n, c), e.lineTo(n, l), e.stroke();
|
|
7360
7360
|
}
|
|
7361
7361
|
e.globalAlpha = .5, e.setLineDash([4, 3]), e.beginPath(), e.moveTo(o, c), e.lineTo(s, l), e.stroke(), e.beginPath(), e.moveTo(s, c), e.lineTo(o, l), e.stroke(), e.restore(), this.resetLineStyle(e), e.fillStyle = t.style.color, e.font = "8px sans-serif", e.globalAlpha = .6, e.textBaseline = "bottom", e.textAlign = "right";
|
|
7362
|
-
for (let t of
|
|
7362
|
+
for (let t of Er) {
|
|
7363
7363
|
if (t === 0 || t === 1) continue;
|
|
7364
7364
|
let n = c + d * t;
|
|
7365
7365
|
e.fillText(`${(t * 100).toFixed(0)}%`, o - 3, n);
|
|
@@ -7384,7 +7384,7 @@ var xr = class extends H {
|
|
|
7384
7384
|
y: l
|
|
7385
7385
|
}) <= r;
|
|
7386
7386
|
}
|
|
7387
|
-
},
|
|
7387
|
+
}, Or = class extends H {
|
|
7388
7388
|
descriptor = {
|
|
7389
7389
|
type: "anchoredVWAP",
|
|
7390
7390
|
name: "Anchored VWAP",
|
|
@@ -7400,11 +7400,11 @@ var xr = class extends H {
|
|
|
7400
7400
|
}
|
|
7401
7401
|
render(e, t, n, r) {
|
|
7402
7402
|
if (t.anchors.length < 1 || !this.dataGetter) return;
|
|
7403
|
-
let i = this.dataGetter(), a = Math.max(0, Math.round(
|
|
7403
|
+
let i = this.dataGetter(), a = Math.max(0, Math.round(P(t.anchors[0].time, n)));
|
|
7404
7404
|
if (a >= i.length) return;
|
|
7405
7405
|
let { vwap: o, upper1: s, lower1: c, upper2: l, lower2: u } = this.computeVWAP(i, a), { chartRect: d } = n, f = n.barWidth + n.barSpacing;
|
|
7406
7406
|
if (this.applyLineStyle(e, t.style), e.lineWidth = t.style.lineWidth + .5, this.drawLine(e, o, a, n, d, f), this.showBands && o.length > 1 && (e.globalAlpha = .4, e.lineWidth = Math.max(.5, t.style.lineWidth * .6), e.setLineDash([4, 3]), this.drawLine(e, s, a, n, d, f), this.drawLine(e, c, a, n, d, f), e.globalAlpha = .25, this.drawLine(e, l, a, n, d, f), this.drawLine(e, u, a, n, d, f), e.globalAlpha = 1), this.resetLineStyle(e), o.length > 0) {
|
|
7407
|
-
let r = o[o.length - 1], i =
|
|
7407
|
+
let r = o[o.length - 1], i = k(a + o.length - 1, n), s = A(r, n);
|
|
7408
7408
|
i >= d.x && i <= d.x + d.width && (e.fillStyle = t.style.color, e.font = "bold 9px sans-serif", e.textAlign = "left", e.textBaseline = "middle", e.fillText(`AVWAP ${r.toFixed(2)}`, i + 6, s));
|
|
7409
7409
|
}
|
|
7410
7410
|
r && this.renderAnchorHandles(e, t, n);
|
|
@@ -7413,10 +7413,10 @@ var xr = class extends H {
|
|
|
7413
7413
|
e.beginPath();
|
|
7414
7414
|
let o = !1;
|
|
7415
7415
|
for (let s = 0; s < t.length; s++) {
|
|
7416
|
-
let c =
|
|
7416
|
+
let c = k(n + s, r);
|
|
7417
7417
|
if (c < i.x - a) continue;
|
|
7418
7418
|
if (c > i.x + i.width + a) break;
|
|
7419
|
-
let l =
|
|
7419
|
+
let l = A(t[s], r);
|
|
7420
7420
|
o ? e.lineTo(c, l) : (e.moveTo(c, l), o = !0);
|
|
7421
7421
|
}
|
|
7422
7422
|
e.stroke();
|
|
@@ -7441,11 +7441,11 @@ var xr = class extends H {
|
|
|
7441
7441
|
}
|
|
7442
7442
|
hitTest(e, t, n, r) {
|
|
7443
7443
|
if (t.anchors.length < 1 || !this.dataGetter) return !1;
|
|
7444
|
-
let i = this.dataGetter(), a = Math.max(0, Math.round(
|
|
7444
|
+
let i = this.dataGetter(), a = Math.max(0, Math.round(P(t.anchors[0].time, n)));
|
|
7445
7445
|
if (a >= i.length) return !1;
|
|
7446
7446
|
let { vwap: o } = this.computeVWAP(i, a);
|
|
7447
7447
|
for (let t = 1; t < o.length; t++) {
|
|
7448
|
-
let i =
|
|
7448
|
+
let i = k(a + t - 1, n), s = A(o[t - 1], n), c = k(a + t, n), l = A(o[t], n);
|
|
7449
7449
|
if (this.distanceToLine(e, {
|
|
7450
7450
|
x: i,
|
|
7451
7451
|
y: s
|
|
@@ -7456,7 +7456,7 @@ var xr = class extends H {
|
|
|
7456
7456
|
}
|
|
7457
7457
|
return !1;
|
|
7458
7458
|
}
|
|
7459
|
-
},
|
|
7459
|
+
}, kr = class extends H {
|
|
7460
7460
|
descriptor = {
|
|
7461
7461
|
type: "volumeProfileRange",
|
|
7462
7462
|
name: "Volume Profile (Range)",
|
|
@@ -7469,7 +7469,7 @@ var xr = class extends H {
|
|
|
7469
7469
|
}
|
|
7470
7470
|
render(e, t, n, r) {
|
|
7471
7471
|
if (t.anchors.length < 2 || !this.dataGetter) return;
|
|
7472
|
-
let i = this.dataGetter(), a = Math.round(
|
|
7472
|
+
let i = this.dataGetter(), a = Math.round(P(t.anchors[0].time, n)), o = Math.round(P(t.anchors[1].time, n)), s = Math.max(0, Math.min(a, o)), c = Math.min(i.length - 1, Math.max(a, o));
|
|
7473
7473
|
if (s >= i.length || c < 0 || s > c) return;
|
|
7474
7474
|
let l = Infinity, u = -Infinity;
|
|
7475
7475
|
for (let e = s; e <= c; e++) i[e].low < l && (l = i[e].low), i[e].high > u && (u = i[e].high);
|
|
@@ -7482,15 +7482,15 @@ var xr = class extends H {
|
|
|
7482
7482
|
if (p === 0) return;
|
|
7483
7483
|
let m = 0;
|
|
7484
7484
|
for (let e = 1; e < this.numBins; e++) f[e] > f[m] && (m = e);
|
|
7485
|
-
let h =
|
|
7485
|
+
let h = k(c, n) + n.barWidth, g = t.style.color, _ = t.style.fillColor ?? "#FF9800";
|
|
7486
7486
|
e.save();
|
|
7487
7487
|
for (let t = 0; t < this.numBins; t++) {
|
|
7488
|
-
let r = f[t] / p * 100, i = l + (t + 1) * d, a = l + t * d, o =
|
|
7488
|
+
let r = f[t] / p * 100, i = l + (t + 1) * d, a = l + t * d, o = A(i, n), s = A(a, n), c = Math.abs(s - o);
|
|
7489
7489
|
e.globalAlpha = .35, e.fillStyle = t === m ? _ : g, e.fillRect(h, Math.min(o, s), r, Math.max(1, c - .5));
|
|
7490
7490
|
}
|
|
7491
|
-
let v = l + (m + .5) * d, y =
|
|
7491
|
+
let v = l + (m + .5) * d, y = A(v, n);
|
|
7492
7492
|
e.globalAlpha = .7, e.strokeStyle = _, e.lineWidth = 1, e.setLineDash([4, 3]), e.beginPath();
|
|
7493
|
-
let b =
|
|
7493
|
+
let b = k(s, n) - n.barWidth / 2;
|
|
7494
7494
|
e.moveTo(b, y), e.lineTo(h + 100, y), e.stroke(), e.fillStyle = _, e.font = "9px sans-serif", e.textAlign = "left", e.textBaseline = "bottom", e.globalAlpha = .8, e.fillText(`POC ${v.toFixed(2)}`, h + 100 + 4, y - 2), e.restore(), r && this.renderAnchorHandles(e, t, n);
|
|
7495
7495
|
}
|
|
7496
7496
|
hitTest(e, t, n, r) {
|
|
@@ -7498,7 +7498,7 @@ var xr = class extends H {
|
|
|
7498
7498
|
let i = this.anchorToPixel(t.anchors[0], n), a = this.anchorToPixel(t.anchors[1], n), o = Math.min(i.x, a.x) - r, s = Math.max(i.x, a.x) + 100 + r, c = Math.min(i.y, a.y) - r, l = Math.max(i.y, a.y) + r;
|
|
7499
7499
|
return e.x >= o && e.x <= s && e.y >= c && e.y <= l;
|
|
7500
7500
|
}
|
|
7501
|
-
},
|
|
7501
|
+
}, Ar = [
|
|
7502
7502
|
1,
|
|
7503
7503
|
2,
|
|
7504
7504
|
3,
|
|
@@ -7508,7 +7508,7 @@ var xr = class extends H {
|
|
|
7508
7508
|
21,
|
|
7509
7509
|
34,
|
|
7510
7510
|
55
|
|
7511
|
-
],
|
|
7511
|
+
], jr = class extends H {
|
|
7512
7512
|
descriptor = {
|
|
7513
7513
|
type: "fibTimeZones",
|
|
7514
7514
|
name: "Fibonacci Time Zones",
|
|
@@ -7520,8 +7520,8 @@ var xr = class extends H {
|
|
|
7520
7520
|
if (a === 0) return;
|
|
7521
7521
|
let { chartRect: o } = n;
|
|
7522
7522
|
e.font = "11px sans-serif", e.textBaseline = "top", e.textAlign = "center", this.applyLineStyle(e, t.style);
|
|
7523
|
-
for (let r of
|
|
7524
|
-
let s =
|
|
7523
|
+
for (let r of Ar) {
|
|
7524
|
+
let s = F(i.time + a * r, n);
|
|
7525
7525
|
s < o.x || s > o.x + o.width || (e.globalAlpha = r === 1 ? 1 : .55, e.beginPath(), e.moveTo(s, o.y), e.lineTo(s, o.y + o.height), e.stroke(), e.fillStyle = t.style.color, e.fillText(String(r), s, o.y + 2));
|
|
7526
7526
|
}
|
|
7527
7527
|
e.globalAlpha = 1, this.resetLineStyle(e), r && this.renderAnchorHandles(e, t, n);
|
|
@@ -7532,8 +7532,8 @@ var xr = class extends H {
|
|
|
7532
7532
|
if (a === 0) return !1;
|
|
7533
7533
|
let { chartRect: o } = n;
|
|
7534
7534
|
if (e.y < o.y || e.y > o.y + o.height) return !1;
|
|
7535
|
-
for (let t of
|
|
7536
|
-
let o =
|
|
7535
|
+
for (let t of Ar) {
|
|
7536
|
+
let o = F(i.time + a * t, n);
|
|
7537
7537
|
if (Math.abs(e.x - o) <= r) return !0;
|
|
7538
7538
|
}
|
|
7539
7539
|
return !1;
|
|
@@ -7541,16 +7541,16 @@ var xr = class extends H {
|
|
|
7541
7541
|
};
|
|
7542
7542
|
//#endregion
|
|
7543
7543
|
//#region src/drawings/tools/index.ts
|
|
7544
|
-
function
|
|
7545
|
-
e.register(new
|
|
7544
|
+
function Mr(e) {
|
|
7545
|
+
e.register(new nr()), e.register(new rr()), e.register(new ir()), e.register(new ar()), e.register(new or()), e.register(new sr()), e.register(new cr()), e.register(new lr()), e.register(new dr()), e.register(new fr()), e.register(new pr()), e.register(new mr()), e.register(new hr()), e.register(new _r()), e.register(new vr()), e.register(new yr()), e.register(new br()), e.register(new Sr()), e.register(new Cr()), e.register(new Tr()), e.register(new Dr()), e.register(new Or()), e.register(new kr()), e.register(new jr());
|
|
7546
7546
|
}
|
|
7547
7547
|
//#endregion
|
|
7548
7548
|
//#region src/trading/OrderRenderer.ts
|
|
7549
|
-
var
|
|
7549
|
+
var Nr = class {
|
|
7550
7550
|
render(e, t, n, r, i, a) {
|
|
7551
7551
|
let o = i.orderColors?.buy ?? "#26A69A", s = i.orderColors?.sell ?? "#EF5350", { chartRect: c } = n;
|
|
7552
7552
|
for (let i of t) {
|
|
7553
|
-
let t = a?.orderId === i.id && a.sourceType === "order", l =
|
|
7553
|
+
let t = a?.orderId === i.id && a.sourceType === "order", l = A(t ? a.currentPrice : i.price, n);
|
|
7554
7554
|
if (l < c.y || l > c.y + c.height) continue;
|
|
7555
7555
|
let u = i.side === "buy" ? o : s;
|
|
7556
7556
|
e.setLineDash([6, 4]), e.strokeStyle = u, e.lineWidth = 1, e.beginPath(), e.moveTo(c.x, Math.round(l) + .5), e.lineTo(c.x + c.width, Math.round(l) + .5), e.stroke(), e.setLineDash([]);
|
|
@@ -7560,7 +7560,7 @@ var Mr = class {
|
|
|
7560
7560
|
e.fillStyle = u, e.fillRect(c.x + 4, l - 8, f, 16), e.fillStyle = "#FFFFFF", e.textBaseline = "middle", e.textAlign = "left", e.fillText(d, c.x + 8, l);
|
|
7561
7561
|
let p = c.x + 4 + f + 6;
|
|
7562
7562
|
if (e.fillStyle = u, e.beginPath(), i.side === "buy" ? (e.moveTo(p, l + 4), e.lineTo(p + 5, l - 2), e.lineTo(p + 10, l + 4)) : (e.moveTo(p, l - 4), e.lineTo(p + 5, l + 2), e.lineTo(p + 10, l - 4)), e.fill(), t) {
|
|
7563
|
-
let t =
|
|
7563
|
+
let t = A(a.startPrice, n);
|
|
7564
7564
|
e.setLineDash([2, 4]), e.strokeStyle = u, e.globalAlpha = .3, e.beginPath(), e.moveTo(c.x, Math.round(t) + .5), e.lineTo(c.x + c.width, Math.round(t) + .5), e.stroke(), e.globalAlpha = 1, e.setLineDash([]);
|
|
7565
7565
|
}
|
|
7566
7566
|
}
|
|
@@ -7568,7 +7568,7 @@ var Mr = class {
|
|
|
7568
7568
|
renderAxisBadges(e, t, n, r, i, a) {
|
|
7569
7569
|
let o = i.orderColors?.buy ?? "#26A69A", s = i.orderColors?.sell ?? "#EF5350", c = i.pricePrecision ?? 2, { chartRect: l } = n, d = l.x + l.width + 1;
|
|
7570
7570
|
for (let i of t) {
|
|
7571
|
-
let t = a?.orderId === i.id && a.sourceType === "order" ? a.currentPrice : i.price, f =
|
|
7571
|
+
let t = a?.orderId === i.id && a.sourceType === "order" ? a.currentPrice : i.price, f = A(t, n);
|
|
7572
7572
|
if (f < l.y || f > l.y + l.height) continue;
|
|
7573
7573
|
let p = i.side === "buy" ? o : s, m = `${t.toFixed(c)} x ${i.quantity}`;
|
|
7574
7574
|
e.font = `11px ${r.font.family}`;
|
|
@@ -7579,7 +7579,7 @@ var Mr = class {
|
|
|
7579
7579
|
hitTest(e, t, n, r) {
|
|
7580
7580
|
for (let i of t) {
|
|
7581
7581
|
if (i.draggable === !1) continue;
|
|
7582
|
-
let t =
|
|
7582
|
+
let t = A(i.price, n);
|
|
7583
7583
|
if (Math.abs(e - t) <= r) return i;
|
|
7584
7584
|
}
|
|
7585
7585
|
return null;
|
|
@@ -7587,7 +7587,7 @@ var Mr = class {
|
|
|
7587
7587
|
};
|
|
7588
7588
|
//#endregion
|
|
7589
7589
|
//#region src/trading/positionFormat.ts
|
|
7590
|
-
function
|
|
7590
|
+
function Pr(e, t, n) {
|
|
7591
7591
|
let r = Math.min(Math.max(e.closedQuantity ?? 0, 0), e.quantity), i = e.quantity - r, a = e.side === "buy" ? 1 : -1, o = (t - e.entryPrice) * i * a, s = e.entryPrice === 0 ? 0 : (t - e.entryPrice) / e.entryPrice * 100 * a;
|
|
7592
7592
|
return {
|
|
7593
7593
|
side: e.side,
|
|
@@ -7601,9 +7601,9 @@ function Nr(e, t, n) {
|
|
|
7601
7601
|
precision: n
|
|
7602
7602
|
};
|
|
7603
7603
|
}
|
|
7604
|
-
var
|
|
7605
|
-
function
|
|
7606
|
-
return e.replace(
|
|
7604
|
+
var Fr = /\{(side|qty|closedQty|openQty|entry|price|pnl|pnlPct|pnlSign)\}/g;
|
|
7605
|
+
function Ir(e, t) {
|
|
7606
|
+
return e.replace(Fr, (e, n) => {
|
|
7607
7607
|
switch (n) {
|
|
7608
7608
|
case "side": return t.side.toUpperCase();
|
|
7609
7609
|
case "qty": return String(t.quantity);
|
|
@@ -7618,10 +7618,10 @@ function Fr(e, t) {
|
|
|
7618
7618
|
}
|
|
7619
7619
|
});
|
|
7620
7620
|
}
|
|
7621
|
-
function
|
|
7622
|
-
return typeof e == "function" ? e(t) :
|
|
7621
|
+
function Lr(e, t) {
|
|
7622
|
+
return typeof e == "function" ? e(t) : Ir(e ?? "{side} {qty} | P&L: {pnlSign}{pnl}", t);
|
|
7623
7623
|
}
|
|
7624
|
-
function
|
|
7624
|
+
function Rr(e, t, n) {
|
|
7625
7625
|
if (!t || t.length === 0) return n;
|
|
7626
7626
|
let r = [...t].sort((e, t) => e.pnl - t.pnl), i;
|
|
7627
7627
|
for (let t of r) if (e >= t.pnl) i = t.color;
|
|
@@ -7630,30 +7630,30 @@ function Lr(e, t, n) {
|
|
|
7630
7630
|
}
|
|
7631
7631
|
//#endregion
|
|
7632
7632
|
//#region src/trading/PositionRenderer.ts
|
|
7633
|
-
var
|
|
7633
|
+
var zr = class {
|
|
7634
7634
|
render(e, t, n, r, i, a) {
|
|
7635
7635
|
let { chartRect: o } = r, s = a.positionColors?.profit ?? "#26A69A", c = a.positionColors?.loss ?? "#EF5350", l = a.positionColors?.entry ?? "#2196F3", u = a.pricePrecision ?? 2;
|
|
7636
7636
|
for (let d of t) {
|
|
7637
|
-
let t =
|
|
7637
|
+
let t = A(d.entryPrice, r);
|
|
7638
7638
|
if (e.strokeStyle = l, e.lineWidth = 1.5, e.setLineDash([]), e.beginPath(), e.moveTo(o.x, Math.round(t) + .5), e.lineTo(o.x + o.width, Math.round(t) + .5), e.stroke(), n !== null) {
|
|
7639
|
-
let f =
|
|
7639
|
+
let f = A(n, r), p = Pr(d, n, u), m = p.pnl, h = m >= 0 ? s : c, g = Rr(m, a.pnlThresholds, h);
|
|
7640
7640
|
e.fillStyle = g, e.globalAlpha = .08;
|
|
7641
7641
|
let _ = Math.min(t, f), v = Math.abs(f - t);
|
|
7642
7642
|
if (e.fillRect(o.x, _, o.width, v), e.globalAlpha = 1, p.closedQuantity > 0 && d.quantity > 0) {
|
|
7643
7643
|
let t = p.closedQuantity / d.quantity;
|
|
7644
7644
|
e.fillStyle = l, e.globalAlpha = .25, e.fillRect(o.x, _, Math.max(2, o.width * t * .04) + 2, v), e.globalAlpha = 1;
|
|
7645
7645
|
}
|
|
7646
|
-
let y =
|
|
7646
|
+
let y = Lr(a.positionLabel, p);
|
|
7647
7647
|
e.font = `bold 11px ${i.font.family}`;
|
|
7648
7648
|
let b = e.measureText(y).width + 12, x = o.x + 8;
|
|
7649
7649
|
e.fillStyle = g, e.globalAlpha = .9, e.fillRect(x, t - 10, b, 20), e.globalAlpha = 1, e.fillStyle = "#FFFFFF", e.textBaseline = "middle", e.textAlign = "left", e.fillText(y, x + 6, t);
|
|
7650
7650
|
}
|
|
7651
7651
|
if (d.stopLoss !== void 0) {
|
|
7652
|
-
let t =
|
|
7652
|
+
let t = A(d.stopLoss, r);
|
|
7653
7653
|
e.setLineDash([4, 4]), e.strokeStyle = c, e.lineWidth = 1, e.beginPath(), e.moveTo(o.x, Math.round(t) + .5), e.lineTo(o.x + o.width, Math.round(t) + .5), e.stroke(), e.font = `bold 10px ${i.font.family}`, e.fillStyle = c, e.fillRect(o.x + 4, t - 8, 24, 16), e.fillStyle = "#FFFFFF", e.textAlign = "left", e.textBaseline = "middle", e.fillText("SL", o.x + 8, t);
|
|
7654
7654
|
}
|
|
7655
7655
|
if (d.takeProfit !== void 0) {
|
|
7656
|
-
let t =
|
|
7656
|
+
let t = A(d.takeProfit, r);
|
|
7657
7657
|
e.setLineDash([4, 4]), e.strokeStyle = s, e.lineWidth = 1, e.beginPath(), e.moveTo(o.x, Math.round(t) + .5), e.lineTo(o.x + o.width, Math.round(t) + .5), e.stroke(), e.font = `bold 10px ${i.font.family}`, e.fillStyle = s, e.fillRect(o.x + 4, t - 8, 24, 16), e.fillStyle = "#FFFFFF", e.textAlign = "left", e.textBaseline = "middle", e.fillText("TP", o.x + 8, t);
|
|
7658
7658
|
}
|
|
7659
7659
|
e.setLineDash([]);
|
|
@@ -7662,11 +7662,11 @@ var Rr = class {
|
|
|
7662
7662
|
renderAxisBadges(e, t, n, r, i) {
|
|
7663
7663
|
let { chartRect: a } = n, o = i.positionColors?.entry ?? "#2196F3", s = i.pricePrecision ?? 2, c = a.x + a.width + 1;
|
|
7664
7664
|
for (let i of t) {
|
|
7665
|
-
let t =
|
|
7665
|
+
let t = A(i.entryPrice, n);
|
|
7666
7666
|
e.fillStyle = o, e.fillRect(c, t - 9, u - 2, 18), e.fillStyle = "#FFFFFF", e.font = `11px ${r.font.family}`, e.textAlign = "left", e.textBaseline = "middle", e.fillText(i.entryPrice.toFixed(s), c + 5, t);
|
|
7667
7667
|
}
|
|
7668
7668
|
}
|
|
7669
|
-
},
|
|
7669
|
+
}, Br = class {
|
|
7670
7670
|
render(e, t, n, r) {
|
|
7671
7671
|
if (!r.depthOverlay?.enabled) return;
|
|
7672
7672
|
let { chartRect: i } = n, a = r.depthOverlay.bidColor ?? "rgba(38,166,154,0.15)", o = r.depthOverlay.askColor ?? "rgba(239,83,80,0.15)", s = r.depthOverlay.maxWidth ?? 100, c = 0, l = [], u = 0;
|
|
@@ -7681,23 +7681,23 @@ var Rr = class {
|
|
|
7681
7681
|
cumVol: u
|
|
7682
7682
|
}), u > c && (c = u);
|
|
7683
7683
|
if (c === 0) return;
|
|
7684
|
-
let f = Math.max(1, t.bids.length > 1 ? Math.abs(
|
|
7684
|
+
let f = Math.max(1, t.bids.length > 1 ? Math.abs(A(t.bids[0].price, n) - A(t.bids[1].price, n)) : 4), p = i.x + i.width;
|
|
7685
7685
|
e.fillStyle = a;
|
|
7686
7686
|
for (let { price: t, cumVol: r } of l) {
|
|
7687
|
-
let a =
|
|
7687
|
+
let a = A(t, n);
|
|
7688
7688
|
if (a < i.y || a > i.y + i.height) continue;
|
|
7689
7689
|
let o = r / c * s;
|
|
7690
7690
|
e.fillRect(p - o, a - f / 2, o, f);
|
|
7691
7691
|
}
|
|
7692
7692
|
e.fillStyle = o;
|
|
7693
7693
|
for (let { price: t, cumVol: r } of d) {
|
|
7694
|
-
let a =
|
|
7694
|
+
let a = A(t, n);
|
|
7695
7695
|
if (a < i.y || a > i.y + i.height) continue;
|
|
7696
7696
|
let o = r / c * s;
|
|
7697
7697
|
e.fillRect(p - o, a - f / 2, o, f);
|
|
7698
7698
|
}
|
|
7699
7699
|
}
|
|
7700
|
-
},
|
|
7700
|
+
}, Vr = class {
|
|
7701
7701
|
dragState = null;
|
|
7702
7702
|
startY = 0;
|
|
7703
7703
|
dragging = !1;
|
|
@@ -7707,7 +7707,7 @@ var Rr = class {
|
|
|
7707
7707
|
onPointerDown(e, t, n, r, i) {
|
|
7708
7708
|
for (let n of t) {
|
|
7709
7709
|
if (n.draggable === !1) continue;
|
|
7710
|
-
let t =
|
|
7710
|
+
let t = A(n.price, r);
|
|
7711
7711
|
if (Math.abs(e.y - t) <= i) return this.dragState = {
|
|
7712
7712
|
orderId: n.id,
|
|
7713
7713
|
sourceType: "order",
|
|
@@ -7717,7 +7717,7 @@ var Rr = class {
|
|
|
7717
7717
|
}
|
|
7718
7718
|
for (let t of n) {
|
|
7719
7719
|
if (t.stopLoss !== void 0) {
|
|
7720
|
-
let n =
|
|
7720
|
+
let n = A(t.stopLoss, r);
|
|
7721
7721
|
if (Math.abs(e.y - n) <= i) return this.dragState = {
|
|
7722
7722
|
orderId: t.id,
|
|
7723
7723
|
sourceType: "stopLoss",
|
|
@@ -7726,7 +7726,7 @@ var Rr = class {
|
|
|
7726
7726
|
}, this.startY = e.y, this.dragging = !1, !0;
|
|
7727
7727
|
}
|
|
7728
7728
|
if (t.takeProfit !== void 0) {
|
|
7729
|
-
let n =
|
|
7729
|
+
let n = A(t.takeProfit, r);
|
|
7730
7730
|
if (Math.abs(e.y - n) <= i) return this.dragState = {
|
|
7731
7731
|
orderId: t.id,
|
|
7732
7732
|
sourceType: "takeProfit",
|
|
@@ -7743,7 +7743,7 @@ var Rr = class {
|
|
|
7743
7743
|
if (Math.abs(e.y - this.startY) < this.dragThreshold) return !0;
|
|
7744
7744
|
this.dragging = !0;
|
|
7745
7745
|
}
|
|
7746
|
-
return this.dragState.currentPrice =
|
|
7746
|
+
return this.dragState.currentPrice = M(e.y, t), !0;
|
|
7747
7747
|
}
|
|
7748
7748
|
onPointerUp() {
|
|
7749
7749
|
if (!this.dragState) return null;
|
|
@@ -7761,7 +7761,7 @@ var Rr = class {
|
|
|
7761
7761
|
isActive() {
|
|
7762
7762
|
return this.dragState !== null;
|
|
7763
7763
|
}
|
|
7764
|
-
},
|
|
7764
|
+
}, Hr = class {
|
|
7765
7765
|
menuElement = null;
|
|
7766
7766
|
removeHandler = null;
|
|
7767
7767
|
onItemSelect = null;
|
|
@@ -7848,7 +7848,7 @@ var Rr = class {
|
|
|
7848
7848
|
};
|
|
7849
7849
|
//#endregion
|
|
7850
7850
|
//#region src/trading/BracketTool.ts
|
|
7851
|
-
function
|
|
7851
|
+
function Ur(e, t, n = {}) {
|
|
7852
7852
|
let r = Math.max(Math.abs(t) * (n.riskFraction ?? .01), 1e-8), i = r * (n.riskReward ?? 2);
|
|
7853
7853
|
return e === "buy" ? {
|
|
7854
7854
|
side: e,
|
|
@@ -7862,11 +7862,11 @@ function Hr(e, t, n = {}) {
|
|
|
7862
7862
|
takeProfit: t - i
|
|
7863
7863
|
};
|
|
7864
7864
|
}
|
|
7865
|
-
function
|
|
7865
|
+
function Wr(e) {
|
|
7866
7866
|
let t = Math.abs(e.entry - e.stopLoss);
|
|
7867
7867
|
return t === 0 ? 0 : Math.abs(e.takeProfit - e.entry) / t;
|
|
7868
7868
|
}
|
|
7869
|
-
var
|
|
7869
|
+
var Gr = 6, Kr = class {
|
|
7870
7870
|
draft = null;
|
|
7871
7871
|
dragging = null;
|
|
7872
7872
|
defaults;
|
|
@@ -7874,7 +7874,7 @@ var Wr = 6, Gr = class {
|
|
|
7874
7874
|
this.defaults = e;
|
|
7875
7875
|
}
|
|
7876
7876
|
start(e, t) {
|
|
7877
|
-
this.draft =
|
|
7877
|
+
this.draft = Ur(e, t, this.defaults), this.dragging = null;
|
|
7878
7878
|
}
|
|
7879
7879
|
cancel() {
|
|
7880
7880
|
this.draft = null, this.dragging = null;
|
|
@@ -7891,9 +7891,9 @@ var Wr = 6, Gr = class {
|
|
|
7891
7891
|
"entry",
|
|
7892
7892
|
"sl",
|
|
7893
7893
|
"tp"
|
|
7894
|
-
], r = null, i =
|
|
7894
|
+
], r = null, i = Gr;
|
|
7895
7895
|
for (let a of n) {
|
|
7896
|
-
let n =
|
|
7896
|
+
let n = A(this.priceOf(a), t), o = Math.abs(n - e.y);
|
|
7897
7897
|
o <= i && (i = o, r = a);
|
|
7898
7898
|
}
|
|
7899
7899
|
return r;
|
|
@@ -7904,8 +7904,8 @@ var Wr = 6, Gr = class {
|
|
|
7904
7904
|
}
|
|
7905
7905
|
drag(e, t) {
|
|
7906
7906
|
if (!this.draft || !this.dragging) return !1;
|
|
7907
|
-
let n =
|
|
7908
|
-
return this.draft =
|
|
7907
|
+
let n = M(e.y, t);
|
|
7908
|
+
return this.draft = qr(this.draft, this.dragging, n), !0;
|
|
7909
7909
|
}
|
|
7910
7910
|
endDrag() {
|
|
7911
7911
|
this.dragging = null;
|
|
@@ -7920,22 +7920,22 @@ var Wr = 6, Gr = class {
|
|
|
7920
7920
|
render(e, t, n, r = 2) {
|
|
7921
7921
|
let i = this.draft;
|
|
7922
7922
|
if (!i) return;
|
|
7923
|
-
let { chartRect: a } = t, o = a.x, s = a.x + a.width, c =
|
|
7924
|
-
e.save(), e.globalAlpha = .12, e.fillStyle = d, e.fillRect(o, Math.min(c, u), a.width, Math.abs(u - c)), e.fillStyle = f, e.fillRect(o, Math.min(c, l), a.width, Math.abs(l - c)), e.globalAlpha = 1,
|
|
7925
|
-
let p =
|
|
7926
|
-
|
|
7923
|
+
let { chartRect: a } = t, o = a.x, s = a.x + a.width, c = A(i.entry, t), l = A(i.stopLoss, t), u = A(i.takeProfit, t), d = n.candleUp, f = n.candleDown;
|
|
7924
|
+
e.save(), e.globalAlpha = .12, e.fillStyle = d, e.fillRect(o, Math.min(c, u), a.width, Math.abs(u - c)), e.fillStyle = f, e.fillRect(o, Math.min(c, l), a.width, Math.abs(l - c)), e.globalAlpha = 1, Jr(e, o, s, c, n.text, [6, 3]), Jr(e, o, s, u, d, []), Jr(e, o, s, l, f, []);
|
|
7925
|
+
let p = Wr(i), m = i.side === "buy" ? "LONG" : "SHORT";
|
|
7926
|
+
Yr(e, o + 6, c, `${m} entry ${i.entry.toFixed(r)}`, n.text, n.background), Yr(e, o + 6, u, `TP ${i.takeProfit.toFixed(r)} · ${p.toFixed(2)}R`, d, n.background), Yr(e, o + 6, l, `SL ${i.stopLoss.toFixed(r)}`, f, n.background);
|
|
7927
7927
|
for (let [r, a] of [
|
|
7928
7928
|
[i.entry, n.text],
|
|
7929
7929
|
[i.takeProfit, d],
|
|
7930
7930
|
[i.stopLoss, f]
|
|
7931
7931
|
]) {
|
|
7932
|
-
let n =
|
|
7932
|
+
let n = A(r, t);
|
|
7933
7933
|
e.fillStyle = a, e.beginPath(), e.arc(s - 6, n, 3.5, 0, Math.PI * 2), e.fill();
|
|
7934
7934
|
}
|
|
7935
7935
|
e.restore();
|
|
7936
7936
|
}
|
|
7937
7937
|
};
|
|
7938
|
-
function
|
|
7938
|
+
function qr(e, t, n) {
|
|
7939
7939
|
let r = e.side === "buy";
|
|
7940
7940
|
if (t === "entry") {
|
|
7941
7941
|
let t = n - e.entry;
|
|
@@ -7959,20 +7959,20 @@ function Kr(e, t, n) {
|
|
|
7959
7959
|
takeProfit: i
|
|
7960
7960
|
};
|
|
7961
7961
|
}
|
|
7962
|
-
function
|
|
7962
|
+
function Jr(e, t, n, r, i, a) {
|
|
7963
7963
|
e.strokeStyle = i, e.lineWidth = 1, e.setLineDash(a), e.beginPath(), e.moveTo(t, Math.round(r) + .5), e.lineTo(n, Math.round(r) + .5), e.stroke(), e.setLineDash([]);
|
|
7964
7964
|
}
|
|
7965
|
-
function
|
|
7965
|
+
function Yr(e, t, n, r, i, a) {
|
|
7966
7966
|
e.font = "600 10px system-ui, sans-serif", e.textBaseline = "middle", e.textAlign = "left";
|
|
7967
7967
|
let o = e.measureText(r).width;
|
|
7968
7968
|
e.globalAlpha = .85, e.fillStyle = a, e.fillRect(t - 3, n - 8, o + 6, 16), e.globalAlpha = 1, e.fillStyle = i, e.fillText(r, t, n + .5);
|
|
7969
7969
|
}
|
|
7970
7970
|
//#endregion
|
|
7971
7971
|
//#region src/trading/OrderDraftTool.ts
|
|
7972
|
-
function
|
|
7972
|
+
function Xr(e, t, n) {
|
|
7973
7973
|
return n == null ? "limit" : e === "buy" ? t <= n ? "limit" : "stop" : t >= n ? "limit" : "stop";
|
|
7974
7974
|
}
|
|
7975
|
-
var
|
|
7975
|
+
var Zr = 6, Qr = class {
|
|
7976
7976
|
draft = null;
|
|
7977
7977
|
dragging = !1;
|
|
7978
7978
|
start(e, t, n = 1) {
|
|
@@ -8003,19 +8003,19 @@ var Xr = 6, Zr = class {
|
|
|
8003
8003
|
toIntent(e) {
|
|
8004
8004
|
return this.draft ? {
|
|
8005
8005
|
side: this.draft.side,
|
|
8006
|
-
type:
|
|
8006
|
+
type: Xr(this.draft.side, this.draft.price, e),
|
|
8007
8007
|
price: this.draft.price,
|
|
8008
8008
|
quantity: this.draft.quantity
|
|
8009
8009
|
} : null;
|
|
8010
8010
|
}
|
|
8011
8011
|
hitTest(e, t) {
|
|
8012
|
-
return this.draft ? Math.abs(
|
|
8012
|
+
return this.draft ? Math.abs(A(this.draft.price, t) - e.y) <= Zr : !1;
|
|
8013
8013
|
}
|
|
8014
8014
|
beginDrag(e, t) {
|
|
8015
8015
|
return this.hitTest(e, t) ? (this.dragging = !0, !0) : !1;
|
|
8016
8016
|
}
|
|
8017
8017
|
drag(e, t) {
|
|
8018
|
-
return !this.draft || !this.dragging ? !1 : this.setPrice(
|
|
8018
|
+
return !this.draft || !this.dragging ? !1 : this.setPrice(M(e.y, t));
|
|
8019
8019
|
}
|
|
8020
8020
|
endDrag() {
|
|
8021
8021
|
this.dragging = !1;
|
|
@@ -8023,35 +8023,35 @@ var Xr = 6, Zr = class {
|
|
|
8023
8023
|
render(e, t, n, r, i = 2) {
|
|
8024
8024
|
let a = this.draft;
|
|
8025
8025
|
if (!a) return;
|
|
8026
|
-
let { chartRect: o } = t, s = o.x, c = o.x + o.width, l =
|
|
8027
|
-
e.save(),
|
|
8026
|
+
let { chartRect: o } = t, s = o.x, c = o.x + o.width, l = A(a.price, t), u = Xr(a.side, a.price, r), d = a.side === "buy" ? n.candleUp : n.candleDown;
|
|
8027
|
+
e.save(), $r(e, s, c, l, d, [6, 3]);
|
|
8028
8028
|
let f = a.side === "buy" ? "BUY" : "SELL";
|
|
8029
|
-
|
|
8029
|
+
ei(e, s + 6, l, `${f} ${u.toUpperCase()} ${a.price.toFixed(i)}`, d, n.background), e.fillStyle = d, e.beginPath(), e.arc(c - 6, l, 3.5, 0, Math.PI * 2), e.fill(), e.restore();
|
|
8030
8030
|
}
|
|
8031
8031
|
};
|
|
8032
|
-
function
|
|
8032
|
+
function $r(e, t, n, r, i, a) {
|
|
8033
8033
|
e.strokeStyle = i, e.lineWidth = 1, e.setLineDash(a), e.beginPath(), e.moveTo(t, Math.round(r) + .5), e.lineTo(n, Math.round(r) + .5), e.stroke(), e.setLineDash([]);
|
|
8034
8034
|
}
|
|
8035
|
-
function
|
|
8035
|
+
function ei(e, t, n, r, i, a) {
|
|
8036
8036
|
e.font = "600 10px system-ui, sans-serif", e.textBaseline = "middle", e.textAlign = "left";
|
|
8037
8037
|
let o = e.measureText(r).width;
|
|
8038
8038
|
e.globalAlpha = .85, e.fillStyle = a, e.fillRect(t - 3, n - 8, o + 6, 16), e.globalAlpha = 1, e.fillStyle = i, e.fillText(r, t, n + .5);
|
|
8039
8039
|
}
|
|
8040
8040
|
//#endregion
|
|
8041
8041
|
//#region src/trading/TradingManager.ts
|
|
8042
|
-
var
|
|
8042
|
+
var ti = class {
|
|
8043
8043
|
orders = [];
|
|
8044
8044
|
positions = [];
|
|
8045
8045
|
depthData = null;
|
|
8046
8046
|
currentPrice = null;
|
|
8047
8047
|
config;
|
|
8048
|
-
orderRenderer = new
|
|
8049
|
-
positionRenderer = new
|
|
8050
|
-
depthOverlay = new
|
|
8048
|
+
orderRenderer = new Nr();
|
|
8049
|
+
positionRenderer = new zr();
|
|
8050
|
+
depthOverlay = new Br();
|
|
8051
8051
|
dragHandler;
|
|
8052
|
-
contextMenu = new
|
|
8053
|
-
bracket = new
|
|
8054
|
-
orderDraft = new
|
|
8052
|
+
contextMenu = new Hr();
|
|
8053
|
+
bracket = new Kr();
|
|
8054
|
+
orderDraft = new Qr();
|
|
8055
8055
|
requestRender = null;
|
|
8056
8056
|
eventCallback = null;
|
|
8057
8057
|
container = null;
|
|
@@ -8059,7 +8059,7 @@ var ei = class {
|
|
|
8059
8059
|
this.config = {
|
|
8060
8060
|
...s,
|
|
8061
8061
|
...e
|
|
8062
|
-
}, this.dragHandler = new
|
|
8062
|
+
}, this.dragHandler = new Vr(this.config.dragThreshold), this.contextMenu.onItemSelect = (e) => {
|
|
8063
8063
|
this.eventCallback?.("orderPlace", e);
|
|
8064
8064
|
};
|
|
8065
8065
|
}
|
|
@@ -8100,7 +8100,7 @@ var ei = class {
|
|
|
8100
8100
|
entry: e.entry,
|
|
8101
8101
|
stopLoss: e.stopLoss,
|
|
8102
8102
|
takeProfit: e.takeProfit,
|
|
8103
|
-
riskReward:
|
|
8103
|
+
riskReward: Wr(e)
|
|
8104
8104
|
}), this.bracket.cancel(), this.requestRender?.(), !0) : !1;
|
|
8105
8105
|
}
|
|
8106
8106
|
isBracketActive() {
|
|
@@ -8150,7 +8150,7 @@ var ei = class {
|
|
|
8150
8150
|
}
|
|
8151
8151
|
onContextMenu(e, t) {
|
|
8152
8152
|
if (!this.config.enabled || !this.config.contextMenu?.enabled || !this.container) return !1;
|
|
8153
|
-
let n =
|
|
8153
|
+
let n = M(e.y, t);
|
|
8154
8154
|
return this.contextMenu.show(e, n, this.container, this.config), !0;
|
|
8155
8155
|
}
|
|
8156
8156
|
render(e, t, n) {
|
|
@@ -8162,7 +8162,7 @@ var ei = class {
|
|
|
8162
8162
|
destroy() {
|
|
8163
8163
|
this.contextMenu.destroy();
|
|
8164
8164
|
}
|
|
8165
|
-
},
|
|
8165
|
+
}, ni = class {
|
|
8166
8166
|
constructor(e) {
|
|
8167
8167
|
this.manager = e;
|
|
8168
8168
|
}
|
|
@@ -8172,7 +8172,7 @@ var ei = class {
|
|
|
8172
8172
|
renderAxisBadges(e, t, n) {
|
|
8173
8173
|
this.manager.renderAxisBadges(e, t, n);
|
|
8174
8174
|
}
|
|
8175
|
-
},
|
|
8175
|
+
}, ri = class {
|
|
8176
8176
|
name = "paper";
|
|
8177
8177
|
state = "disconnected";
|
|
8178
8178
|
listeners = /* @__PURE__ */ new Map();
|
|
@@ -8209,7 +8209,7 @@ var ei = class {
|
|
|
8209
8209
|
price: e.price,
|
|
8210
8210
|
stopPrice: e.stopPrice,
|
|
8211
8211
|
quantity: e.quantity ?? 1,
|
|
8212
|
-
label: e.type === "market" ? void 0 :
|
|
8212
|
+
label: e.type === "market" ? void 0 : ii(e.type),
|
|
8213
8213
|
draggable: !0
|
|
8214
8214
|
};
|
|
8215
8215
|
return e.type === "market" ? this.fill(t, this.markPrice || e.price) : (this.orders = [...this.orders, t], this.emit("orders", this.orders)), t;
|
|
@@ -8300,7 +8300,7 @@ var ei = class {
|
|
|
8300
8300
|
}
|
|
8301
8301
|
}
|
|
8302
8302
|
};
|
|
8303
|
-
function
|
|
8303
|
+
function ii(e) {
|
|
8304
8304
|
switch (e) {
|
|
8305
8305
|
case "stop": return "STOP";
|
|
8306
8306
|
case "stopLimit": return "STOP LIMIT";
|
|
@@ -8331,7 +8331,7 @@ var G = class {
|
|
|
8331
8331
|
removeAllListeners() {
|
|
8332
8332
|
this.listeners.clear();
|
|
8333
8333
|
}
|
|
8334
|
-
},
|
|
8334
|
+
}, ai = class extends G {
|
|
8335
8335
|
currentBar = null;
|
|
8336
8336
|
timeframeMs;
|
|
8337
8337
|
tickRing;
|
|
@@ -8339,10 +8339,10 @@ var G = class {
|
|
|
8339
8339
|
ringCount = 0;
|
|
8340
8340
|
ringCapacity;
|
|
8341
8341
|
constructor(e, t = 1e3) {
|
|
8342
|
-
super(), this.timeframeMs =
|
|
8342
|
+
super(), this.timeframeMs = S(e), this.ringCapacity = t, this.tickRing = Array(t);
|
|
8343
8343
|
}
|
|
8344
8344
|
setTimeframe(e) {
|
|
8345
|
-
this.timeframeMs =
|
|
8345
|
+
this.timeframeMs = S(e), this.currentBar = null, this.ringHead = 0, this.ringCount = 0;
|
|
8346
8346
|
}
|
|
8347
8347
|
processTick(e) {
|
|
8348
8348
|
let t = (this.ringHead + this.ringCount) % this.ringCapacity;
|
|
@@ -8393,7 +8393,7 @@ var G = class {
|
|
|
8393
8393
|
alignToTimeframe(e) {
|
|
8394
8394
|
return Math.floor(e / this.timeframeMs) * this.timeframeMs;
|
|
8395
8395
|
}
|
|
8396
|
-
},
|
|
8396
|
+
}, oi = class extends G {
|
|
8397
8397
|
config;
|
|
8398
8398
|
attempt = 0;
|
|
8399
8399
|
timer = null;
|
|
@@ -8440,7 +8440,7 @@ var G = class {
|
|
|
8440
8440
|
let e = this.config.baseDelay, t = this.config.backoffMultiplier ** (this.attempt - 1), n = Math.min(e * t, this.config.maxDelay), r = n * .25 * (Math.random() * 2 - 1);
|
|
8441
8441
|
return Math.max(0, Math.round(n + r));
|
|
8442
8442
|
}
|
|
8443
|
-
},
|
|
8443
|
+
}, si = class {
|
|
8444
8444
|
price = null;
|
|
8445
8445
|
previousClose = null;
|
|
8446
8446
|
visible = !0;
|
|
@@ -8460,7 +8460,7 @@ var G = class {
|
|
|
8460
8460
|
}
|
|
8461
8461
|
render(e, t, n) {
|
|
8462
8462
|
if (!this.visible || this.price === null) return;
|
|
8463
|
-
let r =
|
|
8463
|
+
let r = A(this.price, t), { chartRect: i } = t;
|
|
8464
8464
|
if (r < i.y || r > i.y + i.height) return;
|
|
8465
8465
|
let a = this.previousClose === null || this.price >= this.previousClose ? n.candleUp ?? "#26A69A" : n.candleDown ?? "#EF5350", o = Date.now() < this.flashUntil;
|
|
8466
8466
|
e.setLineDash([4, 3]), e.strokeStyle = a, e.lineWidth = 1, e.globalAlpha = o ? 1 : .7, e.beginPath(), e.moveTo(i.x, Math.round(r) + .5), e.lineTo(i.x + i.width, Math.round(r) + .5), e.stroke(), e.setLineDash([]), e.globalAlpha = 1;
|
|
@@ -8471,12 +8471,12 @@ var G = class {
|
|
|
8471
8471
|
let f = s - 5;
|
|
8472
8472
|
e.beginPath(), e.moveTo(f, r), e.lineTo(f + 5, r - 5), e.lineTo(f + 5, r + 5), e.closePath(), e.fill(), e.fillStyle = "#FFFFFF", e.textBaseline = "middle", e.textAlign = "left", e.fillText(c, s + 5, r);
|
|
8473
8473
|
}
|
|
8474
|
-
},
|
|
8474
|
+
}, ci = class extends G {
|
|
8475
8475
|
config = null;
|
|
8476
8476
|
adapter = null;
|
|
8477
8477
|
aggregator = null;
|
|
8478
8478
|
reconnector;
|
|
8479
|
-
priceLine = new
|
|
8479
|
+
priceLine = new si();
|
|
8480
8480
|
state = "disconnected";
|
|
8481
8481
|
lastPrice = null;
|
|
8482
8482
|
previousClose = null;
|
|
@@ -8484,13 +8484,13 @@ var G = class {
|
|
|
8484
8484
|
heartbeatTimer = null;
|
|
8485
8485
|
lastMessageTime = 0;
|
|
8486
8486
|
constructor() {
|
|
8487
|
-
super(), this.reconnector = new
|
|
8487
|
+
super(), this.reconnector = new oi(), this.wireReconnector();
|
|
8488
8488
|
}
|
|
8489
8489
|
async connect(e) {
|
|
8490
8490
|
this.disconnect(), this.config = {
|
|
8491
8491
|
...a,
|
|
8492
8492
|
...e
|
|
8493
|
-
}, this.adapter = e.adapter, this.aggregator = new
|
|
8493
|
+
}, this.adapter = e.adapter, this.aggregator = new ai(e.timeframe), this.reconnector.removeAllListeners(), this.reconnector.stop(), this.reconnector = new oi(e.reconnect ?? r), this.wireReconnector(), this.aggregator.on("bar", (e) => {
|
|
8494
8494
|
this.emit("barUpdate", e), this.updatePrice(e.close);
|
|
8495
8495
|
}), this.aggregator.on("barClose", (e) => {
|
|
8496
8496
|
this.previousClose = e.close, this.emit("barClose", e);
|
|
@@ -8600,7 +8600,7 @@ var G = class {
|
|
|
8600
8600
|
dispose() {
|
|
8601
8601
|
this.disconnect(), this.removeAllListeners();
|
|
8602
8602
|
}
|
|
8603
|
-
},
|
|
8603
|
+
}, li = class extends G {
|
|
8604
8604
|
data;
|
|
8605
8605
|
speed;
|
|
8606
8606
|
index;
|
|
@@ -8687,7 +8687,7 @@ var G = class {
|
|
|
8687
8687
|
};
|
|
8688
8688
|
//#endregion
|
|
8689
8689
|
//#region src/realtime/adapters/binanceTypes.ts
|
|
8690
|
-
function
|
|
8690
|
+
function ui(e) {
|
|
8691
8691
|
if (!Array.isArray(e) || e.length < 6) return null;
|
|
8692
8692
|
let t = e[0];
|
|
8693
8693
|
if (typeof t != "number" || !Number.isFinite(t)) return null;
|
|
@@ -8701,8 +8701,8 @@ function li(e) {
|
|
|
8701
8701
|
volume: o
|
|
8702
8702
|
};
|
|
8703
8703
|
}
|
|
8704
|
-
function
|
|
8705
|
-
if (!
|
|
8704
|
+
function di(e) {
|
|
8705
|
+
if (!fi(e)) return null;
|
|
8706
8706
|
let t = e.t;
|
|
8707
8707
|
if (typeof t != "number" || !Number.isFinite(t)) return null;
|
|
8708
8708
|
let n = K(e.o), r = K(e.h), i = K(e.l), a = K(e.c), o = K(e.v);
|
|
@@ -8728,12 +8728,12 @@ function K(e) {
|
|
|
8728
8728
|
}
|
|
8729
8729
|
return null;
|
|
8730
8730
|
}
|
|
8731
|
-
function
|
|
8731
|
+
function fi(e) {
|
|
8732
8732
|
return typeof e == "object" && !!e;
|
|
8733
8733
|
}
|
|
8734
8734
|
//#endregion
|
|
8735
8735
|
//#region src/realtime/adapters/BinanceAdapter.ts
|
|
8736
|
-
var
|
|
8736
|
+
var pi = {
|
|
8737
8737
|
"1s": "1s",
|
|
8738
8738
|
"1m": "1m",
|
|
8739
8739
|
"3m": "3m",
|
|
@@ -8750,7 +8750,7 @@ var fi = {
|
|
|
8750
8750
|
"3d": "3d",
|
|
8751
8751
|
"1w": "1w",
|
|
8752
8752
|
"1M": "1M"
|
|
8753
|
-
},
|
|
8753
|
+
}, mi = class {
|
|
8754
8754
|
name = "binance";
|
|
8755
8755
|
ws = null;
|
|
8756
8756
|
state = "disconnected";
|
|
@@ -8771,13 +8771,13 @@ var fi = {
|
|
|
8771
8771
|
return this.state;
|
|
8772
8772
|
}
|
|
8773
8773
|
async fetchHistory(e, t, n = 500) {
|
|
8774
|
-
let r =
|
|
8774
|
+
let r = pi[t] ?? "15m", i = `${this.restBase}/klines?symbol=${e}&interval=${r}&limit=${n}`, a = await fetch(i);
|
|
8775
8775
|
if (!a.ok) throw Error(`Binance REST error: ${a.status}`);
|
|
8776
8776
|
let o = await a.json();
|
|
8777
8777
|
if (!Array.isArray(o)) return [];
|
|
8778
8778
|
let s = [];
|
|
8779
8779
|
for (let e of o) {
|
|
8780
|
-
let t =
|
|
8780
|
+
let t = ui(e);
|
|
8781
8781
|
t && s.push(t);
|
|
8782
8782
|
}
|
|
8783
8783
|
return s;
|
|
@@ -8794,7 +8794,7 @@ var fi = {
|
|
|
8794
8794
|
}
|
|
8795
8795
|
connectWs() {
|
|
8796
8796
|
if (!this.config) return;
|
|
8797
|
-
let e = `${this.config.symbol.toLowerCase()}@kline_${
|
|
8797
|
+
let e = `${this.config.symbol.toLowerCase()}@kline_${pi[this.config.timeframe] ?? "15m"}`, t = `${this.wsBase}/${e}`;
|
|
8798
8798
|
this.setState("connecting");
|
|
8799
8799
|
try {
|
|
8800
8800
|
this.ws = new WebSocket(t);
|
|
@@ -8819,7 +8819,7 @@ var fi = {
|
|
|
8819
8819
|
};
|
|
8820
8820
|
}
|
|
8821
8821
|
handleKline(e) {
|
|
8822
|
-
let t =
|
|
8822
|
+
let t = di(e);
|
|
8823
8823
|
if (!t) return;
|
|
8824
8824
|
let { bar: n, closed: r } = t;
|
|
8825
8825
|
this.emitEvent("bar", {
|
|
@@ -8845,7 +8845,7 @@ var fi = {
|
|
|
8845
8845
|
for (let e of n) e(r);
|
|
8846
8846
|
}
|
|
8847
8847
|
}
|
|
8848
|
-
},
|
|
8848
|
+
}, hi = class {
|
|
8849
8849
|
name = "mock";
|
|
8850
8850
|
state = "disconnected";
|
|
8851
8851
|
listeners = /* @__PURE__ */ new Map();
|
|
@@ -8885,7 +8885,7 @@ var fi = {
|
|
|
8885
8885
|
this.disconnect(), this.listeners.clear();
|
|
8886
8886
|
}
|
|
8887
8887
|
generateHistory(e, t) {
|
|
8888
|
-
let n = [], r = Date.now(), i =
|
|
8888
|
+
let n = [], r = Date.now(), i = S(e), a = this.options.basePrice, o = this.options.volatility / 100;
|
|
8889
8889
|
for (let e = t - 1; e >= 0; e--) {
|
|
8890
8890
|
let t = r - e * i, s = (Math.random() - .48) * a * o, c = a;
|
|
8891
8891
|
a += s;
|
|
@@ -8908,7 +8908,7 @@ var fi = {
|
|
|
8908
8908
|
if (this.state !== "connected" || !this.config) return;
|
|
8909
8909
|
let e = this.options.volatility / 100, t = (Math.random() - .48) * this.currentPrice * e * .3;
|
|
8910
8910
|
this.currentPrice += t;
|
|
8911
|
-
let n = Date.now(), r =
|
|
8911
|
+
let n = Date.now(), r = S(this.config.timeframe), i = {
|
|
8912
8912
|
time: Math.floor(n / r) * r,
|
|
8913
8913
|
open: this.currentPrice - t,
|
|
8914
8914
|
high: Math.max(this.currentPrice, this.currentPrice - t) + Math.abs(t) * .2,
|
|
@@ -8940,7 +8940,7 @@ var fi = {
|
|
|
8940
8940
|
for (let e of n) e(r);
|
|
8941
8941
|
}
|
|
8942
8942
|
}
|
|
8943
|
-
},
|
|
8943
|
+
}, gi = class {
|
|
8944
8944
|
name;
|
|
8945
8945
|
ws = null;
|
|
8946
8946
|
state = "disconnected";
|
|
@@ -9054,7 +9054,7 @@ var fi = {
|
|
|
9054
9054
|
for (let e of n) e(r);
|
|
9055
9055
|
}
|
|
9056
9056
|
}
|
|
9057
|
-
},
|
|
9057
|
+
}, _i = class {
|
|
9058
9058
|
name;
|
|
9059
9059
|
state = "disconnected";
|
|
9060
9060
|
listeners = /* @__PURE__ */ new Map();
|
|
@@ -9155,7 +9155,7 @@ function J(e) {
|
|
|
9155
9155
|
}
|
|
9156
9156
|
//#endregion
|
|
9157
9157
|
//#region src/realtime/adapters/CoinbaseAdapter.ts
|
|
9158
|
-
var
|
|
9158
|
+
var vi = {
|
|
9159
9159
|
"1m": 60,
|
|
9160
9160
|
"5m": 300,
|
|
9161
9161
|
"15m": 900,
|
|
@@ -9163,35 +9163,35 @@ var _i = {
|
|
|
9163
9163
|
"6h": 21600,
|
|
9164
9164
|
"1d": 86400
|
|
9165
9165
|
};
|
|
9166
|
-
function
|
|
9167
|
-
return
|
|
9166
|
+
function yi(e) {
|
|
9167
|
+
return vi[e] ?? 3600;
|
|
9168
9168
|
}
|
|
9169
|
-
var
|
|
9169
|
+
var bi = class extends _i {
|
|
9170
9170
|
constructor(e = {}) {
|
|
9171
9171
|
let t = e.restBase ?? "https://api.exchange.coinbase.com";
|
|
9172
9172
|
super({
|
|
9173
9173
|
name: "coinbase",
|
|
9174
9174
|
intervalMs: e.intervalMs ?? 5e3,
|
|
9175
9175
|
pollLimit: 2,
|
|
9176
|
-
fetchBars: (e, n) =>
|
|
9176
|
+
fetchBars: (e, n) => xi(t, e, n)
|
|
9177
9177
|
});
|
|
9178
9178
|
}
|
|
9179
9179
|
};
|
|
9180
|
-
async function
|
|
9181
|
-
let r = `${e}/products/${t}/candles?granularity=${
|
|
9180
|
+
async function xi(e, t, n) {
|
|
9181
|
+
let r = `${e}/products/${t}/candles?granularity=${yi(n)}`, i = await fetch(r);
|
|
9182
9182
|
if (!i.ok) throw Error(`Coinbase REST error: ${i.status}`);
|
|
9183
|
-
return
|
|
9183
|
+
return Si(await i.json());
|
|
9184
9184
|
}
|
|
9185
|
-
function
|
|
9185
|
+
function Si(e) {
|
|
9186
9186
|
if (!Array.isArray(e)) return [];
|
|
9187
9187
|
let t = [];
|
|
9188
9188
|
for (let n of e) {
|
|
9189
|
-
let e =
|
|
9189
|
+
let e = Ci(n);
|
|
9190
9190
|
e && t.push(e);
|
|
9191
9191
|
}
|
|
9192
9192
|
return t.sort((e, t) => e.time - t.time), t;
|
|
9193
9193
|
}
|
|
9194
|
-
function
|
|
9194
|
+
function Ci(e) {
|
|
9195
9195
|
if (!Array.isArray(e) || e.length < 6) return null;
|
|
9196
9196
|
let t = q(e[0]), n = q(e[1]), r = q(e[2]), i = q(e[3]), a = q(e[4]), o = q(e[5]);
|
|
9197
9197
|
return t === null || n === null || r === null || i === null || a === null || o === null ? null : {
|
|
@@ -9205,7 +9205,7 @@ function Si(e) {
|
|
|
9205
9205
|
}
|
|
9206
9206
|
//#endregion
|
|
9207
9207
|
//#region src/realtime/adapters/BybitAdapter.ts
|
|
9208
|
-
var
|
|
9208
|
+
var wi = {
|
|
9209
9209
|
"1m": "1",
|
|
9210
9210
|
"3m": "3",
|
|
9211
9211
|
"5m": "5",
|
|
@@ -9220,10 +9220,10 @@ var Ci = {
|
|
|
9220
9220
|
"1w": "W",
|
|
9221
9221
|
"1M": "M"
|
|
9222
9222
|
};
|
|
9223
|
-
function
|
|
9224
|
-
return
|
|
9223
|
+
function Ti(e) {
|
|
9224
|
+
return wi[e] ?? "1";
|
|
9225
9225
|
}
|
|
9226
|
-
var
|
|
9226
|
+
var Ei = class extends gi {
|
|
9227
9227
|
constructor(e = {}) {
|
|
9228
9228
|
let t = e.restBase ?? "https://api.bybit.com", n = e.wsBase ?? "wss://stream.bybit.com/v5/public/spot", r = e.category ?? "spot";
|
|
9229
9229
|
super({
|
|
@@ -9231,18 +9231,18 @@ var Ti = class extends hi {
|
|
|
9231
9231
|
wsUrl: () => n,
|
|
9232
9232
|
subscribeMessage: (e) => ({
|
|
9233
9233
|
op: "subscribe",
|
|
9234
|
-
args: [`kline.${
|
|
9234
|
+
args: [`kline.${Ti(e.timeframe)}.${e.symbol}`]
|
|
9235
9235
|
}),
|
|
9236
9236
|
unsubscribeMessage: (e) => ({
|
|
9237
9237
|
op: "unsubscribe",
|
|
9238
|
-
args: [`kline.${
|
|
9238
|
+
args: [`kline.${Ti(e.timeframe)}.${e.symbol}`]
|
|
9239
9239
|
}),
|
|
9240
|
-
parseMessage:
|
|
9241
|
-
fetchHistory: (e, n, i) =>
|
|
9240
|
+
parseMessage: Di,
|
|
9241
|
+
fetchHistory: (e, n, i) => Oi(t, r, e, n, i)
|
|
9242
9242
|
});
|
|
9243
9243
|
}
|
|
9244
9244
|
};
|
|
9245
|
-
function
|
|
9245
|
+
function Di(e) {
|
|
9246
9246
|
if (!J(e) || typeof e.topic != "string" || !e.topic.startsWith("kline.")) return null;
|
|
9247
9247
|
let t = e.data;
|
|
9248
9248
|
if (!Array.isArray(t) || t.length === 0) return null;
|
|
@@ -9263,23 +9263,23 @@ function Ei(e) {
|
|
|
9263
9263
|
closed: l
|
|
9264
9264
|
};
|
|
9265
9265
|
}
|
|
9266
|
-
async function
|
|
9267
|
-
let a = `${e}/v5/market/kline?category=${t}&symbol=${n}&interval=${
|
|
9266
|
+
async function Oi(e, t, n, r, i) {
|
|
9267
|
+
let a = `${e}/v5/market/kline?category=${t}&symbol=${n}&interval=${Ti(r)}&limit=${Math.min(Math.max(i, 1), 1e3)}`, o = await fetch(a);
|
|
9268
9268
|
if (!o.ok) throw Error(`Bybit REST error: ${o.status}`);
|
|
9269
|
-
return
|
|
9269
|
+
return ki(await o.json());
|
|
9270
9270
|
}
|
|
9271
|
-
function
|
|
9271
|
+
function ki(e) {
|
|
9272
9272
|
if (!J(e) || !J(e.result)) return [];
|
|
9273
9273
|
let t = e.result.list;
|
|
9274
9274
|
if (!Array.isArray(t)) return [];
|
|
9275
9275
|
let n = [];
|
|
9276
9276
|
for (let e of t) {
|
|
9277
|
-
let t =
|
|
9277
|
+
let t = Ai(e);
|
|
9278
9278
|
t && n.push(t);
|
|
9279
9279
|
}
|
|
9280
9280
|
return n.sort((e, t) => e.time - t.time), n;
|
|
9281
9281
|
}
|
|
9282
|
-
function
|
|
9282
|
+
function Ai(e) {
|
|
9283
9283
|
if (!Array.isArray(e) || e.length < 6) return null;
|
|
9284
9284
|
let t = q(e[0]), n = q(e[1]), r = q(e[2]), i = q(e[3]), a = q(e[4]), o = q(e[5]);
|
|
9285
9285
|
return t === null || n === null || r === null || i === null || a === null || o === null ? null : {
|
|
@@ -9293,7 +9293,7 @@ function ki(e) {
|
|
|
9293
9293
|
}
|
|
9294
9294
|
//#endregion
|
|
9295
9295
|
//#region src/realtime/adapters/KrakenAdapter.ts
|
|
9296
|
-
var
|
|
9296
|
+
var ji = {
|
|
9297
9297
|
"1m": 1,
|
|
9298
9298
|
"5m": 5,
|
|
9299
9299
|
"15m": 15,
|
|
@@ -9303,10 +9303,10 @@ var Ai = {
|
|
|
9303
9303
|
"1d": 1440,
|
|
9304
9304
|
"1w": 10080
|
|
9305
9305
|
};
|
|
9306
|
-
function
|
|
9307
|
-
return
|
|
9306
|
+
function Mi(e) {
|
|
9307
|
+
return ji[e] ?? 1;
|
|
9308
9308
|
}
|
|
9309
|
-
var
|
|
9309
|
+
var Ni = class extends gi {
|
|
9310
9310
|
constructor(e = {}) {
|
|
9311
9311
|
let t = e.restBase ?? "https://api.kraken.com", n = e.wsBase ?? "wss://ws.kraken.com/v2";
|
|
9312
9312
|
super({
|
|
@@ -9317,7 +9317,7 @@ var Mi = class extends hi {
|
|
|
9317
9317
|
params: {
|
|
9318
9318
|
channel: "ohlc",
|
|
9319
9319
|
symbol: [e.symbol],
|
|
9320
|
-
interval:
|
|
9320
|
+
interval: Mi(e.timeframe)
|
|
9321
9321
|
}
|
|
9322
9322
|
}),
|
|
9323
9323
|
unsubscribeMessage: (e) => ({
|
|
@@ -9325,15 +9325,15 @@ var Mi = class extends hi {
|
|
|
9325
9325
|
params: {
|
|
9326
9326
|
channel: "ohlc",
|
|
9327
9327
|
symbol: [e.symbol],
|
|
9328
|
-
interval:
|
|
9328
|
+
interval: Mi(e.timeframe)
|
|
9329
9329
|
}
|
|
9330
9330
|
}),
|
|
9331
|
-
parseMessage:
|
|
9332
|
-
fetchHistory: (e, n) =>
|
|
9331
|
+
parseMessage: Pi,
|
|
9332
|
+
fetchHistory: (e, n) => Fi(t, e, n)
|
|
9333
9333
|
});
|
|
9334
9334
|
}
|
|
9335
9335
|
};
|
|
9336
|
-
function
|
|
9336
|
+
function Pi(e) {
|
|
9337
9337
|
if (!J(e) || e.channel !== "ohlc") return null;
|
|
9338
9338
|
let t = e.data;
|
|
9339
9339
|
if (!Array.isArray(t) || t.length === 0) return null;
|
|
@@ -9352,12 +9352,12 @@ function Ni(e) {
|
|
|
9352
9352
|
closed: !1
|
|
9353
9353
|
};
|
|
9354
9354
|
}
|
|
9355
|
-
async function
|
|
9356
|
-
let r =
|
|
9355
|
+
async function Fi(e, t, n) {
|
|
9356
|
+
let r = Mi(n), i = t.replace("/", ""), a = `${e}/0/public/OHLC?pair=${encodeURIComponent(i)}&interval=${r}`, o = await fetch(a);
|
|
9357
9357
|
if (!o.ok) throw Error(`Kraken REST error: ${o.status}`);
|
|
9358
|
-
return
|
|
9358
|
+
return Ii(await o.json());
|
|
9359
9359
|
}
|
|
9360
|
-
function
|
|
9360
|
+
function Ii(e) {
|
|
9361
9361
|
if (!J(e) || !J(e.result)) return [];
|
|
9362
9362
|
let t = null;
|
|
9363
9363
|
for (let [n, r] of Object.entries(e.result)) if (n !== "last" && Array.isArray(r)) {
|
|
@@ -9367,12 +9367,12 @@ function Fi(e) {
|
|
|
9367
9367
|
if (!Array.isArray(t)) return [];
|
|
9368
9368
|
let n = [];
|
|
9369
9369
|
for (let e of t) {
|
|
9370
|
-
let t =
|
|
9370
|
+
let t = Li(e);
|
|
9371
9371
|
t && n.push(t);
|
|
9372
9372
|
}
|
|
9373
9373
|
return n.sort((e, t) => e.time - t.time), n;
|
|
9374
9374
|
}
|
|
9375
|
-
function
|
|
9375
|
+
function Li(e) {
|
|
9376
9376
|
if (!Array.isArray(e) || e.length < 7) return null;
|
|
9377
9377
|
let t = q(e[0]), n = q(e[1]), r = q(e[2]), i = q(e[3]), a = q(e[4]), o = q(e[6]);
|
|
9378
9378
|
return t === null || n === null || r === null || i === null || a === null || o === null ? null : {
|
|
@@ -9386,7 +9386,7 @@ function Ii(e) {
|
|
|
9386
9386
|
}
|
|
9387
9387
|
//#endregion
|
|
9388
9388
|
//#region src/ui/ChartLegend.ts
|
|
9389
|
-
var
|
|
9389
|
+
var Ri = {
|
|
9390
9390
|
visible: !0,
|
|
9391
9391
|
showSymbol: !0,
|
|
9392
9392
|
showOHLC: !0,
|
|
@@ -9394,8 +9394,8 @@ var Li = {
|
|
|
9394
9394
|
showVolume: !0,
|
|
9395
9395
|
position: "top-left",
|
|
9396
9396
|
fontSize: 12
|
|
9397
|
-
},
|
|
9398
|
-
config = { ...
|
|
9397
|
+
}, zi = class {
|
|
9398
|
+
config = { ...Ri };
|
|
9399
9399
|
symbol = "";
|
|
9400
9400
|
timeframe = "";
|
|
9401
9401
|
hoverBar = null;
|
|
@@ -9486,7 +9486,7 @@ var Li = {
|
|
|
9486
9486
|
}
|
|
9487
9487
|
}
|
|
9488
9488
|
}
|
|
9489
|
-
},
|
|
9489
|
+
}, Bi = class {
|
|
9490
9490
|
static toDataURL(e, t) {
|
|
9491
9491
|
let n = e.querySelectorAll("canvas");
|
|
9492
9492
|
if (n.length === 0) return "";
|
|
@@ -9508,7 +9508,7 @@ var Li = {
|
|
|
9508
9508
|
let i = document.createElement("a");
|
|
9509
9509
|
i.href = r, i.download = t, document.body.appendChild(i), i.click(), document.body.removeChild(i);
|
|
9510
9510
|
}
|
|
9511
|
-
},
|
|
9511
|
+
}, Vi = class {
|
|
9512
9512
|
config = null;
|
|
9513
9513
|
setConfig(e) {
|
|
9514
9514
|
this.config = e;
|
|
@@ -9518,7 +9518,7 @@ var Li = {
|
|
|
9518
9518
|
let { chartRect: r } = t, i = this.config.fontSize ?? 48, a = this.config.color ?? n.textSecondary;
|
|
9519
9519
|
e.save(), e.globalAlpha = .07, e.font = `bold ${i}px ${n.font.family}`, e.fillStyle = a, e.textAlign = "center", e.textBaseline = "middle", e.fillText(this.config.text, r.x + r.width / 2, r.y + r.height / 2), e.restore();
|
|
9520
9520
|
}
|
|
9521
|
-
},
|
|
9521
|
+
}, Hi = class {
|
|
9522
9522
|
visible = !0;
|
|
9523
9523
|
timeframeMs = 0;
|
|
9524
9524
|
setVisible(e) {
|
|
@@ -9534,14 +9534,14 @@ var Li = {
|
|
|
9534
9534
|
if (!this.visible || this.timeframeMs <= 0 || r.length === 0) return;
|
|
9535
9535
|
let i = r[r.length - 1], a = (i.time > 0xe8d4a51000 ? i.time : i.time * 1e3) + this.timeframeMs - Date.now();
|
|
9536
9536
|
if (a <= 0) return;
|
|
9537
|
-
let o = this.formatRemaining(a), s =
|
|
9537
|
+
let o = this.formatRemaining(a), s = k(r.length - 1, t), c = t.chartRect.y + t.chartRect.height - 4;
|
|
9538
9538
|
s < t.chartRect.x || s > t.chartRect.x + t.chartRect.width || (e.font = `${n.font.sizeSmall}px ${n.font.family}`, e.textBaseline = "bottom", e.textAlign = "center", e.fillStyle = n.textSecondary, e.fillText(o, s, c));
|
|
9539
9539
|
}
|
|
9540
9540
|
formatRemaining(e) {
|
|
9541
9541
|
let t = Math.ceil(e / 1e3), n = Math.floor(t / 3600), r = Math.floor(t % 3600 / 60), i = t % 60;
|
|
9542
9542
|
return n > 0 ? `${n}:${String(r).padStart(2, "0")}:${String(i).padStart(2, "0")}` : `${r}:${String(i).padStart(2, "0")}`;
|
|
9543
9543
|
}
|
|
9544
|
-
},
|
|
9544
|
+
}, Ui = class {
|
|
9545
9545
|
config = { visible: !1 };
|
|
9546
9546
|
cachedBreaksTyped = [];
|
|
9547
9547
|
lastDataLength = 0;
|
|
@@ -9588,21 +9588,21 @@ var Li = {
|
|
|
9588
9588
|
render(e, t, n, r) {
|
|
9589
9589
|
if (!this.config.visible || r.length < 2) return;
|
|
9590
9590
|
let i = this.computeBreaksTyped(r);
|
|
9591
|
-
if (i.length === 0 ||
|
|
9591
|
+
if (i.length === 0 || qi(r) >= 1380 * 60 * 1e3) return;
|
|
9592
9592
|
let { chartRect: a } = t, o = this.config.color ?? n.axisLine, s = this.config.lineWidth ?? 1, c = this.config.lineStyle ?? "dashed";
|
|
9593
9593
|
e.save(), c === "dashed" ? e.setLineDash([6, 4]) : c === "dotted" && e.setLineDash([2, 3]), e.font = `600 11px ${n.font.family}`, e.textBaseline = "top", e.textAlign = "left";
|
|
9594
9594
|
for (let r of i) {
|
|
9595
|
-
let i =
|
|
9595
|
+
let i = k(r.idx, t) - (t.barWidth + t.barSpacing) / 2;
|
|
9596
9596
|
if (i < a.x - 1 || i > a.x + a.width + 1) continue;
|
|
9597
9597
|
let c = Math.round(i) + .5, l = .25, u = s, d = null;
|
|
9598
|
-
r.kind === "day" ? l = .22 : r.kind === "week" ? (l = .34, d =
|
|
9598
|
+
r.kind === "day" ? l = .22 : r.kind === "week" ? (l = .34, d = Gi(r.date)) : r.kind === "month" ? (l = .5, u = s + .5, d = Ki(r.date)) : (l = .7, u = s + 1, d = String(r.date.getFullYear())), e.globalAlpha = l, e.strokeStyle = o, e.lineWidth = u, e.beginPath(), e.moveTo(c, a.y), e.lineTo(c, a.y + a.height), e.stroke(), d && (e.globalAlpha = Math.min(1, l + .35), e.fillStyle = n.textSecondary, e.fillText(d, c + 4, a.y + 4));
|
|
9599
9599
|
}
|
|
9600
9600
|
e.restore();
|
|
9601
9601
|
}
|
|
9602
9602
|
invalidateCache() {
|
|
9603
9603
|
this.lastDataLength = 0, this.cachedBreaksTyped = [];
|
|
9604
9604
|
}
|
|
9605
|
-
},
|
|
9605
|
+
}, Wi = [
|
|
9606
9606
|
"Jan",
|
|
9607
9607
|
"Feb",
|
|
9608
9608
|
"Mar",
|
|
@@ -9616,13 +9616,13 @@ var Li = {
|
|
|
9616
9616
|
"Nov",
|
|
9617
9617
|
"Dec"
|
|
9618
9618
|
];
|
|
9619
|
-
function Wi(e) {
|
|
9620
|
-
return `${Ui[e.getMonth()]} ${e.getDate()}`;
|
|
9621
|
-
}
|
|
9622
9619
|
function Gi(e) {
|
|
9623
|
-
return `${
|
|
9620
|
+
return `${Wi[e.getMonth()]} ${e.getDate()}`;
|
|
9624
9621
|
}
|
|
9625
9622
|
function Ki(e) {
|
|
9623
|
+
return `${Wi[e.getMonth()]} ${String(e.getFullYear()).slice(-2)}`;
|
|
9624
|
+
}
|
|
9625
|
+
function qi(e) {
|
|
9626
9626
|
if (e.length < 2) return 0;
|
|
9627
9627
|
let t = Math.min(50, e.length - 1), n = [];
|
|
9628
9628
|
for (let r = 1; r <= t; r++) {
|
|
@@ -9633,24 +9633,24 @@ function Ki(e) {
|
|
|
9633
9633
|
}
|
|
9634
9634
|
//#endregion
|
|
9635
9635
|
//#region src/ui/sessionHours.ts
|
|
9636
|
-
var
|
|
9637
|
-
function
|
|
9638
|
-
let n = ((e + t * 6e4) %
|
|
9636
|
+
var Ji = 864e5;
|
|
9637
|
+
function Yi(e, t) {
|
|
9638
|
+
let n = ((e + t * 6e4) % Ji + Ji) % Ji;
|
|
9639
9639
|
return Math.floor(n / 6e4);
|
|
9640
9640
|
}
|
|
9641
|
-
function
|
|
9642
|
-
let n =
|
|
9641
|
+
function Xi(e, t) {
|
|
9642
|
+
let n = Yi(e, t.tzOffsetMinutes), { startMinute: r, endMinute: i } = t;
|
|
9643
9643
|
return r === i ? !0 : r < i ? n >= r && n < i : n >= r || n < i;
|
|
9644
9644
|
}
|
|
9645
9645
|
//#endregion
|
|
9646
9646
|
//#region src/ui/SessionShading.ts
|
|
9647
|
-
var
|
|
9647
|
+
var Zi = {
|
|
9648
9648
|
startMinute: 570,
|
|
9649
9649
|
endMinute: 960,
|
|
9650
9650
|
tzOffsetMinutes: -300
|
|
9651
|
-
},
|
|
9651
|
+
}, Qi = class {
|
|
9652
9652
|
visible = !1;
|
|
9653
|
-
config = { ...
|
|
9653
|
+
config = { ...Zi };
|
|
9654
9654
|
setVisible(e) {
|
|
9655
9655
|
this.visible = e;
|
|
9656
9656
|
}
|
|
@@ -9673,16 +9673,16 @@ var Xi = {
|
|
|
9673
9673
|
let l = n.barWidth + n.barSpacing, u = r.name === "light";
|
|
9674
9674
|
e.save(), e.fillStyle = u ? "rgba(0,0,0,0.045)" : "rgba(0,0,0,0.28)";
|
|
9675
9675
|
let d = -1, f = (t, r) => {
|
|
9676
|
-
let a =
|
|
9676
|
+
let a = k(t, n) - l / 2, o = k(r, n) + l / 2;
|
|
9677
9677
|
e.fillRect(a, i.y, o - a, i.height);
|
|
9678
9678
|
};
|
|
9679
9679
|
for (let e = s; e <= c; e++) {
|
|
9680
|
-
let n = !
|
|
9680
|
+
let n = !Xi(t[e].time, this.config);
|
|
9681
9681
|
n && d === -1 ? d = e : !n && d !== -1 && (f(d, e - 1), d = -1);
|
|
9682
9682
|
}
|
|
9683
9683
|
d !== -1 && f(d, c), e.restore();
|
|
9684
9684
|
}
|
|
9685
|
-
},
|
|
9685
|
+
}, $i = 1, ea = class extends G {
|
|
9686
9686
|
alerts = [];
|
|
9687
9687
|
lastValues = /* @__PURE__ */ new Map();
|
|
9688
9688
|
requestRender = null;
|
|
@@ -9694,7 +9694,7 @@ var Xi = {
|
|
|
9694
9694
|
this.pricePrecision = e;
|
|
9695
9695
|
}
|
|
9696
9696
|
addAlert(e, t = "crossing", n, r = !1, i = "price", a) {
|
|
9697
|
-
let o = `tc_alert_${
|
|
9697
|
+
let o = `tc_alert_${$i++}`, s = {
|
|
9698
9698
|
id: o,
|
|
9699
9699
|
price: e,
|
|
9700
9700
|
condition: t,
|
|
@@ -9718,7 +9718,7 @@ var Xi = {
|
|
|
9718
9718
|
let i = null, a = n;
|
|
9719
9719
|
for (let n of this.alerts) {
|
|
9720
9720
|
if (n.channel !== "price") continue;
|
|
9721
|
-
let r = Math.abs(
|
|
9721
|
+
let r = Math.abs(A(n.price, t) - e.y);
|
|
9722
9722
|
r <= a && (a = r, i = n);
|
|
9723
9723
|
}
|
|
9724
9724
|
return i;
|
|
@@ -9795,7 +9795,7 @@ var Xi = {
|
|
|
9795
9795
|
let { chartRect: r } = t;
|
|
9796
9796
|
for (let i of this.alerts) {
|
|
9797
9797
|
if (i.channel !== "price") continue;
|
|
9798
|
-
let a =
|
|
9798
|
+
let a = A(i.price, t);
|
|
9799
9799
|
if (a < r.y || a > r.y + r.height) continue;
|
|
9800
9800
|
let o = i.triggered ? "#FF9800" : "#FFD700";
|
|
9801
9801
|
e.setLineDash([2, 6]), e.strokeStyle = o, e.lineWidth = 1, e.beginPath(), e.moveTo(r.x, Math.round(a) + .5), e.lineTo(r.x + r.width, Math.round(a) + .5), e.stroke(), e.setLineDash([]), e.font = `10px ${n.font.family}`, e.fillStyle = o, e.textBaseline = "bottom", e.textAlign = "right";
|
|
@@ -9803,7 +9803,7 @@ var Xi = {
|
|
|
9803
9803
|
e.fillText(s, r.x + r.width - 4, a - 2);
|
|
9804
9804
|
}
|
|
9805
9805
|
}
|
|
9806
|
-
},
|
|
9806
|
+
}, ta = class extends G {
|
|
9807
9807
|
data = [];
|
|
9808
9808
|
currentIndex = 0;
|
|
9809
9809
|
timer = null;
|
|
@@ -9872,13 +9872,13 @@ function X(e) {
|
|
|
9872
9872
|
function Z(e) {
|
|
9873
9873
|
return Array.isArray(e) ? e : [];
|
|
9874
9874
|
}
|
|
9875
|
-
function
|
|
9875
|
+
function na(e, t) {
|
|
9876
9876
|
return typeof e == "string" ? e : t;
|
|
9877
9877
|
}
|
|
9878
|
-
function
|
|
9878
|
+
function ra(e, t) {
|
|
9879
9879
|
return typeof e == "number" && Number.isFinite(e) ? e : t;
|
|
9880
9880
|
}
|
|
9881
|
-
function
|
|
9881
|
+
function ia(e) {
|
|
9882
9882
|
if (!X(e) || typeof e.id != "string" || typeof e.type != "string" || !Array.isArray(e.anchors) || e.anchors.length === 0 || !X(e.style)) return null;
|
|
9883
9883
|
let t = [];
|
|
9884
9884
|
for (let n of e.anchors) {
|
|
@@ -9899,14 +9899,14 @@ function ra(e) {
|
|
|
9899
9899
|
meta: X(e.meta) ? e.meta : void 0
|
|
9900
9900
|
};
|
|
9901
9901
|
}
|
|
9902
|
-
function
|
|
9902
|
+
function aa(e) {
|
|
9903
9903
|
return !X(e) || typeof e.id != "string" || typeof e.side != "string" || typeof e.type != "string" || typeof e.price != "number" || typeof e.quantity != "number" ? null : e;
|
|
9904
9904
|
}
|
|
9905
|
-
function
|
|
9905
|
+
function oa(e) {
|
|
9906
9906
|
return !X(e) || typeof e.id != "string" || typeof e.side != "string" || typeof e.entryPrice != "number" || typeof e.quantity != "number" ? null : e;
|
|
9907
9907
|
}
|
|
9908
|
-
function
|
|
9909
|
-
if (!X(e)) return
|
|
9908
|
+
function sa(e) {
|
|
9909
|
+
if (!X(e)) return ca();
|
|
9910
9910
|
typeof e.version == "number" && e.version !== Y && console.warn(`Chart state version mismatch: ${e.version} vs ${Y}`);
|
|
9911
9911
|
let t = X(e.viewport) ? e.viewport : {}, n = [];
|
|
9912
9912
|
for (let t of Z(e.indicators)) X(t) && (typeof t.id != "string" || typeof t.instanceId != "string" || X(t.params) && n.push({
|
|
@@ -9917,31 +9917,31 @@ function oa(e) {
|
|
|
9917
9917
|
}));
|
|
9918
9918
|
let r = [];
|
|
9919
9919
|
for (let t of Z(e.drawings)) {
|
|
9920
|
-
let e =
|
|
9920
|
+
let e = ia(t);
|
|
9921
9921
|
e && r.push(e);
|
|
9922
9922
|
}
|
|
9923
9923
|
let i = [];
|
|
9924
9924
|
for (let t of Z(e.orders)) {
|
|
9925
|
-
let e =
|
|
9925
|
+
let e = aa(t);
|
|
9926
9926
|
e && i.push(e);
|
|
9927
9927
|
}
|
|
9928
9928
|
let a = [];
|
|
9929
9929
|
for (let t of Z(e.positions)) {
|
|
9930
|
-
let e =
|
|
9930
|
+
let e = oa(t);
|
|
9931
9931
|
e && a.push(e);
|
|
9932
9932
|
}
|
|
9933
9933
|
let o = [];
|
|
9934
9934
|
for (let t of Z(e.alerts)) X(t) && typeof t.id == "string" && o.push(t);
|
|
9935
9935
|
return {
|
|
9936
9936
|
version: typeof e.version == "number" ? e.version : Y,
|
|
9937
|
-
timestamp:
|
|
9937
|
+
timestamp: ra(e.timestamp, Date.now()),
|
|
9938
9938
|
symbol: typeof e.symbol == "string" ? e.symbol : void 0,
|
|
9939
9939
|
timeframe: typeof e.timeframe == "string" ? e.timeframe : void 0,
|
|
9940
|
-
chartType:
|
|
9940
|
+
chartType: na(e.chartType, "candlestick"),
|
|
9941
9941
|
viewport: {
|
|
9942
|
-
barWidth:
|
|
9943
|
-
barSpacing:
|
|
9944
|
-
offset:
|
|
9942
|
+
barWidth: ra(t.barWidth, 8),
|
|
9943
|
+
barSpacing: ra(t.barSpacing, 2),
|
|
9944
|
+
offset: ra(t.offset, 0)
|
|
9945
9945
|
},
|
|
9946
9946
|
theme: typeof e.theme == "string" ? e.theme : void 0,
|
|
9947
9947
|
locale: typeof e.locale == "string" ? e.locale : void 0,
|
|
@@ -9952,7 +9952,7 @@ function oa(e) {
|
|
|
9952
9952
|
alerts: o
|
|
9953
9953
|
};
|
|
9954
9954
|
}
|
|
9955
|
-
function
|
|
9955
|
+
function ca() {
|
|
9956
9956
|
return {
|
|
9957
9957
|
version: Y,
|
|
9958
9958
|
timestamp: Date.now(),
|
|
@@ -9969,7 +9969,7 @@ function sa() {
|
|
|
9969
9969
|
alerts: []
|
|
9970
9970
|
};
|
|
9971
9971
|
}
|
|
9972
|
-
var
|
|
9972
|
+
var la = class {
|
|
9973
9973
|
static capture(e, t) {
|
|
9974
9974
|
return {
|
|
9975
9975
|
version: Y,
|
|
@@ -9994,7 +9994,7 @@ var ca = class {
|
|
|
9994
9994
|
return JSON.stringify(e);
|
|
9995
9995
|
}
|
|
9996
9996
|
static deserialize(e) {
|
|
9997
|
-
return
|
|
9997
|
+
return sa(JSON.parse(e));
|
|
9998
9998
|
}
|
|
9999
9999
|
static saveToStorage(e, t) {
|
|
10000
10000
|
localStorage.setItem(e, this.serialize(t));
|
|
@@ -10021,7 +10021,7 @@ var ca = class {
|
|
|
10021
10021
|
}, n.click();
|
|
10022
10022
|
});
|
|
10023
10023
|
}
|
|
10024
|
-
},
|
|
10024
|
+
}, ua = class {
|
|
10025
10025
|
undoStack = [];
|
|
10026
10026
|
redoStack = [];
|
|
10027
10027
|
maxHistory = 50;
|
|
@@ -10057,7 +10057,7 @@ var ca = class {
|
|
|
10057
10057
|
redoCount: this.redoStack.length
|
|
10058
10058
|
};
|
|
10059
10059
|
}
|
|
10060
|
-
},
|
|
10060
|
+
}, da = class {
|
|
10061
10061
|
static toCSV(e) {
|
|
10062
10062
|
return ["Time,Open,High,Low,Close,Volume", ...e.map((e) => `${new Date(e.time).toISOString()},${e.open},${e.high},${e.low},${e.close},${e.volume}`)].join("\n");
|
|
10063
10063
|
}
|
|
@@ -10075,7 +10075,7 @@ var ca = class {
|
|
|
10075
10075
|
let r = new Blob([e], { type: n }), i = URL.createObjectURL(r), a = document.createElement("a");
|
|
10076
10076
|
a.href = i, a.download = t, document.body.appendChild(a), a.click(), document.body.removeChild(a), URL.revokeObjectURL(i);
|
|
10077
10077
|
}
|
|
10078
|
-
},
|
|
10078
|
+
}, fa = 1, pa = class extends G {
|
|
10079
10079
|
markers = [];
|
|
10080
10080
|
style = { ...i };
|
|
10081
10081
|
requestRender = null;
|
|
@@ -10096,7 +10096,7 @@ var ca = class {
|
|
|
10096
10096
|
return { ...this.style };
|
|
10097
10097
|
}
|
|
10098
10098
|
addMarker(e) {
|
|
10099
|
-
let t = e.id ?? `tc_signal_${
|
|
10099
|
+
let t = e.id ?? `tc_signal_${fa++}`, n = {
|
|
10100
10100
|
...e,
|
|
10101
10101
|
id: t
|
|
10102
10102
|
};
|
|
@@ -10120,9 +10120,9 @@ var ca = class {
|
|
|
10120
10120
|
let { chartRect: i, visibleRange: a } = t, o = this.style, s = o.arrowSize ?? 12;
|
|
10121
10121
|
e.save(), e.beginPath(), e.rect(i.x, i.y, i.width, i.height), e.clip();
|
|
10122
10122
|
for (let c of this.markers) {
|
|
10123
|
-
let l =
|
|
10123
|
+
let l = N(c.time, r);
|
|
10124
10124
|
if (l < a.from - 1 || l > a.to + 1) continue;
|
|
10125
|
-
let u =
|
|
10125
|
+
let u = k(l, t), d = A(c.price, t);
|
|
10126
10126
|
if (u < i.x - s || u > i.x + i.width + s || d < i.y - s || d > i.y + i.height + s) continue;
|
|
10127
10127
|
let f = this.resolveColor(c, o), p = s * Math.max(.6, Math.min(1, c.confidence));
|
|
10128
10128
|
if (this.renderArrow(e, u, d, c.direction, p, f), o.showLabel && c.label) {
|
|
@@ -10150,7 +10150,7 @@ var ca = class {
|
|
|
10150
10150
|
renderArrow(e, t, n, r, i, a) {
|
|
10151
10151
|
e.fillStyle = a, e.beginPath(), r === "long" ? (e.moveTo(t, n - i), e.lineTo(t - i * .6, n), e.lineTo(t - i * .2, n), e.lineTo(t - i * .2, n + i * .4), e.lineTo(t + i * .2, n + i * .4), e.lineTo(t + i * .2, n), e.lineTo(t + i * .6, n)) : r === "short" ? (e.moveTo(t, n + i), e.lineTo(t - i * .6, n), e.lineTo(t - i * .2, n), e.lineTo(t - i * .2, n - i * .4), e.lineTo(t + i * .2, n - i * .4), e.lineTo(t + i * .2, n), e.lineTo(t + i * .6, n)) : e.arc(t, n, i * .4, 0, Math.PI * 2), e.closePath(), e.fill();
|
|
10152
10152
|
}
|
|
10153
|
-
},
|
|
10153
|
+
}, ma = 1, ha = class extends G {
|
|
10154
10154
|
zones = [];
|
|
10155
10155
|
style = { ...o };
|
|
10156
10156
|
requestRender = null;
|
|
@@ -10175,7 +10175,7 @@ var ca = class {
|
|
|
10175
10175
|
return { ...this.style };
|
|
10176
10176
|
}
|
|
10177
10177
|
addZone(e) {
|
|
10178
|
-
let t = e.id ?? `tc_zone_${
|
|
10178
|
+
let t = e.id ?? `tc_zone_${ma++}`, n = {
|
|
10179
10179
|
...e,
|
|
10180
10180
|
id: t
|
|
10181
10181
|
};
|
|
@@ -10209,11 +10209,11 @@ var ca = class {
|
|
|
10209
10209
|
e.restore();
|
|
10210
10210
|
}
|
|
10211
10211
|
renderZone(e, t, n, r, i, a) {
|
|
10212
|
-
let { chartRect: o, visibleRange: s } = r, c =
|
|
10212
|
+
let { chartRect: o, visibleRange: s } = r, c = N(t.entryTime, n), l = t.exitTime == null ? n.length - 1 : N(t.exitTime, n);
|
|
10213
10213
|
if (l < s.from || c > s.to) return;
|
|
10214
|
-
let u =
|
|
10214
|
+
let u = k(c, r), d = k(l, r), f = Math.max(o.x, Math.min(u, d)), p = Math.min(o.x + o.width, Math.max(u, d));
|
|
10215
10215
|
if (p - f < 1) return;
|
|
10216
|
-
let m =
|
|
10216
|
+
let m = A(t.entryPrice, r), h = t.exitPrice == null ? A(t.entryPrice, r) : A(t.exitPrice, r), g = Math.min(m, h), _ = Math.max(Math.max(m, h) - g, 2), v = t.exitTime == null, y = t.pnl == null ? t.direction === "long" ? (t.exitPrice ?? t.entryPrice) >= t.entryPrice : (t.exitPrice ?? t.entryPrice) <= t.entryPrice : t.pnl >= 0, b = v ? a.activeColor ?? "#2196F3" : y ? a.profitColor ?? "#26A69A" : a.lossColor ?? "#EF5350";
|
|
10217
10217
|
e.fillStyle = b, e.globalAlpha = a.fillOpacity ?? .12, e.fillRect(f, g, p - f, _), e.globalAlpha = 1;
|
|
10218
10218
|
let x = a.borderWidth ?? 1;
|
|
10219
10219
|
e.strokeStyle = b, e.lineWidth = x, e.setLineDash([]), e.beginPath(), e.moveTo(f, Math.round(m) + .5), e.lineTo(p, Math.round(m) + .5), e.stroke(), !v && t.exitPrice != null && (e.setLineDash([3, 3]), e.beginPath(), e.moveTo(f, Math.round(h) + .5), e.lineTo(p, Math.round(h) + .5), e.stroke(), e.setLineDash([]));
|
|
@@ -10226,7 +10226,7 @@ var ca = class {
|
|
|
10226
10226
|
}
|
|
10227
10227
|
a.showLabel && t.label && (e.font = `9px ${i.font.family}`, e.fillStyle = b, e.globalAlpha = .8, e.textBaseline = "top", e.textAlign = "left", e.fillText(t.label, f + 4, m + 3), e.globalAlpha = 1);
|
|
10228
10228
|
}
|
|
10229
|
-
},
|
|
10229
|
+
}, ga = class {
|
|
10230
10230
|
active = !1;
|
|
10231
10231
|
startBar = 0;
|
|
10232
10232
|
startPrice = 0;
|
|
@@ -10238,34 +10238,34 @@ var ca = class {
|
|
|
10238
10238
|
return this.active;
|
|
10239
10239
|
}
|
|
10240
10240
|
begin(e, t, n) {
|
|
10241
|
-
let r = Math.round(
|
|
10242
|
-
this.startBar = r, this.startPrice = i, this.endBar = r, this.endPrice = i, this.startTime =
|
|
10241
|
+
let r = Math.round(j(e.x, t)), i = M(e.y, t);
|
|
10242
|
+
this.startBar = r, this.startPrice = i, this.endBar = r, this.endPrice = i, this.startTime = _a(r, n), this.endTime = this.startTime, this.active = !0;
|
|
10243
10243
|
}
|
|
10244
10244
|
update(e, t, n) {
|
|
10245
10245
|
if (!this.active) return;
|
|
10246
|
-
let r = Math.round(
|
|
10247
|
-
this.endBar = r, this.endPrice =
|
|
10246
|
+
let r = Math.round(j(e.x, t));
|
|
10247
|
+
this.endBar = r, this.endPrice = M(e.y, t), this.endTime = _a(r, n);
|
|
10248
10248
|
}
|
|
10249
10249
|
end() {
|
|
10250
10250
|
this.active = !1;
|
|
10251
10251
|
}
|
|
10252
10252
|
render(e, t, n) {
|
|
10253
10253
|
if (!this.active) return;
|
|
10254
|
-
let r =
|
|
10255
|
-
e.save(), e.fillStyle = m, e.fillRect(s, l, d, f), e.strokeStyle = p, e.lineWidth = 1, e.setLineDash([4, 3]), e.strokeRect(s + .5, l + .5, d, f), e.setLineDash([]), e.strokeStyle = p, e.lineWidth = 1.5, e.beginPath(), e.moveTo(r, a), e.lineTo(i, o), e.stroke(),
|
|
10256
|
-
let h = Math.abs(this.endBar - this.startBar), g = this.endPrice - this.startPrice, _ = this.startPrice === 0 ? 0 : g / this.startPrice * 100, v = this.startTime !== null && this.endTime !== null ?
|
|
10257
|
-
y.push(`${b}${
|
|
10254
|
+
let r = k(this.startBar, t), i = k(this.endBar, t), a = A(this.startPrice, t), o = A(this.endPrice, t), s = Math.min(r, i), c = Math.max(r, i), l = Math.min(a, o), u = Math.max(a, o), d = c - s, f = u - l, p = this.endPrice >= this.startPrice ? n.candleUp : n.candleDown, m = Ca(p, .14);
|
|
10255
|
+
e.save(), e.fillStyle = m, e.fillRect(s, l, d, f), e.strokeStyle = p, e.lineWidth = 1, e.setLineDash([4, 3]), e.strokeRect(s + .5, l + .5, d, f), e.setLineDash([]), e.strokeStyle = p, e.lineWidth = 1.5, e.beginPath(), e.moveTo(r, a), e.lineTo(i, o), e.stroke(), ba(e, r, a, p), ba(e, i, o, p);
|
|
10256
|
+
let h = Math.abs(this.endBar - this.startBar), g = this.endPrice - this.startPrice, _ = this.startPrice === 0 ? 0 : g / this.startPrice * 100, v = this.startTime !== null && this.endTime !== null ? ya(Math.abs(this.endTime - this.startTime)) : null, y = [], b = g > 0 ? "+" : g < 0 ? "−" : "", x = Math.abs(g);
|
|
10257
|
+
y.push(`${b}${va(x)} (${b}${Math.abs(_).toFixed(2)}%)`), y.push(`${h} bars${v ? " · " + v : ""}`), xa(e, i, o, y, p, n), e.restore();
|
|
10258
10258
|
}
|
|
10259
10259
|
};
|
|
10260
|
-
function
|
|
10260
|
+
function _a(e, t) {
|
|
10261
10261
|
if (e < 0 || e >= t.length) return null;
|
|
10262
10262
|
let n = t[e].time;
|
|
10263
10263
|
return n > 0xe8d4a51000 ? n : n * 1e3;
|
|
10264
10264
|
}
|
|
10265
|
-
function
|
|
10265
|
+
function va(e) {
|
|
10266
10266
|
return e >= 1e3 ? e.toFixed(2) : e >= 1 ? e.toFixed(4) : e.toPrecision(4);
|
|
10267
10267
|
}
|
|
10268
|
-
function
|
|
10268
|
+
function ya(e) {
|
|
10269
10269
|
let t = e / 1e3;
|
|
10270
10270
|
if (t < 60) return `${t.toFixed(0)}s`;
|
|
10271
10271
|
let n = t / 60;
|
|
@@ -10277,10 +10277,10 @@ function va(e) {
|
|
|
10277
10277
|
let a = i / 30;
|
|
10278
10278
|
return a < 12 ? `${a.toFixed(1)}mo` : `${(i / 365).toFixed(1)}y`;
|
|
10279
10279
|
}
|
|
10280
|
-
function
|
|
10280
|
+
function ba(e, t, n, r) {
|
|
10281
10281
|
e.fillStyle = r, e.beginPath(), e.arc(t, n, 3.5, 0, Math.PI * 2), e.fill(), e.fillStyle = "#fff", e.beginPath(), e.arc(t, n, 1.5, 0, Math.PI * 2), e.fill();
|
|
10282
10282
|
}
|
|
10283
|
-
function
|
|
10283
|
+
function xa(e, t, n, r, i, a) {
|
|
10284
10284
|
e.font = `600 11px ${a.font.family}`;
|
|
10285
10285
|
let o = 0;
|
|
10286
10286
|
for (let t of r) {
|
|
@@ -10288,13 +10288,13 @@ function ba(e, t, n, r, i, a) {
|
|
|
10288
10288
|
n > o && (o = n);
|
|
10289
10289
|
}
|
|
10290
10290
|
let s = Math.ceil(o) + 16, c = r.length * 14 + 12, l = t + 8, u = n + 8, d = e.canvas.clientWidth || e.canvas.width;
|
|
10291
|
-
l + s > d - 4 && (l = t - s - 8), l < 4 && (l = 4), e.fillStyle = a.background, e.globalAlpha = .96,
|
|
10291
|
+
l + s > d - 4 && (l = t - s - 8), l < 4 && (l = 4), e.fillStyle = a.background, e.globalAlpha = .96, Sa(e, l, u, s, c, 6), e.fill(), e.globalAlpha = 1, e.strokeStyle = i, e.lineWidth = 1, Sa(e, l + .5, u + .5, s - 1, c - 1, 6), e.stroke(), e.fillStyle = a.text, e.textBaseline = "top", e.textAlign = "left";
|
|
10292
10292
|
for (let t = 0; t < r.length; t++) e.fillStyle = t === 0 ? i : a.textSecondary, e.fillText(r[t], l + 8, u + 6 + t * 14);
|
|
10293
10293
|
}
|
|
10294
|
-
function
|
|
10294
|
+
function Sa(e, t, n, r, i, a) {
|
|
10295
10295
|
e.beginPath(), e.moveTo(t + a, n), e.arcTo(t + r, n, t + r, n + i, a), e.arcTo(t + r, n + i, t, n + i, a), e.arcTo(t, n + i, t, n, a), e.arcTo(t, n, t + r, n, a), e.closePath();
|
|
10296
10296
|
}
|
|
10297
|
-
function
|
|
10297
|
+
function Ca(e, t) {
|
|
10298
10298
|
if (e.startsWith("#")) {
|
|
10299
10299
|
let n = 0, r = 0, i = 0;
|
|
10300
10300
|
return e.length === 4 ? (n = parseInt(e[1] + e[1], 16), r = parseInt(e[2] + e[2], 16), i = parseInt(e[3] + e[3], 16)) : e.length >= 7 && (n = parseInt(e.slice(1, 3), 16), r = parseInt(e.slice(3, 5), 16), i = parseInt(e.slice(5, 7), 16)), `rgba(${n},${r},${i},${t})`;
|
|
@@ -10307,7 +10307,7 @@ function Sa(e, t) {
|
|
|
10307
10307
|
}
|
|
10308
10308
|
//#endregion
|
|
10309
10309
|
//#region src/animation/Animator.ts
|
|
10310
|
-
var
|
|
10310
|
+
var wa = {
|
|
10311
10311
|
linear: (e) => e,
|
|
10312
10312
|
easeOutCubic: (e) => 1 - (1 - e) ** 3,
|
|
10313
10313
|
easeOutQuart: (e) => 1 - (1 - e) ** 4,
|
|
@@ -10315,7 +10315,7 @@ var Ca = {
|
|
|
10315
10315
|
easeOutExpo: (e) => e === 1 ? 1 : 1 - 2 ** (-10 * e),
|
|
10316
10316
|
easeOutElastic: (e) => e === 0 || e === 1 ? e : 2 ** (-10 * e) * Math.sin((e * 10 - .75) * (2 * Math.PI / 3)) + 1,
|
|
10317
10317
|
spring: (e) => 1 - Math.E ** (-6 * e) * Math.cos(8 * e)
|
|
10318
|
-
},
|
|
10318
|
+
}, Ta = class {
|
|
10319
10319
|
animations = /* @__PURE__ */ new Map();
|
|
10320
10320
|
frameId = 0;
|
|
10321
10321
|
running = !1;
|
|
@@ -10323,7 +10323,7 @@ var Ca = {
|
|
|
10323
10323
|
this.animations.set(e, {
|
|
10324
10324
|
startTime: -1,
|
|
10325
10325
|
duration: t.duration,
|
|
10326
|
-
easing: t.easing ??
|
|
10326
|
+
easing: t.easing ?? wa.easeOutCubic,
|
|
10327
10327
|
onUpdate: t.onUpdate,
|
|
10328
10328
|
onComplete: t.onComplete
|
|
10329
10329
|
}), this.running || (this.running = !0, this.tick());
|
|
@@ -10358,10 +10358,10 @@ var Ca = {
|
|
|
10358
10358
|
};
|
|
10359
10359
|
//#endregion
|
|
10360
10360
|
//#region src/finance/BaseFinanceChart.ts
|
|
10361
|
-
function
|
|
10361
|
+
function Ea(t) {
|
|
10362
10362
|
return !t || t === "dark" ? e : t === "light" ? c : t;
|
|
10363
10363
|
}
|
|
10364
|
-
var
|
|
10364
|
+
var Da = class {
|
|
10365
10365
|
canvas;
|
|
10366
10366
|
ctx;
|
|
10367
10367
|
container;
|
|
@@ -10372,7 +10372,7 @@ var Ea = class {
|
|
|
10372
10372
|
frameId = null;
|
|
10373
10373
|
resizeObserver;
|
|
10374
10374
|
constructor(e, t) {
|
|
10375
|
-
this.container = e, this.theme =
|
|
10375
|
+
this.container = e, this.theme = Ea(t), this.canvas = document.createElement("canvas"), this.canvas.style.width = "100%", this.canvas.style.height = "100%", this.canvas.style.display = "block", e.appendChild(this.canvas), this.ctx = this.canvas.getContext("2d"), this.dpr = window.devicePixelRatio || 1, this.updateSize(), this.resizeObserver = new ResizeObserver(() => {
|
|
10376
10376
|
this.updateSize(), this.requestRender();
|
|
10377
10377
|
}), this.resizeObserver.observe(e);
|
|
10378
10378
|
}
|
|
@@ -10387,12 +10387,12 @@ var Ea = class {
|
|
|
10387
10387
|
}));
|
|
10388
10388
|
}
|
|
10389
10389
|
setTheme(e) {
|
|
10390
|
-
this.theme =
|
|
10390
|
+
this.theme = Ea(e), this.requestRender();
|
|
10391
10391
|
}
|
|
10392
10392
|
destroy() {
|
|
10393
10393
|
this.frameId !== null && cancelAnimationFrame(this.frameId), this.resizeObserver.disconnect(), this.canvas.remove();
|
|
10394
10394
|
}
|
|
10395
|
-
},
|
|
10395
|
+
}, Oa = class {
|
|
10396
10396
|
pos = null;
|
|
10397
10397
|
canvas;
|
|
10398
10398
|
onUpdate;
|
|
@@ -10424,7 +10424,7 @@ var Ea = class {
|
|
|
10424
10424
|
};
|
|
10425
10425
|
//#endregion
|
|
10426
10426
|
//#region src/finance/SparklineRenderer.ts
|
|
10427
|
-
function
|
|
10427
|
+
function ka(e, t, n, r, i) {
|
|
10428
10428
|
let { data: a, mode: o = "area", lineWidth: s = 1.5, showLastPoint: c = !1, showMinMax: l = !1 } = r;
|
|
10429
10429
|
if (a.length < 2 || t <= 0 || n <= 0) return;
|
|
10430
10430
|
let u = r.color ?? i.lineColor, d = r.fillColor ?? u, f = t - 4, p = n - 4, m = Infinity, h = -Infinity, g = 0, _ = 0;
|
|
@@ -10449,8 +10449,8 @@ function Oa(e, t, n, r, i) {
|
|
|
10449
10449
|
}
|
|
10450
10450
|
//#endregion
|
|
10451
10451
|
//#region src/finance/DepthChartRenderer.ts
|
|
10452
|
-
var
|
|
10453
|
-
function
|
|
10452
|
+
var Aa = 50, ja = 60, Ma = 20, Na = .2;
|
|
10453
|
+
function Pa(e) {
|
|
10454
10454
|
let t = [...e].sort((e, t) => t.price - e.price), n = [], r = 0;
|
|
10455
10455
|
for (let e of t) r += e.volume, n.push({
|
|
10456
10456
|
price: e.price,
|
|
@@ -10458,7 +10458,7 @@ function Na(e) {
|
|
|
10458
10458
|
});
|
|
10459
10459
|
return n;
|
|
10460
10460
|
}
|
|
10461
|
-
function
|
|
10461
|
+
function Fa(e) {
|
|
10462
10462
|
let t = [...e].sort((e, t) => e.price - t.price), n = [], r = 0;
|
|
10463
10463
|
for (let e of t) r += e.volume, n.push({
|
|
10464
10464
|
price: e.price,
|
|
@@ -10466,20 +10466,20 @@ function Pa(e) {
|
|
|
10466
10466
|
});
|
|
10467
10467
|
return n;
|
|
10468
10468
|
}
|
|
10469
|
-
function
|
|
10469
|
+
function Ia(e, t) {
|
|
10470
10470
|
return {
|
|
10471
|
-
left:
|
|
10472
|
-
right: e -
|
|
10473
|
-
top:
|
|
10474
|
-
bottom: t -
|
|
10475
|
-
plotWidth: e -
|
|
10476
|
-
plotHeight: t -
|
|
10471
|
+
left: Aa,
|
|
10472
|
+
right: e - ja,
|
|
10473
|
+
top: Ma,
|
|
10474
|
+
bottom: t - Ma,
|
|
10475
|
+
plotWidth: e - Aa - ja,
|
|
10476
|
+
plotHeight: t - Ma * 2
|
|
10477
10477
|
};
|
|
10478
10478
|
}
|
|
10479
|
-
function
|
|
10479
|
+
function La(e, t, n, r) {
|
|
10480
10480
|
e.fillStyle = r, e.fillRect(0, 0, t, n);
|
|
10481
10481
|
}
|
|
10482
|
-
function
|
|
10482
|
+
function Ra(e, t, n, r, i, a, o, s) {
|
|
10483
10483
|
let { left: c, right: l, top: u, bottom: d, plotWidth: f, plotHeight: p } = t;
|
|
10484
10484
|
e.save(), e.strokeStyle = a.grid, e.lineWidth = .5, e.fillStyle = a.axisLabel, e.font = `${a.font.sizeSmall}px ${a.font.family}`;
|
|
10485
10485
|
let h = m(0, i, 5);
|
|
@@ -10494,7 +10494,7 @@ function La(e, t, n, r, i, a, o, s) {
|
|
|
10494
10494
|
}
|
|
10495
10495
|
e.restore();
|
|
10496
10496
|
}
|
|
10497
|
-
function
|
|
10497
|
+
function za(e, t, n, r, i, a, o, s, c) {
|
|
10498
10498
|
if (t.length === 0) return;
|
|
10499
10499
|
let { left: l, bottom: u, plotWidth: d, plotHeight: f } = n, p = (e) => l + (e - r) / i * d, m = (e) => u - e / a * f;
|
|
10500
10500
|
if (e.beginPath(), c === "bid") {
|
|
@@ -10527,14 +10527,14 @@ function Ra(e, t, n, r, i, a, o, s, c) {
|
|
|
10527
10527
|
}
|
|
10528
10528
|
e.strokeStyle = s, e.lineWidth = 1.5, e.stroke();
|
|
10529
10529
|
}
|
|
10530
|
-
function
|
|
10530
|
+
function Ba(e, t, n, r, i, a, o, s, c) {
|
|
10531
10531
|
let { left: l, top: u, bottom: d, plotWidth: f } = r, p = l + (t - i) / a * f;
|
|
10532
10532
|
if (e.save(), e.strokeStyle = o.textSecondary, e.lineWidth = 1, e.setLineDash([4, 4]), e.beginPath(), e.moveTo(p, u), e.lineTo(p, d), e.stroke(), e.restore(), s) {
|
|
10533
10533
|
let t = `Spread: ${c(n)}`;
|
|
10534
10534
|
e.save(), e.font = `${o.font.sizeSmall}px ${o.font.family}`, e.fillStyle = o.textSecondary, e.textAlign = "center", e.textBaseline = "bottom", e.fillText(t, p, u - 2), e.restore();
|
|
10535
10535
|
}
|
|
10536
10536
|
}
|
|
10537
|
-
function
|
|
10537
|
+
function Va(e, t, n, r, i, a, o, s, c, l, u) {
|
|
10538
10538
|
let { left: d, top: f, bottom: p, plotWidth: m, plotHeight: h } = i, g = t.x;
|
|
10539
10539
|
if (g < d || g > i.right) return;
|
|
10540
10540
|
let _ = a + (g - d) / m * o, v = 0, y = "";
|
|
@@ -10560,47 +10560,47 @@ function Ba(e, t, n, r, i, a, o, s, c, l, u) {
|
|
|
10560
10560
|
for (let t = 0; t < b.length; t++) e.fillText(b[t], C + 8, w + 6 + t * (c.font.sizeSmall + 4));
|
|
10561
10561
|
e.restore();
|
|
10562
10562
|
}
|
|
10563
|
-
function
|
|
10563
|
+
function Ha(e) {
|
|
10564
10564
|
return e.toFixed(2);
|
|
10565
10565
|
}
|
|
10566
|
-
function
|
|
10566
|
+
function Ua(e) {
|
|
10567
10567
|
return e >= 1e6 ? (e / 1e6).toFixed(2) + "M" : e >= 1e3 ? (e / 1e3).toFixed(1) + "K" : e.toFixed(0);
|
|
10568
10568
|
}
|
|
10569
|
-
function
|
|
10569
|
+
function Wa(e, t, n, r, i, a) {
|
|
10570
10570
|
let { data: o } = r;
|
|
10571
10571
|
if (o.bids.length === 0 && o.asks.length === 0 || t <= 0 || n <= 0) return;
|
|
10572
|
-
let s = r.bidColor ?? i.candleUp, c = r.askColor ?? i.candleDown, l = r.bidFillColor ?? s + "40", u = r.askFillColor ?? c + "40", d = r.midPriceLine !== !1, f = r.spreadLabel !== !1, p = r.priceFormat ??
|
|
10573
|
-
|
|
10572
|
+
let s = r.bidColor ?? i.candleUp, c = r.askColor ?? i.candleDown, l = r.bidFillColor ?? s + "40", u = r.askFillColor ?? c + "40", d = r.midPriceLine !== !1, f = r.spreadLabel !== !1, p = r.priceFormat ?? Ha, m = r.volumeFormat ?? Ua, h = Pa(o.bids), g = Fa(o.asks), _ = h.length > 0 ? h[0].price : 0, v = g.length > 0 ? g[0].price : 0, y = h.length > 0 && g.length > 0 ? (_ + v) / 2 : _ || v, b = g.length > 0 && h.length > 0 ? v - _ : 0, x = h.length > 0 ? h[h.length - 1].price : y, S = g.length > 0 ? g[g.length - 1].price : y, C = Math.max(y - x, S - y) * (1 + Na), w = y - C, T = y + C, E = T - w, D = h.length > 0 ? h[h.length - 1].cumulativeVolume : 0, O = g.length > 0 ? g[g.length - 1].cumulativeVolume : 0, k = Math.max(D, O) || 1, A = Ia(t, n);
|
|
10573
|
+
La(e, t, n, i.background), Ra(e, A, w, T, k, i, p, m), za(e, h, A, w, E, k, l, s, "bid"), za(e, g, A, w, E, k, u, c, "ask"), d && Ba(e, y, b, A, w, E, i, f, p), a && Va(e, a, h, g, A, w, E, k, i, p, m);
|
|
10574
10574
|
}
|
|
10575
10575
|
//#endregion
|
|
10576
10576
|
//#region src/finance/EquityCurveRenderer.ts
|
|
10577
|
-
var
|
|
10578
|
-
function
|
|
10577
|
+
var Ga = 70, Ka = 30, qa = 20, Ja = 20, Ya = .05;
|
|
10578
|
+
function Xa(e, t) {
|
|
10579
10579
|
return {
|
|
10580
|
-
left:
|
|
10581
|
-
right: e -
|
|
10582
|
-
top:
|
|
10583
|
-
bottom: t -
|
|
10584
|
-
plotWidth: e -
|
|
10585
|
-
plotHeight: t -
|
|
10580
|
+
left: Ga,
|
|
10581
|
+
right: e - qa,
|
|
10582
|
+
top: Ja,
|
|
10583
|
+
bottom: t - Ka,
|
|
10584
|
+
plotWidth: e - Ga - qa,
|
|
10585
|
+
plotHeight: t - Ja - Ka
|
|
10586
10586
|
};
|
|
10587
10587
|
}
|
|
10588
|
-
function
|
|
10588
|
+
function Za(e, t) {
|
|
10589
10589
|
let n = Infinity, r = -Infinity;
|
|
10590
10590
|
for (let t of e) t.value < n && (n = t.value), t.value > r && (r = t.value);
|
|
10591
10591
|
if (t) for (let e of t) e.value < n && (n = e.value), e.value > r && (r = e.value);
|
|
10592
|
-
let i = (r - n) *
|
|
10592
|
+
let i = (r - n) * Ya;
|
|
10593
10593
|
return {
|
|
10594
10594
|
valMin: n - i,
|
|
10595
10595
|
valMax: r + i
|
|
10596
10596
|
};
|
|
10597
10597
|
}
|
|
10598
|
-
function
|
|
10598
|
+
function Qa(e) {
|
|
10599
10599
|
let t = [], n = -Infinity;
|
|
10600
10600
|
for (let r of e) r.value > n && (n = r.value), t.push(n);
|
|
10601
10601
|
return t;
|
|
10602
10602
|
}
|
|
10603
|
-
function
|
|
10603
|
+
function $a(e) {
|
|
10604
10604
|
let t = 864e5;
|
|
10605
10605
|
if (365.25 * t, e < 7 * t) {
|
|
10606
10606
|
let e = new Intl.DateTimeFormat(void 0, {
|
|
@@ -10622,13 +10622,13 @@ function Qa(e) {
|
|
|
10622
10622
|
});
|
|
10623
10623
|
return (e) => n.format(new Date(e));
|
|
10624
10624
|
}
|
|
10625
|
-
function
|
|
10625
|
+
function eo(e) {
|
|
10626
10626
|
return Math.abs(e) >= 1e6 ? (e / 1e6).toFixed(2) + "M" : Math.abs(e) >= 1e3 ? (e / 1e3).toFixed(1) + "K" : e.toFixed(2);
|
|
10627
10627
|
}
|
|
10628
|
-
function
|
|
10628
|
+
function to(e, t, n, r) {
|
|
10629
10629
|
e.fillStyle = r, e.fillRect(0, 0, t, n);
|
|
10630
10630
|
}
|
|
10631
|
-
function
|
|
10631
|
+
function no(e, t, n, r, i, a, o, s, c) {
|
|
10632
10632
|
let { left: l, right: u, top: d, bottom: f, plotWidth: p, plotHeight: h } = t;
|
|
10633
10633
|
e.save(), e.strokeStyle = o.grid, e.lineWidth = .5, e.fillStyle = o.axisLabel, e.font = `${o.font.sizeSmall}px ${o.font.family}`;
|
|
10634
10634
|
let g = m(n, r, 6), _ = Math.ceil(n / g) * g;
|
|
@@ -10643,21 +10643,21 @@ function to(e, t, n, r, i, a, o, s, c) {
|
|
|
10643
10643
|
}
|
|
10644
10644
|
e.restore();
|
|
10645
10645
|
}
|
|
10646
|
-
function
|
|
10646
|
+
function ro(e, t, n, r, i, a, o, s, c) {
|
|
10647
10647
|
if (t.length < 2) return;
|
|
10648
10648
|
let { left: l, bottom: u, plotWidth: d, plotHeight: f } = n, p = (e) => l + (e - r) / i * d, m = (e) => u - (e - a) / o * f;
|
|
10649
10649
|
e.save(), e.beginPath(), e.moveTo(p(t[0].time), m(t[0].value));
|
|
10650
10650
|
for (let n = 1; n < t.length; n++) e.lineTo(p(t[n].time), m(t[n].value));
|
|
10651
10651
|
e.strokeStyle = s, e.lineWidth = c, e.lineJoin = "round", e.stroke(), e.restore();
|
|
10652
10652
|
}
|
|
10653
|
-
function
|
|
10653
|
+
function io(e, t, n, r, i, a, o, s) {
|
|
10654
10654
|
if (t.length < 2) return;
|
|
10655
10655
|
let { left: c, bottom: l, plotWidth: u, plotHeight: d } = n, f = (e) => c + (e - r) / i * u, p = (e) => l - (e - a) / o * d, m = e.createLinearGradient(0, n.top, 0, l);
|
|
10656
10656
|
m.addColorStop(0, s + "40"), m.addColorStop(1, "transparent"), e.save(), e.beginPath(), e.moveTo(f(t[0].time), p(t[0].value));
|
|
10657
10657
|
for (let n = 1; n < t.length; n++) e.lineTo(f(t[n].time), p(t[n].value));
|
|
10658
10658
|
e.lineTo(f(t[t.length - 1].time), l), e.lineTo(f(t[0].time), l), e.closePath(), e.fillStyle = m, e.fill(), e.restore();
|
|
10659
10659
|
}
|
|
10660
|
-
function
|
|
10660
|
+
function ao(e, t, n, r, i, a, o, s, c) {
|
|
10661
10661
|
if (t.length < 2) return;
|
|
10662
10662
|
let { left: l, bottom: u, plotWidth: d, plotHeight: f } = r, p = (e) => l + (e - i) / a * d, m = (e) => u - (e - o) / s * f;
|
|
10663
10663
|
e.save(), e.fillStyle = c, e.beginPath(), e.moveTo(p(t[0].time), m(n[0]));
|
|
@@ -10665,12 +10665,12 @@ function io(e, t, n, r, i, a, o, s, c) {
|
|
|
10665
10665
|
for (let n = t.length - 1; n >= 0; n--) e.lineTo(p(t[n].time), m(t[n].value));
|
|
10666
10666
|
e.closePath(), e.fill(), e.restore();
|
|
10667
10667
|
}
|
|
10668
|
-
function
|
|
10668
|
+
function oo(e, t, n, r, i, a, o, s, c, l) {
|
|
10669
10669
|
if (t.length === 0) return;
|
|
10670
10670
|
let { left: u, bottom: d, plotWidth: f, plotHeight: p } = n, m = t[t.length - 1], h = u + (m.time - r) / i * f, g = d - (m.value - a) / o * p;
|
|
10671
10671
|
e.save(), e.font = `${l.font.sizeSmall}px ${l.font.family}`, e.fillStyle = c, e.textAlign = "left", e.textBaseline = "middle", e.fillText(s, h + 4, g), e.restore();
|
|
10672
10672
|
}
|
|
10673
|
-
function
|
|
10673
|
+
function so(e, t, n, r, i, a, o, s, c, l, u, d) {
|
|
10674
10674
|
let { left: f, top: p, bottom: m, plotWidth: h, plotHeight: g } = i, _ = t.x;
|
|
10675
10675
|
if (_ < f || _ > i.right) return;
|
|
10676
10676
|
e.save(), e.strokeStyle = l.crosshair, e.lineWidth = .5, e.setLineDash([4, 4]), e.beginPath(), e.moveTo(_, p), e.lineTo(_, m), e.stroke(), e.restore();
|
|
@@ -10688,15 +10688,15 @@ function oo(e, t, n, r, i, a, o, s, c, l, u, d) {
|
|
|
10688
10688
|
for (let t = 0; t < S.length; t++) e.fillText(S[t], D + 8, O + 6 + t * (l.font.sizeSmall + 4));
|
|
10689
10689
|
e.restore();
|
|
10690
10690
|
}
|
|
10691
|
-
function
|
|
10691
|
+
function co(e, t, n, r, i, a) {
|
|
10692
10692
|
let { data: o } = r;
|
|
10693
10693
|
if (o.length < 2 || t <= 0 || n <= 0) return;
|
|
10694
|
-
let s = r.lineColor ?? i.lineColor, c = r.lineWidth ?? 1.5, l = r.drawdown === !0, u = r.drawdownColor ?? i.candleDown + "30", d = r.fillArea === !0, f = r.benchmark, p = r.benchmarkColor ?? i.textSecondary, m = r.benchmarkLabel ?? "Benchmark", h = r.valueFormat ??
|
|
10695
|
-
|
|
10694
|
+
let s = r.lineColor ?? i.lineColor, c = r.lineWidth ?? 1.5, l = r.drawdown === !0, u = r.drawdownColor ?? i.candleDown + "30", d = r.fillArea === !0, f = r.benchmark, p = r.benchmarkColor ?? i.textSecondary, m = r.benchmarkLabel ?? "Benchmark", h = r.valueFormat ?? eo, { valMin: g, valMax: _ } = Za(o, f), v = _ - g || 1, y = o[0].time, b = o[o.length - 1].time, x = b - y || 1, S = r.timeFormat ?? $a(x), C = Xa(t, n);
|
|
10695
|
+
to(e, t, n, i.background), no(e, C, g, _, y, b, i, h, S), l && ao(e, o, Qa(o), C, y, x, g, v, u), d && io(e, o, C, y, x, g, v, s), ro(e, o, C, y, x, g, v, s, c), f && f.length >= 2 && (ro(e, f, C, y, x, g, v, p, 1), oo(e, f, C, y, x, g, v, m, p, i)), a && so(e, a, o, f, C, y, x, g, v, i, S, h);
|
|
10696
10696
|
}
|
|
10697
10697
|
//#endregion
|
|
10698
10698
|
//#region src/finance/HeatmapLayout.ts
|
|
10699
|
-
function
|
|
10699
|
+
function lo(e, t, n) {
|
|
10700
10700
|
if (e.length === 0) return [];
|
|
10701
10701
|
let r = e.length, i = Math.ceil(Math.sqrt(r)), a = Math.ceil(r / i), o = t.width / i, s = t.height / a, c = [];
|
|
10702
10702
|
for (let a = 0; a < r; a++) {
|
|
@@ -10713,7 +10713,7 @@ function co(e, t, n) {
|
|
|
10713
10713
|
}
|
|
10714
10714
|
return c;
|
|
10715
10715
|
}
|
|
10716
|
-
function
|
|
10716
|
+
function uo(e, t) {
|
|
10717
10717
|
let n = e.reduce((e, t) => e + t, 0);
|
|
10718
10718
|
if (n === 0 || t === 0) return Infinity;
|
|
10719
10719
|
let r = 0;
|
|
@@ -10723,7 +10723,7 @@ function lo(e, t) {
|
|
|
10723
10723
|
}
|
|
10724
10724
|
return r;
|
|
10725
10725
|
}
|
|
10726
|
-
function
|
|
10726
|
+
function fo(e, t, n, r, i, a) {
|
|
10727
10727
|
let o = r ? n.height : n.width, s = e.reduce((e, t) => e + t, 0), c = o > 0 ? s / o : 0, l = 0;
|
|
10728
10728
|
for (let o = 0; o < e.length; o++) {
|
|
10729
10729
|
let s = c > 0 ? e[o] / c : 0, u;
|
|
@@ -10743,19 +10743,19 @@ function uo(e, t, n, r, i, a) {
|
|
|
10743
10743
|
}), l += s;
|
|
10744
10744
|
}
|
|
10745
10745
|
}
|
|
10746
|
-
function
|
|
10746
|
+
function po(e, t, n, r, i) {
|
|
10747
10747
|
if (e.length === 0) return;
|
|
10748
10748
|
let a = n.width >= n.height, o = a ? n.height : n.width;
|
|
10749
10749
|
if (e.length === 1) {
|
|
10750
|
-
|
|
10750
|
+
fo(e, t, n, a, r, i);
|
|
10751
10751
|
return;
|
|
10752
10752
|
}
|
|
10753
10753
|
let s = [], c = [], l = 0;
|
|
10754
10754
|
for (; l < e.length;) {
|
|
10755
10755
|
let u = [...s, e[l]];
|
|
10756
|
-
if (s.length === 0 ||
|
|
10756
|
+
if (s.length === 0 || uo(u, o) <= uo(s, o)) s.push(e[l]), c.push(t[l]), l++;
|
|
10757
10757
|
else {
|
|
10758
|
-
|
|
10758
|
+
fo(s, c, n, a, r, i);
|
|
10759
10759
|
let u = s.reduce((e, t) => e + t, 0), d = o > 0 ? u / o : 0;
|
|
10760
10760
|
n = a ? {
|
|
10761
10761
|
x: n.x + d,
|
|
@@ -10767,43 +10767,43 @@ function fo(e, t, n, r, i) {
|
|
|
10767
10767
|
y: n.y + d,
|
|
10768
10768
|
width: n.width,
|
|
10769
10769
|
height: n.height - d
|
|
10770
|
-
},
|
|
10770
|
+
}, po(e.slice(l), t.slice(l), n, r, i);
|
|
10771
10771
|
return;
|
|
10772
10772
|
}
|
|
10773
10773
|
}
|
|
10774
|
-
s.length > 0 &&
|
|
10774
|
+
s.length > 0 && fo(s, c, n, a, r, i);
|
|
10775
10775
|
}
|
|
10776
|
-
function
|
|
10776
|
+
function mo(e, t, n) {
|
|
10777
10777
|
if (e.length === 0) return [];
|
|
10778
10778
|
let r = [...e].sort((e, t) => t.weight - e.weight), i = r.reduce((e, t) => e + Math.max(0, t.weight), 0);
|
|
10779
10779
|
if (i === 0) return [];
|
|
10780
10780
|
let a = t.width * t.height, o = r.map((e) => Math.max(0, e.weight) / i * a), s = r.map((e) => e.id), c = [];
|
|
10781
|
-
return
|
|
10781
|
+
return po(o, s, { ...t }, n, c), c;
|
|
10782
10782
|
}
|
|
10783
10783
|
//#endregion
|
|
10784
10784
|
//#region src/finance/HeatmapRenderer.ts
|
|
10785
|
-
function
|
|
10785
|
+
function ho(e) {
|
|
10786
10786
|
return (e >= 0 ? "+" : "") + e.toFixed(2) + "%";
|
|
10787
10787
|
}
|
|
10788
|
-
function
|
|
10788
|
+
function go(e) {
|
|
10789
10789
|
return e.label;
|
|
10790
10790
|
}
|
|
10791
|
-
function
|
|
10791
|
+
function _o(e, t) {
|
|
10792
10792
|
let n = t.min ?? -5, r = t.max ?? 5;
|
|
10793
10793
|
if (e <= n) return t.negative;
|
|
10794
10794
|
if (e >= r) return t.positive;
|
|
10795
10795
|
if (e < 0) {
|
|
10796
10796
|
let r = 1 - e / n;
|
|
10797
|
-
return
|
|
10797
|
+
return v(t.negative, t.zero, r);
|
|
10798
10798
|
}
|
|
10799
10799
|
let i = e / r;
|
|
10800
|
-
return
|
|
10800
|
+
return v(t.zero, t.positive, i);
|
|
10801
10801
|
}
|
|
10802
|
-
function
|
|
10802
|
+
function vo(e, t, n, r, i, a) {
|
|
10803
10803
|
let o = Math.min(a, r / 2, i / 2);
|
|
10804
10804
|
e.beginPath(), e.moveTo(t + o, n), e.lineTo(t + r - o, n), e.arcTo(t + r, n, t + r, n + o, o), e.lineTo(t + r, n + i - o), e.arcTo(t + r, n + i, t + r - o, n + i, o), e.lineTo(t + o, n + i), e.arcTo(t, n + i, t, n + i - o, o), e.lineTo(t, n + o), e.arcTo(t, n, t + o, n, o), e.closePath();
|
|
10805
10805
|
}
|
|
10806
|
-
function
|
|
10806
|
+
function yo(e, t, n, r, i, a, o, s, c, l, u) {
|
|
10807
10807
|
if (i < 40 || a < 30) return;
|
|
10808
10808
|
let d = n + i / 2, f = r + a / 2;
|
|
10809
10809
|
if (e.save(), e.shadowColor = "rgba(0,0,0,0.6)", e.shadowBlur = 2, e.fillStyle = "#FFFFFF", e.textAlign = "center", s) {
|
|
@@ -10816,22 +10816,22 @@ function vo(e, t, n, r, i, a, o, s, c, l, u) {
|
|
|
10816
10816
|
}
|
|
10817
10817
|
e.restore();
|
|
10818
10818
|
}
|
|
10819
|
-
function
|
|
10819
|
+
function bo(e, t, n, r, i, a, o, s) {
|
|
10820
10820
|
let c = [o(t), s(t.value)];
|
|
10821
10821
|
if (t.meta) for (let [e, n] of Object.entries(t.meta)) c.push(e + ": " + String(n));
|
|
10822
10822
|
e.save(), e.font = a.font.sizeSmall + "px " + a.font.family;
|
|
10823
10823
|
let l = Math.max(...c.map((t) => e.measureText(t).width)) + 16, u = a.font.sizeSmall + 4, d = c.length * u + 12, f = n.x + 14, p = n.y - d / 2;
|
|
10824
|
-
f + l > r && (f = n.x - l - 14), p < 0 && (p = 0), p + d > i && (p = i - d), e.fillStyle = a.axisLabelBackground, e.globalAlpha = .92,
|
|
10824
|
+
f + l > r && (f = n.x - l - 14), p < 0 && (p = 0), p + d > i && (p = i - d), e.fillStyle = a.axisLabelBackground, e.globalAlpha = .92, vo(e, f, p, l, d, 4), e.fill(), e.globalAlpha = 1, e.fillStyle = a.text, e.textBaseline = "top", e.textAlign = "left";
|
|
10825
10825
|
for (let t = 0; t < c.length; t++) e.fillText(c[t], f + 8, p + 6 + t * u);
|
|
10826
10826
|
e.restore();
|
|
10827
10827
|
}
|
|
10828
|
-
function
|
|
10828
|
+
function xo(e, t, n, r, i, a, o, s) {
|
|
10829
10829
|
if (r.length === 0 || i.length === 0 || t <= 0 || n <= 0) return null;
|
|
10830
10830
|
let c = a.colorScale ?? {
|
|
10831
10831
|
negative: "#EF5350",
|
|
10832
10832
|
zero: "#424242",
|
|
10833
10833
|
positive: "#26A69A"
|
|
10834
|
-
}, l = a.cellRadius ?? 4, u = a.showLabels !== !1, d = a.showValues !== !1, f = a.valueFormat ??
|
|
10834
|
+
}, l = a.cellRadius ?? 4, u = a.showLabels !== !1, d = a.showValues !== !1, f = a.valueFormat ?? ho, p = a.labelFormat ?? go, m = /* @__PURE__ */ new Map();
|
|
10835
10835
|
for (let e of r) m.set(e.id, e);
|
|
10836
10836
|
let h = null, g = null;
|
|
10837
10837
|
if (s) for (let e of i) {
|
|
@@ -10852,37 +10852,37 @@ function bo(e, t, n, r, i, a, o, s) {
|
|
|
10852
10852
|
if (!n) continue;
|
|
10853
10853
|
let { x: r, y: i, width: a, height: s } = t.rect;
|
|
10854
10854
|
if (a <= 0 || s <= 0) continue;
|
|
10855
|
-
let g =
|
|
10856
|
-
|
|
10855
|
+
let g = _o(n.value, c);
|
|
10856
|
+
vo(e, r, i, a, s, l), e.fillStyle = g, e.fill(), yo(e, n, r, i, a, s, o, u, d, p, f), t.id === h && (vo(e, r, i, a, s, l), e.strokeStyle = "#FFFFFF", e.lineWidth = 1.5, e.stroke());
|
|
10857
10857
|
}
|
|
10858
|
-
return g && s &&
|
|
10858
|
+
return g && s && bo(e, g.cell, s, t, n, o, p, f), g;
|
|
10859
10859
|
}
|
|
10860
10860
|
//#endregion
|
|
10861
10861
|
//#region src/finance/WaterfallRenderer.ts
|
|
10862
|
-
var
|
|
10863
|
-
function
|
|
10862
|
+
var So = 60, Co = 12, wo = 24, To = 40, Eo = .7, Do = 1;
|
|
10863
|
+
function Oo(e) {
|
|
10864
10864
|
return e.type ? e.type : e.value > 0 ? "positive" : e.value < 0 ? "negative" : "subtotal";
|
|
10865
10865
|
}
|
|
10866
|
-
function
|
|
10866
|
+
function ko(e) {
|
|
10867
10867
|
let t = Math.abs(e);
|
|
10868
10868
|
return t >= 1e6 ? (e / 1e6).toFixed(2) + "M" : t >= 1e3 ? (e / 1e3).toFixed(1) + "K" : e.toFixed(2);
|
|
10869
10869
|
}
|
|
10870
|
-
function
|
|
10870
|
+
function Ao(e, t) {
|
|
10871
10871
|
return {
|
|
10872
|
-
left:
|
|
10873
|
-
right: e -
|
|
10874
|
-
top:
|
|
10875
|
-
bottom: t -
|
|
10876
|
-
plotWidth: e -
|
|
10877
|
-
plotHeight: t -
|
|
10872
|
+
left: So,
|
|
10873
|
+
right: e - Co,
|
|
10874
|
+
top: wo,
|
|
10875
|
+
bottom: t - To,
|
|
10876
|
+
plotWidth: e - So - Co,
|
|
10877
|
+
plotHeight: t - wo - To
|
|
10878
10878
|
};
|
|
10879
10879
|
}
|
|
10880
|
-
function
|
|
10880
|
+
function jo(e, t, n, r, i) {
|
|
10881
10881
|
let a = Array(e.length), o = Array(e.length), s = t.plotWidth / e.length, c = s * n, l = (s - c) / 2, { left: u, bottom: d, plotHeight: f } = t, p = 0;
|
|
10882
10882
|
for (let t = 0; t < e.length; t++) {
|
|
10883
|
-
let n = e[t], m =
|
|
10883
|
+
let n = e[t], m = Oo(n), h, g;
|
|
10884
10884
|
m === "total" || m === "subtotal" ? (h = 0, g = n.value, p = n.value) : (h = p, g = p + n.value, p = g);
|
|
10885
|
-
let _ = Math.min(h, g), v = Math.max(h, g), y = d - (_ - r) / i * f, b = d - (v - r) / i * f, x = Math.min(y, b), S = Math.max(Math.abs(b - y),
|
|
10885
|
+
let _ = Math.min(h, g), v = Math.max(h, g), y = d - (_ - r) / i * f, b = d - (v - r) / i * f, x = Math.min(y, b), S = Math.max(Math.abs(b - y), Do), C = u + t * s, w = C + l;
|
|
10886
10886
|
a[t] = {
|
|
10887
10887
|
label: n.label,
|
|
10888
10888
|
value: n.value,
|
|
@@ -10902,14 +10902,14 @@ function Ao(e, t, n, r, i) {
|
|
|
10902
10902
|
cumulatives: o
|
|
10903
10903
|
};
|
|
10904
10904
|
}
|
|
10905
|
-
function
|
|
10905
|
+
function Mo(e) {
|
|
10906
10906
|
if (e.length === 0) return {
|
|
10907
10907
|
valMin: 0,
|
|
10908
10908
|
valMax: 1
|
|
10909
10909
|
};
|
|
10910
10910
|
let t = 0, n = 0, r = 0;
|
|
10911
10911
|
for (let i = 0; i < e.length; i++) {
|
|
10912
|
-
let a = e[i], o =
|
|
10912
|
+
let a = e[i], o = Oo(a), s, c;
|
|
10913
10913
|
o === "total" || o === "subtotal" ? (s = 0, c = a.value, r = a.value) : (s = r, c = r + a.value, r = c), s < t && (t = s), c < t && (t = c), s > n && (n = s), c > n && (n = c);
|
|
10914
10914
|
}
|
|
10915
10915
|
let i = (n - t || 1) * .1;
|
|
@@ -10918,10 +10918,10 @@ function jo(e) {
|
|
|
10918
10918
|
valMax: n + i
|
|
10919
10919
|
};
|
|
10920
10920
|
}
|
|
10921
|
-
function
|
|
10921
|
+
function No(e, t, n, r) {
|
|
10922
10922
|
e.fillStyle = r, e.fillRect(0, 0, t, n);
|
|
10923
10923
|
}
|
|
10924
|
-
function
|
|
10924
|
+
function Po(e, t, n, r, i, a) {
|
|
10925
10925
|
let { left: o, right: s, top: c, bottom: l, plotHeight: u } = t, d = r - n || 1;
|
|
10926
10926
|
e.strokeStyle = i.grid, e.lineWidth = .5, e.fillStyle = i.axisLabel, e.font = `${i.font.sizeSmall}px ${i.font.family}`, e.textAlign = "right", e.textBaseline = "middle";
|
|
10927
10927
|
let f = m(n, r, 5), p = Math.ceil(n / f) * f;
|
|
@@ -10940,7 +10940,7 @@ function No(e, t, n, r, i, a) {
|
|
|
10940
10940
|
e.strokeStyle = i.axisLine, e.lineWidth = 1, e.beginPath(), e.moveTo(o, t), e.lineTo(s, t), e.stroke();
|
|
10941
10941
|
}
|
|
10942
10942
|
}
|
|
10943
|
-
function
|
|
10943
|
+
function Fo(e, t, n) {
|
|
10944
10944
|
let r = [
|
|
10945
10945
|
"positive",
|
|
10946
10946
|
"negative",
|
|
@@ -10959,7 +10959,7 @@ function Po(e, t, n) {
|
|
|
10959
10959
|
s && (e.fillStyle = o, e.fill());
|
|
10960
10960
|
}
|
|
10961
10961
|
}
|
|
10962
|
-
function
|
|
10962
|
+
function Io(e, t, n, r, i, a, o) {
|
|
10963
10963
|
if (o === "none" || t.length < 2) return;
|
|
10964
10964
|
let { bottom: s, plotHeight: c } = n;
|
|
10965
10965
|
e.strokeStyle = a, e.lineWidth = 1, o === "dashed" ? e.setLineDash([4, 4]) : e.setLineDash([]), e.beginPath();
|
|
@@ -10969,7 +10969,7 @@ function Fo(e, t, n, r, i, a, o) {
|
|
|
10969
10969
|
}
|
|
10970
10970
|
e.stroke(), e.setLineDash([]);
|
|
10971
10971
|
}
|
|
10972
|
-
function
|
|
10972
|
+
function Lo(e, t, n, r, i, a) {
|
|
10973
10973
|
e.fillStyle = r.text, e.font = `${r.font.sizeSmall}px ${r.font.family}`, e.textAlign = "center";
|
|
10974
10974
|
for (let r = 0; r < t.length; r++) {
|
|
10975
10975
|
let o = t[r], s;
|
|
@@ -10978,7 +10978,7 @@ function Io(e, t, n, r, i, a) {
|
|
|
10978
10978
|
o.end < o.start ? (e.textBaseline = "top", e.fillText(s, c, o.rectY + o.rectH + 4)) : (e.textBaseline = "bottom", e.fillText(s, c, o.rectY - 4));
|
|
10979
10979
|
}
|
|
10980
10980
|
}
|
|
10981
|
-
function
|
|
10981
|
+
function Ro(e, t, n, r, i) {
|
|
10982
10982
|
e.fillStyle = r.axisLabel, e.font = `${r.font.sizeSmall}px ${r.font.family}`, e.textAlign = "center", e.textBaseline = "top";
|
|
10983
10983
|
let a = n.bottom + 6, o = t.length > 0 ? t[0].slotW - 4 : 0, s = !1;
|
|
10984
10984
|
for (let n = 0; n < t.length; n++) if (e.measureText(i(t[n].label)).width > o) {
|
|
@@ -10999,7 +10999,7 @@ function Lo(e, t, n, r, i) {
|
|
|
10999
10999
|
}
|
|
11000
11000
|
e.setTransform(1, 0, 0, 1, 0, 0), e.restore();
|
|
11001
11001
|
}
|
|
11002
|
-
function
|
|
11002
|
+
function zo(e, t, n) {
|
|
11003
11003
|
if (t < n.left || t > n.right) return null;
|
|
11004
11004
|
for (let n = 0; n < e.length; n++) {
|
|
11005
11005
|
let r = e[n];
|
|
@@ -11007,7 +11007,7 @@ function Ro(e, t, n) {
|
|
|
11007
11007
|
}
|
|
11008
11008
|
return null;
|
|
11009
11009
|
}
|
|
11010
|
-
function
|
|
11010
|
+
function Bo(e, t, n, r, i, a, o, s) {
|
|
11011
11011
|
let c = t[r], l = n[r], u = Math.round(c.slotX + c.slotW / 2) + .5;
|
|
11012
11012
|
e.strokeStyle = o.crosshair, e.lineWidth = .5, e.setLineDash([4, 4]), e.beginPath(), e.moveTo(u, a.top), e.lineTo(u, a.bottom), e.stroke(), e.setLineDash([]);
|
|
11013
11013
|
let d = [
|
|
@@ -11026,31 +11026,31 @@ function zo(e, t, n, r, i, a, o, s) {
|
|
|
11026
11026
|
let _ = o.font.sizeSmall + 4;
|
|
11027
11027
|
for (let t = 0; t < d.length; t++) e.fillText(d[t], h + 8, g + 6 + t * _);
|
|
11028
11028
|
}
|
|
11029
|
-
function
|
|
11029
|
+
function Vo(e, t, n, r, i, a) {
|
|
11030
11030
|
let { data: o } = r;
|
|
11031
11031
|
if (!o || o.length === 0 || t <= 0 || n <= 0) return { hitBar: null };
|
|
11032
|
-
let s = r.positiveColor ?? i.candleUp, c = r.negativeColor ?? i.candleDown, l = r.totalColor ?? i.lineColor, u = r.subtotalColor ?? i.textSecondary, d = r.connectorColor ?? i.textSecondary, f = r.connectorStyle ?? "dashed", p = r.barWidth ??
|
|
11033
|
-
|
|
11032
|
+
let s = r.positiveColor ?? i.candleUp, c = r.negativeColor ?? i.candleDown, l = r.totalColor ?? i.lineColor, u = r.subtotalColor ?? i.textSecondary, d = r.connectorColor ?? i.textSecondary, f = r.connectorStyle ?? "dashed", p = r.barWidth ?? Eo, m = r.showValues !== !1, h = r.showDelta !== !1, g = r.valueFormat ?? ko, _ = r.labelFormat ?? ((e) => e), { valMin: v, valMax: y } = Mo(o), b = y - v || 1, x = Ao(t, n), { bars: S, cumulatives: C } = jo(o, x, p, v, b);
|
|
11033
|
+
No(e, t, n, i.background), Po(e, x, v, y, i, g), Io(e, S, x, v, b, d, f), Fo(e, S, {
|
|
11034
11034
|
positive: s,
|
|
11035
11035
|
negative: c,
|
|
11036
11036
|
total: l,
|
|
11037
11037
|
subtotal: u
|
|
11038
|
-
}), m &&
|
|
11039
|
-
let w = a ?
|
|
11040
|
-
return a && w !== null &&
|
|
11038
|
+
}), m && Lo(e, S, C, i, g, h), Ro(e, S, x, i, _);
|
|
11039
|
+
let w = a ? zo(S, a.x, x) : null;
|
|
11040
|
+
return a && w !== null && Bo(e, S, C, w, a, x, i, g), { hitBar: w };
|
|
11041
11041
|
}
|
|
11042
11042
|
//#endregion
|
|
11043
11043
|
//#region src/finance/GaugeRenderer.ts
|
|
11044
|
-
var
|
|
11045
|
-
function
|
|
11044
|
+
var Ho = Math.PI / 180, Uo = 135, Wo = 405, Go = .25;
|
|
11045
|
+
function Ko(e) {
|
|
11046
11046
|
let t = Math.abs(e);
|
|
11047
11047
|
return t >= 1e6 ? (e / 1e6).toFixed(2) + "M" : t >= 1e3 ? (e / 1e3).toFixed(1) + "K" : Number.isInteger(e) ? e.toFixed(0) : e.toFixed(1);
|
|
11048
11048
|
}
|
|
11049
11049
|
function Q(e, t, n) {
|
|
11050
11050
|
return e < t ? t : e > n ? n : e;
|
|
11051
11051
|
}
|
|
11052
|
-
function
|
|
11053
|
-
let r = n.min ?? 0, i = n.max ?? 100, a = i - r || 1, o = (n.startAngle ??
|
|
11052
|
+
function qo(e, t, n) {
|
|
11053
|
+
let r = n.min ?? 0, i = n.max ?? 100, a = i - r || 1, o = (n.startAngle ?? Uo) * Ho, s = (n.endAngle ?? Wo) * Ho, c = n.thickness ?? Go, l = e / 2, u = t / 2 + t * .05, d = Math.max(10, Math.min(e, t) / 2 - 24);
|
|
11054
11054
|
return {
|
|
11055
11055
|
cx: l,
|
|
11056
11056
|
cy: u,
|
|
@@ -11068,38 +11068,38 @@ function $(e, t) {
|
|
|
11068
11068
|
let n = Q((e - t.min) / t.range, 0, 1);
|
|
11069
11069
|
return t.startAngle + t.angleRange * n;
|
|
11070
11070
|
}
|
|
11071
|
-
function
|
|
11071
|
+
function Jo(e, t, n, r) {
|
|
11072
11072
|
e.fillStyle = r, e.fillRect(0, 0, t, n);
|
|
11073
11073
|
}
|
|
11074
|
-
function
|
|
11074
|
+
function Yo(e, t, n) {
|
|
11075
11075
|
e.beginPath(), e.arc(t.cx, t.cy, t.radius, t.startAngle, t.endAngle, !1), e.arc(t.cx, t.cy, t.innerRadius, t.endAngle, t.startAngle, !0), e.closePath(), e.fillStyle = n, e.fill();
|
|
11076
11076
|
}
|
|
11077
|
-
function
|
|
11077
|
+
function Xo(e, t, n) {
|
|
11078
11078
|
let r = Q(n.from, t.min, t.max), i = Q(n.to, t.min, t.max);
|
|
11079
11079
|
if (i <= r) return;
|
|
11080
11080
|
let a = $(r, t), o = $(i, t);
|
|
11081
11081
|
e.beginPath(), e.arc(t.cx, t.cy, t.radius, a, o, !1), e.arc(t.cx, t.cy, t.innerRadius, o, a, !0), e.closePath(), e.fillStyle = n.color, e.fill();
|
|
11082
11082
|
}
|
|
11083
|
-
function
|
|
11083
|
+
function Zo(e, t, n, r, i) {
|
|
11084
11084
|
let a = $(n, t);
|
|
11085
11085
|
a <= t.startAngle || (e.globalAlpha = i, e.beginPath(), e.arc(t.cx, t.cy, t.radius, t.startAngle, a, !1), e.arc(t.cx, t.cy, t.innerRadius, a, t.startAngle, !0), e.closePath(), e.fillStyle = r, e.fill(), e.globalAlpha = 1);
|
|
11086
11086
|
}
|
|
11087
|
-
function
|
|
11087
|
+
function Qo(e, t, n, r) {
|
|
11088
11088
|
let i = $(n, t), a = Math.cos(i), o = Math.sin(i), s = t.radius - 2, c = t.innerRadius * .25, l = -o, u = a, d = t.cx + a * s, f = t.cy + o * s, p = t.cx + l * 4 - a * c, m = t.cy + u * 4 - o * c, h = t.cx - l * 4 - a * c, g = t.cy - u * 4 - o * c;
|
|
11089
11089
|
e.beginPath(), e.moveTo(d, f), e.lineTo(p, m), e.lineTo(h, g), e.closePath(), e.fillStyle = r, e.fill(), e.beginPath(), e.arc(t.cx, t.cy, Math.max(4, t.innerRadius * .12), 0, Math.PI * 2), e.fill();
|
|
11090
11090
|
}
|
|
11091
|
-
function
|
|
11091
|
+
function $o(e, t, n, r, i) {
|
|
11092
11092
|
let a = Math.round(t.innerRadius * .55), o = Math.round(i.font.sizeMedium);
|
|
11093
11093
|
e.fillStyle = i.text, e.textAlign = "center", e.textBaseline = "middle", e.font = `600 ${a}px ${i.font.family}`;
|
|
11094
11094
|
let s = !!r, c = s ? t.cy - o * .6 : t.cy - a * .1;
|
|
11095
11095
|
e.fillText(n, t.cx, c), s && (e.fillStyle = i.textSecondary, e.font = `${o}px ${i.font.family}`, e.fillText(r, t.cx, t.cy + a * .55));
|
|
11096
11096
|
}
|
|
11097
|
-
function
|
|
11097
|
+
function es(e, t, n, r) {
|
|
11098
11098
|
e.fillStyle = r.textSecondary, e.font = `${r.font.sizeSmall}px ${r.font.family}`;
|
|
11099
11099
|
let i = t.radius + 10, a = Math.cos(t.startAngle), o = Math.sin(t.startAngle), s = Math.cos(t.endAngle), c = Math.sin(t.endAngle), l = t.cx + a * i, u = t.cy + o * i, d = t.cx + s * i, f = t.cy + c * i;
|
|
11100
11100
|
e.textBaseline = "middle", e.textAlign = a < -.2 ? "right" : a > .2 ? "left" : "center", e.fillText(n(t.min), l, u), e.textAlign = s < -.2 ? "right" : s > .2 ? "left" : "center", e.fillText(n(t.max), d, f);
|
|
11101
11101
|
}
|
|
11102
|
-
function
|
|
11102
|
+
function ts(e, t, n, r) {
|
|
11103
11103
|
e.fillStyle = r.textSecondary, e.font = `${r.font.sizeSmall}px ${r.font.family}`, e.textAlign = "center", e.textBaseline = "middle";
|
|
11104
11104
|
let i = (t.radius + t.innerRadius) / 2;
|
|
11105
11105
|
for (let r = 0; r < n.length; r++) {
|
|
@@ -11109,15 +11109,15 @@ function es(e, t, n, r) {
|
|
|
11109
11109
|
e.fillText(a.label, s, c);
|
|
11110
11110
|
}
|
|
11111
11111
|
}
|
|
11112
|
-
function
|
|
11112
|
+
function ns(e, t, n, r, i, a) {
|
|
11113
11113
|
if (t <= 0 || n <= 0) return;
|
|
11114
|
-
let o =
|
|
11115
|
-
|
|
11114
|
+
let o = qo(t, n, r), s = r.trackColor ?? i.grid, c = r.needleColor ?? i.text, l = r.showValue !== !1, u = r.showZoneLabels === !0, d = r.valueFormat ?? Ko, f = Q(a, o.min, o.max);
|
|
11115
|
+
Jo(e, t, n, i.background), Yo(e, o, s);
|
|
11116
11116
|
let p = r.zones;
|
|
11117
|
-
if (p && p.length > 0) for (let t = 0; t < p.length; t++)
|
|
11118
|
-
|
|
11117
|
+
if (p && p.length > 0) for (let t = 0; t < p.length; t++) Xo(e, o, p[t]);
|
|
11118
|
+
Zo(e, o, f, c, .12), Qo(e, o, f, c), l && $o(e, o, d(f), r.label, i), es(e, o, d, i), u && p && p.length > 0 && ts(e, o, p, i);
|
|
11119
11119
|
}
|
|
11120
11120
|
//#endregion
|
|
11121
|
-
export { Et as ADXIndicator, Tt as ATRIndicator,
|
|
11121
|
+
export { Et as ADXIndicator, Tt as ATRIndicator, gn as AcceleratorOscillatorIndicator, wn as AccumulationDistributionIndicator, Ln as AlertDragHandler, ea as AlertManager, vt as AlligatorIndicator, lt as AnchoredVWAPIndicator, Or as AnchoredVWAPTool, Ta as Animator, ce as AreaRenderer, jt as AroonIndicator, Cr as ArrowTool, bt as AwesomeOscillatorIndicator, In as AxisDragHandler, Qt as BalanceOfPowerIndicator, Hi as BarCountdown, le as BarRenderer, Da as BaseFinanceChart, de as BaselineRenderer, mi as BinanceAdapter, et as BollingerBandsIndicator, Kr as BracketTool, Ei as BybitAdapter, kt as CCIIndicator, Pt as CMFIndicator, re as CandlestickRenderer, T as CanvasLayer, xt as ChaikinOscillatorIndicator, ln as ChaikinVolatilityIndicator, en as ChandeMomentumIndicator, _t as ChandelierExitIndicator, zi as ChartLegend, la as ChartStateManager, Lt as ChoppinessIndexIndicator, bi as CoinbaseAdapter, He as CompareRenderer, Vt as ConnorsRSIIndicator, Ut as CoppockIndicator, Bn as CrosshairHandler, Wn as CrosshairTooltip, si as CurrentPriceLine, Ri as DEFAULT_LEGEND_CONFIG, Zi as DEFAULT_SESSION_HOURS, O as DPRManager, da as DataExporter, yr as DateRangeTool, ze as DepthHeatmapBuffer, Be as DepthHeatmapRenderer, Br as DepthOverlay, Zt as DetrendedPriceOscillatorIndicator, yn as DisparityIndexIndicator, ot as DonchianChannelIndicator, H as DrawingBase, $n as DrawingManager, er as DrawingRenderer, $e as EMAIndicator, rn as EaseOfMovementIndicator, wa as Easing, Kt as ElderRayIndicator, _r as ElliottWaveTool, pr as EllipseTool, G as Emitter, ge as EquivolumeRenderer, Zn as EventBus, or as ExtendedLineTool, dr as FibExtensionTool, lr as FibRetracementTool, jr as FibTimeZonesTool, Oa as FinanceCrosshair, Xt as FisherTransformIndicator, Bt as ForceIndexIndicator, Dr as GannBoxTool, Tr as GannFanTool, kn as GridRenderer, ve as HLCAreaRenderer, ue as HollowCandleRenderer, rr as HorizontalLineTool, ft as HullMAIndicator, nt as IchimokuIndicator, L as IndicatorBase, Ze as IndicatorEngine, On as IndicatorWorkerHost, Nn as InteractionManager, Wt as KSTIndicator, pe as KagiRenderer, at as KeltnerChannelIndicator, Un as KeyboardHandler, Yt as KlingerIndicator, Ni as KrakenAdapter, E as LayerManager, se as LineRenderer, be as LineWithMarkersRenderer, dt as LinearRegressionChannelIndicator, Ct as MACDIndicator, At as MFIIndicator, ht as MTFMovingAverageIndicator, Oe as MarketProfileRenderer, $t as MassIndexIndicator, ga as MeasureOverlay, br as MeasureTool, hi as MockAdapter, Dt as OBVIndicator, Qr as OrderDraftTool, Nr as OrderRenderer, Pn as PanHandler, Rn as PaneResizeHandler, ri as PaperExecutionAdapter, rt as ParabolicSARIndicator, sr as ParallelChannelTool, mn as PercentagePriceOscillatorIndicator, Ne as PeriodLevelsRenderer, qn as PinnedTooltip, hr as PitchforkTool, Le as PivotMarkersRenderer, ct as PivotPointsIndicator, me as PointAndFigureRenderer, _i as PollingAdapter, zr as PositionRenderer, xn as PrettyGoodOscillatorIndicator, An as PriceAxis, vr as PriceRangeTool, cn as PriceVolumeTrendIndicator, bn as QstickIndicator, Mt as ROCIndicator, St as RSIIndicator, ar as RayTool, oi as ReconnectManager, fr as RectangleTool, cr as RegressionChannelTool, vn as RelativeMomentumIndexIndicator, un as RelativeVigorIndicator, ee as RenderEngine, D as RenderLoop, fe as RenkoRenderer, li as ReplayController, ta as ReplayManager, Qe as SMAIndicator, qt as SchaffTrendCycleIndicator, Bi as Screenshot, Ui as SessionBreaks, Qi as SessionShading, gt as SessionVWAPIndicator, pa as SignalMarkerManager, Sn as StdDevIndicator, ye as StepLineRenderer, wt as StochasticIndicator, dn as StochasticRSIIndicator, ci as StreamManager, it as SupertrendIndicator, tn as TRIXIndicator, Nt as TSIIndicator, Sr as TextAnnotationTool, ai as TickAggregator, Mn as TimeAxis, ha as TradeZoneManager, Hr as TradingContextMenu, Vr as TradingDragHandler, ti as TradingManager, ni as TradingRenderer, nr as TrendLineTool, mr as TriangleTool, Rt as UltimateOscillatorIndicator, ua as UndoRedoManager, Tn as VROCIndicator, tt as VWAPIndicator, ir as VerticalLineTool, te as Viewport, he as VolumeCandleRenderer, Ft as VolumeDeltaIndicator, Cn as VolumeProfileIndicator, kr as VolumeProfileRangeTool, Se as VolumeProfileRenderer, xe as VolumeRenderer, It as VortexIndicator, Vi as Watermark, gi as WebSocketAdapter, on as WilliamsADIndicator, Ot as WilliamsRIndicator, ut as ZigZagIndicator, Fn as ZoomHandler, Ee as assignSessionLetters, k as barIndexToX, Wr as bracketRiskReward, Fe as classifyPivots, Ur as computeBracketDefaults, we as computeMarketProfile, Me as computePeriodLevels, De as computeSessionProfiles, tr as findDominantSwing, Ie as findPivots, z as getIntParam, R as getNumberParam, ne as getVisibleData, Xr as inferOrderType, Xi as isRegularSession, Dn as isWorkerResponse, mo as layoutSquarifiedTreemap, lo as layoutUniformGrid, ie as lttbDownsample, oe as lttbVisibleIndices, Yi as minuteOfDay, A as priceToY, Mr as registerBuiltInDrawingTools, En as registerBuiltInIndicators, Wa as renderDepthChart, co as renderEquityCurve, ns as renderGauge, xo as renderHeatmap, ka as renderSparkline, Vo as renderWaterfall, P as resolveBarIndex, F as timeToX, N as timestampToBarIndex, Ue as toHeikinAshi, qe as toKagi, Ke as toLineBreak, Je as toPointAndFigure, Ye as toRangeBars, We as toRenko, Te as tpoLetter, j as xToBarIndex, I as xToTime, M as yToPrice };
|
|
11122
11122
|
|
|
11123
11123
|
//# sourceMappingURL=index.js.map
|