@backtest-kit/ui 7.8.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.cjs CHANGED
@@ -20,6 +20,8 @@ var _documentCurrentScript = typeof document !== 'undefined' ? document.currentS
20
20
  const CC_WWWROOT_PATH = process.env.CC_WWWROOT_PATH || "";
21
21
  const CC_WWWROOT_HOST = process.env.CC_WWWROOT_HOST || "0.0.0.0";
22
22
  const CC_WWWROOT_PORT = parseInt(process.env.CC_WWWROOT_PORT) || 60050;
23
+ const CC_TELEGRAM_CHANNEL = process.env.CC_TELEGRAM_CHANNEL || "";
24
+ const CC_QUICKCHART_HOST = process.env.CC_QUICKCHART_HOST || "";
23
25
  const CC_ENABLE_MOCK = !!parseInt(process.env.CC_ENABLE_MOCK) || false;
24
26
 
25
27
  const serveSubject = new functoolsKit.BehaviorSubject();
@@ -79,6 +81,8 @@ const mockServices$1 = {
79
81
  explorerMockService: Symbol("explorerMockService"),
80
82
  signalMockService: Symbol("signalMockService"),
81
83
  heatMockService: Symbol("heatMockService"),
84
+ performanceMockService: Symbol("performanceMockService"),
85
+ environmentMockService: Symbol("environmentMockService"),
82
86
  };
83
87
  const viewServices$1 = {
84
88
  notificationViewService: Symbol("notificationViewService"),
@@ -90,6 +94,8 @@ const viewServices$1 = {
90
94
  explorerViewService: Symbol("explorerViewService"),
91
95
  signalViewService: Symbol("signalViewService"),
92
96
  heatViewService: Symbol("heatViewService"),
97
+ performanceViewService: Symbol("performanceViewService"),
98
+ environmentViewService: Symbol("environmentViewService"),
93
99
  };
94
100
  const TYPES = {
95
101
  ...baseServices$1,
@@ -770,14 +776,14 @@ class SignalMockService {
770
776
  }
771
777
  }
772
778
 
773
- const MOCK_DATA_PATH = "./mock/heat.json";
774
- const MOCK_REPORT_PATH = "./mock/heat-report.md";
779
+ const MOCK_DATA_PATH$2 = "./mock/heat.json";
780
+ const MOCK_REPORT_PATH$1 = "./mock/heat-report.md";
775
781
  const READ_HEAT_DATA_FN = functoolsKit.singleshot(async () => {
776
- const data = await fs.readFile(MOCK_DATA_PATH, "utf-8");
782
+ const data = await fs.readFile(MOCK_DATA_PATH$2, "utf-8");
777
783
  return JSON.parse(data);
778
784
  });
779
785
  const READ_HEAT_REPORT_FN = functoolsKit.singleshot(async () => {
780
- return await fs.readFile(MOCK_REPORT_PATH, "utf-8");
786
+ return await fs.readFile(MOCK_REPORT_PATH$1, "utf-8");
781
787
  });
782
788
  class HeatMockService {
783
789
  constructor() {
@@ -1218,7 +1224,7 @@ class StatusViewService {
1218
1224
  portfolioTotalPnl: currentHeat.portfolioTotalPnl,
1219
1225
  portfolioSharpeRatio: currentHeat.portfolioSharpeRatio,
1220
1226
  portfolioTotalTrades: currentHeat.portfolioTotalTrades,
1221
- symbols: currentHeat.symbols.map(({ symbol, totalPnl, winRate, profitFactor, maxDrawdown, expectancy, totalTrades }) => ({
1227
+ symbols: currentHeat.symbols.map(({ symbol, totalPnl, winRate, profitFactor, maxDrawdown, expectancy, totalTrades, sortinoRatio, calmarRatio, recoveryFactor }) => ({
1222
1228
  symbol,
1223
1229
  totalPnl,
1224
1230
  winRate,
@@ -1226,6 +1232,9 @@ class StatusViewService {
1226
1232
  maxDrawdown,
1227
1233
  expectancy,
1228
1234
  totalTrades,
1235
+ sortinoRatio,
1236
+ calmarRatio,
1237
+ recoveryFactor,
1229
1238
  })),
1230
1239
  backtest: true,
1231
1240
  };
@@ -1248,7 +1257,7 @@ class StatusViewService {
1248
1257
  portfolioTotalPnl: currentHeat.portfolioTotalPnl,
1249
1258
  portfolioSharpeRatio: currentHeat.portfolioSharpeRatio,
1250
1259
  portfolioTotalTrades: currentHeat.portfolioTotalTrades,
1251
- symbols: currentHeat.symbols.map(({ symbol, totalPnl, winRate, profitFactor, maxDrawdown, expectancy, totalTrades }) => ({
1260
+ symbols: currentHeat.symbols.map(({ symbol, totalPnl, winRate, profitFactor, maxDrawdown, expectancy, totalTrades, sortinoRatio, calmarRatio, recoveryFactor }) => ({
1252
1261
  symbol,
1253
1262
  totalPnl,
1254
1263
  winRate,
@@ -1256,6 +1265,9 @@ class StatusViewService {
1256
1265
  maxDrawdown,
1257
1266
  expectancy,
1258
1267
  totalTrades,
1268
+ sortinoRatio,
1269
+ calmarRatio,
1270
+ recoveryFactor,
1259
1271
  })),
1260
1272
  backtest: false,
1261
1273
  };
@@ -1836,6 +1848,117 @@ class LiveMetaService {
1836
1848
  }
1837
1849
  }
1838
1850
 
1851
+ const MOCK_DATA_PATH$1 = "./mock/performance.json";
1852
+ const MOCK_REPORT_PATH = "./mock/performance-report.md";
1853
+ const READ_PERFORMANCE_DATA_FN = functoolsKit.singleshot(async () => {
1854
+ const data = await fs.readFile(MOCK_DATA_PATH$1, "utf-8");
1855
+ return JSON.parse(data);
1856
+ });
1857
+ const READ_PERFORMANCE_REPORT_FN = functoolsKit.singleshot(async () => {
1858
+ return await fs.readFile(MOCK_REPORT_PATH, "utf-8");
1859
+ });
1860
+ class PerformanceMockService {
1861
+ constructor() {
1862
+ this.loggerService = inject(TYPES.loggerService);
1863
+ this.getPerformanceData = async () => {
1864
+ this.loggerService.log("performanceMockService getPerformanceData");
1865
+ return await READ_PERFORMANCE_DATA_FN();
1866
+ };
1867
+ this.getPerformanceReport = async () => {
1868
+ this.loggerService.log("performanceMockService getPerformanceReport");
1869
+ return await READ_PERFORMANCE_REPORT_FN();
1870
+ };
1871
+ }
1872
+ }
1873
+
1874
+ const MOCK_DATA_PATH = "./mock/environment.json";
1875
+ const READ_ENVIRONMENT_DATA_FN = functoolsKit.singleshot(async () => {
1876
+ const data = await fs.readFile(MOCK_DATA_PATH, "utf-8");
1877
+ return JSON.parse(data);
1878
+ });
1879
+ class EnvironmentMockService {
1880
+ constructor() {
1881
+ this.loggerService = inject(TYPES.loggerService);
1882
+ this.getEnvironmentData = async () => {
1883
+ this.loggerService.log("environmentMockService getEnvironmentData");
1884
+ return await READ_ENVIRONMENT_DATA_FN();
1885
+ };
1886
+ }
1887
+ }
1888
+
1889
+ class PerformanceViewService {
1890
+ constructor() {
1891
+ this.loggerService = inject(TYPES.loggerService);
1892
+ this.performanceMockService = inject(TYPES.performanceMockService);
1893
+ this.getPerformanceData = async () => {
1894
+ this.loggerService.log("performanceViewService getPerformanceData");
1895
+ if (CC_ENABLE_MOCK) {
1896
+ return await this.performanceMockService.getPerformanceData();
1897
+ }
1898
+ const [backtestItem] = await backtestKit.Backtest.list();
1899
+ const [liveItem] = await backtestKit.Live.list();
1900
+ if (backtestItem) {
1901
+ return await backtestKit.Performance.getData(backtestItem.symbol, {
1902
+ strategyName: backtestItem.strategyName,
1903
+ exchangeName: backtestItem.exchangeName,
1904
+ frameName: backtestItem.frameName,
1905
+ }, true);
1906
+ }
1907
+ if (liveItem) {
1908
+ return await backtestKit.Performance.getData(liveItem.symbol, {
1909
+ strategyName: liveItem.strategyName,
1910
+ exchangeName: liveItem.exchangeName,
1911
+ frameName: "",
1912
+ }, false);
1913
+ }
1914
+ return null;
1915
+ };
1916
+ this.getPerformanceReport = async () => {
1917
+ this.loggerService.log("performanceViewService getPerformanceReport");
1918
+ if (CC_ENABLE_MOCK) {
1919
+ return await this.performanceMockService.getPerformanceReport();
1920
+ }
1921
+ const [backtestItem] = await backtestKit.Backtest.list();
1922
+ const [liveItem] = await backtestKit.Live.list();
1923
+ if (backtestItem) {
1924
+ return await backtestKit.Performance.getReport(backtestItem.symbol, {
1925
+ strategyName: backtestItem.strategyName,
1926
+ exchangeName: backtestItem.exchangeName,
1927
+ frameName: backtestItem.frameName,
1928
+ }, true);
1929
+ }
1930
+ if (liveItem) {
1931
+ return await backtestKit.Performance.getReport(liveItem.symbol, {
1932
+ strategyName: liveItem.strategyName,
1933
+ exchangeName: liveItem.exchangeName,
1934
+ frameName: "",
1935
+ }, false);
1936
+ }
1937
+ return null;
1938
+ };
1939
+ }
1940
+ }
1941
+
1942
+ class EnvironmentViewService {
1943
+ constructor() {
1944
+ this.loggerService = inject(TYPES.loggerService);
1945
+ this.enviromentMockService = inject(TYPES.environmentMockService);
1946
+ this.getEnvironmentData = async () => {
1947
+ this.loggerService.log("environmentViewService getEnvironmentData");
1948
+ if (CC_ENABLE_MOCK) {
1949
+ return await this.enviromentMockService.getEnvironmentData();
1950
+ }
1951
+ return {
1952
+ quickchart_host: CC_QUICKCHART_HOST,
1953
+ telegram_channel: CC_TELEGRAM_CHANNEL,
1954
+ wwwroot_host: CC_WWWROOT_HOST,
1955
+ wwwroot_path: CC_WWWROOT_PATH,
1956
+ wwwroot_port: CC_WWWROOT_PORT,
1957
+ };
1958
+ };
1959
+ }
1960
+ }
1961
+
1839
1962
  {
1840
1963
  provide(TYPES.loggerService, () => new LoggerService());
1841
1964
  provide(TYPES.exchangeService, () => new ExchangeService());
@@ -1859,6 +1982,8 @@ class LiveMetaService {
1859
1982
  provide(TYPES.explorerMockService, () => new ExplorerMockService());
1860
1983
  provide(TYPES.signalMockService, () => new SignalMockService());
1861
1984
  provide(TYPES.heatMockService, () => new HeatMockService());
1985
+ provide(TYPES.performanceMockService, () => new PerformanceMockService());
1986
+ provide(TYPES.environmentMockService, () => new EnvironmentMockService());
1862
1987
  }
1863
1988
  {
1864
1989
  provide(TYPES.notificationViewService, () => new NotificationViewService());
@@ -1870,6 +1995,8 @@ class LiveMetaService {
1870
1995
  provide(TYPES.explorerViewService, () => new ExplorerViewService());
1871
1996
  provide(TYPES.signalViewService, () => new SignalViewService());
1872
1997
  provide(TYPES.heatViewService, () => new HeatViewService());
1998
+ provide(TYPES.performanceViewService, () => new PerformanceViewService());
1999
+ provide(TYPES.environmentViewService, () => new EnvironmentViewService());
1873
2000
  }
1874
2001
 
1875
2002
  const baseServices = {
@@ -1895,6 +2022,8 @@ const mockServices = {
1895
2022
  explorerMockService: inject(TYPES.explorerMockService),
1896
2023
  signalMockService: inject(TYPES.signalMockService),
1897
2024
  heatMockService: inject(TYPES.heatMockService),
2025
+ performanceMockService: inject(TYPES.performanceMockService),
2026
+ environmentMockService: inject(TYPES.environmentMockService),
1898
2027
  };
1899
2028
  const viewServices = {
1900
2029
  notificationViewService: inject(TYPES.notificationViewService),
@@ -1906,6 +2035,8 @@ const viewServices = {
1906
2035
  explorerViewService: inject(TYPES.explorerViewService),
1907
2036
  signalViewService: inject(TYPES.signalViewService),
1908
2037
  heatViewService: inject(TYPES.heatViewService),
2038
+ performanceViewService: inject(TYPES.performanceViewService),
2039
+ environmentViewService: inject(TYPES.environmentViewService),
1909
2040
  };
1910
2041
  const ioc = {
1911
2042
  ...baseServices,
@@ -2530,6 +2661,92 @@ router$a.post("/api/v1/mock/status_info", async (req, res) => {
2530
2661
  });
2531
2662
  }
2532
2663
  });
2664
+ // PerformanceMockService endpoints
2665
+ router$a.post("/api/v1/mock/performance_data", async (req, res) => {
2666
+ try {
2667
+ const request = await micro.json(req);
2668
+ const { requestId, serviceName } = request;
2669
+ const data = await ioc.performanceMockService.getPerformanceData();
2670
+ const result = {
2671
+ data,
2672
+ status: "ok",
2673
+ error: "",
2674
+ requestId,
2675
+ serviceName,
2676
+ };
2677
+ ioc.loggerService.log("/api/v1/mock/performance_data ok", {
2678
+ request,
2679
+ result: omit(result, "data"),
2680
+ });
2681
+ return await micro.send(res, 200, result);
2682
+ }
2683
+ catch (error) {
2684
+ ioc.loggerService.log("/api/v1/mock/performance_data error", {
2685
+ error: functoolsKit.errorData(error),
2686
+ });
2687
+ return await micro.send(res, 200, {
2688
+ status: "error",
2689
+ error: functoolsKit.getErrorMessage(error),
2690
+ });
2691
+ }
2692
+ });
2693
+ router$a.post("/api/v1/mock/performance_report", async (req, res) => {
2694
+ try {
2695
+ const request = await micro.json(req);
2696
+ const { requestId, serviceName } = request;
2697
+ const data = await ioc.performanceMockService.getPerformanceReport();
2698
+ const result = {
2699
+ data,
2700
+ status: "ok",
2701
+ error: "",
2702
+ requestId,
2703
+ serviceName,
2704
+ };
2705
+ ioc.loggerService.log("/api/v1/mock/performance_report ok", {
2706
+ request,
2707
+ result: omit(result, "data"),
2708
+ });
2709
+ return await micro.send(res, 200, result);
2710
+ }
2711
+ catch (error) {
2712
+ ioc.loggerService.log("/api/v1/mock/performance_report error", {
2713
+ error: functoolsKit.errorData(error),
2714
+ });
2715
+ return await micro.send(res, 200, {
2716
+ status: "error",
2717
+ error: functoolsKit.getErrorMessage(error),
2718
+ });
2719
+ }
2720
+ });
2721
+ // EnvironmentMockService endpoints
2722
+ router$a.post("/api/v1/mock/environment_data", async (req, res) => {
2723
+ try {
2724
+ const request = await micro.json(req);
2725
+ const { requestId, serviceName } = request;
2726
+ const data = await ioc.environmentMockService.getEnvironmentData();
2727
+ const result = {
2728
+ data,
2729
+ status: "ok",
2730
+ error: "",
2731
+ requestId,
2732
+ serviceName,
2733
+ };
2734
+ ioc.loggerService.log("/api/v1/mock/environment_data ok", {
2735
+ request,
2736
+ result: omit(result, "data"),
2737
+ });
2738
+ return await micro.send(res, 200, result);
2739
+ }
2740
+ catch (error) {
2741
+ ioc.loggerService.log("/api/v1/mock/environment_data error", {
2742
+ error: functoolsKit.errorData(error),
2743
+ });
2744
+ return await micro.send(res, 200, {
2745
+ status: "error",
2746
+ error: functoolsKit.getErrorMessage(error),
2747
+ });
2748
+ }
2749
+ });
2533
2750
 
2534
2751
  const router$9 = Router({
2535
2752
  params: true,
@@ -3145,6 +3362,92 @@ router$9.post("/api/v1/view/status_info", async (req, res) => {
3145
3362
  });
3146
3363
  }
3147
3364
  });
3365
+ // PerformanceViewService endpoints
3366
+ router$9.post("/api/v1/view/performance_data", async (req, res) => {
3367
+ try {
3368
+ const request = await micro.json(req);
3369
+ const { requestId, serviceName } = request;
3370
+ const data = await ioc.performanceViewService.getPerformanceData();
3371
+ const result = {
3372
+ data,
3373
+ status: "ok",
3374
+ error: "",
3375
+ requestId,
3376
+ serviceName,
3377
+ };
3378
+ ioc.loggerService.log("/api/v1/view/performance_data ok", {
3379
+ request,
3380
+ result: omit(result, "data"),
3381
+ });
3382
+ return await micro.send(res, 200, result);
3383
+ }
3384
+ catch (error) {
3385
+ ioc.loggerService.log("/api/v1/view/performance_data error", {
3386
+ error: functoolsKit.errorData(error),
3387
+ });
3388
+ return await micro.send(res, 200, {
3389
+ status: "error",
3390
+ error: functoolsKit.getErrorMessage(error),
3391
+ });
3392
+ }
3393
+ });
3394
+ router$9.post("/api/v1/view/performance_report", async (req, res) => {
3395
+ try {
3396
+ const request = await micro.json(req);
3397
+ const { requestId, serviceName } = request;
3398
+ const data = await ioc.performanceViewService.getPerformanceReport();
3399
+ const result = {
3400
+ data,
3401
+ status: "ok",
3402
+ error: "",
3403
+ requestId,
3404
+ serviceName,
3405
+ };
3406
+ ioc.loggerService.log("/api/v1/view/performance_report ok", {
3407
+ request,
3408
+ result: omit(result, "data"),
3409
+ });
3410
+ return await micro.send(res, 200, result);
3411
+ }
3412
+ catch (error) {
3413
+ ioc.loggerService.log("/api/v1/view/performance_report error", {
3414
+ error: functoolsKit.errorData(error),
3415
+ });
3416
+ return await micro.send(res, 200, {
3417
+ status: "error",
3418
+ error: functoolsKit.getErrorMessage(error),
3419
+ });
3420
+ }
3421
+ });
3422
+ // EnvironmentViewService endpoints
3423
+ router$9.post("/api/v1/view/environment_data", async (req, res) => {
3424
+ try {
3425
+ const request = await micro.json(req);
3426
+ const { requestId, serviceName } = request;
3427
+ const data = await ioc.environmentViewService.getEnvironmentData();
3428
+ const result = {
3429
+ data,
3430
+ status: "ok",
3431
+ error: "",
3432
+ requestId,
3433
+ serviceName,
3434
+ };
3435
+ ioc.loggerService.log("/api/v1/view/environment_data ok", {
3436
+ request,
3437
+ result: omit(result, "data"),
3438
+ });
3439
+ return await micro.send(res, 200, result);
3440
+ }
3441
+ catch (error) {
3442
+ ioc.loggerService.log("/api/v1/view/environment_data error", {
3443
+ error: functoolsKit.errorData(error),
3444
+ });
3445
+ return await micro.send(res, 200, {
3446
+ status: "error",
3447
+ error: functoolsKit.getErrorMessage(error),
3448
+ });
3449
+ }
3450
+ });
3148
3451
 
3149
3452
  const require$2 = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)));
3150
3453
  function getModulesPath() {