@backtest-kit/ui 7.7.0 → 8.0.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.
Files changed (46) hide show
  1. package/README.md +254 -254
  2. package/build/index.cjs +309 -6
  3. package/build/index.mjs +309 -6
  4. package/build/modules/frontend/build/3rdparty/ace_1.4.12/ace.js +21337 -21337
  5. package/build/modules/frontend/build/3rdparty/ace_1.4.12/mode-javascript.js +797 -797
  6. package/build/modules/frontend/build/3rdparty/ace_1.4.12/theme-chrome.js +137 -137
  7. package/build/modules/frontend/build/3rdparty/ace_1.4.12/theme-twilight.js +115 -115
  8. package/build/modules/frontend/build/3rdparty/ace_1.4.12/worker-javascript.js +15012 -15012
  9. package/build/modules/frontend/build/3rdparty/qfchart_0.8.7/echarts.min.js +45 -45
  10. package/build/modules/frontend/build/assets/{Article-Z1gwQi4C.js → Article-Jdmz7aZ2.js} +1 -1
  11. package/build/modules/frontend/build/assets/{Background-DS1gKl45.js → Background-EK9k_h9v.js} +1 -1
  12. package/build/modules/frontend/build/assets/{IconPhoto-BitDk5sL.js → IconPhoto-CDjyp9zD.js} +1 -1
  13. package/build/modules/frontend/build/assets/{KeyboardArrowLeft-BT0IHVDD.js → KeyboardArrowLeft-Dr0dCIxL.js} +1 -1
  14. package/build/modules/frontend/build/assets/PictureAsPdfOutlined-HbiH_Q-c.js +1 -0
  15. package/build/modules/frontend/build/assets/{Refresh-BgupECvn.js → Refresh-B8TqdmHB.js} +1 -1
  16. package/build/modules/frontend/build/assets/emitters-CSLwhjBD.js +1 -0
  17. package/build/modules/frontend/build/assets/hasRouteMatch-CikI4OQa.js +1 -0
  18. package/build/modules/frontend/build/assets/{html2canvas-CxpxaxUC.js → html2canvas-DljqBlXP.js} +1 -1
  19. package/build/modules/frontend/build/assets/index-0QTAHHmG.js +1 -0
  20. package/build/modules/frontend/build/assets/{index-C4dzv30q.js → index-BdVXoDcb.js} +1 -1
  21. package/build/modules/frontend/build/assets/index-Bg-hgDXg.js +1 -0
  22. package/build/modules/frontend/build/assets/{index-CnRuFJIf.js → index-CJY9g0ao.js} +1 -1
  23. package/build/modules/frontend/build/assets/index-CtMweBSG.js +1 -0
  24. package/build/modules/frontend/build/assets/{index-nfZ8sdZp.js → index-DP0KiPHM.js} +1 -1
  25. package/build/modules/frontend/build/assets/{index-DzrwP4k5.js → index-Dj5yCZBM.js} +56 -56
  26. package/build/modules/frontend/build/assets/index-DpvQhidl.js +1 -0
  27. package/build/modules/frontend/build/assets/{index-9YHmY3Zv.js → index-HAAb1Hoc.js} +1 -1
  28. package/build/modules/frontend/build/assets/index-Qr2GaVV1.js +1 -0
  29. package/build/modules/frontend/build/assets/index-VbqABn7v.js +1 -0
  30. package/build/modules/frontend/build/assets/index-cETv4rVS.js +1 -0
  31. package/build/modules/frontend/build/assets/index-dcGK7g_Z.js +1 -0
  32. package/build/modules/frontend/build/assets/{index.es-Du6U2Hyj.js → index.es-BNKwZTfP.js} +1 -1
  33. package/build/modules/frontend/build/assets/{markdownit-SQF1Xc8y.js → markdownit-BHwoI8cd.js} +1 -1
  34. package/build/modules/frontend/build/index.html +87 -87
  35. package/build/modules/frontend/build/manifest.json +23 -23
  36. package/package.json +118 -118
  37. package/types.d.ts +28 -0
  38. package/build/modules/frontend/build/assets/emitters-BJfdDGbd.js +0 -1
  39. package/build/modules/frontend/build/assets/hasRouteMatch-CcXyiBjV.js +0 -1
  40. package/build/modules/frontend/build/assets/index-1kyziIc7.js +0 -1
  41. package/build/modules/frontend/build/assets/index-3ZYgMfYi.js +0 -1
  42. package/build/modules/frontend/build/assets/index-BR0aHfoe.js +0 -1
  43. package/build/modules/frontend/build/assets/index-Bg2qm7TJ.js +0 -1
  44. package/build/modules/frontend/build/assets/index-C8Wdopwt.js +0 -1
  45. package/build/modules/frontend/build/assets/index-CWErSuod.js +0 -1
  46. package/build/modules/frontend/build/assets/index-J3hGIAw0.js +0 -1
package/build/index.mjs CHANGED
@@ -17,6 +17,8 @@ import { existsSync } from 'fs';
17
17
  const CC_WWWROOT_PATH = process.env.CC_WWWROOT_PATH || "";
18
18
  const CC_WWWROOT_HOST = process.env.CC_WWWROOT_HOST || "0.0.0.0";
19
19
  const CC_WWWROOT_PORT = parseInt(process.env.CC_WWWROOT_PORT) || 60050;
20
+ const CC_TELEGRAM_CHANNEL = process.env.CC_TELEGRAM_CHANNEL || "";
21
+ const CC_QUICKCHART_HOST = process.env.CC_QUICKCHART_HOST || "";
20
22
  const CC_ENABLE_MOCK = !!parseInt(process.env.CC_ENABLE_MOCK) || false;
21
23
 
22
24
  const serveSubject = new BehaviorSubject();
@@ -76,6 +78,8 @@ const mockServices$1 = {
76
78
  explorerMockService: Symbol("explorerMockService"),
77
79
  signalMockService: Symbol("signalMockService"),
78
80
  heatMockService: Symbol("heatMockService"),
81
+ performanceMockService: Symbol("performanceMockService"),
82
+ environmentMockService: Symbol("environmentMockService"),
79
83
  };
80
84
  const viewServices$1 = {
81
85
  notificationViewService: Symbol("notificationViewService"),
@@ -87,6 +91,8 @@ const viewServices$1 = {
87
91
  explorerViewService: Symbol("explorerViewService"),
88
92
  signalViewService: Symbol("signalViewService"),
89
93
  heatViewService: Symbol("heatViewService"),
94
+ performanceViewService: Symbol("performanceViewService"),
95
+ environmentViewService: Symbol("environmentViewService"),
90
96
  };
91
97
  const TYPES = {
92
98
  ...baseServices$1,
@@ -767,14 +773,14 @@ class SignalMockService {
767
773
  }
768
774
  }
769
775
 
770
- const MOCK_DATA_PATH = "./mock/heat.json";
771
- const MOCK_REPORT_PATH = "./mock/heat-report.md";
776
+ const MOCK_DATA_PATH$2 = "./mock/heat.json";
777
+ const MOCK_REPORT_PATH$1 = "./mock/heat-report.md";
772
778
  const READ_HEAT_DATA_FN = singleshot(async () => {
773
- const data = await fs.readFile(MOCK_DATA_PATH, "utf-8");
779
+ const data = await fs.readFile(MOCK_DATA_PATH$2, "utf-8");
774
780
  return JSON.parse(data);
775
781
  });
776
782
  const READ_HEAT_REPORT_FN = singleshot(async () => {
777
- return await fs.readFile(MOCK_REPORT_PATH, "utf-8");
783
+ return await fs.readFile(MOCK_REPORT_PATH$1, "utf-8");
778
784
  });
779
785
  class HeatMockService {
780
786
  constructor() {
@@ -1215,7 +1221,7 @@ class StatusViewService {
1215
1221
  portfolioTotalPnl: currentHeat.portfolioTotalPnl,
1216
1222
  portfolioSharpeRatio: currentHeat.portfolioSharpeRatio,
1217
1223
  portfolioTotalTrades: currentHeat.portfolioTotalTrades,
1218
- symbols: currentHeat.symbols.map(({ symbol, totalPnl, winRate, profitFactor, maxDrawdown, expectancy, totalTrades }) => ({
1224
+ symbols: currentHeat.symbols.map(({ symbol, totalPnl, winRate, profitFactor, maxDrawdown, expectancy, totalTrades, sortinoRatio, calmarRatio, recoveryFactor }) => ({
1219
1225
  symbol,
1220
1226
  totalPnl,
1221
1227
  winRate,
@@ -1223,6 +1229,9 @@ class StatusViewService {
1223
1229
  maxDrawdown,
1224
1230
  expectancy,
1225
1231
  totalTrades,
1232
+ sortinoRatio,
1233
+ calmarRatio,
1234
+ recoveryFactor,
1226
1235
  })),
1227
1236
  backtest: true,
1228
1237
  };
@@ -1245,7 +1254,7 @@ class StatusViewService {
1245
1254
  portfolioTotalPnl: currentHeat.portfolioTotalPnl,
1246
1255
  portfolioSharpeRatio: currentHeat.portfolioSharpeRatio,
1247
1256
  portfolioTotalTrades: currentHeat.portfolioTotalTrades,
1248
- symbols: currentHeat.symbols.map(({ symbol, totalPnl, winRate, profitFactor, maxDrawdown, expectancy, totalTrades }) => ({
1257
+ symbols: currentHeat.symbols.map(({ symbol, totalPnl, winRate, profitFactor, maxDrawdown, expectancy, totalTrades, sortinoRatio, calmarRatio, recoveryFactor }) => ({
1249
1258
  symbol,
1250
1259
  totalPnl,
1251
1260
  winRate,
@@ -1253,6 +1262,9 @@ class StatusViewService {
1253
1262
  maxDrawdown,
1254
1263
  expectancy,
1255
1264
  totalTrades,
1265
+ sortinoRatio,
1266
+ calmarRatio,
1267
+ recoveryFactor,
1256
1268
  })),
1257
1269
  backtest: false,
1258
1270
  };
@@ -1833,6 +1845,117 @@ class LiveMetaService {
1833
1845
  }
1834
1846
  }
1835
1847
 
1848
+ const MOCK_DATA_PATH$1 = "./mock/performance.json";
1849
+ const MOCK_REPORT_PATH = "./mock/performance-report.md";
1850
+ const READ_PERFORMANCE_DATA_FN = singleshot(async () => {
1851
+ const data = await fs.readFile(MOCK_DATA_PATH$1, "utf-8");
1852
+ return JSON.parse(data);
1853
+ });
1854
+ const READ_PERFORMANCE_REPORT_FN = singleshot(async () => {
1855
+ return await fs.readFile(MOCK_REPORT_PATH, "utf-8");
1856
+ });
1857
+ class PerformanceMockService {
1858
+ constructor() {
1859
+ this.loggerService = inject(TYPES.loggerService);
1860
+ this.getPerformanceData = async () => {
1861
+ this.loggerService.log("performanceMockService getPerformanceData");
1862
+ return await READ_PERFORMANCE_DATA_FN();
1863
+ };
1864
+ this.getPerformanceReport = async () => {
1865
+ this.loggerService.log("performanceMockService getPerformanceReport");
1866
+ return await READ_PERFORMANCE_REPORT_FN();
1867
+ };
1868
+ }
1869
+ }
1870
+
1871
+ const MOCK_DATA_PATH = "./mock/environment.json";
1872
+ const READ_ENVIRONMENT_DATA_FN = singleshot(async () => {
1873
+ const data = await fs.readFile(MOCK_DATA_PATH, "utf-8");
1874
+ return JSON.parse(data);
1875
+ });
1876
+ class EnvironmentMockService {
1877
+ constructor() {
1878
+ this.loggerService = inject(TYPES.loggerService);
1879
+ this.getEnvironmentData = async () => {
1880
+ this.loggerService.log("environmentMockService getEnvironmentData");
1881
+ return await READ_ENVIRONMENT_DATA_FN();
1882
+ };
1883
+ }
1884
+ }
1885
+
1886
+ class PerformanceViewService {
1887
+ constructor() {
1888
+ this.loggerService = inject(TYPES.loggerService);
1889
+ this.performanceMockService = inject(TYPES.performanceMockService);
1890
+ this.getPerformanceData = async () => {
1891
+ this.loggerService.log("performanceViewService getPerformanceData");
1892
+ if (CC_ENABLE_MOCK) {
1893
+ return await this.performanceMockService.getPerformanceData();
1894
+ }
1895
+ const [backtestItem] = await Backtest.list();
1896
+ const [liveItem] = await Live.list();
1897
+ if (backtestItem) {
1898
+ return await Performance.getData(backtestItem.symbol, {
1899
+ strategyName: backtestItem.strategyName,
1900
+ exchangeName: backtestItem.exchangeName,
1901
+ frameName: backtestItem.frameName,
1902
+ }, true);
1903
+ }
1904
+ if (liveItem) {
1905
+ return await Performance.getData(liveItem.symbol, {
1906
+ strategyName: liveItem.strategyName,
1907
+ exchangeName: liveItem.exchangeName,
1908
+ frameName: "",
1909
+ }, false);
1910
+ }
1911
+ return null;
1912
+ };
1913
+ this.getPerformanceReport = async () => {
1914
+ this.loggerService.log("performanceViewService getPerformanceReport");
1915
+ if (CC_ENABLE_MOCK) {
1916
+ return await this.performanceMockService.getPerformanceReport();
1917
+ }
1918
+ const [backtestItem] = await Backtest.list();
1919
+ const [liveItem] = await Live.list();
1920
+ if (backtestItem) {
1921
+ return await Performance.getReport(backtestItem.symbol, {
1922
+ strategyName: backtestItem.strategyName,
1923
+ exchangeName: backtestItem.exchangeName,
1924
+ frameName: backtestItem.frameName,
1925
+ }, true);
1926
+ }
1927
+ if (liveItem) {
1928
+ return await Performance.getReport(liveItem.symbol, {
1929
+ strategyName: liveItem.strategyName,
1930
+ exchangeName: liveItem.exchangeName,
1931
+ frameName: "",
1932
+ }, false);
1933
+ }
1934
+ return null;
1935
+ };
1936
+ }
1937
+ }
1938
+
1939
+ class EnvironmentViewService {
1940
+ constructor() {
1941
+ this.loggerService = inject(TYPES.loggerService);
1942
+ this.enviromentMockService = inject(TYPES.environmentMockService);
1943
+ this.getEnvironmentData = async () => {
1944
+ this.loggerService.log("environmentViewService getEnvironmentData");
1945
+ if (CC_ENABLE_MOCK) {
1946
+ return await this.enviromentMockService.getEnvironmentData();
1947
+ }
1948
+ return {
1949
+ quickchart_host: CC_QUICKCHART_HOST,
1950
+ telegram_channel: CC_TELEGRAM_CHANNEL,
1951
+ wwwroot_host: CC_WWWROOT_HOST,
1952
+ wwwroot_path: CC_WWWROOT_PATH,
1953
+ wwwroot_port: CC_WWWROOT_PORT,
1954
+ };
1955
+ };
1956
+ }
1957
+ }
1958
+
1836
1959
  {
1837
1960
  provide(TYPES.loggerService, () => new LoggerService());
1838
1961
  provide(TYPES.exchangeService, () => new ExchangeService());
@@ -1856,6 +1979,8 @@ class LiveMetaService {
1856
1979
  provide(TYPES.explorerMockService, () => new ExplorerMockService());
1857
1980
  provide(TYPES.signalMockService, () => new SignalMockService());
1858
1981
  provide(TYPES.heatMockService, () => new HeatMockService());
1982
+ provide(TYPES.performanceMockService, () => new PerformanceMockService());
1983
+ provide(TYPES.environmentMockService, () => new EnvironmentMockService());
1859
1984
  }
1860
1985
  {
1861
1986
  provide(TYPES.notificationViewService, () => new NotificationViewService());
@@ -1867,6 +1992,8 @@ class LiveMetaService {
1867
1992
  provide(TYPES.explorerViewService, () => new ExplorerViewService());
1868
1993
  provide(TYPES.signalViewService, () => new SignalViewService());
1869
1994
  provide(TYPES.heatViewService, () => new HeatViewService());
1995
+ provide(TYPES.performanceViewService, () => new PerformanceViewService());
1996
+ provide(TYPES.environmentViewService, () => new EnvironmentViewService());
1870
1997
  }
1871
1998
 
1872
1999
  const baseServices = {
@@ -1892,6 +2019,8 @@ const mockServices = {
1892
2019
  explorerMockService: inject(TYPES.explorerMockService),
1893
2020
  signalMockService: inject(TYPES.signalMockService),
1894
2021
  heatMockService: inject(TYPES.heatMockService),
2022
+ performanceMockService: inject(TYPES.performanceMockService),
2023
+ environmentMockService: inject(TYPES.environmentMockService),
1895
2024
  };
1896
2025
  const viewServices = {
1897
2026
  notificationViewService: inject(TYPES.notificationViewService),
@@ -1903,6 +2032,8 @@ const viewServices = {
1903
2032
  explorerViewService: inject(TYPES.explorerViewService),
1904
2033
  signalViewService: inject(TYPES.signalViewService),
1905
2034
  heatViewService: inject(TYPES.heatViewService),
2035
+ performanceViewService: inject(TYPES.performanceViewService),
2036
+ environmentViewService: inject(TYPES.environmentViewService),
1906
2037
  };
1907
2038
  const ioc = {
1908
2039
  ...baseServices,
@@ -2527,6 +2658,92 @@ router$a.post("/api/v1/mock/status_info", async (req, res) => {
2527
2658
  });
2528
2659
  }
2529
2660
  });
2661
+ // PerformanceMockService endpoints
2662
+ router$a.post("/api/v1/mock/performance_data", async (req, res) => {
2663
+ try {
2664
+ const request = await micro.json(req);
2665
+ const { requestId, serviceName } = request;
2666
+ const data = await ioc.performanceMockService.getPerformanceData();
2667
+ const result = {
2668
+ data,
2669
+ status: "ok",
2670
+ error: "",
2671
+ requestId,
2672
+ serviceName,
2673
+ };
2674
+ ioc.loggerService.log("/api/v1/mock/performance_data ok", {
2675
+ request,
2676
+ result: omit(result, "data"),
2677
+ });
2678
+ return await micro.send(res, 200, result);
2679
+ }
2680
+ catch (error) {
2681
+ ioc.loggerService.log("/api/v1/mock/performance_data error", {
2682
+ error: errorData(error),
2683
+ });
2684
+ return await micro.send(res, 200, {
2685
+ status: "error",
2686
+ error: getErrorMessage(error),
2687
+ });
2688
+ }
2689
+ });
2690
+ router$a.post("/api/v1/mock/performance_report", async (req, res) => {
2691
+ try {
2692
+ const request = await micro.json(req);
2693
+ const { requestId, serviceName } = request;
2694
+ const data = await ioc.performanceMockService.getPerformanceReport();
2695
+ const result = {
2696
+ data,
2697
+ status: "ok",
2698
+ error: "",
2699
+ requestId,
2700
+ serviceName,
2701
+ };
2702
+ ioc.loggerService.log("/api/v1/mock/performance_report ok", {
2703
+ request,
2704
+ result: omit(result, "data"),
2705
+ });
2706
+ return await micro.send(res, 200, result);
2707
+ }
2708
+ catch (error) {
2709
+ ioc.loggerService.log("/api/v1/mock/performance_report error", {
2710
+ error: errorData(error),
2711
+ });
2712
+ return await micro.send(res, 200, {
2713
+ status: "error",
2714
+ error: getErrorMessage(error),
2715
+ });
2716
+ }
2717
+ });
2718
+ // EnvironmentMockService endpoints
2719
+ router$a.post("/api/v1/mock/environment_data", async (req, res) => {
2720
+ try {
2721
+ const request = await micro.json(req);
2722
+ const { requestId, serviceName } = request;
2723
+ const data = await ioc.environmentMockService.getEnvironmentData();
2724
+ const result = {
2725
+ data,
2726
+ status: "ok",
2727
+ error: "",
2728
+ requestId,
2729
+ serviceName,
2730
+ };
2731
+ ioc.loggerService.log("/api/v1/mock/environment_data ok", {
2732
+ request,
2733
+ result: omit(result, "data"),
2734
+ });
2735
+ return await micro.send(res, 200, result);
2736
+ }
2737
+ catch (error) {
2738
+ ioc.loggerService.log("/api/v1/mock/environment_data error", {
2739
+ error: errorData(error),
2740
+ });
2741
+ return await micro.send(res, 200, {
2742
+ status: "error",
2743
+ error: getErrorMessage(error),
2744
+ });
2745
+ }
2746
+ });
2530
2747
 
2531
2748
  const router$9 = Router({
2532
2749
  params: true,
@@ -3142,6 +3359,92 @@ router$9.post("/api/v1/view/status_info", async (req, res) => {
3142
3359
  });
3143
3360
  }
3144
3361
  });
3362
+ // PerformanceViewService endpoints
3363
+ router$9.post("/api/v1/view/performance_data", async (req, res) => {
3364
+ try {
3365
+ const request = await micro.json(req);
3366
+ const { requestId, serviceName } = request;
3367
+ const data = await ioc.performanceViewService.getPerformanceData();
3368
+ const result = {
3369
+ data,
3370
+ status: "ok",
3371
+ error: "",
3372
+ requestId,
3373
+ serviceName,
3374
+ };
3375
+ ioc.loggerService.log("/api/v1/view/performance_data ok", {
3376
+ request,
3377
+ result: omit(result, "data"),
3378
+ });
3379
+ return await micro.send(res, 200, result);
3380
+ }
3381
+ catch (error) {
3382
+ ioc.loggerService.log("/api/v1/view/performance_data error", {
3383
+ error: errorData(error),
3384
+ });
3385
+ return await micro.send(res, 200, {
3386
+ status: "error",
3387
+ error: getErrorMessage(error),
3388
+ });
3389
+ }
3390
+ });
3391
+ router$9.post("/api/v1/view/performance_report", async (req, res) => {
3392
+ try {
3393
+ const request = await micro.json(req);
3394
+ const { requestId, serviceName } = request;
3395
+ const data = await ioc.performanceViewService.getPerformanceReport();
3396
+ const result = {
3397
+ data,
3398
+ status: "ok",
3399
+ error: "",
3400
+ requestId,
3401
+ serviceName,
3402
+ };
3403
+ ioc.loggerService.log("/api/v1/view/performance_report ok", {
3404
+ request,
3405
+ result: omit(result, "data"),
3406
+ });
3407
+ return await micro.send(res, 200, result);
3408
+ }
3409
+ catch (error) {
3410
+ ioc.loggerService.log("/api/v1/view/performance_report error", {
3411
+ error: errorData(error),
3412
+ });
3413
+ return await micro.send(res, 200, {
3414
+ status: "error",
3415
+ error: getErrorMessage(error),
3416
+ });
3417
+ }
3418
+ });
3419
+ // EnvironmentViewService endpoints
3420
+ router$9.post("/api/v1/view/environment_data", async (req, res) => {
3421
+ try {
3422
+ const request = await micro.json(req);
3423
+ const { requestId, serviceName } = request;
3424
+ const data = await ioc.environmentViewService.getEnvironmentData();
3425
+ const result = {
3426
+ data,
3427
+ status: "ok",
3428
+ error: "",
3429
+ requestId,
3430
+ serviceName,
3431
+ };
3432
+ ioc.loggerService.log("/api/v1/view/environment_data ok", {
3433
+ request,
3434
+ result: omit(result, "data"),
3435
+ });
3436
+ return await micro.send(res, 200, result);
3437
+ }
3438
+ catch (error) {
3439
+ ioc.loggerService.log("/api/v1/view/environment_data error", {
3440
+ error: errorData(error),
3441
+ });
3442
+ return await micro.send(res, 200, {
3443
+ status: "error",
3444
+ error: getErrorMessage(error),
3445
+ });
3446
+ }
3447
+ });
3145
3448
 
3146
3449
  const require$1 = createRequire(import.meta.url);
3147
3450
  function getModulesPath() {