@tradecanvas/core 0.4.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -6
- package/dist/charts/transforms/index.d.ts +2 -0
- package/dist/charts/transforms/index.d.ts.map +1 -1
- package/dist/charts/transforms/rangeBars.d.ts +18 -0
- package/dist/charts/transforms/rangeBars.d.ts.map +1 -0
- package/dist/drawings/tools/TextAnnotation.d.ts +5 -0
- package/dist/drawings/tools/TextAnnotation.d.ts.map +1 -1
- package/dist/features/ChartState.d.ts +6 -1
- package/dist/features/ChartState.d.ts.map +1 -1
- package/dist/index.cjs +3 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1074 -330
- package/dist/index.js.map +1 -1
- package/dist/indicators/index.d.ts +12 -0
- package/dist/indicators/index.d.ts.map +1 -1
- package/dist/indicators/overlay/AnchoredVWAP.d.ts +20 -0
- package/dist/indicators/overlay/AnchoredVWAP.d.ts.map +1 -0
- package/dist/indicators/overlay/BollingerBands.d.ts.map +1 -1
- package/dist/indicators/overlay/DonchianChannel.d.ts.map +1 -1
- package/dist/indicators/overlay/EMA.d.ts.map +1 -1
- package/dist/indicators/overlay/HullMA.d.ts +19 -0
- package/dist/indicators/overlay/HullMA.d.ts.map +1 -0
- package/dist/indicators/overlay/Ichimoku.d.ts.map +1 -1
- package/dist/indicators/overlay/KeltnerChannel.d.ts.map +1 -1
- package/dist/indicators/overlay/LinearRegressionChannel.d.ts +20 -0
- package/dist/indicators/overlay/LinearRegressionChannel.d.ts.map +1 -0
- package/dist/indicators/overlay/ParabolicSAR.d.ts.map +1 -1
- package/dist/indicators/overlay/PivotPoints.d.ts +15 -0
- package/dist/indicators/overlay/PivotPoints.d.ts.map +1 -0
- package/dist/indicators/overlay/SMA.d.ts.map +1 -1
- package/dist/indicators/overlay/Supertrend.d.ts.map +1 -1
- package/dist/indicators/overlay/ZigZag.d.ts +20 -0
- package/dist/indicators/overlay/ZigZag.d.ts.map +1 -0
- package/dist/indicators/panel/ADX.d.ts.map +1 -1
- package/dist/indicators/panel/ATR.d.ts.map +1 -1
- package/dist/indicators/panel/Aroon.d.ts.map +1 -1
- package/dist/indicators/panel/AwesomeOscillator.d.ts +16 -0
- package/dist/indicators/panel/AwesomeOscillator.d.ts.map +1 -0
- package/dist/indicators/panel/CCI.d.ts.map +1 -1
- package/dist/indicators/panel/CMF.d.ts.map +1 -1
- package/dist/indicators/panel/ChaikinOscillator.d.ts +21 -0
- package/dist/indicators/panel/ChaikinOscillator.d.ts.map +1 -0
- package/dist/indicators/panel/MACD.d.ts.map +1 -1
- package/dist/indicators/panel/MFI.d.ts.map +1 -1
- package/dist/indicators/panel/ROC.d.ts.map +1 -1
- package/dist/indicators/panel/RSI.d.ts.map +1 -1
- package/dist/indicators/panel/StdDev.d.ts.map +1 -1
- package/dist/indicators/panel/Stochastic.d.ts.map +1 -1
- package/dist/indicators/panel/TSI.d.ts.map +1 -1
- package/dist/indicators/panel/VROC.d.ts.map +1 -1
- package/dist/indicators/panel/VolumeProfile.d.ts.map +1 -1
- package/dist/indicators/panel/WilliamsR.d.ts.map +1 -1
- package/dist/indicators/params.d.ts +10 -0
- package/dist/indicators/params.d.ts.map +1 -0
- package/dist/indicators/registry.d.ts.map +1 -1
- package/dist/indicators/worker/IndicatorWorkerHost.d.ts +49 -0
- package/dist/indicators/worker/IndicatorWorkerHost.d.ts.map +1 -0
- package/dist/indicators/worker/indicator.worker.d.ts +2 -0
- package/dist/indicators/worker/indicator.worker.d.ts.map +1 -0
- package/dist/indicators/worker/messages.d.ts +27 -0
- package/dist/indicators/worker/messages.d.ts.map +1 -0
- package/dist/realtime/adapters/BinanceAdapter.d.ts.map +1 -1
- package/dist/realtime/adapters/binanceTypes.d.ts +58 -0
- package/dist/realtime/adapters/binanceTypes.d.ts.map +1 -0
- package/dist/trading/PositionRenderer.d.ts.map +1 -1
- package/dist/trading/positionFormat.d.ts +15 -0
- package/dist/trading/positionFormat.d.ts.map +1 -0
- package/dist/ui/ChartLegend.d.ts +2 -0
- package/dist/ui/ChartLegend.d.ts.map +1 -1
- package/package.json +8 -3
package/dist/index.js
CHANGED
|
@@ -317,7 +317,9 @@ var D = class {
|
|
|
317
317
|
maxBarWidth;
|
|
318
318
|
rightMarginBars;
|
|
319
319
|
constructor(e, r, i = 2, a = 30, o = 5) {
|
|
320
|
-
this.minBarWidth = i, this.maxBarWidth = a, this.rightMarginBars = o
|
|
320
|
+
this.minBarWidth = i, this.maxBarWidth = a, this.rightMarginBars = o;
|
|
321
|
+
let s = this.computeChartRect(e, r);
|
|
322
|
+
this.state = {
|
|
321
323
|
visibleRange: {
|
|
322
324
|
from: 0,
|
|
323
325
|
to: 0
|
|
@@ -329,7 +331,7 @@ var D = class {
|
|
|
329
331
|
barWidth: n,
|
|
330
332
|
barSpacing: t,
|
|
331
333
|
offset: 0,
|
|
332
|
-
chartRect:
|
|
334
|
+
chartRect: s
|
|
333
335
|
};
|
|
334
336
|
}
|
|
335
337
|
getState() {
|
|
@@ -817,6 +819,37 @@ function he(e, t, n = 3) {
|
|
|
817
819
|
}), r;
|
|
818
820
|
}
|
|
819
821
|
//#endregion
|
|
822
|
+
//#region src/charts/transforms/rangeBars.ts
|
|
823
|
+
function ge(e, t) {
|
|
824
|
+
if (e.length === 0 || t.rangeSize <= 0) return [];
|
|
825
|
+
let n = [], r = e[0].time, i = e[0].open, a = i, o = i, s = 0, c = (e, c) => {
|
|
826
|
+
for (e > a && (a = e), e < o && (o = e), s += c; a - o >= t.rangeSize;) {
|
|
827
|
+
let c = e >= i, l = c ? i + t.rangeSize : i - t.rangeSize;
|
|
828
|
+
n.push({
|
|
829
|
+
time: r++,
|
|
830
|
+
open: i,
|
|
831
|
+
high: c ? l : i,
|
|
832
|
+
low: c ? i : l,
|
|
833
|
+
close: l,
|
|
834
|
+
volume: s
|
|
835
|
+
}), i = l, a = l, o = l, s = 0;
|
|
836
|
+
}
|
|
837
|
+
};
|
|
838
|
+
for (let t of e) {
|
|
839
|
+
let e = t.close >= t.open ? [
|
|
840
|
+
t.low,
|
|
841
|
+
t.high,
|
|
842
|
+
t.close
|
|
843
|
+
] : [
|
|
844
|
+
t.high,
|
|
845
|
+
t.low,
|
|
846
|
+
t.close
|
|
847
|
+
], n = t.volume / e.length;
|
|
848
|
+
for (let t of e) c(t, n);
|
|
849
|
+
}
|
|
850
|
+
return n;
|
|
851
|
+
}
|
|
852
|
+
//#endregion
|
|
820
853
|
//#region src/indicators/IndicatorBase.ts
|
|
821
854
|
var j = class {
|
|
822
855
|
drawLine(e, t, n, r) {
|
|
@@ -853,7 +886,7 @@ var j = class {
|
|
|
853
886
|
}
|
|
854
887
|
return i;
|
|
855
888
|
}
|
|
856
|
-
},
|
|
889
|
+
}, _e = 1, ve = class {
|
|
857
890
|
registry = /* @__PURE__ */ new Map();
|
|
858
891
|
instances = /* @__PURE__ */ new Map();
|
|
859
892
|
register(e) {
|
|
@@ -865,7 +898,7 @@ var j = class {
|
|
|
865
898
|
addIndicator(e, t = {}, n) {
|
|
866
899
|
let r = this.registry.get(e);
|
|
867
900
|
if (!r) throw Error(`Unknown indicator: ${e}`);
|
|
868
|
-
let i = `tc_${e}_${
|
|
901
|
+
let i = `tc_${e}_${_e++}`, a = {
|
|
869
902
|
id: e,
|
|
870
903
|
instanceId: i,
|
|
871
904
|
params: {
|
|
@@ -957,7 +990,25 @@ var j = class {
|
|
|
957
990
|
});
|
|
958
991
|
return e;
|
|
959
992
|
}
|
|
960
|
-
}
|
|
993
|
+
};
|
|
994
|
+
//#endregion
|
|
995
|
+
//#region src/indicators/params.ts
|
|
996
|
+
function M(e, t, n) {
|
|
997
|
+
let r = e.params[t];
|
|
998
|
+
if (typeof r == "number" && Number.isFinite(r)) return r;
|
|
999
|
+
if (typeof r == "string") {
|
|
1000
|
+
let e = Number(r);
|
|
1001
|
+
if (Number.isFinite(e)) return e;
|
|
1002
|
+
}
|
|
1003
|
+
return n;
|
|
1004
|
+
}
|
|
1005
|
+
function N(e, t, n, r = 1) {
|
|
1006
|
+
let i = M(e, t, n);
|
|
1007
|
+
return Math.max(r, Math.floor(i));
|
|
1008
|
+
}
|
|
1009
|
+
//#endregion
|
|
1010
|
+
//#region src/indicators/overlay/SMA.ts
|
|
1011
|
+
var ye = class extends j {
|
|
961
1012
|
descriptor = {
|
|
962
1013
|
id: "sma",
|
|
963
1014
|
name: "Simple Moving Average",
|
|
@@ -965,7 +1016,7 @@ var j = class {
|
|
|
965
1016
|
defaultConfig: { period: 20 }
|
|
966
1017
|
};
|
|
967
1018
|
calculate(e, t) {
|
|
968
|
-
let n = t
|
|
1019
|
+
let n = N(t, "period", 20, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null), a = 0;
|
|
969
1020
|
for (let t = 0; t < e.length; t++) if (a += e[t].close, t >= n && (a -= e[t - n].close), t >= n - 1) {
|
|
970
1021
|
let o = { value: a / n };
|
|
971
1022
|
r.set(e[t].time, o), i[t] = o;
|
|
@@ -989,7 +1040,7 @@ var j = class {
|
|
|
989
1040
|
}
|
|
990
1041
|
e.stroke();
|
|
991
1042
|
}
|
|
992
|
-
},
|
|
1043
|
+
}, P = class extends j {
|
|
993
1044
|
descriptor = {
|
|
994
1045
|
id: "ema",
|
|
995
1046
|
name: "Exponential Moving Average",
|
|
@@ -997,7 +1048,7 @@ var j = class {
|
|
|
997
1048
|
defaultConfig: { period: 20 }
|
|
998
1049
|
};
|
|
999
1050
|
calculate(e, t) {
|
|
1000
|
-
let n = t
|
|
1051
|
+
let n = N(t, "period", 20, 1), r = 2 / (n + 1), i = /* @__PURE__ */ new Map(), a = Array(e.length).fill(null), o = 0;
|
|
1001
1052
|
for (let t = 0; t < e.length; t++) {
|
|
1002
1053
|
if (t < n - 1) {
|
|
1003
1054
|
o += e[t].close;
|
|
@@ -1026,7 +1077,7 @@ var j = class {
|
|
|
1026
1077
|
}
|
|
1027
1078
|
e.stroke();
|
|
1028
1079
|
}
|
|
1029
|
-
},
|
|
1080
|
+
}, F = class extends j {
|
|
1030
1081
|
descriptor = {
|
|
1031
1082
|
id: "bb",
|
|
1032
1083
|
name: "Bollinger Bands",
|
|
@@ -1037,7 +1088,7 @@ var j = class {
|
|
|
1037
1088
|
}
|
|
1038
1089
|
};
|
|
1039
1090
|
calculate(e, t) {
|
|
1040
|
-
let n = t
|
|
1091
|
+
let n = N(t, "period", 20, 1), r = M(t, "stdDev", 2), i = /* @__PURE__ */ new Map(), a = Array(e.length).fill(null), o = 0, s = 0;
|
|
1041
1092
|
for (let t = 0; t < e.length; t++) {
|
|
1042
1093
|
let c = e[t].close;
|
|
1043
1094
|
if (o += c, s += c * c, t >= n) {
|
|
@@ -1081,7 +1132,7 @@ var j = class {
|
|
|
1081
1132
|
e.stroke();
|
|
1082
1133
|
}
|
|
1083
1134
|
}
|
|
1084
|
-
},
|
|
1135
|
+
}, be = class extends j {
|
|
1085
1136
|
descriptor = {
|
|
1086
1137
|
id: "vwap",
|
|
1087
1138
|
name: "Volume Weighted Average Price",
|
|
@@ -1116,7 +1167,7 @@ var j = class {
|
|
|
1116
1167
|
}
|
|
1117
1168
|
e.stroke();
|
|
1118
1169
|
}
|
|
1119
|
-
},
|
|
1170
|
+
}, xe = class extends j {
|
|
1120
1171
|
descriptor = {
|
|
1121
1172
|
id: "ichimoku",
|
|
1122
1173
|
name: "Ichimoku Cloud",
|
|
@@ -1129,7 +1180,7 @@ var j = class {
|
|
|
1129
1180
|
}
|
|
1130
1181
|
};
|
|
1131
1182
|
calculate(e, t) {
|
|
1132
|
-
let n = t
|
|
1183
|
+
let n = N(t, "tenkan", 9, 1), r = N(t, "kijun", 26, 1), i = N(t, "senkou", 52, 1), a = /* @__PURE__ */ new Map(), o = Array(e.length).fill(null), s = (t) => {
|
|
1133
1184
|
let n = new Float64Array(e.length), r = new Float64Array(e.length);
|
|
1134
1185
|
for (let i = 0; i < e.length; i++) {
|
|
1135
1186
|
let a = -Infinity, o = Infinity, s = Math.max(0, i - t + 1);
|
|
@@ -1176,7 +1227,7 @@ var j = class {
|
|
|
1176
1227
|
};
|
|
1177
1228
|
x(c, l, u, r.colors[0], r.lineWidths[0]), x(d, f, p, r.colors[1] ?? "#FF9800", r.lineWidths[0]), x(m, h, g, r.colors[2] ?? "#26A69A", 1), x(v, y, b, r.colors[3] ?? "#EF5350", 1);
|
|
1178
1229
|
}
|
|
1179
|
-
},
|
|
1230
|
+
}, Se = class extends j {
|
|
1180
1231
|
descriptor = {
|
|
1181
1232
|
id: "psar",
|
|
1182
1233
|
name: "Parabolic SAR",
|
|
@@ -1187,7 +1238,7 @@ var j = class {
|
|
|
1187
1238
|
}
|
|
1188
1239
|
};
|
|
1189
1240
|
calculate(e, t) {
|
|
1190
|
-
let n = t
|
|
1241
|
+
let n = M(t, "step", .02), r = M(t, "max", .2), i = /* @__PURE__ */ new Map(), a = Array(e.length).fill(null);
|
|
1191
1242
|
if (e.length < 2) return {
|
|
1192
1243
|
values: i,
|
|
1193
1244
|
series: a
|
|
@@ -1222,7 +1273,7 @@ var j = class {
|
|
|
1222
1273
|
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();
|
|
1223
1274
|
}
|
|
1224
1275
|
}
|
|
1225
|
-
},
|
|
1276
|
+
}, Ce = class extends j {
|
|
1226
1277
|
descriptor = {
|
|
1227
1278
|
id: "supertrend",
|
|
1228
1279
|
name: "Supertrend",
|
|
@@ -1233,7 +1284,7 @@ var j = class {
|
|
|
1233
1284
|
}
|
|
1234
1285
|
};
|
|
1235
1286
|
calculate(e, t) {
|
|
1236
|
-
let n = t
|
|
1287
|
+
let n = N(t, "period", 10, 1), r = M(t, "multiplier", 3), i = /* @__PURE__ */ new Map(), a = Array(e.length).fill(null);
|
|
1237
1288
|
if (e.length < n) return {
|
|
1238
1289
|
values: i,
|
|
1239
1290
|
series: a
|
|
@@ -1270,7 +1321,7 @@ var j = class {
|
|
|
1270
1321
|
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;
|
|
1271
1322
|
}
|
|
1272
1323
|
}
|
|
1273
|
-
},
|
|
1324
|
+
}, we = class extends j {
|
|
1274
1325
|
descriptor = {
|
|
1275
1326
|
id: "keltner",
|
|
1276
1327
|
name: "Keltner Channel",
|
|
@@ -1282,7 +1333,7 @@ var j = class {
|
|
|
1282
1333
|
}
|
|
1283
1334
|
};
|
|
1284
1335
|
calculate(e, t) {
|
|
1285
|
-
let n = t
|
|
1336
|
+
let n = N(t, "emaPeriod", 20, 1), r = N(t, "atrPeriod", 10, 1), i = M(t, "multiplier", 1.5), a = /* @__PURE__ */ new Map();
|
|
1286
1337
|
if (e.length < Math.max(n, r)) return { values: a };
|
|
1287
1338
|
let o = 2 / (n + 1), s = e[0].close, c = [s];
|
|
1288
1339
|
for (let t = 1; t < e.length; t++) s = (e[t].close - s) * o + s, c.push(s);
|
|
@@ -1327,7 +1378,7 @@ var j = class {
|
|
|
1327
1378
|
}
|
|
1328
1379
|
this.drawBand(e, s, l, _(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]);
|
|
1329
1380
|
}
|
|
1330
|
-
},
|
|
1381
|
+
}, Te = class extends j {
|
|
1331
1382
|
descriptor = {
|
|
1332
1383
|
id: "donchian",
|
|
1333
1384
|
name: "Donchian Channel",
|
|
@@ -1335,7 +1386,7 @@ var j = class {
|
|
|
1335
1386
|
defaultConfig: { period: 20 }
|
|
1336
1387
|
};
|
|
1337
1388
|
calculate(e, t) {
|
|
1338
|
-
let n = t
|
|
1389
|
+
let n = N(t, "period", 20, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null);
|
|
1339
1390
|
for (let t = n - 1; t < e.length; t++) {
|
|
1340
1391
|
let a = -Infinity, o = Infinity;
|
|
1341
1392
|
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);
|
|
@@ -1372,7 +1423,396 @@ var j = class {
|
|
|
1372
1423
|
}
|
|
1373
1424
|
this.drawBand(e, s, l, _(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]);
|
|
1374
1425
|
}
|
|
1375
|
-
},
|
|
1426
|
+
}, Ee = [
|
|
1427
|
+
"s3",
|
|
1428
|
+
"s2",
|
|
1429
|
+
"s1",
|
|
1430
|
+
"pp",
|
|
1431
|
+
"r1",
|
|
1432
|
+
"r2",
|
|
1433
|
+
"r3"
|
|
1434
|
+
], De = class extends j {
|
|
1435
|
+
descriptor = {
|
|
1436
|
+
id: "pivots",
|
|
1437
|
+
name: "Pivot Points (Classic)",
|
|
1438
|
+
placement: "overlay",
|
|
1439
|
+
defaultConfig: { lookback: 24 }
|
|
1440
|
+
};
|
|
1441
|
+
calculate(e, t) {
|
|
1442
|
+
let n = N(t, "lookback", 24, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null);
|
|
1443
|
+
if (e.length <= n) return {
|
|
1444
|
+
values: r,
|
|
1445
|
+
series: i
|
|
1446
|
+
};
|
|
1447
|
+
for (let t = n; t < e.length; t++) {
|
|
1448
|
+
let a = -Infinity, o = Infinity;
|
|
1449
|
+
for (let r = t - n; r < t; r++) e[r].high > a && (a = e[r].high), e[r].low < o && (o = e[r].low);
|
|
1450
|
+
let s = e[t - 1].close, c = (a + o + s) / 3, l = a - o, u = {
|
|
1451
|
+
pp: c,
|
|
1452
|
+
r1: 2 * c - o,
|
|
1453
|
+
s1: 2 * c - a,
|
|
1454
|
+
r2: c + l,
|
|
1455
|
+
s2: c - l,
|
|
1456
|
+
r3: a + 2 * (c - o),
|
|
1457
|
+
s3: o - 2 * (a - c)
|
|
1458
|
+
};
|
|
1459
|
+
r.set(e[t].time, u), i[t] = u;
|
|
1460
|
+
}
|
|
1461
|
+
return {
|
|
1462
|
+
values: r,
|
|
1463
|
+
series: i
|
|
1464
|
+
};
|
|
1465
|
+
}
|
|
1466
|
+
render(e, t, n, r) {
|
|
1467
|
+
let i = t.series;
|
|
1468
|
+
if (!i) return;
|
|
1469
|
+
let { from: a, to: o } = n.visibleRange, s = r.colors[0], c = r.colors[1] ?? "#EF5350", l = r.colors[2] ?? "#26A69A", u = r.lineWidths[0], d = (e) => e === "pp" ? s : e.startsWith("r") ? c : l;
|
|
1470
|
+
for (let t of Ee) {
|
|
1471
|
+
e.beginPath(), e.strokeStyle = d(t), e.lineWidth = t === "pp" ? u : Math.max(1, u - 1), t !== "pp" && e.setLineDash([4, 3]);
|
|
1472
|
+
let r = !1;
|
|
1473
|
+
for (let s = a; s <= o && s < i.length; s++) {
|
|
1474
|
+
let a = i[s]?.[t];
|
|
1475
|
+
if (a === void 0) continue;
|
|
1476
|
+
let o = S(s, n), c = C(a, n);
|
|
1477
|
+
r ? e.lineTo(o, c) : (e.moveTo(o, c), r = !0);
|
|
1478
|
+
}
|
|
1479
|
+
e.stroke(), e.setLineDash([]);
|
|
1480
|
+
}
|
|
1481
|
+
}
|
|
1482
|
+
}, Oe = class extends j {
|
|
1483
|
+
descriptor = {
|
|
1484
|
+
id: "avwap",
|
|
1485
|
+
name: "Anchored VWAP",
|
|
1486
|
+
placement: "overlay",
|
|
1487
|
+
defaultConfig: { anchorTime: 0 }
|
|
1488
|
+
};
|
|
1489
|
+
calculate(e, t) {
|
|
1490
|
+
let n = M(t, "anchorTime", 0), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null), a = 0;
|
|
1491
|
+
if (n > 0 && (a = e.findIndex((e) => e.time >= n), a < 0)) return {
|
|
1492
|
+
values: r,
|
|
1493
|
+
series: i
|
|
1494
|
+
};
|
|
1495
|
+
let o = 0, s = 0;
|
|
1496
|
+
for (let t = a; t < e.length; t++) {
|
|
1497
|
+
let n = (e[t].high + e[t].low + e[t].close) / 3;
|
|
1498
|
+
if (o += e[t].volume, s += n * e[t].volume, o > 0) {
|
|
1499
|
+
let n = { value: s / o };
|
|
1500
|
+
r.set(e[t].time, n), i[t] = n;
|
|
1501
|
+
}
|
|
1502
|
+
}
|
|
1503
|
+
return {
|
|
1504
|
+
values: r,
|
|
1505
|
+
series: i
|
|
1506
|
+
};
|
|
1507
|
+
}
|
|
1508
|
+
render(e, t, n, r) {
|
|
1509
|
+
let i = t.series;
|
|
1510
|
+
if (!i) return;
|
|
1511
|
+
let { from: a, to: o } = n.visibleRange;
|
|
1512
|
+
e.beginPath(), e.strokeStyle = r.colors[0], e.lineWidth = r.lineWidths[0], e.lineJoin = "round";
|
|
1513
|
+
let s = !1;
|
|
1514
|
+
for (let t = a; t <= o && t < i.length; t++) {
|
|
1515
|
+
let r = i[t];
|
|
1516
|
+
if (!r || r.value === void 0) continue;
|
|
1517
|
+
let a = S(t, n), o = C(r.value, n);
|
|
1518
|
+
s ? e.lineTo(a, o) : (e.moveTo(a, o), s = !0);
|
|
1519
|
+
}
|
|
1520
|
+
e.stroke();
|
|
1521
|
+
}
|
|
1522
|
+
}, ke = class extends j {
|
|
1523
|
+
descriptor = {
|
|
1524
|
+
id: "zigzag",
|
|
1525
|
+
name: "ZigZag",
|
|
1526
|
+
placement: "overlay",
|
|
1527
|
+
defaultConfig: { deviation: 5 }
|
|
1528
|
+
};
|
|
1529
|
+
calculate(e, t) {
|
|
1530
|
+
let n = Math.max(.01, M(t, "deviation", 5)) / 100, r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null);
|
|
1531
|
+
if (e.length < 2) return {
|
|
1532
|
+
values: r,
|
|
1533
|
+
series: i,
|
|
1534
|
+
meta: { pivots: [] }
|
|
1535
|
+
};
|
|
1536
|
+
let a = [], o = null, s = 0, c = e[0].close;
|
|
1537
|
+
for (let t = 1; t < e.length; t++) {
|
|
1538
|
+
let r = e[t].high, i = e[t].low;
|
|
1539
|
+
if (o === null) {
|
|
1540
|
+
r >= c * (1 + n) ? (a.push({
|
|
1541
|
+
idx: s,
|
|
1542
|
+
price: c,
|
|
1543
|
+
type: "low"
|
|
1544
|
+
}), o = "up", s = t, c = r) : i <= c * (1 - n) && (a.push({
|
|
1545
|
+
idx: s,
|
|
1546
|
+
price: c,
|
|
1547
|
+
type: "high"
|
|
1548
|
+
}), o = "down", s = t, c = i);
|
|
1549
|
+
continue;
|
|
1550
|
+
}
|
|
1551
|
+
o === "up" ? r > c ? (s = t, c = r) : i <= c * (1 - n) && (a.push({
|
|
1552
|
+
idx: s,
|
|
1553
|
+
price: c,
|
|
1554
|
+
type: "high"
|
|
1555
|
+
}), o = "down", s = t, c = i) : i < c ? (s = t, c = i) : r >= c * (1 + n) && (a.push({
|
|
1556
|
+
idx: s,
|
|
1557
|
+
price: c,
|
|
1558
|
+
type: "low"
|
|
1559
|
+
}), o = "up", s = t, c = r);
|
|
1560
|
+
}
|
|
1561
|
+
a.push({
|
|
1562
|
+
idx: s,
|
|
1563
|
+
price: c,
|
|
1564
|
+
type: o === "up" ? "high" : "low"
|
|
1565
|
+
});
|
|
1566
|
+
for (let t of a) {
|
|
1567
|
+
let n = { pivot: t.price };
|
|
1568
|
+
r.set(e[t.idx].time, n), i[t.idx] = n;
|
|
1569
|
+
}
|
|
1570
|
+
return {
|
|
1571
|
+
values: r,
|
|
1572
|
+
series: i,
|
|
1573
|
+
meta: { pivots: a }
|
|
1574
|
+
};
|
|
1575
|
+
}
|
|
1576
|
+
render(e, t, n, r) {
|
|
1577
|
+
let i = t.meta?.pivots;
|
|
1578
|
+
if (!(!i || i.length < 2)) {
|
|
1579
|
+
e.beginPath(), e.strokeStyle = r.colors[0], e.lineWidth = r.lineWidths[0], e.lineJoin = "round";
|
|
1580
|
+
for (let t = 0; t < i.length; t++) {
|
|
1581
|
+
let r = i[t], a = S(r.idx, n), o = C(r.price, n);
|
|
1582
|
+
t === 0 ? e.moveTo(a, o) : e.lineTo(a, o);
|
|
1583
|
+
}
|
|
1584
|
+
e.stroke();
|
|
1585
|
+
}
|
|
1586
|
+
}
|
|
1587
|
+
}, Ae = class extends j {
|
|
1588
|
+
descriptor = {
|
|
1589
|
+
id: "lrc",
|
|
1590
|
+
name: "Linear Regression Channel",
|
|
1591
|
+
placement: "overlay",
|
|
1592
|
+
defaultConfig: {
|
|
1593
|
+
period: 100,
|
|
1594
|
+
stdDev: 2
|
|
1595
|
+
}
|
|
1596
|
+
};
|
|
1597
|
+
calculate(e, t) {
|
|
1598
|
+
let n = N(t, "period", 100, 2), r = M(t, "stdDev", 2), i = /* @__PURE__ */ new Map(), a = Array(e.length).fill(null);
|
|
1599
|
+
if (e.length < n) return {
|
|
1600
|
+
values: i,
|
|
1601
|
+
series: a
|
|
1602
|
+
};
|
|
1603
|
+
for (let t = n - 1; t < e.length; t++) {
|
|
1604
|
+
let o = t - n + 1, s = 0, c = 0, l = 0, u = 0;
|
|
1605
|
+
for (let t = 0; t < n; t++) {
|
|
1606
|
+
let n = t, r = e[o + t].close;
|
|
1607
|
+
s += n, c += r, l += n * r, u += n * n;
|
|
1608
|
+
}
|
|
1609
|
+
let d = n * u - s * s;
|
|
1610
|
+
if (d === 0) continue;
|
|
1611
|
+
let f = (n * l - s * c) / d, p = (c - f * s) / n, m = 0;
|
|
1612
|
+
for (let t = 0; t < n; t++) {
|
|
1613
|
+
let n = f * t + p, r = e[o + t].close - n;
|
|
1614
|
+
m += r * r;
|
|
1615
|
+
}
|
|
1616
|
+
let h = Math.sqrt(m / n), g = f * (n - 1) + p, _ = {
|
|
1617
|
+
middle: g,
|
|
1618
|
+
upper: g + r * h,
|
|
1619
|
+
lower: g - r * h,
|
|
1620
|
+
slope: f
|
|
1621
|
+
};
|
|
1622
|
+
i.set(e[t].time, _), a[t] = _;
|
|
1623
|
+
}
|
|
1624
|
+
return {
|
|
1625
|
+
values: i,
|
|
1626
|
+
series: a
|
|
1627
|
+
};
|
|
1628
|
+
}
|
|
1629
|
+
render(e, t, n, r) {
|
|
1630
|
+
let i = t.series;
|
|
1631
|
+
if (!i) return;
|
|
1632
|
+
let { from: a, to: o } = n.visibleRange, s = [], c = [], l = [];
|
|
1633
|
+
for (let e = a; e <= o && e < i.length; e++) {
|
|
1634
|
+
let t = i[e];
|
|
1635
|
+
if (!t) continue;
|
|
1636
|
+
let r = S(e, n);
|
|
1637
|
+
t.middle !== void 0 && c.push({
|
|
1638
|
+
x: r,
|
|
1639
|
+
y: C(t.middle, n)
|
|
1640
|
+
}), t.upper !== void 0 && s.push({
|
|
1641
|
+
x: r,
|
|
1642
|
+
y: C(t.upper, n)
|
|
1643
|
+
}), t.lower !== void 0 && l.push({
|
|
1644
|
+
x: r,
|
|
1645
|
+
y: C(t.lower, n)
|
|
1646
|
+
});
|
|
1647
|
+
}
|
|
1648
|
+
this.drawBand(e, s, l, _(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]);
|
|
1649
|
+
}
|
|
1650
|
+
}, je = class extends j {
|
|
1651
|
+
descriptor = {
|
|
1652
|
+
id: "hma",
|
|
1653
|
+
name: "Hull Moving Average",
|
|
1654
|
+
placement: "overlay",
|
|
1655
|
+
defaultConfig: { period: 21 }
|
|
1656
|
+
};
|
|
1657
|
+
calculate(e, t) {
|
|
1658
|
+
let n = N(t, "period", 21, 2), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null);
|
|
1659
|
+
if (e.length < n) return {
|
|
1660
|
+
values: r,
|
|
1661
|
+
series: i
|
|
1662
|
+
};
|
|
1663
|
+
let a = e.map((e) => e.close), o = Math.max(2, Math.floor(n / 2)), s = Math.max(2, Math.floor(Math.sqrt(n))), c = Me(a, n), l = Me(a, o), u = Ne(a.map((e, t) => c[t] === null || l[t] === null ? null : 2 * l[t] - c[t]), s);
|
|
1664
|
+
for (let t = 0; t < e.length; t++) {
|
|
1665
|
+
if (u[t] === null) continue;
|
|
1666
|
+
let n = { value: u[t] };
|
|
1667
|
+
r.set(e[t].time, n), i[t] = n;
|
|
1668
|
+
}
|
|
1669
|
+
return {
|
|
1670
|
+
values: r,
|
|
1671
|
+
series: i
|
|
1672
|
+
};
|
|
1673
|
+
}
|
|
1674
|
+
render(e, t, n, r) {
|
|
1675
|
+
let i = t.series;
|
|
1676
|
+
if (!i) return;
|
|
1677
|
+
let { from: a, to: o } = n.visibleRange;
|
|
1678
|
+
e.beginPath(), e.strokeStyle = r.colors[0], e.lineWidth = r.lineWidths[0], e.lineJoin = "round";
|
|
1679
|
+
let s = !1;
|
|
1680
|
+
for (let t = a; t <= o && t < i.length; t++) {
|
|
1681
|
+
let r = i[t];
|
|
1682
|
+
if (!r || r.value === void 0) continue;
|
|
1683
|
+
let a = S(t, n), o = C(r.value, n);
|
|
1684
|
+
s ? e.lineTo(a, o) : (e.moveTo(a, o), s = !0);
|
|
1685
|
+
}
|
|
1686
|
+
e.stroke();
|
|
1687
|
+
}
|
|
1688
|
+
};
|
|
1689
|
+
function Me(e, t) {
|
|
1690
|
+
let n = Array(e.length).fill(null);
|
|
1691
|
+
if (e.length < t) return n;
|
|
1692
|
+
let r = t * (t + 1) / 2;
|
|
1693
|
+
for (let i = t - 1; i < e.length; i++) {
|
|
1694
|
+
let a = 0;
|
|
1695
|
+
for (let n = 0; n < t; n++) a += e[i - n] * (t - n);
|
|
1696
|
+
n[i] = a / r;
|
|
1697
|
+
}
|
|
1698
|
+
return n;
|
|
1699
|
+
}
|
|
1700
|
+
function Ne(e, t) {
|
|
1701
|
+
let n = Array(e.length).fill(null), r = t * (t + 1) / 2;
|
|
1702
|
+
for (let i = t - 1; i < e.length; i++) {
|
|
1703
|
+
let a = 0, o = !0;
|
|
1704
|
+
for (let n = 0; n < t; n++) {
|
|
1705
|
+
let r = e[i - n];
|
|
1706
|
+
if (r === null) {
|
|
1707
|
+
o = !1;
|
|
1708
|
+
break;
|
|
1709
|
+
}
|
|
1710
|
+
a += r * (t - n);
|
|
1711
|
+
}
|
|
1712
|
+
o && (n[i] = a / r);
|
|
1713
|
+
}
|
|
1714
|
+
return n;
|
|
1715
|
+
}
|
|
1716
|
+
//#endregion
|
|
1717
|
+
//#region src/indicators/panel/AwesomeOscillator.ts
|
|
1718
|
+
var Pe = class extends j {
|
|
1719
|
+
descriptor = {
|
|
1720
|
+
id: "ao",
|
|
1721
|
+
name: "Awesome Oscillator",
|
|
1722
|
+
placement: "panel",
|
|
1723
|
+
defaultConfig: {
|
|
1724
|
+
fast: 5,
|
|
1725
|
+
slow: 34
|
|
1726
|
+
}
|
|
1727
|
+
};
|
|
1728
|
+
calculate(e, t) {
|
|
1729
|
+
let n = N(t, "fast", 5, 1), r = N(t, "slow", 34, 1), i = /* @__PURE__ */ new Map(), a = Array(e.length).fill(null);
|
|
1730
|
+
if (e.length < r) return {
|
|
1731
|
+
values: i,
|
|
1732
|
+
series: a
|
|
1733
|
+
};
|
|
1734
|
+
let o = Array(e.length);
|
|
1735
|
+
for (let t = 0; t < e.length; t++) o[t] = (e[t].high + e[t].low) / 2;
|
|
1736
|
+
let s = 0, c = 0, l;
|
|
1737
|
+
for (let t = 0; t < e.length; t++) if (c += o[t], t >= r && (c -= o[t - r]), s += o[t], t >= n && (s -= o[t - n]), t >= r - 1) {
|
|
1738
|
+
let o = s / n - c / r, u = {
|
|
1739
|
+
value: o,
|
|
1740
|
+
up: +(l === void 0 || o >= l)
|
|
1741
|
+
};
|
|
1742
|
+
i.set(e[t].time, u), a[t] = u, l = o;
|
|
1743
|
+
}
|
|
1744
|
+
return {
|
|
1745
|
+
values: i,
|
|
1746
|
+
series: a
|
|
1747
|
+
};
|
|
1748
|
+
}
|
|
1749
|
+
render(e, t, n, r) {
|
|
1750
|
+
let i = t.series;
|
|
1751
|
+
if (!i) return;
|
|
1752
|
+
let { chartRect: a } = n, { from: o, to: s } = n.visibleRange, c = Infinity, l = -Infinity;
|
|
1753
|
+
for (let e = o; e <= s && e < i.length; e++) {
|
|
1754
|
+
let t = i[e]?.value;
|
|
1755
|
+
t !== void 0 && (t < c && (c = t), t > l && (l = t));
|
|
1756
|
+
}
|
|
1757
|
+
if (c === Infinity) return;
|
|
1758
|
+
let u = Math.max(Math.abs(c), Math.abs(l)) || 1, d = (e) => a.y + a.height * (1 - (e + u) / (2 * u)), f = d(0), p = n.barWidth / 2, m = r.colors[0] ?? "#26A69A", h = r.colors[1] ?? "#EF5350";
|
|
1759
|
+
for (let t = o; t <= s && t < i.length; t++) {
|
|
1760
|
+
let r = i[t];
|
|
1761
|
+
if (!r || r.value === void 0) continue;
|
|
1762
|
+
let a = S(t, n), o = d(r.value), s = Math.min(o, f), c = Math.max(Math.abs(o - f), 1);
|
|
1763
|
+
e.fillStyle = r.up ? m : h, e.fillRect(a - p, s, n.barWidth, c);
|
|
1764
|
+
}
|
|
1765
|
+
}
|
|
1766
|
+
}, Fe = class extends j {
|
|
1767
|
+
descriptor = {
|
|
1768
|
+
id: "chaikinOsc",
|
|
1769
|
+
name: "Chaikin Oscillator",
|
|
1770
|
+
placement: "panel",
|
|
1771
|
+
defaultConfig: {
|
|
1772
|
+
fast: 3,
|
|
1773
|
+
slow: 10
|
|
1774
|
+
}
|
|
1775
|
+
};
|
|
1776
|
+
calculate(e, t) {
|
|
1777
|
+
let n = N(t, "fast", 3, 1), r = N(t, "slow", 10, 1), i = /* @__PURE__ */ new Map(), a = Array(e.length).fill(null);
|
|
1778
|
+
if (e.length < r) return {
|
|
1779
|
+
values: i,
|
|
1780
|
+
series: a
|
|
1781
|
+
};
|
|
1782
|
+
let o = 2 / (n + 1), s = 2 / (r + 1), c = 0, l = 0, u = 0;
|
|
1783
|
+
for (let t = 0; t < e.length; t++) {
|
|
1784
|
+
let { high: n, low: d, close: f, volume: p } = e[t], m = n - d, h = m === 0 ? 0 : (f - d - (n - f)) / m;
|
|
1785
|
+
if (c += h * p, t === 0 ? (l = c, u = c) : (l = (c - l) * o + l, u = (c - u) * s + u), t >= r - 1) {
|
|
1786
|
+
let n = {
|
|
1787
|
+
value: l - u,
|
|
1788
|
+
adl: c
|
|
1789
|
+
};
|
|
1790
|
+
i.set(e[t].time, n), a[t] = n;
|
|
1791
|
+
}
|
|
1792
|
+
}
|
|
1793
|
+
return {
|
|
1794
|
+
values: i,
|
|
1795
|
+
series: a
|
|
1796
|
+
};
|
|
1797
|
+
}
|
|
1798
|
+
render(e, t, n, r) {
|
|
1799
|
+
let i = t.series;
|
|
1800
|
+
if (!i) return;
|
|
1801
|
+
let { chartRect: a } = n, { from: o, to: s } = n.visibleRange, c = Infinity, l = -Infinity;
|
|
1802
|
+
for (let e = o; e <= s && e < i.length; e++) {
|
|
1803
|
+
let t = i[e]?.value;
|
|
1804
|
+
t !== void 0 && (t < c && (c = t), t > l && (l = t));
|
|
1805
|
+
}
|
|
1806
|
+
if (c === Infinity) return;
|
|
1807
|
+
let u = Math.max(Math.abs(c), Math.abs(l)) || 1, d = (e) => a.y + a.height * (1 - (e + u) / (2 * u)), f = d(0), p = n.barWidth / 2, m = r.colors[0] ?? "#26A69A", h = r.colors[1] ?? "#EF5350";
|
|
1808
|
+
for (let t = o; t <= s && t < i.length; t++) {
|
|
1809
|
+
let r = i[t];
|
|
1810
|
+
if (!r || r.value === void 0) continue;
|
|
1811
|
+
let a = S(t, n), o = d(r.value), s = Math.min(o, f), c = Math.max(Math.abs(o - f), 1);
|
|
1812
|
+
e.fillStyle = r.value >= 0 ? m : h, e.fillRect(a - p, s, n.barWidth, c);
|
|
1813
|
+
}
|
|
1814
|
+
}
|
|
1815
|
+
}, Ie = class extends j {
|
|
1376
1816
|
descriptor = {
|
|
1377
1817
|
id: "rsi",
|
|
1378
1818
|
name: "Relative Strength Index",
|
|
@@ -1380,7 +1820,7 @@ var j = class {
|
|
|
1380
1820
|
defaultConfig: { period: 14 }
|
|
1381
1821
|
};
|
|
1382
1822
|
calculate(e, t) {
|
|
1383
|
-
let n = t
|
|
1823
|
+
let n = N(t, "period", 14, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null);
|
|
1384
1824
|
if (e.length < n + 1) return {
|
|
1385
1825
|
values: r,
|
|
1386
1826
|
series: i
|
|
@@ -1423,7 +1863,7 @@ var j = class {
|
|
|
1423
1863
|
}
|
|
1424
1864
|
e.stroke();
|
|
1425
1865
|
}
|
|
1426
|
-
},
|
|
1866
|
+
}, Le = class extends j {
|
|
1427
1867
|
descriptor = {
|
|
1428
1868
|
id: "macd",
|
|
1429
1869
|
name: "MACD",
|
|
@@ -1435,7 +1875,7 @@ var j = class {
|
|
|
1435
1875
|
}
|
|
1436
1876
|
};
|
|
1437
1877
|
calculate(e, t) {
|
|
1438
|
-
let n = t
|
|
1878
|
+
let n = N(t, "fast", 12, 1), r = N(t, "slow", 26, 1), i = N(t, "signal", 9, 1), a = /* @__PURE__ */ new Map(), o = Array(e.length).fill(null);
|
|
1439
1879
|
if (e.length < r) return {
|
|
1440
1880
|
values: a,
|
|
1441
1881
|
series: o
|
|
@@ -1490,7 +1930,7 @@ var j = class {
|
|
|
1490
1930
|
}
|
|
1491
1931
|
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(C), e.strokeStyle = _, e.stroke(w);
|
|
1492
1932
|
}
|
|
1493
|
-
},
|
|
1933
|
+
}, Re = class extends j {
|
|
1494
1934
|
descriptor = {
|
|
1495
1935
|
id: "stochastic",
|
|
1496
1936
|
name: "Stochastic Oscillator",
|
|
@@ -1502,7 +1942,7 @@ var j = class {
|
|
|
1502
1942
|
}
|
|
1503
1943
|
};
|
|
1504
1944
|
calculate(e, t) {
|
|
1505
|
-
let n = t
|
|
1945
|
+
let n = N(t, "kPeriod", 14, 1), r = N(t, "dPeriod", 3, 1), i = N(t, "smooth", 3, 1), a = /* @__PURE__ */ new Map(), o = Array(e.length).fill(null);
|
|
1506
1946
|
if (e.length < n) return {
|
|
1507
1947
|
values: a,
|
|
1508
1948
|
series: o
|
|
@@ -1565,7 +2005,7 @@ var j = class {
|
|
|
1565
2005
|
};
|
|
1566
2006
|
l("k", r.colors[0]), l("d", r.colors[1] ?? "#FF9800");
|
|
1567
2007
|
}
|
|
1568
|
-
},
|
|
2008
|
+
}, ze = class extends j {
|
|
1569
2009
|
descriptor = {
|
|
1570
2010
|
id: "atr",
|
|
1571
2011
|
name: "Average True Range",
|
|
@@ -1573,7 +2013,7 @@ var j = class {
|
|
|
1573
2013
|
defaultConfig: { period: 14 }
|
|
1574
2014
|
};
|
|
1575
2015
|
calculate(e, t) {
|
|
1576
|
-
let n = t
|
|
2016
|
+
let n = N(t, "period", 14, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null);
|
|
1577
2017
|
if (e.length < 2) return {
|
|
1578
2018
|
values: r,
|
|
1579
2019
|
series: i
|
|
@@ -1619,7 +2059,7 @@ var j = class {
|
|
|
1619
2059
|
}
|
|
1620
2060
|
e.stroke();
|
|
1621
2061
|
}
|
|
1622
|
-
},
|
|
2062
|
+
}, Be = class extends j {
|
|
1623
2063
|
descriptor = {
|
|
1624
2064
|
id: "adx",
|
|
1625
2065
|
name: "Average Directional Index",
|
|
@@ -1627,7 +2067,7 @@ var j = class {
|
|
|
1627
2067
|
defaultConfig: { period: 14 }
|
|
1628
2068
|
};
|
|
1629
2069
|
calculate(e, t) {
|
|
1630
|
-
let n = t
|
|
2070
|
+
let n = N(t, "period", 14, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null);
|
|
1631
2071
|
if (e.length < n * 2) return {
|
|
1632
2072
|
values: r,
|
|
1633
2073
|
series: i
|
|
@@ -1692,7 +2132,7 @@ var j = class {
|
|
|
1692
2132
|
};
|
|
1693
2133
|
l("adx", r.colors[0]), l("plusDI", r.colors[1] ?? "#26A69A"), l("minusDI", r.colors[2] ?? "#EF5350");
|
|
1694
2134
|
}
|
|
1695
|
-
},
|
|
2135
|
+
}, Ve = class extends j {
|
|
1696
2136
|
descriptor = {
|
|
1697
2137
|
id: "obv",
|
|
1698
2138
|
name: "On Balance Volume",
|
|
@@ -1738,7 +2178,7 @@ var j = class {
|
|
|
1738
2178
|
}
|
|
1739
2179
|
e.stroke();
|
|
1740
2180
|
}
|
|
1741
|
-
},
|
|
2181
|
+
}, He = class extends j {
|
|
1742
2182
|
descriptor = {
|
|
1743
2183
|
id: "williamsR",
|
|
1744
2184
|
name: "Williams %R",
|
|
@@ -1746,7 +2186,7 @@ var j = class {
|
|
|
1746
2186
|
defaultConfig: { period: 14 }
|
|
1747
2187
|
};
|
|
1748
2188
|
calculate(e, t) {
|
|
1749
|
-
let n = t
|
|
2189
|
+
let n = N(t, "period", 14, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null);
|
|
1750
2190
|
for (let t = n - 1; t < e.length; t++) {
|
|
1751
2191
|
let a = -Infinity, o = Infinity;
|
|
1752
2192
|
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);
|
|
@@ -1778,7 +2218,7 @@ var j = class {
|
|
|
1778
2218
|
}
|
|
1779
2219
|
e.stroke();
|
|
1780
2220
|
}
|
|
1781
|
-
},
|
|
2221
|
+
}, Ue = class extends j {
|
|
1782
2222
|
descriptor = {
|
|
1783
2223
|
id: "cci",
|
|
1784
2224
|
name: "Commodity Channel Index",
|
|
@@ -1786,7 +2226,7 @@ var j = class {
|
|
|
1786
2226
|
defaultConfig: { period: 20 }
|
|
1787
2227
|
};
|
|
1788
2228
|
calculate(e, t) {
|
|
1789
|
-
let n = t
|
|
2229
|
+
let n = N(t, "period", 20, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null);
|
|
1790
2230
|
for (let t = n - 1; t < e.length; t++) {
|
|
1791
2231
|
let a = 0;
|
|
1792
2232
|
for (let r = t - n + 1; r <= t; r++) a += (e[r].high + e[r].low + e[r].close) / 3;
|
|
@@ -1833,7 +2273,7 @@ var j = class {
|
|
|
1833
2273
|
}
|
|
1834
2274
|
e.stroke();
|
|
1835
2275
|
}
|
|
1836
|
-
},
|
|
2276
|
+
}, We = class extends j {
|
|
1837
2277
|
descriptor = {
|
|
1838
2278
|
id: "mfi",
|
|
1839
2279
|
name: "Money Flow Index",
|
|
@@ -1841,7 +2281,7 @@ var j = class {
|
|
|
1841
2281
|
defaultConfig: { period: 14 }
|
|
1842
2282
|
};
|
|
1843
2283
|
calculate(e, t) {
|
|
1844
|
-
let n = t
|
|
2284
|
+
let n = N(t, "period", 14, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null);
|
|
1845
2285
|
if (e.length < n + 1) return {
|
|
1846
2286
|
values: r,
|
|
1847
2287
|
series: i
|
|
@@ -1878,7 +2318,7 @@ var j = class {
|
|
|
1878
2318
|
}
|
|
1879
2319
|
e.stroke();
|
|
1880
2320
|
}
|
|
1881
|
-
},
|
|
2321
|
+
}, Ge = class extends j {
|
|
1882
2322
|
descriptor = {
|
|
1883
2323
|
id: "aroon",
|
|
1884
2324
|
name: "Aroon",
|
|
@@ -1886,7 +2326,7 @@ var j = class {
|
|
|
1886
2326
|
defaultConfig: { period: 25 }
|
|
1887
2327
|
};
|
|
1888
2328
|
calculate(e, t) {
|
|
1889
|
-
let n = t
|
|
2329
|
+
let n = N(t, "period", 25, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null);
|
|
1890
2330
|
for (let t = n; t < e.length; t++) {
|
|
1891
2331
|
let a = 0, o = 0, s = -Infinity, c = Infinity;
|
|
1892
2332
|
for (let r = 0; r <= n; r++) {
|
|
@@ -1920,7 +2360,7 @@ var j = class {
|
|
|
1920
2360
|
};
|
|
1921
2361
|
l("up", r.colors[0]), l("down", r.colors[1] ?? "#EF5350");
|
|
1922
2362
|
}
|
|
1923
|
-
},
|
|
2363
|
+
}, Ke = class extends j {
|
|
1924
2364
|
descriptor = {
|
|
1925
2365
|
id: "roc",
|
|
1926
2366
|
name: "Rate of Change",
|
|
@@ -1928,7 +2368,7 @@ var j = class {
|
|
|
1928
2368
|
defaultConfig: { period: 12 }
|
|
1929
2369
|
};
|
|
1930
2370
|
calculate(e, t) {
|
|
1931
|
-
let n = t
|
|
2371
|
+
let n = N(t, "period", 12, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null);
|
|
1932
2372
|
for (let t = n; t < e.length; t++) {
|
|
1933
2373
|
let a = e[t - n].close, o = { value: a === 0 ? 0 : (e[t].close - a) / a * 100 };
|
|
1934
2374
|
r.set(e[t].time, o), i[t] = o;
|
|
@@ -1964,7 +2404,7 @@ var j = class {
|
|
|
1964
2404
|
}
|
|
1965
2405
|
e.stroke();
|
|
1966
2406
|
}
|
|
1967
|
-
},
|
|
2407
|
+
}, qe = class extends j {
|
|
1968
2408
|
descriptor = {
|
|
1969
2409
|
id: "tsi",
|
|
1970
2410
|
name: "True Strength Index",
|
|
@@ -1981,7 +2421,7 @@ var j = class {
|
|
|
1981
2421
|
return r;
|
|
1982
2422
|
}
|
|
1983
2423
|
calculate(e, t) {
|
|
1984
|
-
let n = t
|
|
2424
|
+
let n = N(t, "longPeriod", 25, 1), r = N(t, "shortPeriod", 13, 1), i = N(t, "signalPeriod", 7, 1), a = /* @__PURE__ */ new Map(), o = Array(e.length).fill(null);
|
|
1985
2425
|
if (e.length < 2) return {
|
|
1986
2426
|
values: a,
|
|
1987
2427
|
series: o
|
|
@@ -2033,7 +2473,7 @@ var j = class {
|
|
|
2033
2473
|
};
|
|
2034
2474
|
h("tsi", r.colors[0]), h("signal", r.colors[1] ?? "#FF9800");
|
|
2035
2475
|
}
|
|
2036
|
-
},
|
|
2476
|
+
}, Je = class extends j {
|
|
2037
2477
|
descriptor = {
|
|
2038
2478
|
id: "cmf",
|
|
2039
2479
|
name: "Chaikin Money Flow",
|
|
@@ -2041,7 +2481,7 @@ var j = class {
|
|
|
2041
2481
|
defaultConfig: { period: 20 }
|
|
2042
2482
|
};
|
|
2043
2483
|
calculate(e, t) {
|
|
2044
|
-
let n = t
|
|
2484
|
+
let n = N(t, "period", 20, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null);
|
|
2045
2485
|
for (let t = n - 1; t < e.length; t++) {
|
|
2046
2486
|
let a = 0, o = 0;
|
|
2047
2487
|
for (let r = t - n + 1; r <= t; r++) {
|
|
@@ -2078,7 +2518,7 @@ var j = class {
|
|
|
2078
2518
|
}
|
|
2079
2519
|
}
|
|
2080
2520
|
}
|
|
2081
|
-
},
|
|
2521
|
+
}, Ye = class extends j {
|
|
2082
2522
|
descriptor = {
|
|
2083
2523
|
id: "stddev",
|
|
2084
2524
|
name: "Standard Deviation",
|
|
@@ -2086,7 +2526,7 @@ var j = class {
|
|
|
2086
2526
|
defaultConfig: { period: 20 }
|
|
2087
2527
|
};
|
|
2088
2528
|
calculate(e, t) {
|
|
2089
|
-
let n = t
|
|
2529
|
+
let n = N(t, "period", 20, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null);
|
|
2090
2530
|
for (let t = n - 1; t < e.length; t++) {
|
|
2091
2531
|
let a = 0;
|
|
2092
2532
|
for (let r = t - n + 1; r <= t; r++) a += e[r].close;
|
|
@@ -2124,7 +2564,7 @@ var j = class {
|
|
|
2124
2564
|
}
|
|
2125
2565
|
e.stroke();
|
|
2126
2566
|
}
|
|
2127
|
-
},
|
|
2567
|
+
}, Xe = class extends j {
|
|
2128
2568
|
descriptor = {
|
|
2129
2569
|
id: "volumeProfile",
|
|
2130
2570
|
name: "Volume Profile",
|
|
@@ -2132,7 +2572,7 @@ var j = class {
|
|
|
2132
2572
|
defaultConfig: { rows: 24 }
|
|
2133
2573
|
};
|
|
2134
2574
|
calculate(e, t) {
|
|
2135
|
-
let n = t
|
|
2575
|
+
let n = N(t, "rows", 24, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null);
|
|
2136
2576
|
if (e.length === 0) return {
|
|
2137
2577
|
values: r,
|
|
2138
2578
|
series: i
|
|
@@ -2174,7 +2614,7 @@ var j = class {
|
|
|
2174
2614
|
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));
|
|
2175
2615
|
}
|
|
2176
2616
|
}
|
|
2177
|
-
},
|
|
2617
|
+
}, Ze = class extends j {
|
|
2178
2618
|
descriptor = {
|
|
2179
2619
|
id: "ad",
|
|
2180
2620
|
name: "Accumulation/Distribution",
|
|
@@ -2220,7 +2660,7 @@ var j = class {
|
|
|
2220
2660
|
}
|
|
2221
2661
|
e.stroke();
|
|
2222
2662
|
}
|
|
2223
|
-
},
|
|
2663
|
+
}, Qe = class extends j {
|
|
2224
2664
|
descriptor = {
|
|
2225
2665
|
id: "vroc",
|
|
2226
2666
|
name: "Volume Rate of Change",
|
|
@@ -2228,7 +2668,7 @@ var j = class {
|
|
|
2228
2668
|
defaultConfig: { period: 14 }
|
|
2229
2669
|
};
|
|
2230
2670
|
calculate(e, t) {
|
|
2231
|
-
let n = t
|
|
2671
|
+
let n = N(t, "period", 14, 1), r = /* @__PURE__ */ new Map(), i = Array(e.length).fill(null);
|
|
2232
2672
|
for (let t = n; t < e.length; t++) {
|
|
2233
2673
|
let a = e[t - n].volume, o = { value: a === 0 ? 0 : (e[t].volume - a) / a * 100 };
|
|
2234
2674
|
r.set(e[t].time, o), i[t] = o;
|
|
@@ -2262,12 +2702,105 @@ var j = class {
|
|
|
2262
2702
|
};
|
|
2263
2703
|
//#endregion
|
|
2264
2704
|
//#region src/indicators/registry.ts
|
|
2265
|
-
function
|
|
2266
|
-
e.register(new
|
|
2705
|
+
function $e(e) {
|
|
2706
|
+
e.register(new ye()), e.register(new P()), e.register(new F()), e.register(new be()), e.register(new xe()), e.register(new Se()), e.register(new Ce()), e.register(new we()), e.register(new Te()), e.register(new De()), e.register(new Oe()), e.register(new ke()), e.register(new Ae()), e.register(new je()), e.register(new Ie()), e.register(new Le()), e.register(new Re()), e.register(new ze()), e.register(new Be()), e.register(new Ve()), e.register(new He()), e.register(new Ue()), e.register(new We()), e.register(new Ge()), e.register(new Ke()), e.register(new qe()), e.register(new Je()), e.register(new Ye()), e.register(new Xe()), e.register(new Ze()), e.register(new Qe()), e.register(new Pe()), e.register(new Fe());
|
|
2267
2707
|
}
|
|
2268
2708
|
//#endregion
|
|
2269
|
-
//#region src/
|
|
2270
|
-
|
|
2709
|
+
//#region src/indicators/worker/messages.ts
|
|
2710
|
+
function et(e) {
|
|
2711
|
+
if (typeof e != "object" || !e) return !1;
|
|
2712
|
+
let t = e;
|
|
2713
|
+
return typeof t.requestId == "number" ? t.type === "result" || t.type === "pong" || t.type === "error" : !1;
|
|
2714
|
+
}
|
|
2715
|
+
//#endregion
|
|
2716
|
+
//#region src/indicators/worker/IndicatorWorkerHost.ts
|
|
2717
|
+
var tt = class {
|
|
2718
|
+
worker;
|
|
2719
|
+
fallbackPlugins;
|
|
2720
|
+
timeoutMs;
|
|
2721
|
+
nextRequestId = 1;
|
|
2722
|
+
pending = /* @__PURE__ */ new Map();
|
|
2723
|
+
messageHandler;
|
|
2724
|
+
constructor(e, t = {}) {
|
|
2725
|
+
this.worker = e, this.fallbackPlugins = t.fallbackPlugins ?? /* @__PURE__ */ new Map(), this.timeoutMs = t.timeoutMs ?? 3e4, this.messageHandler = (e) => this.handleMessage(e), this.worker && (this.worker.addEventListener("message", this.messageHandler), this.worker.addEventListener("error", this.messageHandler));
|
|
2726
|
+
}
|
|
2727
|
+
hasWorker() {
|
|
2728
|
+
return this.worker !== null;
|
|
2729
|
+
}
|
|
2730
|
+
registerFallbackPlugin(e) {
|
|
2731
|
+
this.fallbackPlugins.set(e.descriptor.id, e);
|
|
2732
|
+
}
|
|
2733
|
+
async calculate(e, t, n) {
|
|
2734
|
+
if (!this.worker) {
|
|
2735
|
+
let r = this.fallbackPlugins.get(e);
|
|
2736
|
+
if (!r) throw Error(`Unknown indicator: ${e}`);
|
|
2737
|
+
return r.calculate(n, t);
|
|
2738
|
+
}
|
|
2739
|
+
let r = this.nextRequestId++, i = {
|
|
2740
|
+
type: "calculate",
|
|
2741
|
+
requestId: r,
|
|
2742
|
+
indicatorId: e,
|
|
2743
|
+
config: t,
|
|
2744
|
+
data: n
|
|
2745
|
+
};
|
|
2746
|
+
return new Promise((t, n) => {
|
|
2747
|
+
let a = {
|
|
2748
|
+
resolve: t,
|
|
2749
|
+
reject: n,
|
|
2750
|
+
timer: null
|
|
2751
|
+
};
|
|
2752
|
+
this.timeoutMs > 0 && (a.timer = setTimeout(() => {
|
|
2753
|
+
this.pending.delete(r), n(/* @__PURE__ */ Error(`Indicator worker timeout (${this.timeoutMs}ms): ${e}`));
|
|
2754
|
+
}, this.timeoutMs)), this.pending.set(r, a), this.worker.postMessage(i);
|
|
2755
|
+
});
|
|
2756
|
+
}
|
|
2757
|
+
ping() {
|
|
2758
|
+
if (!this.worker) return Promise.resolve();
|
|
2759
|
+
let e = this.nextRequestId++;
|
|
2760
|
+
return new Promise((t, n) => {
|
|
2761
|
+
let r = {
|
|
2762
|
+
resolve: () => t(),
|
|
2763
|
+
reject: n,
|
|
2764
|
+
timer: this.timeoutMs > 0 ? setTimeout(() => {
|
|
2765
|
+
this.pending.delete(e), n(/* @__PURE__ */ Error("Indicator worker ping timeout"));
|
|
2766
|
+
}, this.timeoutMs) : null
|
|
2767
|
+
};
|
|
2768
|
+
this.pending.set(e, r), this.worker.postMessage({
|
|
2769
|
+
type: "ping",
|
|
2770
|
+
requestId: e
|
|
2771
|
+
});
|
|
2772
|
+
});
|
|
2773
|
+
}
|
|
2774
|
+
terminate() {
|
|
2775
|
+
this.worker &&= (this.worker.removeEventListener("message", this.messageHandler), this.worker.removeEventListener("error", this.messageHandler), this.worker.terminate(), null);
|
|
2776
|
+
for (let e of this.pending.values()) e.timer && clearTimeout(e.timer), e.reject(/* @__PURE__ */ Error("Indicator worker terminated"));
|
|
2777
|
+
this.pending.clear();
|
|
2778
|
+
}
|
|
2779
|
+
handleMessage(e) {
|
|
2780
|
+
let t = e.data;
|
|
2781
|
+
if (t !== void 0) {
|
|
2782
|
+
if (!et(t)) return;
|
|
2783
|
+
this.dispatchResponse(t);
|
|
2784
|
+
return;
|
|
2785
|
+
}
|
|
2786
|
+
let n = e.message ?? "Indicator worker error";
|
|
2787
|
+
for (let [e, t] of this.pending) t.timer && clearTimeout(t.timer), t.reject(Error(n)), this.pending.delete(e);
|
|
2788
|
+
}
|
|
2789
|
+
dispatchResponse(e) {
|
|
2790
|
+
let t = this.pending.get(e.requestId);
|
|
2791
|
+
if (t) {
|
|
2792
|
+
if (this.pending.delete(e.requestId), t.timer && clearTimeout(t.timer), e.type === "error") {
|
|
2793
|
+
t.reject(Error(e.message));
|
|
2794
|
+
return;
|
|
2795
|
+
}
|
|
2796
|
+
if (e.type === "pong") {
|
|
2797
|
+
t.resolve(void 0);
|
|
2798
|
+
return;
|
|
2799
|
+
}
|
|
2800
|
+
t.resolve(e.output);
|
|
2801
|
+
}
|
|
2802
|
+
}
|
|
2803
|
+
}, nt = class {
|
|
2271
2804
|
visible = !0;
|
|
2272
2805
|
setVisible(e) {
|
|
2273
2806
|
this.visible = e;
|
|
@@ -2296,7 +2829,7 @@ var Le = class {
|
|
|
2296
2829
|
}
|
|
2297
2830
|
e.stroke();
|
|
2298
2831
|
}
|
|
2299
|
-
},
|
|
2832
|
+
}, rt = class {
|
|
2300
2833
|
locale = "en-US";
|
|
2301
2834
|
setLocale(e) {
|
|
2302
2835
|
this.locale = e;
|
|
@@ -2319,7 +2852,7 @@ var Le = class {
|
|
|
2319
2852
|
e.fillStyle = n.axisLabel;
|
|
2320
2853
|
for (let { y: t, text: n } of h) e.fillText(n, a + 5, t);
|
|
2321
2854
|
}
|
|
2322
|
-
},
|
|
2855
|
+
}, I = /* @__PURE__ */ new Date(), it = (e) => e < 10 ? "0" + e : "" + e, at = -(/* @__PURE__ */ new Date()).getTimezoneOffset() / 60, ot = `UTC${at >= 0 ? "+" : ""}${at}`, st = class {
|
|
2323
2856
|
render(e, t, n, r, i) {
|
|
2324
2857
|
let { chartRect: a } = t, o = i ?? a.y + a.height;
|
|
2325
2858
|
e.strokeStyle = n.axisLine, e.lineWidth = 1, e.beginPath(), e.moveTo(a.x, o + .5), e.lineTo(a.x + a.width, o + .5), e.stroke();
|
|
@@ -2329,14 +2862,14 @@ var Le = class {
|
|
|
2329
2862
|
for (let t = l; t <= u && t < r.length; t++) {
|
|
2330
2863
|
if (t % c !== 0) continue;
|
|
2331
2864
|
let n = t * s + d, i = r[t].time, a = i > 0xe8d4a51000 ? i : i * 1e3;
|
|
2332
|
-
|
|
2333
|
-
let l =
|
|
2334
|
-
l === f ? h = `${
|
|
2865
|
+
I.setTime(a);
|
|
2866
|
+
let l = I.getDate(), u = I.getMonth() + 1, p = I.getHours(), m = I.getMinutes(), h;
|
|
2867
|
+
l === f ? h = `${it(p)}:${it(m)}` : (h = `${u}/${l}`, f = l), e.fillText(h, n, o + 5);
|
|
2335
2868
|
}
|
|
2336
2869
|
let p = a.x + a.width - 4, m = o + 4;
|
|
2337
|
-
e.font = `${n.font.sizeSmall - 1}px ${n.font.family}`, e.textAlign = "right", e.textBaseline = "top", e.fillStyle = n.textSecondary, e.fillText(
|
|
2870
|
+
e.font = `${n.font.sizeSmall - 1}px ${n.font.family}`, e.textAlign = "right", e.textBaseline = "top", e.fillStyle = n.textSecondary, e.fillText(ot, p, m);
|
|
2338
2871
|
}
|
|
2339
|
-
},
|
|
2872
|
+
}, ct = class {
|
|
2340
2873
|
panHandler = null;
|
|
2341
2874
|
zoomHandler = null;
|
|
2342
2875
|
crosshairHandler = null;
|
|
@@ -2464,7 +2997,7 @@ var Le = class {
|
|
|
2464
2997
|
y: (e.clientY + t.clientY) / 2 - n.top
|
|
2465
2998
|
};
|
|
2466
2999
|
}
|
|
2467
|
-
},
|
|
3000
|
+
}, lt = class {
|
|
2468
3001
|
dragging = !1;
|
|
2469
3002
|
lastX = 0;
|
|
2470
3003
|
lastTime = 0;
|
|
@@ -2500,7 +3033,7 @@ var Le = class {
|
|
|
2500
3033
|
stopMomentum() {
|
|
2501
3034
|
this.momentumId &&= (cancelAnimationFrame(this.momentumId), 0);
|
|
2502
3035
|
}
|
|
2503
|
-
},
|
|
3036
|
+
}, ut = class {
|
|
2504
3037
|
callback;
|
|
2505
3038
|
sensitivity;
|
|
2506
3039
|
pendingDelta = 0;
|
|
@@ -2519,7 +3052,7 @@ var Le = class {
|
|
|
2519
3052
|
dispose() {
|
|
2520
3053
|
this.rafId &&= (cancelAnimationFrame(this.rafId), 0);
|
|
2521
3054
|
}
|
|
2522
|
-
},
|
|
3055
|
+
}, dt = class {
|
|
2523
3056
|
position = null;
|
|
2524
3057
|
callback = null;
|
|
2525
3058
|
data = [];
|
|
@@ -2581,7 +3114,7 @@ var Le = class {
|
|
|
2581
3114
|
flushCallback(e, t) {
|
|
2582
3115
|
this.callback?.(e, t);
|
|
2583
3116
|
}
|
|
2584
|
-
},
|
|
3117
|
+
}, ft = class {
|
|
2585
3118
|
callbacks;
|
|
2586
3119
|
enabled = !0;
|
|
2587
3120
|
constructor(e) {
|
|
@@ -2607,7 +3140,7 @@ var Le = class {
|
|
|
2607
3140
|
default: return !1;
|
|
2608
3141
|
}
|
|
2609
3142
|
}
|
|
2610
|
-
},
|
|
3143
|
+
}, pt = class {
|
|
2611
3144
|
el = null;
|
|
2612
3145
|
visible = !1;
|
|
2613
3146
|
timeEl;
|
|
@@ -2646,8 +3179,8 @@ var Le = class {
|
|
|
2646
3179
|
this.changeEl.textContent = `${l}${a(s)} (${l}${c.toFixed(2)}%)`, this.changeEl.style.color = i;
|
|
2647
3180
|
let u = t.volume;
|
|
2648
3181
|
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;
|
|
2649
|
-
let d =
|
|
2650
|
-
this.el.style.background = d ?
|
|
3182
|
+
let d = mt(n.background);
|
|
3183
|
+
this.el.style.background = d ? ht(n.background, .95) : ht(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);
|
|
2651
3184
|
let f = e.x + 16, p = e.y - 40;
|
|
2652
3185
|
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);
|
|
2653
3186
|
}
|
|
@@ -2672,7 +3205,7 @@ var Le = class {
|
|
|
2672
3205
|
return document.createElement("span");
|
|
2673
3206
|
}
|
|
2674
3207
|
};
|
|
2675
|
-
function
|
|
3208
|
+
function mt(e) {
|
|
2676
3209
|
if (e.startsWith("#")) {
|
|
2677
3210
|
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);
|
|
2678
3211
|
return (.299 * r + .587 * i + .114 * a) / 255 < .5;
|
|
@@ -2684,7 +3217,7 @@ function Ye(e) {
|
|
|
2684
3217
|
}
|
|
2685
3218
|
return !0;
|
|
2686
3219
|
}
|
|
2687
|
-
function
|
|
3220
|
+
function ht(e, t) {
|
|
2688
3221
|
if (e.startsWith("#")) {
|
|
2689
3222
|
let n = e.slice(1), r = n.length === 3 ? n.split("").map((e) => e + e).join("") : n.slice(0, 6);
|
|
2690
3223
|
return `rgba(${parseInt(r.slice(0, 2), 16)}, ${parseInt(r.slice(2, 4), 16)}, ${parseInt(r.slice(4, 6), 16)}, ${t})`;
|
|
@@ -2693,7 +3226,7 @@ function Xe(e, t) {
|
|
|
2693
3226
|
}
|
|
2694
3227
|
//#endregion
|
|
2695
3228
|
//#region src/events/EventBus.ts
|
|
2696
|
-
var
|
|
3229
|
+
var gt = class {
|
|
2697
3230
|
listeners = /* @__PURE__ */ new Map();
|
|
2698
3231
|
tauriBridge = null;
|
|
2699
3232
|
on(e, t) {
|
|
@@ -2724,7 +3257,7 @@ var Ze = class {
|
|
|
2724
3257
|
destroy() {
|
|
2725
3258
|
this.listeners.clear(), this.tauriBridge = null;
|
|
2726
3259
|
}
|
|
2727
|
-
},
|
|
3260
|
+
}, L = class {
|
|
2728
3261
|
hitTestAnchor(e, t, n, r) {
|
|
2729
3262
|
for (let i = 0; i < t.anchors.length; i++) {
|
|
2730
3263
|
let a = this.anchorToPixel(t.anchors[i], n);
|
|
@@ -2779,8 +3312,8 @@ var Ze = class {
|
|
|
2779
3312
|
let r = n.x - t.x, i = n.y - t.y, a = Math.hypot(r, i);
|
|
2780
3313
|
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;
|
|
2781
3314
|
}
|
|
2782
|
-
},
|
|
2783
|
-
function
|
|
3315
|
+
}, _t = 1;
|
|
3316
|
+
function R(e) {
|
|
2784
3317
|
return {
|
|
2785
3318
|
...e,
|
|
2786
3319
|
anchors: e.anchors.map((e) => ({ ...e })),
|
|
@@ -2788,7 +3321,7 @@ function H(e) {
|
|
|
2788
3321
|
meta: e.meta ? { ...e.meta } : void 0
|
|
2789
3322
|
};
|
|
2790
3323
|
}
|
|
2791
|
-
var
|
|
3324
|
+
var vt = class {
|
|
2792
3325
|
registry = /* @__PURE__ */ new Map();
|
|
2793
3326
|
drawings = [];
|
|
2794
3327
|
state = "idle";
|
|
@@ -2960,7 +3493,7 @@ var $e = class {
|
|
|
2960
3493
|
e && this.undoRedo?.push({
|
|
2961
3494
|
type: "drawingModify",
|
|
2962
3495
|
before: this.dragBeforeState,
|
|
2963
|
-
after:
|
|
3496
|
+
after: R(e)
|
|
2964
3497
|
});
|
|
2965
3498
|
}
|
|
2966
3499
|
return this.state = "selected", this.dragStartPoint = null, this.dragStartAnchors = [], this.dragAnchorIndex = -1, this.dragBeforeState = null, !0;
|
|
@@ -2993,7 +3526,7 @@ var $e = class {
|
|
|
2993
3526
|
let t = this.drawings.find((t) => t.id === e);
|
|
2994
3527
|
if (!t) return null;
|
|
2995
3528
|
let n = structuredClone(t);
|
|
2996
|
-
return n.id = `tc_drawing_${
|
|
3529
|
+
return n.id = `tc_drawing_${_t++}`, n.anchors = n.anchors.map((e) => ({
|
|
2997
3530
|
...e,
|
|
2998
3531
|
time: e.time + 3
|
|
2999
3532
|
})), n.locked = !1, this.drawings.push(n), this.undoRedo?.push({
|
|
@@ -3035,7 +3568,7 @@ var $e = class {
|
|
|
3035
3568
|
if (!n) return !1;
|
|
3036
3569
|
let r = w(e.x, t), i = T(e.y, t), a = this.snapToOHLC(r, i, t);
|
|
3037
3570
|
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 = {
|
|
3038
|
-
id: `tc_drawing_${
|
|
3571
|
+
id: `tc_drawing_${_t++}`,
|
|
3039
3572
|
type: this.activeTool,
|
|
3040
3573
|
anchors: [a],
|
|
3041
3574
|
style: { ...this.activeStyle },
|
|
@@ -3057,8 +3590,8 @@ var $e = class {
|
|
|
3057
3590
|
let r = this.registry.get(n.type);
|
|
3058
3591
|
if (r) {
|
|
3059
3592
|
let i = r.hitTestAnchor(e, n, t, 8);
|
|
3060
|
-
if (i >= 0) return this.state = "resizing", this.dragAnchorIndex = i, this.dragStartPoint = e, this.dragBeforeState =
|
|
3061
|
-
if (r.hitTest(e, n, t, 8)) return this.state = "moving", this.dragStartPoint = e, this.dragStartAnchors = n.anchors.map((e) => ({ ...e })), this.dragBeforeState =
|
|
3593
|
+
if (i >= 0) return this.state = "resizing", this.dragAnchorIndex = i, this.dragStartPoint = e, this.dragBeforeState = R(n), !0;
|
|
3594
|
+
if (r.hitTest(e, n, t, 8)) return this.state = "moving", this.dragStartPoint = e, this.dragStartAnchors = n.anchors.map((e) => ({ ...e })), this.dragBeforeState = R(n), !0;
|
|
3062
3595
|
}
|
|
3063
3596
|
}
|
|
3064
3597
|
}
|
|
@@ -3086,14 +3619,14 @@ var $e = class {
|
|
|
3086
3619
|
price: T(e.y, t)
|
|
3087
3620
|
}, this.requestRender?.(), !0);
|
|
3088
3621
|
}
|
|
3089
|
-
},
|
|
3622
|
+
}, yt = class {
|
|
3090
3623
|
constructor(e) {
|
|
3091
3624
|
this.manager = e;
|
|
3092
3625
|
}
|
|
3093
3626
|
render(e, t) {
|
|
3094
3627
|
this.manager.render(e, t);
|
|
3095
3628
|
}
|
|
3096
|
-
},
|
|
3629
|
+
}, bt = class extends L {
|
|
3097
3630
|
descriptor = {
|
|
3098
3631
|
type: "trendLine",
|
|
3099
3632
|
name: "Trend Line",
|
|
@@ -3109,7 +3642,7 @@ var $e = class {
|
|
|
3109
3642
|
let i = this.anchorToPixel(t.anchors[0], n), a = this.anchorToPixel(t.anchors[1], n);
|
|
3110
3643
|
return this.distanceToLine(e, i, a) <= r;
|
|
3111
3644
|
}
|
|
3112
|
-
},
|
|
3645
|
+
}, xt = class extends L {
|
|
3113
3646
|
descriptor = {
|
|
3114
3647
|
type: "horizontalLine",
|
|
3115
3648
|
name: "Horizontal Line",
|
|
@@ -3125,7 +3658,7 @@ var $e = class {
|
|
|
3125
3658
|
let i = C(t.anchors[0].price, n);
|
|
3126
3659
|
return Math.abs(e.y - i) <= r && e.x >= n.chartRect.x && e.x <= n.chartRect.x + n.chartRect.width;
|
|
3127
3660
|
}
|
|
3128
|
-
},
|
|
3661
|
+
}, St = class extends L {
|
|
3129
3662
|
descriptor = {
|
|
3130
3663
|
type: "verticalLine",
|
|
3131
3664
|
name: "Vertical Line",
|
|
@@ -3141,7 +3674,7 @@ var $e = class {
|
|
|
3141
3674
|
let i = this.anchorToPixel(t.anchors[0], n), { chartRect: a } = n;
|
|
3142
3675
|
return Math.abs(e.x - i.x) <= r && e.y >= a.y && e.y <= a.y + a.height;
|
|
3143
3676
|
}
|
|
3144
|
-
},
|
|
3677
|
+
}, Ct = class extends L {
|
|
3145
3678
|
descriptor = {
|
|
3146
3679
|
type: "ray",
|
|
3147
3680
|
name: "Ray",
|
|
@@ -3159,7 +3692,7 @@ var $e = class {
|
|
|
3159
3692
|
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;
|
|
3160
3693
|
return ((e.x - i.x) * o + (e.y - i.y) * s) / (o * o + s * s) < 0 ? !1 : this.distanceToInfiniteLine(e, i, a) <= r;
|
|
3161
3694
|
}
|
|
3162
|
-
},
|
|
3695
|
+
}, wt = class extends L {
|
|
3163
3696
|
descriptor = {
|
|
3164
3697
|
type: "extendedLine",
|
|
3165
3698
|
name: "Extended Line",
|
|
@@ -3177,7 +3710,7 @@ var $e = class {
|
|
|
3177
3710
|
let i = this.anchorToPixel(t.anchors[0], n), a = this.anchorToPixel(t.anchors[1], n);
|
|
3178
3711
|
return this.distanceToInfiniteLine(e, i, a) <= r;
|
|
3179
3712
|
}
|
|
3180
|
-
},
|
|
3713
|
+
}, Tt = class extends L {
|
|
3181
3714
|
descriptor = {
|
|
3182
3715
|
type: "parallelChannel",
|
|
3183
3716
|
name: "Parallel Channel",
|
|
@@ -3214,7 +3747,7 @@ var $e = class {
|
|
|
3214
3747
|
}
|
|
3215
3748
|
return !1;
|
|
3216
3749
|
}
|
|
3217
|
-
},
|
|
3750
|
+
}, Et = class extends L {
|
|
3218
3751
|
descriptor = {
|
|
3219
3752
|
type: "regressionChannel",
|
|
3220
3753
|
name: "Regression Channel",
|
|
@@ -3237,7 +3770,7 @@ var $e = class {
|
|
|
3237
3770
|
let i = this.anchorToPixel(t.anchors[0], n), a = this.anchorToPixel(t.anchors[1], n), o = Math.hypot(a.x - i.x, a.y - i.y), s = Math.max(10, Math.min(o * .2, 100));
|
|
3238
3771
|
return this.distanceToLine(e, i, a) <= r + s;
|
|
3239
3772
|
}
|
|
3240
|
-
},
|
|
3773
|
+
}, z = [
|
|
3241
3774
|
0,
|
|
3242
3775
|
.236,
|
|
3243
3776
|
.382,
|
|
@@ -3245,7 +3778,7 @@ var $e = class {
|
|
|
3245
3778
|
.618,
|
|
3246
3779
|
.786,
|
|
3247
3780
|
1
|
|
3248
|
-
],
|
|
3781
|
+
], Dt = class extends L {
|
|
3249
3782
|
descriptor = {
|
|
3250
3783
|
type: "fibRetracement",
|
|
3251
3784
|
name: "Fibonacci Retracement",
|
|
@@ -3255,13 +3788,13 @@ var $e = class {
|
|
|
3255
3788
|
if (t.anchors.length < 2) return;
|
|
3256
3789
|
let { chartRect: i } = n, a = t.anchors[0].price, o = t.anchors[1].price, s = a - o;
|
|
3257
3790
|
e.font = "11px sans-serif", e.textBaseline = "middle";
|
|
3258
|
-
for (let r of
|
|
3791
|
+
for (let r of z) {
|
|
3259
3792
|
let a = o + s * (1 - r), c = C(a, n);
|
|
3260
3793
|
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);
|
|
3261
3794
|
}
|
|
3262
3795
|
if (e.globalAlpha = 1, t.style.fillColor) {
|
|
3263
|
-
for (let r = 0; r <
|
|
3264
|
-
let a = o + s * (1 -
|
|
3796
|
+
for (let r = 0; r < z.length - 1; r++) {
|
|
3797
|
+
let a = o + s * (1 - z[r]), c = o + s * (1 - z[r + 1]), l = C(a, n), u = C(c, n);
|
|
3265
3798
|
e.fillStyle = t.style.fillColor, e.globalAlpha = .05 + r * .02, e.fillRect(i.x, Math.min(l, u), i.width, Math.abs(u - l));
|
|
3266
3799
|
}
|
|
3267
3800
|
e.globalAlpha = 1;
|
|
@@ -3273,13 +3806,13 @@ var $e = class {
|
|
|
3273
3806
|
let { chartRect: i } = n;
|
|
3274
3807
|
if (e.x < i.x - r || e.x > i.x + i.width + r) return !1;
|
|
3275
3808
|
let a = t.anchors[0].price, o = t.anchors[1].price, s = a - o;
|
|
3276
|
-
for (let t of
|
|
3809
|
+
for (let t of z) {
|
|
3277
3810
|
let i = C(o + s * (1 - t), n);
|
|
3278
3811
|
if (Math.abs(e.y - i) <= r) return !0;
|
|
3279
3812
|
}
|
|
3280
3813
|
return !1;
|
|
3281
3814
|
}
|
|
3282
|
-
},
|
|
3815
|
+
}, Ot = [
|
|
3283
3816
|
0,
|
|
3284
3817
|
.618,
|
|
3285
3818
|
1,
|
|
@@ -3288,7 +3821,7 @@ var $e = class {
|
|
|
3288
3821
|
2.618,
|
|
3289
3822
|
3.618,
|
|
3290
3823
|
4.236
|
|
3291
|
-
],
|
|
3824
|
+
], kt = class extends L {
|
|
3292
3825
|
descriptor = {
|
|
3293
3826
|
type: "fibExtension",
|
|
3294
3827
|
name: "Fibonacci Extension",
|
|
@@ -3304,7 +3837,7 @@ var $e = class {
|
|
|
3304
3837
|
}
|
|
3305
3838
|
let { chartRect: i } = n, a = t.anchors[0].price, o = t.anchors[1].price, s = t.anchors[2].price, c = a - o;
|
|
3306
3839
|
e.font = "11px sans-serif", e.textBaseline = "middle", e.textAlign = "left";
|
|
3307
|
-
for (let r of
|
|
3840
|
+
for (let r of Ot) {
|
|
3308
3841
|
let a = C(s + c * r, n);
|
|
3309
3842
|
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);
|
|
3310
3843
|
}
|
|
@@ -3315,13 +3848,13 @@ var $e = class {
|
|
|
3315
3848
|
let { chartRect: i } = n;
|
|
3316
3849
|
if (e.x < i.x - r || e.x > i.x + i.width + r) return !1;
|
|
3317
3850
|
let a = t.anchors[0].price - t.anchors[1].price;
|
|
3318
|
-
for (let i of
|
|
3851
|
+
for (let i of Ot) {
|
|
3319
3852
|
let o = C(t.anchors[2].price + a * i, n);
|
|
3320
3853
|
if (Math.abs(e.y - o) <= r) return !0;
|
|
3321
3854
|
}
|
|
3322
3855
|
return !1;
|
|
3323
3856
|
}
|
|
3324
|
-
},
|
|
3857
|
+
}, At = class extends L {
|
|
3325
3858
|
descriptor = {
|
|
3326
3859
|
type: "rectangle",
|
|
3327
3860
|
name: "Rectangle",
|
|
@@ -3339,7 +3872,7 @@ var $e = class {
|
|
|
3339
3872
|
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;
|
|
3340
3873
|
return !(e.x > u && e.x < f && e.y > d && e.y < p) || !!t.style.fillColor;
|
|
3341
3874
|
}
|
|
3342
|
-
},
|
|
3875
|
+
}, jt = class extends L {
|
|
3343
3876
|
descriptor = {
|
|
3344
3877
|
type: "ellipse",
|
|
3345
3878
|
name: "Ellipse",
|
|
@@ -3355,7 +3888,7 @@ var $e = class {
|
|
|
3355
3888
|
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);
|
|
3356
3889
|
return t.style.fillColor ? f <= 1 + p : Math.abs(f - 1) <= p;
|
|
3357
3890
|
}
|
|
3358
|
-
},
|
|
3891
|
+
}, Mt = class extends L {
|
|
3359
3892
|
descriptor = {
|
|
3360
3893
|
type: "triangle",
|
|
3361
3894
|
name: "Triangle",
|
|
@@ -3381,7 +3914,7 @@ var $e = class {
|
|
|
3381
3914
|
}
|
|
3382
3915
|
return !1;
|
|
3383
3916
|
}
|
|
3384
|
-
},
|
|
3917
|
+
}, Nt = class extends L {
|
|
3385
3918
|
descriptor = {
|
|
3386
3919
|
type: "pitchfork",
|
|
3387
3920
|
name: "Andrews' Pitchfork",
|
|
@@ -3417,7 +3950,7 @@ var $e = class {
|
|
|
3417
3950
|
};
|
|
3418
3951
|
return this.distanceToInfiniteLine(e, a, u) <= r || this.distanceToInfiniteLine(e, o, d) <= r;
|
|
3419
3952
|
}
|
|
3420
|
-
},
|
|
3953
|
+
}, Pt = [
|
|
3421
3954
|
"1",
|
|
3422
3955
|
"2",
|
|
3423
3956
|
"3",
|
|
@@ -3426,7 +3959,7 @@ var $e = class {
|
|
|
3426
3959
|
"A",
|
|
3427
3960
|
"B",
|
|
3428
3961
|
"C"
|
|
3429
|
-
],
|
|
3962
|
+
], Ft = class extends L {
|
|
3430
3963
|
descriptor = {
|
|
3431
3964
|
type: "elliottWave",
|
|
3432
3965
|
name: "Elliott Wave",
|
|
@@ -3438,9 +3971,9 @@ var $e = class {
|
|
|
3438
3971
|
this.applyLineStyle(e, t.style), e.beginPath(), e.moveTo(i[0].x, i[0].y);
|
|
3439
3972
|
for (let t = 1; t < i.length; t++) e.lineTo(i[t].x, i[t].y);
|
|
3440
3973
|
e.stroke(), this.resetLineStyle(e), e.font = "bold 12px sans-serif", e.fillStyle = t.style.color, e.textAlign = "center";
|
|
3441
|
-
for (let t = 0; t < i.length && t <
|
|
3974
|
+
for (let t = 0; t < i.length && t < Pt.length; t++) {
|
|
3442
3975
|
let n = t % 2 == 0 ? -12 : 12;
|
|
3443
|
-
e.textBaseline = n < 0 ? "bottom" : "top", e.fillText(
|
|
3976
|
+
e.textBaseline = n < 0 ? "bottom" : "top", e.fillText(Pt[t], i[t].x, i[t].y + n);
|
|
3444
3977
|
}
|
|
3445
3978
|
r && this.renderAnchorHandles(e, t, n);
|
|
3446
3979
|
}
|
|
@@ -3450,7 +3983,7 @@ var $e = class {
|
|
|
3450
3983
|
for (let t = 0; t < i.length - 1; t++) if (this.distanceToLine(e, i[t], i[t + 1]) <= r) return !0;
|
|
3451
3984
|
return !1;
|
|
3452
3985
|
}
|
|
3453
|
-
},
|
|
3986
|
+
}, It = class extends L {
|
|
3454
3987
|
descriptor = {
|
|
3455
3988
|
type: "priceRange",
|
|
3456
3989
|
name: "Price Range",
|
|
@@ -3468,7 +4001,7 @@ var $e = class {
|
|
|
3468
4001
|
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);
|
|
3469
4002
|
return e.x >= o - r && e.x <= s + r && e.y >= c - r && e.y <= l + r;
|
|
3470
4003
|
}
|
|
3471
|
-
},
|
|
4004
|
+
}, Lt = class extends L {
|
|
3472
4005
|
descriptor = {
|
|
3473
4006
|
type: "dateRange",
|
|
3474
4007
|
name: "Date Range",
|
|
@@ -3486,7 +4019,7 @@ var $e = class {
|
|
|
3486
4019
|
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);
|
|
3487
4020
|
return e.x >= s - r && e.x <= c + r && e.y >= o.y && e.y <= o.y + o.height;
|
|
3488
4021
|
}
|
|
3489
|
-
},
|
|
4022
|
+
}, Rt = class extends L {
|
|
3490
4023
|
descriptor = {
|
|
3491
4024
|
type: "measure",
|
|
3492
4025
|
name: "Measure",
|
|
@@ -3508,7 +4041,15 @@ var $e = class {
|
|
|
3508
4041
|
let i = this.anchorToPixel(t.anchors[0], n), a = this.anchorToPixel(t.anchors[1], n);
|
|
3509
4042
|
return this.distanceToLine(e, i, a) <= r;
|
|
3510
4043
|
}
|
|
3511
|
-
}
|
|
4044
|
+
};
|
|
4045
|
+
//#endregion
|
|
4046
|
+
//#region src/drawings/tools/TextAnnotation.ts
|
|
4047
|
+
function zt(e, t = "Text") {
|
|
4048
|
+
if (typeof e.style.text == "string" && e.style.text.length > 0) return e.style.text;
|
|
4049
|
+
let n = e.meta?.text;
|
|
4050
|
+
return typeof n == "string" && n.length > 0 ? n : t;
|
|
4051
|
+
}
|
|
4052
|
+
var Bt = class extends L {
|
|
3512
4053
|
descriptor = {
|
|
3513
4054
|
type: "text",
|
|
3514
4055
|
name: "Text",
|
|
@@ -3516,7 +4057,7 @@ var $e = class {
|
|
|
3516
4057
|
};
|
|
3517
4058
|
render(e, t, n, r) {
|
|
3518
4059
|
if (t.anchors.length < 1) return;
|
|
3519
|
-
let i = this.anchorToPixel(t.anchors[0], n), a = t
|
|
4060
|
+
let i = this.anchorToPixel(t.anchors[0], n), a = zt(t), o = t.style.fontSize || 14;
|
|
3520
4061
|
if (e.font = `${o}px sans-serif`, e.fillStyle = t.style.color, e.textAlign = "left", e.textBaseline = "top", r) {
|
|
3521
4062
|
let n = e.measureText(a);
|
|
3522
4063
|
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([]);
|
|
@@ -3528,7 +4069,7 @@ var $e = class {
|
|
|
3528
4069
|
let i = this.anchorToPixel(t.anchors[0], n), a = t.style.fontSize || 14;
|
|
3529
4070
|
return e.x >= i.x - r && e.x <= i.x + 80 + r && e.y >= i.y - r && e.y <= i.y + a + r;
|
|
3530
4071
|
}
|
|
3531
|
-
},
|
|
4072
|
+
}, Vt = class extends L {
|
|
3532
4073
|
descriptor = {
|
|
3533
4074
|
type: "arrow",
|
|
3534
4075
|
name: "Arrow",
|
|
@@ -3546,7 +4087,7 @@ var $e = class {
|
|
|
3546
4087
|
let i = this.anchorToPixel(t.anchors[0], n), a = this.anchorToPixel(t.anchors[1], n);
|
|
3547
4088
|
return this.distanceToLine(e, i, a) <= r;
|
|
3548
4089
|
}
|
|
3549
|
-
},
|
|
4090
|
+
}, Ht = [
|
|
3550
4091
|
{
|
|
3551
4092
|
label: "8x1",
|
|
3552
4093
|
ratio: 8
|
|
@@ -3583,7 +4124,7 @@ var $e = class {
|
|
|
3583
4124
|
label: "1x8",
|
|
3584
4125
|
ratio: .125
|
|
3585
4126
|
}
|
|
3586
|
-
],
|
|
4127
|
+
], Ut = class extends L {
|
|
3587
4128
|
descriptor = {
|
|
3588
4129
|
type: "gannFan",
|
|
3589
4130
|
name: "Gann Fan",
|
|
@@ -3595,7 +4136,7 @@ var $e = class {
|
|
|
3595
4136
|
if (Math.abs(o) < 1) return;
|
|
3596
4137
|
let c = s / o, l = o > 0 ? 1 : -1, { chartRect: u } = n, d = l > 0 ? u.x + u.width : u.x;
|
|
3597
4138
|
this.applyLineStyle(e, t.style);
|
|
3598
|
-
for (let { label: n, ratio: r } of
|
|
4139
|
+
for (let { label: n, ratio: r } of Ht) {
|
|
3599
4140
|
let a = c * r, o = d, s = i.y + a * (o - i.x);
|
|
3600
4141
|
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();
|
|
3601
4142
|
let f = o - l * 4, p = s;
|
|
@@ -3608,7 +4149,7 @@ var $e = class {
|
|
|
3608
4149
|
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;
|
|
3609
4150
|
if (Math.abs(o) < 1) return !1;
|
|
3610
4151
|
let c = s / o, l = o > 0 ? 1 : -1, { chartRect: u } = n, d = l > 0 ? u.x + u.width : u.x;
|
|
3611
|
-
for (let { ratio: t } of
|
|
4152
|
+
for (let { ratio: t } of Ht) {
|
|
3612
4153
|
let n = c * t, a = d, o = i.y + n * (a - i.x);
|
|
3613
4154
|
if (this.distanceToLine(e, i, {
|
|
3614
4155
|
x: a,
|
|
@@ -3617,7 +4158,7 @@ var $e = class {
|
|
|
3617
4158
|
}
|
|
3618
4159
|
return !1;
|
|
3619
4160
|
}
|
|
3620
|
-
},
|
|
4161
|
+
}, B = [
|
|
3621
4162
|
0,
|
|
3622
4163
|
.25,
|
|
3623
4164
|
.333,
|
|
@@ -3625,7 +4166,7 @@ var $e = class {
|
|
|
3625
4166
|
.667,
|
|
3626
4167
|
.75,
|
|
3627
4168
|
1
|
|
3628
|
-
],
|
|
4169
|
+
], Wt = class extends L {
|
|
3629
4170
|
descriptor = {
|
|
3630
4171
|
type: "gannBox",
|
|
3631
4172
|
name: "Gann Box",
|
|
@@ -3636,18 +4177,18 @@ var $e = class {
|
|
|
3636
4177
|
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;
|
|
3637
4178
|
if (!(u < 2 || d < 2)) {
|
|
3638
4179
|
this.applyLineStyle(e, t.style), e.strokeRect(o, c, u, d), e.save(), e.globalAlpha = .35;
|
|
3639
|
-
for (let t of
|
|
4180
|
+
for (let t of B) {
|
|
3640
4181
|
if (t === 0 || t === 1) continue;
|
|
3641
4182
|
let n = c + d * t;
|
|
3642
4183
|
e.beginPath(), e.moveTo(o, n), e.lineTo(s, n), e.stroke();
|
|
3643
4184
|
}
|
|
3644
|
-
for (let t of
|
|
4185
|
+
for (let t of B) {
|
|
3645
4186
|
if (t === 0 || t === 1) continue;
|
|
3646
4187
|
let n = o + u * t;
|
|
3647
4188
|
e.beginPath(), e.moveTo(n, c), e.lineTo(n, l), e.stroke();
|
|
3648
4189
|
}
|
|
3649
4190
|
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";
|
|
3650
|
-
for (let t of
|
|
4191
|
+
for (let t of B) {
|
|
3651
4192
|
if (t === 0 || t === 1) continue;
|
|
3652
4193
|
let n = c + d * t;
|
|
3653
4194
|
e.fillText(`${(t * 100).toFixed(0)}%`, o - 3, n);
|
|
@@ -3672,7 +4213,7 @@ var $e = class {
|
|
|
3672
4213
|
y: l
|
|
3673
4214
|
}) <= r;
|
|
3674
4215
|
}
|
|
3675
|
-
},
|
|
4216
|
+
}, Gt = class extends L {
|
|
3676
4217
|
descriptor = {
|
|
3677
4218
|
type: "anchoredVWAP",
|
|
3678
4219
|
name: "Anchored VWAP",
|
|
@@ -3744,7 +4285,7 @@ var $e = class {
|
|
|
3744
4285
|
}
|
|
3745
4286
|
return !1;
|
|
3746
4287
|
}
|
|
3747
|
-
},
|
|
4288
|
+
}, Kt = class extends L {
|
|
3748
4289
|
descriptor = {
|
|
3749
4290
|
type: "volumeProfileRange",
|
|
3750
4291
|
name: "Volume Profile (Range)",
|
|
@@ -3789,12 +4330,12 @@ var $e = class {
|
|
|
3789
4330
|
};
|
|
3790
4331
|
//#endregion
|
|
3791
4332
|
//#region src/drawings/tools/index.ts
|
|
3792
|
-
function
|
|
3793
|
-
e.register(new
|
|
4333
|
+
function qt(e) {
|
|
4334
|
+
e.register(new bt()), e.register(new xt()), 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 kt()), e.register(new At()), e.register(new jt()), e.register(new Mt()), e.register(new Nt()), 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 Gt()), e.register(new Kt());
|
|
3794
4335
|
}
|
|
3795
4336
|
//#endregion
|
|
3796
4337
|
//#region src/trading/OrderRenderer.ts
|
|
3797
|
-
var
|
|
4338
|
+
var Jt = class {
|
|
3798
4339
|
render(e, t, n, r, i, a) {
|
|
3799
4340
|
let o = i.orderColors?.buy ?? "#26A69A", s = i.orderColors?.sell ?? "#EF5350", { chartRect: c } = n;
|
|
3800
4341
|
for (let i of t) {
|
|
@@ -3832,27 +4373,76 @@ var Ot = class {
|
|
|
3832
4373
|
}
|
|
3833
4374
|
return null;
|
|
3834
4375
|
}
|
|
3835
|
-
}
|
|
4376
|
+
};
|
|
4377
|
+
//#endregion
|
|
4378
|
+
//#region src/trading/positionFormat.ts
|
|
4379
|
+
function Yt(e, t, n) {
|
|
4380
|
+
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;
|
|
4381
|
+
return {
|
|
4382
|
+
side: e.side,
|
|
4383
|
+
quantity: e.quantity,
|
|
4384
|
+
closedQuantity: r,
|
|
4385
|
+
openQuantity: i,
|
|
4386
|
+
entryPrice: e.entryPrice,
|
|
4387
|
+
currentPrice: t,
|
|
4388
|
+
pnl: o,
|
|
4389
|
+
pnlPct: s,
|
|
4390
|
+
precision: n
|
|
4391
|
+
};
|
|
4392
|
+
}
|
|
4393
|
+
var Xt = /\{(side|qty|closedQty|openQty|entry|price|pnl|pnlPct|pnlSign)\}/g;
|
|
4394
|
+
function Zt(e, t) {
|
|
4395
|
+
return e.replace(Xt, (e, n) => {
|
|
4396
|
+
switch (n) {
|
|
4397
|
+
case "side": return t.side.toUpperCase();
|
|
4398
|
+
case "qty": return String(t.quantity);
|
|
4399
|
+
case "closedQty": return String(t.closedQuantity);
|
|
4400
|
+
case "openQty": return String(t.openQuantity);
|
|
4401
|
+
case "entry": return t.entryPrice.toFixed(t.precision);
|
|
4402
|
+
case "price": return t.currentPrice.toFixed(t.precision);
|
|
4403
|
+
case "pnl": return t.pnl.toFixed(t.precision);
|
|
4404
|
+
case "pnlPct": return `${t.pnlPct.toFixed(2)}%`;
|
|
4405
|
+
case "pnlSign": return t.pnl >= 0 ? "+" : "";
|
|
4406
|
+
default: return "";
|
|
4407
|
+
}
|
|
4408
|
+
});
|
|
4409
|
+
}
|
|
4410
|
+
function Qt(e, t) {
|
|
4411
|
+
return typeof e == "function" ? e(t) : Zt(e ?? "{side} {qty} | P&L: {pnlSign}{pnl}", t);
|
|
4412
|
+
}
|
|
4413
|
+
function $t(e, t, n) {
|
|
4414
|
+
if (!t || t.length === 0) return n;
|
|
4415
|
+
let r = [...t].sort((e, t) => e.pnl - t.pnl), i;
|
|
4416
|
+
for (let t of r) if (e >= t.pnl) i = t.color;
|
|
4417
|
+
else break;
|
|
4418
|
+
return i ?? n;
|
|
4419
|
+
}
|
|
4420
|
+
//#endregion
|
|
4421
|
+
//#region src/trading/PositionRenderer.ts
|
|
4422
|
+
var en = class {
|
|
3836
4423
|
render(e, t, n, r, i, a) {
|
|
3837
4424
|
let { chartRect: o } = r, s = a.positionColors?.profit ?? "#26A69A", c = a.positionColors?.loss ?? "#EF5350", l = a.positionColors?.entry ?? "#2196F3", u = a.pricePrecision ?? 2;
|
|
3838
|
-
for (let
|
|
3839
|
-
let t = C(
|
|
4425
|
+
for (let d of t) {
|
|
4426
|
+
let t = C(d.entryPrice, r);
|
|
3840
4427
|
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) {
|
|
3841
|
-
let
|
|
3842
|
-
e.fillStyle =
|
|
3843
|
-
let
|
|
3844
|
-
e.fillRect(o.x,
|
|
3845
|
-
|
|
4428
|
+
let f = C(n, r), p = Yt(d, n, u), m = p.pnl, h = m >= 0 ? s : c, g = $t(m, a.pnlThresholds, h);
|
|
4429
|
+
e.fillStyle = g, e.globalAlpha = .08;
|
|
4430
|
+
let _ = Math.min(t, f), v = Math.abs(f - t);
|
|
4431
|
+
if (e.fillRect(o.x, _, o.width, v), e.globalAlpha = 1, p.closedQuantity > 0 && d.quantity > 0) {
|
|
4432
|
+
let t = p.closedQuantity / d.quantity;
|
|
4433
|
+
e.fillStyle = l, e.globalAlpha = .25, e.fillRect(o.x, _, Math.max(2, o.width * t * .04) + 2, v), e.globalAlpha = 1;
|
|
4434
|
+
}
|
|
4435
|
+
let y = Qt(a.positionLabel, p);
|
|
3846
4436
|
e.font = `bold 11px ${i.font.family}`;
|
|
3847
|
-
let
|
|
3848
|
-
e.fillStyle =
|
|
4437
|
+
let b = e.measureText(y).width + 12, x = o.x + 8;
|
|
4438
|
+
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);
|
|
3849
4439
|
}
|
|
3850
|
-
if (
|
|
3851
|
-
let t = C(
|
|
4440
|
+
if (d.stopLoss !== void 0) {
|
|
4441
|
+
let t = C(d.stopLoss, r);
|
|
3852
4442
|
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);
|
|
3853
4443
|
}
|
|
3854
|
-
if (
|
|
3855
|
-
let t = C(
|
|
4444
|
+
if (d.takeProfit !== void 0) {
|
|
4445
|
+
let t = C(d.takeProfit, r);
|
|
3856
4446
|
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);
|
|
3857
4447
|
}
|
|
3858
4448
|
e.setLineDash([]);
|
|
@@ -3865,7 +4455,7 @@ var Ot = class {
|
|
|
3865
4455
|
e.fillStyle = o, e.fillRect(l, t - 9, c - 2, 18), e.fillStyle = "#FFFFFF", e.font = `11px ${r.font.family}`, e.textAlign = "left", e.textBaseline = "middle", e.fillText(i.entryPrice.toFixed(s), l + 5, t);
|
|
3866
4456
|
}
|
|
3867
4457
|
}
|
|
3868
|
-
},
|
|
4458
|
+
}, tn = class {
|
|
3869
4459
|
render(e, t, n, r) {
|
|
3870
4460
|
if (!r.depthOverlay?.enabled) return;
|
|
3871
4461
|
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;
|
|
@@ -3896,7 +4486,7 @@ var Ot = class {
|
|
|
3896
4486
|
e.fillRect(p - o, a - f / 2, o, f);
|
|
3897
4487
|
}
|
|
3898
4488
|
}
|
|
3899
|
-
},
|
|
4489
|
+
}, nn = class {
|
|
3900
4490
|
dragState = null;
|
|
3901
4491
|
startY = 0;
|
|
3902
4492
|
dragging = !1;
|
|
@@ -3960,7 +4550,7 @@ var Ot = class {
|
|
|
3960
4550
|
isActive() {
|
|
3961
4551
|
return this.dragState !== null;
|
|
3962
4552
|
}
|
|
3963
|
-
},
|
|
4553
|
+
}, V = class {
|
|
3964
4554
|
menuElement = null;
|
|
3965
4555
|
removeHandler = null;
|
|
3966
4556
|
onItemSelect = null;
|
|
@@ -4044,17 +4634,17 @@ var Ot = class {
|
|
|
4044
4634
|
destroy() {
|
|
4045
4635
|
this.hide(), this.onItemSelect = null;
|
|
4046
4636
|
}
|
|
4047
|
-
},
|
|
4637
|
+
}, rn = class {
|
|
4048
4638
|
orders = [];
|
|
4049
4639
|
positions = [];
|
|
4050
4640
|
depthData = null;
|
|
4051
4641
|
currentPrice = null;
|
|
4052
4642
|
config;
|
|
4053
|
-
orderRenderer = new
|
|
4054
|
-
positionRenderer = new
|
|
4055
|
-
depthOverlay = new
|
|
4643
|
+
orderRenderer = new Jt();
|
|
4644
|
+
positionRenderer = new en();
|
|
4645
|
+
depthOverlay = new tn();
|
|
4056
4646
|
dragHandler;
|
|
4057
|
-
contextMenu = new
|
|
4647
|
+
contextMenu = new V();
|
|
4058
4648
|
requestRender = null;
|
|
4059
4649
|
eventCallback = null;
|
|
4060
4650
|
container = null;
|
|
@@ -4062,7 +4652,7 @@ var Ot = class {
|
|
|
4062
4652
|
this.config = {
|
|
4063
4653
|
...a,
|
|
4064
4654
|
...e
|
|
4065
|
-
}, this.dragHandler = new
|
|
4655
|
+
}, this.dragHandler = new nn(this.config.dragThreshold), this.contextMenu.onItemSelect = (e) => {
|
|
4066
4656
|
this.eventCallback?.("orderPlace", e);
|
|
4067
4657
|
};
|
|
4068
4658
|
}
|
|
@@ -4123,7 +4713,7 @@ var Ot = class {
|
|
|
4123
4713
|
destroy() {
|
|
4124
4714
|
this.contextMenu.destroy();
|
|
4125
4715
|
}
|
|
4126
|
-
},
|
|
4716
|
+
}, an = class {
|
|
4127
4717
|
constructor(e) {
|
|
4128
4718
|
this.manager = e;
|
|
4129
4719
|
}
|
|
@@ -4133,7 +4723,7 @@ var Ot = class {
|
|
|
4133
4723
|
renderAxisBadges(e, t, n) {
|
|
4134
4724
|
this.manager.renderAxisBadges(e, t, n);
|
|
4135
4725
|
}
|
|
4136
|
-
},
|
|
4726
|
+
}, H = class {
|
|
4137
4727
|
listeners = /* @__PURE__ */ new Map();
|
|
4138
4728
|
on(e, t) {
|
|
4139
4729
|
let n = this.listeners.get(e);
|
|
@@ -4155,7 +4745,7 @@ var Ot = class {
|
|
|
4155
4745
|
removeAllListeners() {
|
|
4156
4746
|
this.listeners.clear();
|
|
4157
4747
|
}
|
|
4158
|
-
},
|
|
4748
|
+
}, on = class extends H {
|
|
4159
4749
|
currentBar = null;
|
|
4160
4750
|
timeframeMs;
|
|
4161
4751
|
tickRing;
|
|
@@ -4217,7 +4807,7 @@ var Ot = class {
|
|
|
4217
4807
|
alignToTimeframe(e) {
|
|
4218
4808
|
return Math.floor(e / this.timeframeMs) * this.timeframeMs;
|
|
4219
4809
|
}
|
|
4220
|
-
},
|
|
4810
|
+
}, U = class extends H {
|
|
4221
4811
|
config;
|
|
4222
4812
|
attempt = 0;
|
|
4223
4813
|
timer = null;
|
|
@@ -4264,7 +4854,7 @@ var Ot = class {
|
|
|
4264
4854
|
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);
|
|
4265
4855
|
return Math.max(0, Math.round(n + r));
|
|
4266
4856
|
}
|
|
4267
|
-
},
|
|
4857
|
+
}, sn = class {
|
|
4268
4858
|
price = null;
|
|
4269
4859
|
previousClose = null;
|
|
4270
4860
|
visible = !0;
|
|
@@ -4295,12 +4885,12 @@ var Ot = class {
|
|
|
4295
4885
|
let f = s - 5;
|
|
4296
4886
|
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(l, s + 5, r);
|
|
4297
4887
|
}
|
|
4298
|
-
},
|
|
4888
|
+
}, cn = class extends H {
|
|
4299
4889
|
config = null;
|
|
4300
4890
|
adapter = null;
|
|
4301
4891
|
aggregator = null;
|
|
4302
4892
|
reconnector;
|
|
4303
|
-
priceLine = new
|
|
4893
|
+
priceLine = new sn();
|
|
4304
4894
|
state = "disconnected";
|
|
4305
4895
|
lastPrice = null;
|
|
4306
4896
|
previousClose = null;
|
|
@@ -4308,13 +4898,13 @@ var Ot = class {
|
|
|
4308
4898
|
heartbeatTimer = null;
|
|
4309
4899
|
lastMessageTime = 0;
|
|
4310
4900
|
constructor() {
|
|
4311
|
-
super(), this.reconnector = new
|
|
4901
|
+
super(), this.reconnector = new U(), this.wireReconnector();
|
|
4312
4902
|
}
|
|
4313
4903
|
async connect(e) {
|
|
4314
4904
|
this.disconnect(), this.config = {
|
|
4315
4905
|
...i,
|
|
4316
4906
|
...e
|
|
4317
|
-
}, this.adapter = e.adapter, this.aggregator = new
|
|
4907
|
+
}, this.adapter = e.adapter, this.aggregator = new on(e.timeframe), this.reconnector.removeAllListeners(), this.reconnector.stop(), this.reconnector = new U(e.reconnect ?? r), this.wireReconnector(), this.aggregator.on("bar", (e) => {
|
|
4318
4908
|
this.emit("barUpdate", e), this.updatePrice(e.close);
|
|
4319
4909
|
}), this.aggregator.on("barClose", (e) => {
|
|
4320
4910
|
this.previousClose = e.close, this.emit("barClose", e);
|
|
@@ -4424,7 +5014,56 @@ var Ot = class {
|
|
|
4424
5014
|
dispose() {
|
|
4425
5015
|
this.disconnect(), this.removeAllListeners();
|
|
4426
5016
|
}
|
|
4427
|
-
}
|
|
5017
|
+
};
|
|
5018
|
+
//#endregion
|
|
5019
|
+
//#region src/realtime/adapters/binanceTypes.ts
|
|
5020
|
+
function ln(e) {
|
|
5021
|
+
if (!Array.isArray(e) || e.length < 6) return null;
|
|
5022
|
+
let t = e[0];
|
|
5023
|
+
if (typeof t != "number" || !Number.isFinite(t)) return null;
|
|
5024
|
+
let n = W(e[1]), r = W(e[2]), i = W(e[3]), a = W(e[4]), o = W(e[5]);
|
|
5025
|
+
return n === null || r === null || i === null || a === null || o === null ? null : {
|
|
5026
|
+
time: t,
|
|
5027
|
+
open: n,
|
|
5028
|
+
high: r,
|
|
5029
|
+
low: i,
|
|
5030
|
+
close: a,
|
|
5031
|
+
volume: o
|
|
5032
|
+
};
|
|
5033
|
+
}
|
|
5034
|
+
function un(e) {
|
|
5035
|
+
if (!dn(e)) return null;
|
|
5036
|
+
let t = e.t;
|
|
5037
|
+
if (typeof t != "number" || !Number.isFinite(t)) return null;
|
|
5038
|
+
let n = W(e.o), r = W(e.h), i = W(e.l), a = W(e.c), o = W(e.v);
|
|
5039
|
+
if (n === null || r === null || i === null || a === null || o === null) return null;
|
|
5040
|
+
let s = typeof e.x == "boolean" ? e.x : !1;
|
|
5041
|
+
return {
|
|
5042
|
+
bar: {
|
|
5043
|
+
time: t,
|
|
5044
|
+
open: n,
|
|
5045
|
+
high: r,
|
|
5046
|
+
low: i,
|
|
5047
|
+
close: a,
|
|
5048
|
+
volume: o
|
|
5049
|
+
},
|
|
5050
|
+
closed: s
|
|
5051
|
+
};
|
|
5052
|
+
}
|
|
5053
|
+
function W(e) {
|
|
5054
|
+
if (typeof e == "number") return Number.isFinite(e) ? e : null;
|
|
5055
|
+
if (typeof e == "string") {
|
|
5056
|
+
let t = parseFloat(e);
|
|
5057
|
+
return Number.isFinite(t) ? t : null;
|
|
5058
|
+
}
|
|
5059
|
+
return null;
|
|
5060
|
+
}
|
|
5061
|
+
function dn(e) {
|
|
5062
|
+
return typeof e == "object" && !!e;
|
|
5063
|
+
}
|
|
5064
|
+
//#endregion
|
|
5065
|
+
//#region src/realtime/adapters/BinanceAdapter.ts
|
|
5066
|
+
var fn = {
|
|
4428
5067
|
"1s": "1s",
|
|
4429
5068
|
"1m": "1m",
|
|
4430
5069
|
"3m": "3m",
|
|
@@ -4441,7 +5080,7 @@ var Ot = class {
|
|
|
4441
5080
|
"3d": "3d",
|
|
4442
5081
|
"1w": "1w",
|
|
4443
5082
|
"1M": "1M"
|
|
4444
|
-
},
|
|
5083
|
+
}, pn = class {
|
|
4445
5084
|
name = "binance";
|
|
4446
5085
|
ws = null;
|
|
4447
5086
|
state = "disconnected";
|
|
@@ -4462,16 +5101,16 @@ var Ot = class {
|
|
|
4462
5101
|
return this.state;
|
|
4463
5102
|
}
|
|
4464
5103
|
async fetchHistory(e, t, n = 500) {
|
|
4465
|
-
let r =
|
|
5104
|
+
let r = fn[t] ?? "15m", i = `${this.restBase}/klines?symbol=${e}&interval=${r}&limit=${n}`, a = await fetch(i);
|
|
4466
5105
|
if (!a.ok) throw Error(`Binance REST error: ${a.status}`);
|
|
4467
|
-
|
|
4468
|
-
|
|
4469
|
-
|
|
4470
|
-
|
|
4471
|
-
|
|
4472
|
-
|
|
4473
|
-
|
|
4474
|
-
|
|
5106
|
+
let o = await a.json();
|
|
5107
|
+
if (!Array.isArray(o)) return [];
|
|
5108
|
+
let s = [];
|
|
5109
|
+
for (let e of o) {
|
|
5110
|
+
let t = ln(e);
|
|
5111
|
+
t && s.push(t);
|
|
5112
|
+
}
|
|
5113
|
+
return s;
|
|
4475
5114
|
}
|
|
4476
5115
|
on(e, t) {
|
|
4477
5116
|
let n = this.listeners.get(e);
|
|
@@ -4485,7 +5124,7 @@ var Ot = class {
|
|
|
4485
5124
|
}
|
|
4486
5125
|
connectWs() {
|
|
4487
5126
|
if (!this.config) return;
|
|
4488
|
-
let e = `${this.config.symbol.toLowerCase()}@kline_${
|
|
5127
|
+
let e = `${this.config.symbol.toLowerCase()}@kline_${fn[this.config.timeframe] ?? "15m"}`, t = `${this.wsBase}/${e}`;
|
|
4489
5128
|
this.setState("connecting");
|
|
4490
5129
|
try {
|
|
4491
5130
|
this.ws = new WebSocket(t);
|
|
@@ -4496,10 +5135,13 @@ var Ot = class {
|
|
|
4496
5135
|
this.ws.onopen = () => {
|
|
4497
5136
|
this.setState("connected"), this.emitEvent("connectionChange", "connected");
|
|
4498
5137
|
}, this.ws.onmessage = (e) => {
|
|
5138
|
+
let t;
|
|
4499
5139
|
try {
|
|
4500
|
-
|
|
4501
|
-
|
|
4502
|
-
|
|
5140
|
+
t = JSON.parse(typeof e.data == "string" ? e.data : "");
|
|
5141
|
+
} catch {
|
|
5142
|
+
return;
|
|
5143
|
+
}
|
|
5144
|
+
typeof t == "object" && t && t.e === "kline" && this.handleKline(t.k);
|
|
4503
5145
|
}, this.ws.onerror = () => {
|
|
4504
5146
|
this.setState("error"), this.emitEvent("error", { message: "WebSocket error" });
|
|
4505
5147
|
}, this.ws.onclose = () => {
|
|
@@ -4507,21 +5149,16 @@ var Ot = class {
|
|
|
4507
5149
|
};
|
|
4508
5150
|
}
|
|
4509
5151
|
handleKline(e) {
|
|
4510
|
-
let t =
|
|
4511
|
-
|
|
4512
|
-
|
|
4513
|
-
high: parseFloat(e.h),
|
|
4514
|
-
low: parseFloat(e.l),
|
|
4515
|
-
close: parseFloat(e.c),
|
|
4516
|
-
volume: parseFloat(e.v)
|
|
4517
|
-
}, n = e.x;
|
|
5152
|
+
let t = un(e);
|
|
5153
|
+
if (!t) return;
|
|
5154
|
+
let { bar: n, closed: r } = t;
|
|
4518
5155
|
this.emitEvent("bar", {
|
|
4519
|
-
bar:
|
|
4520
|
-
closed:
|
|
5156
|
+
bar: n,
|
|
5157
|
+
closed: r
|
|
4521
5158
|
}), this.emitEvent("tick", {
|
|
4522
5159
|
time: Date.now(),
|
|
4523
|
-
price:
|
|
4524
|
-
volume:
|
|
5160
|
+
price: n.close,
|
|
5161
|
+
volume: n.volume
|
|
4525
5162
|
});
|
|
4526
5163
|
}
|
|
4527
5164
|
setState(e) {
|
|
@@ -4538,7 +5175,7 @@ var Ot = class {
|
|
|
4538
5175
|
for (let e of n) e(r);
|
|
4539
5176
|
}
|
|
4540
5177
|
}
|
|
4541
|
-
},
|
|
5178
|
+
}, mn = class {
|
|
4542
5179
|
name = "mock";
|
|
4543
5180
|
state = "disconnected";
|
|
4544
5181
|
listeners = /* @__PURE__ */ new Map();
|
|
@@ -4633,7 +5270,7 @@ var Ot = class {
|
|
|
4633
5270
|
for (let e of n) e(r);
|
|
4634
5271
|
}
|
|
4635
5272
|
}
|
|
4636
|
-
},
|
|
5273
|
+
}, hn = {
|
|
4637
5274
|
visible: !0,
|
|
4638
5275
|
showSymbol: !0,
|
|
4639
5276
|
showOHLC: !0,
|
|
@@ -4641,12 +5278,13 @@ var Ot = class {
|
|
|
4641
5278
|
showVolume: !0,
|
|
4642
5279
|
position: "top-left",
|
|
4643
5280
|
fontSize: 12
|
|
4644
|
-
},
|
|
4645
|
-
config = { ...
|
|
5281
|
+
}, gn = class {
|
|
5282
|
+
config = { ...hn };
|
|
4646
5283
|
symbol = "";
|
|
4647
5284
|
timeframe = "";
|
|
4648
5285
|
hoverBar = null;
|
|
4649
5286
|
indicators = [];
|
|
5287
|
+
statusText = null;
|
|
4650
5288
|
setConfig(e) {
|
|
4651
5289
|
Object.assign(this.config, e);
|
|
4652
5290
|
}
|
|
@@ -4663,14 +5301,17 @@ var Ot = class {
|
|
|
4663
5301
|
setIndicatorValues(e) {
|
|
4664
5302
|
this.indicators = e;
|
|
4665
5303
|
}
|
|
5304
|
+
setStatusText(e) {
|
|
5305
|
+
this.statusText = e;
|
|
5306
|
+
}
|
|
4666
5307
|
render(e, t, n, r) {
|
|
4667
5308
|
if (!this.config.visible || r.length === 0) return;
|
|
4668
5309
|
let i = this.hoverBar ?? r[r.length - 1], a = r.length > 1 ? r[r.length - 2] : i, { chartRect: o } = t, s = this.config.fontSize, c = this.config.position === "top-left", l = c ? o.x + 8 : o.x + o.width - 8, u = o.y + 6;
|
|
4669
5310
|
if (e.textAlign = c ? "left" : "right", e.textBaseline = "top", this.config.showSymbol) {
|
|
4670
5311
|
e.font = `bold ${s + 2}px ${n.font.family}`, e.fillStyle = n.text;
|
|
4671
|
-
let t = [this.symbol, this.timeframe].filter(Boolean).join(" · ");
|
|
4672
|
-
e.fillText(
|
|
4673
|
-
}
|
|
5312
|
+
let t = [this.symbol, this.timeframe].filter(Boolean).join(" · "), r = this.statusText ? `${t} ${this.statusText}` : t;
|
|
5313
|
+
e.fillText(r, l, u), u += s + 6;
|
|
5314
|
+
} else this.statusText && (e.font = `${s}px ${n.font.family}`, e.fillStyle = n.textSecondary, e.fillText(this.statusText, l, u), u += s + 4);
|
|
4674
5315
|
if (this.config.showOHLC) {
|
|
4675
5316
|
e.font = `${s}px ${n.font.family}`;
|
|
4676
5317
|
let t = i.close >= i.open, r = (e) => e.toLocaleString(void 0, {
|
|
@@ -4729,7 +5370,7 @@ var Ot = class {
|
|
|
4729
5370
|
}
|
|
4730
5371
|
}
|
|
4731
5372
|
}
|
|
4732
|
-
},
|
|
5373
|
+
}, _n = class {
|
|
4733
5374
|
static toDataURL(e, t) {
|
|
4734
5375
|
let n = e.querySelectorAll("canvas");
|
|
4735
5376
|
if (n.length === 0) return "";
|
|
@@ -4751,7 +5392,7 @@ var Ot = class {
|
|
|
4751
5392
|
let i = document.createElement("a");
|
|
4752
5393
|
i.href = r, i.download = t, document.body.appendChild(i), i.click(), document.body.removeChild(i);
|
|
4753
5394
|
}
|
|
4754
|
-
},
|
|
5395
|
+
}, vn = class {
|
|
4755
5396
|
config = null;
|
|
4756
5397
|
setConfig(e) {
|
|
4757
5398
|
this.config = e;
|
|
@@ -4761,7 +5402,7 @@ var Ot = class {
|
|
|
4761
5402
|
let { chartRect: r } = t, i = this.config.fontSize ?? 48, a = this.config.color ?? n.textSecondary;
|
|
4762
5403
|
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();
|
|
4763
5404
|
}
|
|
4764
|
-
},
|
|
5405
|
+
}, yn = class {
|
|
4765
5406
|
visible = !0;
|
|
4766
5407
|
timeframeMs = 0;
|
|
4767
5408
|
setVisible(e) {
|
|
@@ -4784,7 +5425,7 @@ var Ot = class {
|
|
|
4784
5425
|
let t = Math.ceil(e / 1e3), n = Math.floor(t / 3600), r = Math.floor(t % 3600 / 60), i = t % 60;
|
|
4785
5426
|
return n > 0 ? `${n}:${String(r).padStart(2, "0")}:${String(i).padStart(2, "0")}` : `${r}:${String(i).padStart(2, "0")}`;
|
|
4786
5427
|
}
|
|
4787
|
-
},
|
|
5428
|
+
}, bn = class {
|
|
4788
5429
|
config = { visible: !1 };
|
|
4789
5430
|
cachedBreaks = [];
|
|
4790
5431
|
lastDataLength = 0;
|
|
@@ -4828,7 +5469,7 @@ var Ot = class {
|
|
|
4828
5469
|
invalidateCache() {
|
|
4829
5470
|
this.lastDataLength = 0, this.cachedBreaks = [];
|
|
4830
5471
|
}
|
|
4831
|
-
},
|
|
5472
|
+
}, xn = 1, Sn = class extends H {
|
|
4832
5473
|
alerts = [];
|
|
4833
5474
|
lastPrice = null;
|
|
4834
5475
|
requestRender = null;
|
|
@@ -4840,7 +5481,7 @@ var Ot = class {
|
|
|
4840
5481
|
this.pricePrecision = e;
|
|
4841
5482
|
}
|
|
4842
5483
|
addAlert(e, t = "crossing", n, r = !1) {
|
|
4843
|
-
let i = `tc_alert_${
|
|
5484
|
+
let i = `tc_alert_${xn++}`, a = {
|
|
4844
5485
|
id: i,
|
|
4845
5486
|
price: e,
|
|
4846
5487
|
condition: t,
|
|
@@ -4920,7 +5561,7 @@ var Ot = class {
|
|
|
4920
5561
|
e.fillText(s, r.x + r.width - 4, a - 2);
|
|
4921
5562
|
}
|
|
4922
5563
|
}
|
|
4923
|
-
},
|
|
5564
|
+
}, Cn = class extends H {
|
|
4924
5565
|
data = [];
|
|
4925
5566
|
currentIndex = 0;
|
|
4926
5567
|
timer = null;
|
|
@@ -4974,10 +5615,114 @@ var Ot = class {
|
|
|
4974
5615
|
dispose() {
|
|
4975
5616
|
this.stop(), this.removeAllListeners(), this.data = [];
|
|
4976
5617
|
}
|
|
4977
|
-
},
|
|
5618
|
+
}, G = 1;
|
|
5619
|
+
function K(e) {
|
|
5620
|
+
return typeof e == "object" && !!e && !Array.isArray(e);
|
|
5621
|
+
}
|
|
5622
|
+
function q(e) {
|
|
5623
|
+
return Array.isArray(e) ? e : [];
|
|
5624
|
+
}
|
|
5625
|
+
function wn(e, t) {
|
|
5626
|
+
return typeof e == "string" ? e : t;
|
|
5627
|
+
}
|
|
5628
|
+
function J(e, t) {
|
|
5629
|
+
return typeof e == "number" && Number.isFinite(e) ? e : t;
|
|
5630
|
+
}
|
|
5631
|
+
function Tn(e) {
|
|
5632
|
+
if (!K(e) || typeof e.id != "string" || typeof e.type != "string" || !Array.isArray(e.anchors) || e.anchors.length === 0 || !K(e.style)) return null;
|
|
5633
|
+
let t = [];
|
|
5634
|
+
for (let n of e.anchors) {
|
|
5635
|
+
if (!K(n) || typeof n.time != "number" || typeof n.price != "number" || !Number.isFinite(n.time) || !Number.isFinite(n.price)) return null;
|
|
5636
|
+
t.push({
|
|
5637
|
+
time: n.time,
|
|
5638
|
+
price: n.price
|
|
5639
|
+
});
|
|
5640
|
+
}
|
|
5641
|
+
let n = e.style;
|
|
5642
|
+
return typeof n.color != "string" || typeof n.lineWidth != "number" ? null : {
|
|
5643
|
+
id: e.id,
|
|
5644
|
+
type: e.type,
|
|
5645
|
+
anchors: t,
|
|
5646
|
+
style: n,
|
|
5647
|
+
visible: typeof e.visible == "boolean" ? e.visible : !0,
|
|
5648
|
+
locked: typeof e.locked == "boolean" ? e.locked : !1,
|
|
5649
|
+
meta: K(e.meta) ? e.meta : void 0
|
|
5650
|
+
};
|
|
5651
|
+
}
|
|
5652
|
+
function En(e) {
|
|
5653
|
+
return !K(e) || typeof e.id != "string" || typeof e.side != "string" || typeof e.type != "string" || typeof e.price != "number" || typeof e.quantity != "number" ? null : e;
|
|
5654
|
+
}
|
|
5655
|
+
function Dn(e) {
|
|
5656
|
+
return !K(e) || typeof e.id != "string" || typeof e.side != "string" || typeof e.entryPrice != "number" || typeof e.quantity != "number" ? null : e;
|
|
5657
|
+
}
|
|
5658
|
+
function On(e) {
|
|
5659
|
+
if (!K(e)) return kn();
|
|
5660
|
+
typeof e.version == "number" && e.version !== G && console.warn(`Chart state version mismatch: ${e.version} vs ${G}`);
|
|
5661
|
+
let t = K(e.viewport) ? e.viewport : {}, n = [];
|
|
5662
|
+
for (let t of q(e.indicators)) K(t) && (typeof t.id != "string" || typeof t.instanceId != "string" || K(t.params) && n.push({
|
|
5663
|
+
id: t.id,
|
|
5664
|
+
instanceId: t.instanceId,
|
|
5665
|
+
params: t.params,
|
|
5666
|
+
position: typeof t.position == "string" ? t.position : void 0
|
|
5667
|
+
}));
|
|
5668
|
+
let r = [];
|
|
5669
|
+
for (let t of q(e.drawings)) {
|
|
5670
|
+
let e = Tn(t);
|
|
5671
|
+
e && r.push(e);
|
|
5672
|
+
}
|
|
5673
|
+
let i = [];
|
|
5674
|
+
for (let t of q(e.orders)) {
|
|
5675
|
+
let e = En(t);
|
|
5676
|
+
e && i.push(e);
|
|
5677
|
+
}
|
|
5678
|
+
let a = [];
|
|
5679
|
+
for (let t of q(e.positions)) {
|
|
5680
|
+
let e = Dn(t);
|
|
5681
|
+
e && a.push(e);
|
|
5682
|
+
}
|
|
5683
|
+
let o = [];
|
|
5684
|
+
for (let t of q(e.alerts)) K(t) && typeof t.id == "string" && o.push(t);
|
|
5685
|
+
return {
|
|
5686
|
+
version: typeof e.version == "number" ? e.version : G,
|
|
5687
|
+
timestamp: J(e.timestamp, Date.now()),
|
|
5688
|
+
symbol: typeof e.symbol == "string" ? e.symbol : void 0,
|
|
5689
|
+
timeframe: typeof e.timeframe == "string" ? e.timeframe : void 0,
|
|
5690
|
+
chartType: wn(e.chartType, "candlestick"),
|
|
5691
|
+
viewport: {
|
|
5692
|
+
barWidth: J(t.barWidth, 8),
|
|
5693
|
+
barSpacing: J(t.barSpacing, 2),
|
|
5694
|
+
offset: J(t.offset, 0)
|
|
5695
|
+
},
|
|
5696
|
+
theme: typeof e.theme == "string" ? e.theme : void 0,
|
|
5697
|
+
locale: typeof e.locale == "string" ? e.locale : void 0,
|
|
5698
|
+
indicators: n,
|
|
5699
|
+
drawings: r,
|
|
5700
|
+
orders: i,
|
|
5701
|
+
positions: a,
|
|
5702
|
+
alerts: o
|
|
5703
|
+
};
|
|
5704
|
+
}
|
|
5705
|
+
function kn() {
|
|
5706
|
+
return {
|
|
5707
|
+
version: G,
|
|
5708
|
+
timestamp: Date.now(),
|
|
5709
|
+
chartType: "candlestick",
|
|
5710
|
+
viewport: {
|
|
5711
|
+
barWidth: 8,
|
|
5712
|
+
barSpacing: 2,
|
|
5713
|
+
offset: 0
|
|
5714
|
+
},
|
|
5715
|
+
indicators: [],
|
|
5716
|
+
drawings: [],
|
|
5717
|
+
orders: [],
|
|
5718
|
+
positions: [],
|
|
5719
|
+
alerts: []
|
|
5720
|
+
};
|
|
5721
|
+
}
|
|
5722
|
+
var An = class {
|
|
4978
5723
|
static capture(e, t) {
|
|
4979
5724
|
return {
|
|
4980
|
-
version:
|
|
5725
|
+
version: G,
|
|
4981
5726
|
timestamp: Date.now(),
|
|
4982
5727
|
chartType: t?.chartType ?? "candlestick",
|
|
4983
5728
|
symbol: t?.symbol,
|
|
@@ -4999,8 +5744,7 @@ var Ot = class {
|
|
|
4999
5744
|
return JSON.stringify(e);
|
|
5000
5745
|
}
|
|
5001
5746
|
static deserialize(e) {
|
|
5002
|
-
|
|
5003
|
-
return t.version !== q && console.warn(`Chart state version mismatch: ${t.version} vs ${q}`), t;
|
|
5747
|
+
return On(JSON.parse(e));
|
|
5004
5748
|
}
|
|
5005
5749
|
static saveToStorage(e, t) {
|
|
5006
5750
|
localStorage.setItem(e, this.serialize(t));
|
|
@@ -5027,7 +5771,7 @@ var Ot = class {
|
|
|
5027
5771
|
}, n.click();
|
|
5028
5772
|
});
|
|
5029
5773
|
}
|
|
5030
|
-
},
|
|
5774
|
+
}, jn = class {
|
|
5031
5775
|
undoStack = [];
|
|
5032
5776
|
redoStack = [];
|
|
5033
5777
|
maxHistory = 50;
|
|
@@ -5063,7 +5807,7 @@ var Ot = class {
|
|
|
5063
5807
|
redoCount: this.redoStack.length
|
|
5064
5808
|
};
|
|
5065
5809
|
}
|
|
5066
|
-
},
|
|
5810
|
+
}, Mn = class {
|
|
5067
5811
|
static toCSV(e) {
|
|
5068
5812
|
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");
|
|
5069
5813
|
}
|
|
@@ -5081,7 +5825,7 @@ var Ot = class {
|
|
|
5081
5825
|
let r = new Blob([e], { type: n }), i = URL.createObjectURL(r), a = document.createElement("a");
|
|
5082
5826
|
a.href = i, a.download = t, document.body.appendChild(a), a.click(), document.body.removeChild(a), URL.revokeObjectURL(i);
|
|
5083
5827
|
}
|
|
5084
|
-
},
|
|
5828
|
+
}, Nn = {
|
|
5085
5829
|
linear: (e) => e,
|
|
5086
5830
|
easeOutCubic: (e) => 1 - (1 - e) ** 3,
|
|
5087
5831
|
easeOutQuart: (e) => 1 - (1 - e) ** 4,
|
|
@@ -5089,7 +5833,7 @@ var Ot = class {
|
|
|
5089
5833
|
easeOutExpo: (e) => e === 1 ? 1 : 1 - 2 ** (-10 * e),
|
|
5090
5834
|
easeOutElastic: (e) => e === 0 || e === 1 ? e : 2 ** (-10 * e) * Math.sin((e * 10 - .75) * (2 * Math.PI / 3)) + 1,
|
|
5091
5835
|
spring: (e) => 1 - Math.E ** (-6 * e) * Math.cos(8 * e)
|
|
5092
|
-
},
|
|
5836
|
+
}, Pn = class {
|
|
5093
5837
|
animations = /* @__PURE__ */ new Map();
|
|
5094
5838
|
frameId = 0;
|
|
5095
5839
|
running = !1;
|
|
@@ -5097,7 +5841,7 @@ var Ot = class {
|
|
|
5097
5841
|
this.animations.set(e, {
|
|
5098
5842
|
startTime: -1,
|
|
5099
5843
|
duration: t.duration,
|
|
5100
|
-
easing: t.easing ??
|
|
5844
|
+
easing: t.easing ?? Nn.easeOutCubic,
|
|
5101
5845
|
onUpdate: t.onUpdate,
|
|
5102
5846
|
onComplete: t.onComplete
|
|
5103
5847
|
}), this.running || (this.running = !0, this.tick());
|
|
@@ -5132,10 +5876,10 @@ var Ot = class {
|
|
|
5132
5876
|
};
|
|
5133
5877
|
//#endregion
|
|
5134
5878
|
//#region src/finance/BaseFinanceChart.ts
|
|
5135
|
-
function
|
|
5879
|
+
function Fn(t) {
|
|
5136
5880
|
return !t || t === "dark" ? e : t === "light" ? o : t;
|
|
5137
5881
|
}
|
|
5138
|
-
var
|
|
5882
|
+
var In = class {
|
|
5139
5883
|
canvas;
|
|
5140
5884
|
ctx;
|
|
5141
5885
|
container;
|
|
@@ -5146,7 +5890,7 @@ var nn = class {
|
|
|
5146
5890
|
frameId = null;
|
|
5147
5891
|
resizeObserver;
|
|
5148
5892
|
constructor(e, t) {
|
|
5149
|
-
this.container = e, this.theme =
|
|
5893
|
+
this.container = e, this.theme = Fn(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(() => {
|
|
5150
5894
|
this.updateSize(), this.requestRender();
|
|
5151
5895
|
}), this.resizeObserver.observe(e);
|
|
5152
5896
|
}
|
|
@@ -5161,12 +5905,12 @@ var nn = class {
|
|
|
5161
5905
|
}));
|
|
5162
5906
|
}
|
|
5163
5907
|
setTheme(e) {
|
|
5164
|
-
this.theme =
|
|
5908
|
+
this.theme = Fn(e), this.requestRender();
|
|
5165
5909
|
}
|
|
5166
5910
|
destroy() {
|
|
5167
5911
|
this.frameId !== null && cancelAnimationFrame(this.frameId), this.resizeObserver.disconnect(), this.canvas.remove();
|
|
5168
5912
|
}
|
|
5169
|
-
},
|
|
5913
|
+
}, Ln = class {
|
|
5170
5914
|
pos = null;
|
|
5171
5915
|
canvas;
|
|
5172
5916
|
onUpdate;
|
|
@@ -5198,7 +5942,7 @@ var nn = class {
|
|
|
5198
5942
|
};
|
|
5199
5943
|
//#endregion
|
|
5200
5944
|
//#region src/finance/SparklineRenderer.ts
|
|
5201
|
-
function
|
|
5945
|
+
function Rn(e, t, n, r, i) {
|
|
5202
5946
|
let { data: a, mode: o = "area", lineWidth: s = 1.5, showLastPoint: c = !1, showMinMax: l = !1 } = r;
|
|
5203
5947
|
if (a.length < 2 || t <= 0 || n <= 0) return;
|
|
5204
5948
|
let u = r.color ?? i.lineColor, d = r.fillColor ?? u, f = t - 4, p = n - 4, m = Infinity, h = -Infinity, g = 0, _ = 0;
|
|
@@ -5223,8 +5967,8 @@ function an(e, t, n, r, i) {
|
|
|
5223
5967
|
}
|
|
5224
5968
|
//#endregion
|
|
5225
5969
|
//#region src/finance/DepthChartRenderer.ts
|
|
5226
|
-
var
|
|
5227
|
-
function
|
|
5970
|
+
var zn = 50, Bn = 60, Y = 20, Vn = .2;
|
|
5971
|
+
function Hn(e) {
|
|
5228
5972
|
let t = [...e].sort((e, t) => t.price - e.price), n = [], r = 0;
|
|
5229
5973
|
for (let e of t) r += e.volume, n.push({
|
|
5230
5974
|
price: e.price,
|
|
@@ -5232,7 +5976,7 @@ function ln(e) {
|
|
|
5232
5976
|
});
|
|
5233
5977
|
return n;
|
|
5234
5978
|
}
|
|
5235
|
-
function
|
|
5979
|
+
function Un(e) {
|
|
5236
5980
|
let t = [...e].sort((e, t) => e.price - t.price), n = [], r = 0;
|
|
5237
5981
|
for (let e of t) r += e.volume, n.push({
|
|
5238
5982
|
price: e.price,
|
|
@@ -5240,20 +5984,20 @@ function un(e) {
|
|
|
5240
5984
|
});
|
|
5241
5985
|
return n;
|
|
5242
5986
|
}
|
|
5243
|
-
function
|
|
5987
|
+
function Wn(e, t) {
|
|
5244
5988
|
return {
|
|
5245
|
-
left:
|
|
5246
|
-
right: e -
|
|
5247
|
-
top:
|
|
5248
|
-
bottom: t -
|
|
5249
|
-
plotWidth: e -
|
|
5250
|
-
plotHeight: t -
|
|
5989
|
+
left: zn,
|
|
5990
|
+
right: e - Bn,
|
|
5991
|
+
top: Y,
|
|
5992
|
+
bottom: t - Y,
|
|
5993
|
+
plotWidth: e - zn - Bn,
|
|
5994
|
+
plotHeight: t - Y * 2
|
|
5251
5995
|
};
|
|
5252
5996
|
}
|
|
5253
|
-
function
|
|
5997
|
+
function Gn(e, t, n, r) {
|
|
5254
5998
|
e.fillStyle = r, e.fillRect(0, 0, t, n);
|
|
5255
5999
|
}
|
|
5256
|
-
function
|
|
6000
|
+
function Kn(e, t, n, r, i, a, o, s) {
|
|
5257
6001
|
let { left: c, right: l, top: u, bottom: d, plotWidth: p, plotHeight: m } = t;
|
|
5258
6002
|
e.save(), e.strokeStyle = a.grid, e.lineWidth = .5, e.fillStyle = a.axisLabel, e.font = `${a.font.sizeSmall}px ${a.font.family}`;
|
|
5259
6003
|
let h = f(0, i, 5);
|
|
@@ -5268,7 +6012,7 @@ function pn(e, t, n, r, i, a, o, s) {
|
|
|
5268
6012
|
}
|
|
5269
6013
|
e.restore();
|
|
5270
6014
|
}
|
|
5271
|
-
function
|
|
6015
|
+
function qn(e, t, n, r, i, a, o, s, c) {
|
|
5272
6016
|
if (t.length === 0) return;
|
|
5273
6017
|
let { left: l, bottom: u, plotWidth: d, plotHeight: f } = n, p = (e) => l + (e - r) / i * d, m = (e) => u - e / a * f;
|
|
5274
6018
|
if (e.beginPath(), c === "bid") {
|
|
@@ -5301,14 +6045,14 @@ function mn(e, t, n, r, i, a, o, s, c) {
|
|
|
5301
6045
|
}
|
|
5302
6046
|
e.strokeStyle = s, e.lineWidth = 1.5, e.stroke();
|
|
5303
6047
|
}
|
|
5304
|
-
function
|
|
6048
|
+
function Jn(e, t, n, r, i, a, o, s, c) {
|
|
5305
6049
|
let { left: l, top: u, bottom: d, plotWidth: f } = r, p = l + (t - i) / a * f;
|
|
5306
6050
|
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) {
|
|
5307
6051
|
let t = `Spread: ${c(n)}`;
|
|
5308
6052
|
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();
|
|
5309
6053
|
}
|
|
5310
6054
|
}
|
|
5311
|
-
function
|
|
6055
|
+
function Yn(e, t, n, r, i, a, o, s, c, l, u) {
|
|
5312
6056
|
let { left: d, top: f, bottom: p, plotWidth: m, plotHeight: h } = i, g = t.x;
|
|
5313
6057
|
if (g < d || g > i.right) return;
|
|
5314
6058
|
let _ = a + (g - d) / m * o, v = 0, y = "";
|
|
@@ -5334,47 +6078,47 @@ function gn(e, t, n, r, i, a, o, s, c, l, u) {
|
|
|
5334
6078
|
for (let t = 0; t < b.length; t++) e.fillText(b[t], C + 8, w + 6 + t * (c.font.sizeSmall + 4));
|
|
5335
6079
|
e.restore();
|
|
5336
6080
|
}
|
|
5337
|
-
function
|
|
6081
|
+
function Xn(e) {
|
|
5338
6082
|
return e.toFixed(2);
|
|
5339
6083
|
}
|
|
5340
|
-
function
|
|
6084
|
+
function Zn(e) {
|
|
5341
6085
|
return e >= 1e6 ? (e / 1e6).toFixed(2) + "M" : e >= 1e3 ? (e / 1e3).toFixed(1) + "K" : e.toFixed(0);
|
|
5342
6086
|
}
|
|
5343
|
-
function
|
|
6087
|
+
function Qn(e, t, n, r, i, a) {
|
|
5344
6088
|
let { data: o } = r;
|
|
5345
6089
|
if (o.bids.length === 0 && o.asks.length === 0 || t <= 0 || n <= 0) return;
|
|
5346
|
-
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 ??
|
|
5347
|
-
|
|
6090
|
+
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 ?? Xn, m = r.volumeFormat ?? Zn, h = Hn(o.bids), g = Un(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 + Vn), 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 = Wn(t, n);
|
|
6091
|
+
Gn(e, t, n, i.background), Kn(e, A, w, T, k, i, p, m), qn(e, h, A, w, E, k, l, s, "bid"), qn(e, g, A, w, E, k, u, c, "ask"), d && Jn(e, y, b, A, w, E, i, f, p), a && Yn(e, a, h, g, A, w, E, k, i, p, m);
|
|
5348
6092
|
}
|
|
5349
6093
|
//#endregion
|
|
5350
6094
|
//#region src/finance/EquityCurveRenderer.ts
|
|
5351
|
-
var
|
|
5352
|
-
function
|
|
6095
|
+
var $n = 70, er = 30, tr = 20, nr = 20, rr = .05;
|
|
6096
|
+
function ir(e, t) {
|
|
5353
6097
|
return {
|
|
5354
|
-
left:
|
|
5355
|
-
right: e -
|
|
5356
|
-
top:
|
|
5357
|
-
bottom: t -
|
|
5358
|
-
plotWidth: e -
|
|
5359
|
-
plotHeight: t -
|
|
6098
|
+
left: $n,
|
|
6099
|
+
right: e - tr,
|
|
6100
|
+
top: nr,
|
|
6101
|
+
bottom: t - er,
|
|
6102
|
+
plotWidth: e - $n - tr,
|
|
6103
|
+
plotHeight: t - nr - er
|
|
5360
6104
|
};
|
|
5361
6105
|
}
|
|
5362
|
-
function
|
|
6106
|
+
function ar(e, t) {
|
|
5363
6107
|
let n = Infinity, r = -Infinity;
|
|
5364
6108
|
for (let t of e) t.value < n && (n = t.value), t.value > r && (r = t.value);
|
|
5365
6109
|
if (t) for (let e of t) e.value < n && (n = e.value), e.value > r && (r = e.value);
|
|
5366
|
-
let i = (r - n) *
|
|
6110
|
+
let i = (r - n) * rr;
|
|
5367
6111
|
return {
|
|
5368
6112
|
valMin: n - i,
|
|
5369
6113
|
valMax: r + i
|
|
5370
6114
|
};
|
|
5371
6115
|
}
|
|
5372
|
-
function
|
|
6116
|
+
function or(e) {
|
|
5373
6117
|
let t = [], n = -Infinity;
|
|
5374
6118
|
for (let r of e) r.value > n && (n = r.value), t.push(n);
|
|
5375
6119
|
return t;
|
|
5376
6120
|
}
|
|
5377
|
-
function
|
|
6121
|
+
function sr(e) {
|
|
5378
6122
|
let t = 864e5;
|
|
5379
6123
|
if (365.25 * t, e < 7 * t) {
|
|
5380
6124
|
let e = new Intl.DateTimeFormat(void 0, {
|
|
@@ -5396,13 +6140,13 @@ function On(e) {
|
|
|
5396
6140
|
});
|
|
5397
6141
|
return (e) => n.format(new Date(e));
|
|
5398
6142
|
}
|
|
5399
|
-
function
|
|
6143
|
+
function cr(e) {
|
|
5400
6144
|
return Math.abs(e) >= 1e6 ? (e / 1e6).toFixed(2) + "M" : Math.abs(e) >= 1e3 ? (e / 1e3).toFixed(1) + "K" : e.toFixed(2);
|
|
5401
6145
|
}
|
|
5402
|
-
function
|
|
6146
|
+
function lr(e, t, n, r) {
|
|
5403
6147
|
e.fillStyle = r, e.fillRect(0, 0, t, n);
|
|
5404
6148
|
}
|
|
5405
|
-
function
|
|
6149
|
+
function ur(e, t, n, r, i, a, o, s, c) {
|
|
5406
6150
|
let { left: l, right: u, top: d, bottom: p, plotWidth: m, plotHeight: h } = t;
|
|
5407
6151
|
e.save(), e.strokeStyle = o.grid, e.lineWidth = .5, e.fillStyle = o.axisLabel, e.font = `${o.font.sizeSmall}px ${o.font.family}`;
|
|
5408
6152
|
let g = f(n, r, 6), _ = Math.ceil(n / g) * g;
|
|
@@ -5417,21 +6161,21 @@ function jn(e, t, n, r, i, a, o, s, c) {
|
|
|
5417
6161
|
}
|
|
5418
6162
|
e.restore();
|
|
5419
6163
|
}
|
|
5420
|
-
function
|
|
6164
|
+
function dr(e, t, n, r, i, a, o, s, c) {
|
|
5421
6165
|
if (t.length < 2) return;
|
|
5422
6166
|
let { left: l, bottom: u, plotWidth: d, plotHeight: f } = n, p = (e) => l + (e - r) / i * d, m = (e) => u - (e - a) / o * f;
|
|
5423
6167
|
e.save(), e.beginPath(), e.moveTo(p(t[0].time), m(t[0].value));
|
|
5424
6168
|
for (let n = 1; n < t.length; n++) e.lineTo(p(t[n].time), m(t[n].value));
|
|
5425
6169
|
e.strokeStyle = s, e.lineWidth = c, e.lineJoin = "round", e.stroke(), e.restore();
|
|
5426
6170
|
}
|
|
5427
|
-
function
|
|
6171
|
+
function fr(e, t, n, r, i, a, o, s) {
|
|
5428
6172
|
if (t.length < 2) return;
|
|
5429
6173
|
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);
|
|
5430
6174
|
m.addColorStop(0, s + "40"), m.addColorStop(1, "transparent"), e.save(), e.beginPath(), e.moveTo(f(t[0].time), p(t[0].value));
|
|
5431
6175
|
for (let n = 1; n < t.length; n++) e.lineTo(f(t[n].time), p(t[n].value));
|
|
5432
6176
|
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();
|
|
5433
6177
|
}
|
|
5434
|
-
function
|
|
6178
|
+
function pr(e, t, n, r, i, a, o, s, c) {
|
|
5435
6179
|
if (t.length < 2) return;
|
|
5436
6180
|
let { left: l, bottom: u, plotWidth: d, plotHeight: f } = r, p = (e) => l + (e - i) / a * d, m = (e) => u - (e - o) / s * f;
|
|
5437
6181
|
e.save(), e.fillStyle = c, e.beginPath(), e.moveTo(p(t[0].time), m(n[0]));
|
|
@@ -5439,12 +6183,12 @@ function Pn(e, t, n, r, i, a, o, s, c) {
|
|
|
5439
6183
|
for (let n = t.length - 1; n >= 0; n--) e.lineTo(p(t[n].time), m(t[n].value));
|
|
5440
6184
|
e.closePath(), e.fill(), e.restore();
|
|
5441
6185
|
}
|
|
5442
|
-
function
|
|
6186
|
+
function mr(e, t, n, r, i, a, o, s, c, l) {
|
|
5443
6187
|
if (t.length === 0) return;
|
|
5444
6188
|
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;
|
|
5445
6189
|
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();
|
|
5446
6190
|
}
|
|
5447
|
-
function
|
|
6191
|
+
function hr(e, t, n, r, i, a, o, s, c, l, u, d) {
|
|
5448
6192
|
let { left: f, top: p, bottom: m, plotWidth: h, plotHeight: g } = i, _ = t.x;
|
|
5449
6193
|
if (_ < f || _ > i.right) return;
|
|
5450
6194
|
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();
|
|
@@ -5462,15 +6206,15 @@ function In(e, t, n, r, i, a, o, s, c, l, u, d) {
|
|
|
5462
6206
|
for (let t = 0; t < S.length; t++) e.fillText(S[t], D + 8, O + 6 + t * (l.font.sizeSmall + 4));
|
|
5463
6207
|
e.restore();
|
|
5464
6208
|
}
|
|
5465
|
-
function
|
|
6209
|
+
function gr(e, t, n, r, i, a) {
|
|
5466
6210
|
let { data: o } = r;
|
|
5467
6211
|
if (o.length < 2 || t <= 0 || n <= 0) return;
|
|
5468
|
-
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 ??
|
|
5469
|
-
|
|
6212
|
+
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 ?? cr, { valMin: g, valMax: _ } = ar(o, f), v = _ - g || 1, y = o[0].time, b = o[o.length - 1].time, x = b - y || 1, S = r.timeFormat ?? sr(x), C = ir(t, n);
|
|
6213
|
+
lr(e, t, n, i.background), ur(e, C, g, _, y, b, i, h, S), l && pr(e, o, or(o), C, y, x, g, v, u), d && fr(e, o, C, y, x, g, v, s), dr(e, o, C, y, x, g, v, s, c), f && f.length >= 2 && (dr(e, f, C, y, x, g, v, p, 1), mr(e, f, C, y, x, g, v, m, p, i)), a && hr(e, a, o, f, C, y, x, g, v, i, S, h);
|
|
5470
6214
|
}
|
|
5471
6215
|
//#endregion
|
|
5472
6216
|
//#region src/finance/HeatmapLayout.ts
|
|
5473
|
-
function
|
|
6217
|
+
function _r(e, t, n) {
|
|
5474
6218
|
if (e.length === 0) return [];
|
|
5475
6219
|
let r = e.length, i = Math.ceil(Math.sqrt(r)), a = Math.ceil(r / i), o = t.width / i, s = t.height / a, c = [];
|
|
5476
6220
|
for (let a = 0; a < r; a++) {
|
|
@@ -5487,7 +6231,7 @@ function Rn(e, t, n) {
|
|
|
5487
6231
|
}
|
|
5488
6232
|
return c;
|
|
5489
6233
|
}
|
|
5490
|
-
function
|
|
6234
|
+
function vr(e, t) {
|
|
5491
6235
|
let n = e.reduce((e, t) => e + t, 0);
|
|
5492
6236
|
if (n === 0 || t === 0) return Infinity;
|
|
5493
6237
|
let r = 0;
|
|
@@ -5497,7 +6241,7 @@ function zn(e, t) {
|
|
|
5497
6241
|
}
|
|
5498
6242
|
return r;
|
|
5499
6243
|
}
|
|
5500
|
-
function
|
|
6244
|
+
function X(e, t, n, r, i, a) {
|
|
5501
6245
|
let o = r ? n.height : n.width, s = e.reduce((e, t) => e + t, 0), c = o > 0 ? s / o : 0, l = 0;
|
|
5502
6246
|
for (let o = 0; o < e.length; o++) {
|
|
5503
6247
|
let s = c > 0 ? e[o] / c : 0, u;
|
|
@@ -5517,19 +6261,19 @@ function Y(e, t, n, r, i, a) {
|
|
|
5517
6261
|
}), l += s;
|
|
5518
6262
|
}
|
|
5519
6263
|
}
|
|
5520
|
-
function
|
|
6264
|
+
function yr(e, t, n, r, i) {
|
|
5521
6265
|
if (e.length === 0) return;
|
|
5522
6266
|
let a = n.width >= n.height, o = a ? n.height : n.width;
|
|
5523
6267
|
if (e.length === 1) {
|
|
5524
|
-
|
|
6268
|
+
X(e, t, n, a, r, i);
|
|
5525
6269
|
return;
|
|
5526
6270
|
}
|
|
5527
6271
|
let s = [], c = [], l = 0;
|
|
5528
6272
|
for (; l < e.length;) {
|
|
5529
6273
|
let u = [...s, e[l]];
|
|
5530
|
-
if (s.length === 0 ||
|
|
6274
|
+
if (s.length === 0 || vr(u, o) <= vr(s, o)) s.push(e[l]), c.push(t[l]), l++;
|
|
5531
6275
|
else {
|
|
5532
|
-
|
|
6276
|
+
X(s, c, n, a, r, i);
|
|
5533
6277
|
let u = s.reduce((e, t) => e + t, 0), d = o > 0 ? u / o : 0;
|
|
5534
6278
|
n = a ? {
|
|
5535
6279
|
x: n.x + d,
|
|
@@ -5541,28 +6285,28 @@ function Bn(e, t, n, r, i) {
|
|
|
5541
6285
|
y: n.y + d,
|
|
5542
6286
|
width: n.width,
|
|
5543
6287
|
height: n.height - d
|
|
5544
|
-
},
|
|
6288
|
+
}, yr(e.slice(l), t.slice(l), n, r, i);
|
|
5545
6289
|
return;
|
|
5546
6290
|
}
|
|
5547
6291
|
}
|
|
5548
|
-
s.length > 0 &&
|
|
6292
|
+
s.length > 0 && X(s, c, n, a, r, i);
|
|
5549
6293
|
}
|
|
5550
|
-
function
|
|
6294
|
+
function br(e, t, n) {
|
|
5551
6295
|
if (e.length === 0) return [];
|
|
5552
6296
|
let r = [...e].sort((e, t) => t.weight - e.weight), i = r.reduce((e, t) => e + Math.max(0, t.weight), 0);
|
|
5553
6297
|
if (i === 0) return [];
|
|
5554
6298
|
let a = t.width * t.height, o = r.map((e) => Math.max(0, e.weight) / i * a), s = r.map((e) => e.id), c = [];
|
|
5555
|
-
return
|
|
6299
|
+
return yr(o, s, { ...t }, n, c), c;
|
|
5556
6300
|
}
|
|
5557
6301
|
//#endregion
|
|
5558
6302
|
//#region src/finance/HeatmapRenderer.ts
|
|
5559
|
-
function
|
|
6303
|
+
function xr(e) {
|
|
5560
6304
|
return (e >= 0 ? "+" : "") + e.toFixed(2) + "%";
|
|
5561
6305
|
}
|
|
5562
|
-
function
|
|
6306
|
+
function Sr(e) {
|
|
5563
6307
|
return e.label;
|
|
5564
6308
|
}
|
|
5565
|
-
function
|
|
6309
|
+
function Cr(e, t) {
|
|
5566
6310
|
let n = t.min ?? -5, r = t.max ?? 5;
|
|
5567
6311
|
if (e <= n) return t.negative;
|
|
5568
6312
|
if (e >= r) return t.positive;
|
|
@@ -5573,11 +6317,11 @@ function Wn(e, t) {
|
|
|
5573
6317
|
let i = e / r;
|
|
5574
6318
|
return m(t.zero, t.positive, i);
|
|
5575
6319
|
}
|
|
5576
|
-
function
|
|
6320
|
+
function Z(e, t, n, r, i, a) {
|
|
5577
6321
|
let o = Math.min(a, r / 2, i / 2);
|
|
5578
6322
|
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();
|
|
5579
6323
|
}
|
|
5580
|
-
function
|
|
6324
|
+
function wr(e, t, n, r, i, a, o, s, c, l, u) {
|
|
5581
6325
|
if (i < 40 || a < 30) return;
|
|
5582
6326
|
let d = n + i / 2, f = r + a / 2;
|
|
5583
6327
|
if (e.save(), e.shadowColor = "rgba(0,0,0,0.6)", e.shadowBlur = 2, e.fillStyle = "#FFFFFF", e.textAlign = "center", s) {
|
|
@@ -5590,22 +6334,22 @@ function Gn(e, t, n, r, i, a, o, s, c, l, u) {
|
|
|
5590
6334
|
}
|
|
5591
6335
|
e.restore();
|
|
5592
6336
|
}
|
|
5593
|
-
function
|
|
6337
|
+
function Tr(e, t, n, r, i, a, o, s) {
|
|
5594
6338
|
let c = [o(t), s(t.value)];
|
|
5595
6339
|
if (t.meta) for (let [e, n] of Object.entries(t.meta)) c.push(e + ": " + String(n));
|
|
5596
6340
|
e.save(), e.font = a.font.sizeSmall + "px " + a.font.family;
|
|
5597
6341
|
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;
|
|
5598
|
-
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,
|
|
6342
|
+
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, Z(e, f, p, l, d, 4), e.fill(), e.globalAlpha = 1, e.fillStyle = a.text, e.textBaseline = "top", e.textAlign = "left";
|
|
5599
6343
|
for (let t = 0; t < c.length; t++) e.fillText(c[t], f + 8, p + 6 + t * u);
|
|
5600
6344
|
e.restore();
|
|
5601
6345
|
}
|
|
5602
|
-
function
|
|
6346
|
+
function Er(e, t, n, r, i, a, o, s) {
|
|
5603
6347
|
if (r.length === 0 || i.length === 0 || t <= 0 || n <= 0) return null;
|
|
5604
6348
|
let c = a.colorScale ?? {
|
|
5605
6349
|
negative: "#EF5350",
|
|
5606
6350
|
zero: "#424242",
|
|
5607
6351
|
positive: "#26A69A"
|
|
5608
|
-
}, l = a.cellRadius ?? 4, u = a.showLabels !== !1, d = a.showValues !== !1, f = a.valueFormat ??
|
|
6352
|
+
}, l = a.cellRadius ?? 4, u = a.showLabels !== !1, d = a.showValues !== !1, f = a.valueFormat ?? xr, p = a.labelFormat ?? Sr, m = /* @__PURE__ */ new Map();
|
|
5609
6353
|
for (let e of r) m.set(e.id, e);
|
|
5610
6354
|
let h = null, g = null;
|
|
5611
6355
|
if (s) for (let e of i) {
|
|
@@ -5626,37 +6370,37 @@ function qn(e, t, n, r, i, a, o, s) {
|
|
|
5626
6370
|
if (!n) continue;
|
|
5627
6371
|
let { x: r, y: i, width: a, height: s } = t.rect;
|
|
5628
6372
|
if (a <= 0 || s <= 0) continue;
|
|
5629
|
-
let g =
|
|
5630
|
-
|
|
6373
|
+
let g = Cr(n.value, c);
|
|
6374
|
+
Z(e, r, i, a, s, l), e.fillStyle = g, e.fill(), wr(e, n, r, i, a, s, o, u, d, p, f), t.id === h && (Z(e, r, i, a, s, l), e.strokeStyle = "#FFFFFF", e.lineWidth = 1.5, e.stroke());
|
|
5631
6375
|
}
|
|
5632
|
-
return g && s &&
|
|
6376
|
+
return g && s && Tr(e, g.cell, s, t, n, o, p, f), g;
|
|
5633
6377
|
}
|
|
5634
6378
|
//#endregion
|
|
5635
6379
|
//#region src/finance/WaterfallRenderer.ts
|
|
5636
|
-
var
|
|
5637
|
-
function
|
|
6380
|
+
var Dr = 60, Or = 12, kr = 24, Ar = 40, jr = .7, Mr = 1;
|
|
6381
|
+
function Nr(e) {
|
|
5638
6382
|
return e.type ? e.type : e.value > 0 ? "positive" : e.value < 0 ? "negative" : "subtotal";
|
|
5639
6383
|
}
|
|
5640
|
-
function
|
|
6384
|
+
function Pr(e) {
|
|
5641
6385
|
let t = Math.abs(e);
|
|
5642
6386
|
return t >= 1e6 ? (e / 1e6).toFixed(2) + "M" : t >= 1e3 ? (e / 1e3).toFixed(1) + "K" : e.toFixed(2);
|
|
5643
6387
|
}
|
|
5644
|
-
function
|
|
6388
|
+
function Fr(e, t) {
|
|
5645
6389
|
return {
|
|
5646
|
-
left:
|
|
5647
|
-
right: e -
|
|
5648
|
-
top:
|
|
5649
|
-
bottom: t -
|
|
5650
|
-
plotWidth: e -
|
|
5651
|
-
plotHeight: t -
|
|
6390
|
+
left: Dr,
|
|
6391
|
+
right: e - Or,
|
|
6392
|
+
top: kr,
|
|
6393
|
+
bottom: t - Ar,
|
|
6394
|
+
plotWidth: e - Dr - Or,
|
|
6395
|
+
plotHeight: t - kr - Ar
|
|
5652
6396
|
};
|
|
5653
6397
|
}
|
|
5654
|
-
function
|
|
6398
|
+
function Ir(e, t, n, r, i) {
|
|
5655
6399
|
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;
|
|
5656
6400
|
for (let t = 0; t < e.length; t++) {
|
|
5657
|
-
let n = e[t], m =
|
|
6401
|
+
let n = e[t], m = Nr(n), h, g;
|
|
5658
6402
|
m === "total" || m === "subtotal" ? (h = 0, g = n.value, p = n.value) : (h = p, g = p + n.value, p = g);
|
|
5659
|
-
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),
|
|
6403
|
+
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), Mr), C = u + t * s, w = C + l;
|
|
5660
6404
|
a[t] = {
|
|
5661
6405
|
label: n.label,
|
|
5662
6406
|
value: n.value,
|
|
@@ -5676,14 +6420,14 @@ function nr(e, t, n, r, i) {
|
|
|
5676
6420
|
cumulatives: o
|
|
5677
6421
|
};
|
|
5678
6422
|
}
|
|
5679
|
-
function
|
|
6423
|
+
function Lr(e) {
|
|
5680
6424
|
if (e.length === 0) return {
|
|
5681
6425
|
valMin: 0,
|
|
5682
6426
|
valMax: 1
|
|
5683
6427
|
};
|
|
5684
6428
|
let t = 0, n = 0, r = 0;
|
|
5685
6429
|
for (let i = 0; i < e.length; i++) {
|
|
5686
|
-
let a = e[i], o =
|
|
6430
|
+
let a = e[i], o = Nr(a), s, c;
|
|
5687
6431
|
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);
|
|
5688
6432
|
}
|
|
5689
6433
|
let i = (n - t || 1) * .1;
|
|
@@ -5692,10 +6436,10 @@ function rr(e) {
|
|
|
5692
6436
|
valMax: n + i
|
|
5693
6437
|
};
|
|
5694
6438
|
}
|
|
5695
|
-
function
|
|
6439
|
+
function Rr(e, t, n, r) {
|
|
5696
6440
|
e.fillStyle = r, e.fillRect(0, 0, t, n);
|
|
5697
6441
|
}
|
|
5698
|
-
function
|
|
6442
|
+
function zr(e, t, n, r, i, a) {
|
|
5699
6443
|
let { left: o, right: s, top: c, bottom: l, plotHeight: u } = t, d = r - n || 1;
|
|
5700
6444
|
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";
|
|
5701
6445
|
let p = f(n, r, 5), m = Math.ceil(n / p) * p;
|
|
@@ -5714,7 +6458,7 @@ function ar(e, t, n, r, i, a) {
|
|
|
5714
6458
|
e.strokeStyle = i.axisLine, e.lineWidth = 1, e.beginPath(), e.moveTo(o, t), e.lineTo(s, t), e.stroke();
|
|
5715
6459
|
}
|
|
5716
6460
|
}
|
|
5717
|
-
function
|
|
6461
|
+
function Br(e, t, n) {
|
|
5718
6462
|
let r = [
|
|
5719
6463
|
"positive",
|
|
5720
6464
|
"negative",
|
|
@@ -5733,7 +6477,7 @@ function or(e, t, n) {
|
|
|
5733
6477
|
s && (e.fillStyle = o, e.fill());
|
|
5734
6478
|
}
|
|
5735
6479
|
}
|
|
5736
|
-
function
|
|
6480
|
+
function Vr(e, t, n, r, i, a, o) {
|
|
5737
6481
|
if (o === "none" || t.length < 2) return;
|
|
5738
6482
|
let { bottom: s, plotHeight: c } = n;
|
|
5739
6483
|
e.strokeStyle = a, e.lineWidth = 1, o === "dashed" ? e.setLineDash([4, 4]) : e.setLineDash([]), e.beginPath();
|
|
@@ -5743,7 +6487,7 @@ function sr(e, t, n, r, i, a, o) {
|
|
|
5743
6487
|
}
|
|
5744
6488
|
e.stroke(), e.setLineDash([]);
|
|
5745
6489
|
}
|
|
5746
|
-
function
|
|
6490
|
+
function Hr(e, t, n, r, i, a) {
|
|
5747
6491
|
e.fillStyle = r.text, e.font = `${r.font.sizeSmall}px ${r.font.family}`, e.textAlign = "center";
|
|
5748
6492
|
for (let r = 0; r < t.length; r++) {
|
|
5749
6493
|
let o = t[r], s;
|
|
@@ -5752,7 +6496,7 @@ function cr(e, t, n, r, i, a) {
|
|
|
5752
6496
|
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));
|
|
5753
6497
|
}
|
|
5754
6498
|
}
|
|
5755
|
-
function
|
|
6499
|
+
function Ur(e, t, n, r, i) {
|
|
5756
6500
|
e.fillStyle = r.axisLabel, e.font = `${r.font.sizeSmall}px ${r.font.family}`, e.textAlign = "center", e.textBaseline = "top";
|
|
5757
6501
|
let a = n.bottom + 6, o = t.length > 0 ? t[0].slotW - 4 : 0, s = !1;
|
|
5758
6502
|
for (let n = 0; n < t.length; n++) if (e.measureText(i(t[n].label)).width > o) {
|
|
@@ -5773,7 +6517,7 @@ function lr(e, t, n, r, i) {
|
|
|
5773
6517
|
}
|
|
5774
6518
|
e.setTransform(1, 0, 0, 1, 0, 0), e.restore();
|
|
5775
6519
|
}
|
|
5776
|
-
function
|
|
6520
|
+
function Wr(e, t, n) {
|
|
5777
6521
|
if (t < n.left || t > n.right) return null;
|
|
5778
6522
|
for (let n = 0; n < e.length; n++) {
|
|
5779
6523
|
let r = e[n];
|
|
@@ -5781,7 +6525,7 @@ function ur(e, t, n) {
|
|
|
5781
6525
|
}
|
|
5782
6526
|
return null;
|
|
5783
6527
|
}
|
|
5784
|
-
function
|
|
6528
|
+
function Gr(e, t, n, r, i, a, o, s) {
|
|
5785
6529
|
let c = t[r], l = n[r], u = Math.round(c.slotX + c.slotW / 2) + .5;
|
|
5786
6530
|
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([]);
|
|
5787
6531
|
let d = [
|
|
@@ -5800,31 +6544,31 @@ function dr(e, t, n, r, i, a, o, s) {
|
|
|
5800
6544
|
let _ = o.font.sizeSmall + 4;
|
|
5801
6545
|
for (let t = 0; t < d.length; t++) e.fillText(d[t], h + 8, g + 6 + t * _);
|
|
5802
6546
|
}
|
|
5803
|
-
function
|
|
6547
|
+
function Kr(e, t, n, r, i, a) {
|
|
5804
6548
|
let { data: o } = r;
|
|
5805
6549
|
if (!o || o.length === 0 || t <= 0 || n <= 0) return { hitBar: null };
|
|
5806
|
-
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 ??
|
|
5807
|
-
|
|
6550
|
+
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 ?? jr, m = r.showValues !== !1, h = r.showDelta !== !1, g = r.valueFormat ?? Pr, _ = r.labelFormat ?? ((e) => e), { valMin: v, valMax: y } = Lr(o), b = y - v || 1, x = Fr(t, n), { bars: S, cumulatives: C } = Ir(o, x, p, v, b);
|
|
6551
|
+
Rr(e, t, n, i.background), zr(e, x, v, y, i, g), Vr(e, S, x, v, b, d, f), Br(e, S, {
|
|
5808
6552
|
positive: s,
|
|
5809
6553
|
negative: c,
|
|
5810
6554
|
total: l,
|
|
5811
6555
|
subtotal: u
|
|
5812
|
-
}), m &&
|
|
5813
|
-
let w = a ?
|
|
5814
|
-
return a && w !== null &&
|
|
6556
|
+
}), m && Hr(e, S, C, i, g, h), Ur(e, S, x, i, _);
|
|
6557
|
+
let w = a ? Wr(S, a.x, x) : null;
|
|
6558
|
+
return a && w !== null && Gr(e, S, C, w, a, x, i, g), { hitBar: w };
|
|
5815
6559
|
}
|
|
5816
6560
|
//#endregion
|
|
5817
6561
|
//#region src/finance/GaugeRenderer.ts
|
|
5818
|
-
var
|
|
5819
|
-
function
|
|
6562
|
+
var qr = Math.PI / 180, Jr = 135, Yr = 405, Xr = .25;
|
|
6563
|
+
function Zr(e) {
|
|
5820
6564
|
let t = Math.abs(e);
|
|
5821
6565
|
return t >= 1e6 ? (e / 1e6).toFixed(2) + "M" : t >= 1e3 ? (e / 1e3).toFixed(1) + "K" : Number.isInteger(e) ? e.toFixed(0) : e.toFixed(1);
|
|
5822
6566
|
}
|
|
5823
6567
|
function Q(e, t, n) {
|
|
5824
6568
|
return e < t ? t : e > n ? n : e;
|
|
5825
6569
|
}
|
|
5826
|
-
function
|
|
5827
|
-
let r = n.min ?? 0, i = n.max ?? 100, a = i - r || 1, o = (n.startAngle ??
|
|
6570
|
+
function Qr(e, t, n) {
|
|
6571
|
+
let r = n.min ?? 0, i = n.max ?? 100, a = i - r || 1, o = (n.startAngle ?? Jr) * qr, s = (n.endAngle ?? Yr) * qr, c = n.thickness ?? Xr, l = e / 2, u = t / 2 + t * .05, d = Math.max(10, Math.min(e, t) / 2 - 24);
|
|
5828
6572
|
return {
|
|
5829
6573
|
cx: l,
|
|
5830
6574
|
cy: u,
|
|
@@ -5842,38 +6586,38 @@ function $(e, t) {
|
|
|
5842
6586
|
let n = Q((e - t.min) / t.range, 0, 1);
|
|
5843
6587
|
return t.startAngle + t.angleRange * n;
|
|
5844
6588
|
}
|
|
5845
|
-
function
|
|
6589
|
+
function $r(e, t, n, r) {
|
|
5846
6590
|
e.fillStyle = r, e.fillRect(0, 0, t, n);
|
|
5847
6591
|
}
|
|
5848
|
-
function
|
|
6592
|
+
function ei(e, t, n) {
|
|
5849
6593
|
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();
|
|
5850
6594
|
}
|
|
5851
|
-
function
|
|
6595
|
+
function ti(e, t, n) {
|
|
5852
6596
|
let r = Q(n.from, t.min, t.max), i = Q(n.to, t.min, t.max);
|
|
5853
6597
|
if (i <= r) return;
|
|
5854
6598
|
let a = $(r, t), o = $(i, t);
|
|
5855
6599
|
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();
|
|
5856
6600
|
}
|
|
5857
|
-
function
|
|
6601
|
+
function ni(e, t, n, r, i) {
|
|
5858
6602
|
let a = $(n, t);
|
|
5859
6603
|
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);
|
|
5860
6604
|
}
|
|
5861
|
-
function
|
|
6605
|
+
function ri(e, t, n, r) {
|
|
5862
6606
|
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;
|
|
5863
6607
|
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();
|
|
5864
6608
|
}
|
|
5865
|
-
function
|
|
6609
|
+
function ii(e, t, n, r, i) {
|
|
5866
6610
|
let a = Math.round(t.innerRadius * .55), o = Math.round(i.font.sizeMedium);
|
|
5867
6611
|
e.fillStyle = i.text, e.textAlign = "center", e.textBaseline = "middle", e.font = `600 ${a}px ${i.font.family}`;
|
|
5868
6612
|
let s = !!r, c = s ? t.cy - o * .6 : t.cy - a * .1;
|
|
5869
6613
|
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));
|
|
5870
6614
|
}
|
|
5871
|
-
function
|
|
6615
|
+
function ai(e, t, n, r) {
|
|
5872
6616
|
e.fillStyle = r.textSecondary, e.font = `${r.font.sizeSmall}px ${r.font.family}`;
|
|
5873
6617
|
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;
|
|
5874
6618
|
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);
|
|
5875
6619
|
}
|
|
5876
|
-
function
|
|
6620
|
+
function oi(e, t, n, r) {
|
|
5877
6621
|
e.fillStyle = r.textSecondary, e.font = `${r.font.sizeSmall}px ${r.font.family}`, e.textAlign = "center", e.textBaseline = "middle";
|
|
5878
6622
|
let i = (t.radius + t.innerRadius) / 2;
|
|
5879
6623
|
for (let r = 0; r < n.length; r++) {
|
|
@@ -5883,15 +6627,15 @@ function Er(e, t, n, r) {
|
|
|
5883
6627
|
e.fillText(a.label, s, c);
|
|
5884
6628
|
}
|
|
5885
6629
|
}
|
|
5886
|
-
function
|
|
6630
|
+
function si(e, t, n, r, i, a) {
|
|
5887
6631
|
if (t <= 0 || n <= 0) return;
|
|
5888
|
-
let o =
|
|
5889
|
-
|
|
6632
|
+
let o = Qr(t, n, r), s = r.trackColor ?? i.grid, c = r.needleColor ?? i.text, l = r.showValue !== !1, u = r.showZoneLabels === !0, d = r.valueFormat ?? Zr, f = Q(a, o.min, o.max);
|
|
6633
|
+
$r(e, t, n, i.background), ei(e, o, s);
|
|
5890
6634
|
let p = r.zones;
|
|
5891
|
-
if (p && p.length > 0) for (let t = 0; t < p.length; t++)
|
|
5892
|
-
|
|
6635
|
+
if (p && p.length > 0) for (let t = 0; t < p.length; t++) ti(e, o, p[t]);
|
|
6636
|
+
ni(e, o, f, c, .12), ri(e, o, f, c), l && ii(e, o, d(f), r.label, i), ai(e, o, d, i), u && p && p.length > 0 && oi(e, o, p, i);
|
|
5893
6637
|
}
|
|
5894
6638
|
//#endregion
|
|
5895
|
-
export {
|
|
6639
|
+
export { Be as ADXIndicator, ze as ATRIndicator, Ze as AccumulationDistributionIndicator, Sn as AlertManager, Oe as AnchoredVWAPIndicator, Gt as AnchoredVWAPTool, Pn as Animator, te as AreaRenderer, Ge as AroonIndicator, Vt as ArrowTool, Pe as AwesomeOscillatorIndicator, yn as BarCountdown, ne as BarRenderer, In as BaseFinanceChart, ie as BaselineRenderer, pn as BinanceAdapter, F as BollingerBandsIndicator, Ue as CCIIndicator, Je as CMFIndicator, A as CandlestickRenderer, v as CanvasLayer, Fe as ChaikinOscillatorIndicator, gn as ChartLegend, An as ChartStateManager, le as CompareRenderer, dt as CrosshairHandler, pt as CrosshairTooltip, sn as CurrentPriceLine, hn as DEFAULT_LEGEND_CONFIG, x as DPRManager, Mn as DataExporter, Lt as DateRangeTool, tn as DepthOverlay, Te as DonchianChannelIndicator, L as DrawingBase, vt as DrawingManager, yt as DrawingRenderer, P as EMAIndicator, Nn as Easing, Ft as ElliottWaveTool, jt as EllipseTool, H as Emitter, gt as EventBus, wt as ExtendedLineTool, kt as FibExtensionTool, Dt as FibRetracementTool, Ln as FinanceCrosshair, Wt as GannBoxTool, Ut as GannFanTool, nt as GridRenderer, re as HollowCandleRenderer, xt as HorizontalLineTool, je as HullMAIndicator, xe as IchimokuIndicator, j as IndicatorBase, ve as IndicatorEngine, tt as IndicatorWorkerHost, ct as InteractionManager, oe as KagiRenderer, we as KeltnerChannelIndicator, ft as KeyboardHandler, y as LayerManager, ee as LineRenderer, Ae as LinearRegressionChannelIndicator, Le as MACDIndicator, We as MFIIndicator, Rt as MeasureTool, mn as MockAdapter, Ve as OBVIndicator, Jt as OrderRenderer, lt as PanHandler, Se as ParabolicSARIndicator, Tt as ParallelChannelTool, Nt as PitchforkTool, De as PivotPointsIndicator, se as PointAndFigureRenderer, en as PositionRenderer, rt as PriceAxis, It as PriceRangeTool, Ke as ROCIndicator, Ie as RSIIndicator, Ct as RayTool, U as ReconnectManager, At as RectangleTool, Et as RegressionChannelTool, D as RenderEngine, b as RenderLoop, ae as RenkoRenderer, Cn as ReplayManager, ye as SMAIndicator, _n as Screenshot, bn as SessionBreaks, Ye as StdDevIndicator, Re as StochasticIndicator, cn as StreamManager, Ce as SupertrendIndicator, qe as TSIIndicator, Bt as TextAnnotationTool, on as TickAggregator, st as TimeAxis, V as TradingContextMenu, nn as TradingDragHandler, rn as TradingManager, an as TradingRenderer, bt as TrendLineTool, Mt as TriangleTool, jn as UndoRedoManager, Qe as VROCIndicator, be as VWAPIndicator, St as VerticalLineTool, O as Viewport, Xe as VolumeProfileIndicator, Kt as VolumeProfileRangeTool, ce as VolumeRenderer, vn as Watermark, He as WilliamsRIndicator, ke as ZigZagIndicator, ut as ZoomHandler, S as barIndexToX, N as getIntParam, M as getNumberParam, k as getVisibleData, et as isWorkerResponse, br as layoutSquarifiedTreemap, _r as layoutUniformGrid, C as priceToY, qt as registerBuiltInDrawingTools, $e as registerBuiltInIndicators, Qn as renderDepthChart, gr as renderEquityCurve, si as renderGauge, Er as renderHeatmap, Rn as renderSparkline, Kr as renderWaterfall, E as timestampToBarIndex, ue as toHeikinAshi, me as toKagi, pe as toLineBreak, he as toPointAndFigure, ge as toRangeBars, de as toRenko, w as xToBarIndex, T as yToPrice };
|
|
5896
6640
|
|
|
5897
6641
|
//# sourceMappingURL=index.js.map
|