@backtest-kit/ui 11.9.0 → 12.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 (39) hide show
  1. package/build/index.cjs +20 -2
  2. package/build/index.mjs +20 -2
  3. package/build/modules/frontend/build/assets/{Article-cVpAg67f.js → Article-Cep1zZez.js} +1 -1
  4. package/build/modules/frontend/build/assets/{Background-BH--6xAD.js → Background-DI4TR0l_.js} +1 -1
  5. package/build/modules/frontend/build/assets/{IconPhoto-dhtH47SN.js → IconPhoto-BV2g32_b.js} +1 -1
  6. package/build/modules/frontend/build/assets/{KeyboardArrowLeft-Cesmg5AP.js → KeyboardArrowLeft-uHSkdvcT.js} +1 -1
  7. package/build/modules/frontend/build/assets/{PictureAsPdfOutlined-CrADy_Z6.js → PictureAsPdfOutlined-DWr8-Wu_.js} +1 -1
  8. package/build/modules/frontend/build/assets/{Refresh-BnizeO5c.js → Refresh-DDS1Dl8a.js} +1 -1
  9. package/build/modules/frontend/build/assets/emitters-D_sqmu3L.js +1 -0
  10. package/build/modules/frontend/build/assets/{hasRouteMatch-DHHNIPte.js → hasRouteMatch-DTIimlwJ.js} +1 -1
  11. package/build/modules/frontend/build/assets/{html2canvas-BdzWxETw.js → html2canvas-jxBuh7xH.js} +1 -1
  12. package/build/modules/frontend/build/assets/index-BV8dzBt8.js +1 -0
  13. package/build/modules/frontend/build/assets/{index-CvllC0lS.js → index-CAZyhcV6.js} +1 -1
  14. package/build/modules/frontend/build/assets/index-Cgi9Q7Z8.js +1 -0
  15. package/build/modules/frontend/build/assets/index-CjbnzV4W.js +1 -0
  16. package/build/modules/frontend/build/assets/{index-DnelSt2-.js → index-D9wmaFsM.js} +1 -1
  17. package/build/modules/frontend/build/assets/index-DFqeL1wo.js +1 -0
  18. package/build/modules/frontend/build/assets/{index-fsQnmonU.js → index-DMjmH2fE.js} +60 -60
  19. package/build/modules/frontend/build/assets/index-DjRBVBQG.js +1 -0
  20. package/build/modules/frontend/build/assets/index-DkEgiru5.js +1 -0
  21. package/build/modules/frontend/build/assets/index-FTZ3DZOP.js +1 -0
  22. package/build/modules/frontend/build/assets/index-ZVDIT3wc.js +1 -0
  23. package/build/modules/frontend/build/assets/index-_NbOxv95.js +1 -0
  24. package/build/modules/frontend/build/assets/index-uZ6nksDu.js +1 -0
  25. package/build/modules/frontend/build/assets/{index.es-iaxQIlqX.js → index.es-R8OIqeA_.js} +1 -1
  26. package/build/modules/frontend/build/assets/{markdownit-C01iqcLq.js → markdownit-3n_Nebne.js} +1 -1
  27. package/build/modules/frontend/build/index.html +1 -1
  28. package/package.json +3 -3
  29. package/build/modules/frontend/build/assets/emitters-CncrD_BX.js +0 -1
  30. package/build/modules/frontend/build/assets/index-B5gb4k3w.js +0 -1
  31. package/build/modules/frontend/build/assets/index-BtYapa75.js +0 -1
  32. package/build/modules/frontend/build/assets/index-C3WRde97.js +0 -1
  33. package/build/modules/frontend/build/assets/index-C7ab2rQi.js +0 -1
  34. package/build/modules/frontend/build/assets/index-Cq3jOwW6.js +0 -1
  35. package/build/modules/frontend/build/assets/index-CweIrC8b.js +0 -1
  36. package/build/modules/frontend/build/assets/index-DRSduTqB.js +0 -1
  37. package/build/modules/frontend/build/assets/index-DlSjrMHu.js +0 -1
  38. package/build/modules/frontend/build/assets/index-T0gLwUgt.js +0 -1
  39. package/build/modules/frontend/build/assets/index-dZ6l1ywQ.js +0 -1
package/build/index.cjs CHANGED
@@ -1270,7 +1270,7 @@ class StatusViewService {
1270
1270
  portfolioCertaintyRatio: currentHeat.portfolioCertaintyRatio,
1271
1271
  portfolioExpectedYearlyReturns: currentHeat.portfolioExpectedYearlyReturns,
1272
1272
  portfolioTradesPerYear: currentHeat.portfolioTradesPerYear,
1273
- symbols: currentHeat.symbols.map(({ symbol, totalPnl, winRate, profitFactor, maxDrawdown, expectancy, totalTrades, sortinoRatio, calmarRatio, recoveryFactor, sharpeRatio, annualizedSharpeRatio, certaintyRatio, expectedYearlyReturns, tradesPerYear, avgPnl, stdDev, avgWin, avgLoss, maxWinStreak, maxLossStreak, avgPeakPnl, avgFallPnl, peakProfitPnl, maxDrawdownPnl, avgDuration, medianPnl, avgConsecutiveWinPnl, avgConsecutiveLossPnl, avgWinDuration, avgLossDuration, }) => ({
1273
+ symbols: currentHeat.symbols.map(({ symbol, totalPnl, winRate, profitFactor, maxDrawdown, expectancy, totalTrades, sortinoRatio, calmarRatio, recoveryFactor, sharpeRatio, annualizedSharpeRatio, certaintyRatio, expectedYearlyReturns, tradesPerYear, avgPnl, stdDev, avgWin, avgLoss, maxWinStreak, maxLossStreak, avgPeakPnl, avgFallPnl, peakProfitPnl, maxDrawdownPnl, avgDuration, medianPnl, avgConsecutiveWinPnl, avgConsecutiveLossPnl, avgWinDuration, avgLossDuration, medianStepSize, buyerPressure, sellerPressure, buyerStrength, sellerStrength, pressureImbalance, trend, trendStrength, trendConfidence, }) => ({
1274
1274
  symbol,
1275
1275
  totalPnl,
1276
1276
  winRate,
@@ -1302,6 +1302,15 @@ class StatusViewService {
1302
1302
  avgConsecutiveLossPnl,
1303
1303
  avgWinDuration,
1304
1304
  avgLossDuration,
1305
+ medianStepSize,
1306
+ buyerPressure,
1307
+ sellerPressure,
1308
+ buyerStrength,
1309
+ sellerStrength,
1310
+ pressureImbalance,
1311
+ trend,
1312
+ trendStrength,
1313
+ trendConfidence,
1305
1314
  })),
1306
1315
  backtest: true,
1307
1316
  };
@@ -1343,7 +1352,7 @@ class StatusViewService {
1343
1352
  portfolioCertaintyRatio: currentHeat.portfolioCertaintyRatio,
1344
1353
  portfolioExpectedYearlyReturns: currentHeat.portfolioExpectedYearlyReturns,
1345
1354
  portfolioTradesPerYear: currentHeat.portfolioTradesPerYear,
1346
- symbols: currentHeat.symbols.map(({ symbol, totalPnl, winRate, profitFactor, maxDrawdown, expectancy, totalTrades, sortinoRatio, calmarRatio, recoveryFactor, sharpeRatio, annualizedSharpeRatio, certaintyRatio, expectedYearlyReturns, tradesPerYear, avgPnl, stdDev, avgWin, avgLoss, maxWinStreak, maxLossStreak, avgPeakPnl, avgFallPnl, peakProfitPnl, maxDrawdownPnl, avgDuration, medianPnl, avgConsecutiveWinPnl, avgConsecutiveLossPnl, avgWinDuration, avgLossDuration, }) => ({
1355
+ symbols: currentHeat.symbols.map(({ symbol, totalPnl, winRate, profitFactor, maxDrawdown, expectancy, totalTrades, sortinoRatio, calmarRatio, recoveryFactor, sharpeRatio, annualizedSharpeRatio, certaintyRatio, expectedYearlyReturns, tradesPerYear, avgPnl, stdDev, avgWin, avgLoss, maxWinStreak, maxLossStreak, avgPeakPnl, avgFallPnl, peakProfitPnl, maxDrawdownPnl, avgDuration, medianPnl, avgConsecutiveWinPnl, avgConsecutiveLossPnl, avgWinDuration, avgLossDuration, medianStepSize, buyerPressure, sellerPressure, buyerStrength, sellerStrength, pressureImbalance, trend, trendStrength, trendConfidence, }) => ({
1347
1356
  symbol,
1348
1357
  totalPnl,
1349
1358
  winRate,
@@ -1375,6 +1384,15 @@ class StatusViewService {
1375
1384
  avgConsecutiveLossPnl,
1376
1385
  avgWinDuration,
1377
1386
  avgLossDuration,
1387
+ medianStepSize,
1388
+ buyerPressure,
1389
+ sellerPressure,
1390
+ buyerStrength,
1391
+ sellerStrength,
1392
+ pressureImbalance,
1393
+ trend,
1394
+ trendStrength,
1395
+ trendConfidence,
1378
1396
  })),
1379
1397
  backtest: false,
1380
1398
  };
package/build/index.mjs CHANGED
@@ -1249,7 +1249,7 @@ class StatusViewService {
1249
1249
  portfolioCertaintyRatio: currentHeat.portfolioCertaintyRatio,
1250
1250
  portfolioExpectedYearlyReturns: currentHeat.portfolioExpectedYearlyReturns,
1251
1251
  portfolioTradesPerYear: currentHeat.portfolioTradesPerYear,
1252
- symbols: currentHeat.symbols.map(({ symbol, totalPnl, winRate, profitFactor, maxDrawdown, expectancy, totalTrades, sortinoRatio, calmarRatio, recoveryFactor, sharpeRatio, annualizedSharpeRatio, certaintyRatio, expectedYearlyReturns, tradesPerYear, avgPnl, stdDev, avgWin, avgLoss, maxWinStreak, maxLossStreak, avgPeakPnl, avgFallPnl, peakProfitPnl, maxDrawdownPnl, avgDuration, medianPnl, avgConsecutiveWinPnl, avgConsecutiveLossPnl, avgWinDuration, avgLossDuration, }) => ({
1252
+ symbols: currentHeat.symbols.map(({ symbol, totalPnl, winRate, profitFactor, maxDrawdown, expectancy, totalTrades, sortinoRatio, calmarRatio, recoveryFactor, sharpeRatio, annualizedSharpeRatio, certaintyRatio, expectedYearlyReturns, tradesPerYear, avgPnl, stdDev, avgWin, avgLoss, maxWinStreak, maxLossStreak, avgPeakPnl, avgFallPnl, peakProfitPnl, maxDrawdownPnl, avgDuration, medianPnl, avgConsecutiveWinPnl, avgConsecutiveLossPnl, avgWinDuration, avgLossDuration, medianStepSize, buyerPressure, sellerPressure, buyerStrength, sellerStrength, pressureImbalance, trend, trendStrength, trendConfidence, }) => ({
1253
1253
  symbol,
1254
1254
  totalPnl,
1255
1255
  winRate,
@@ -1281,6 +1281,15 @@ class StatusViewService {
1281
1281
  avgConsecutiveLossPnl,
1282
1282
  avgWinDuration,
1283
1283
  avgLossDuration,
1284
+ medianStepSize,
1285
+ buyerPressure,
1286
+ sellerPressure,
1287
+ buyerStrength,
1288
+ sellerStrength,
1289
+ pressureImbalance,
1290
+ trend,
1291
+ trendStrength,
1292
+ trendConfidence,
1284
1293
  })),
1285
1294
  backtest: true,
1286
1295
  };
@@ -1322,7 +1331,7 @@ class StatusViewService {
1322
1331
  portfolioCertaintyRatio: currentHeat.portfolioCertaintyRatio,
1323
1332
  portfolioExpectedYearlyReturns: currentHeat.portfolioExpectedYearlyReturns,
1324
1333
  portfolioTradesPerYear: currentHeat.portfolioTradesPerYear,
1325
- symbols: currentHeat.symbols.map(({ symbol, totalPnl, winRate, profitFactor, maxDrawdown, expectancy, totalTrades, sortinoRatio, calmarRatio, recoveryFactor, sharpeRatio, annualizedSharpeRatio, certaintyRatio, expectedYearlyReturns, tradesPerYear, avgPnl, stdDev, avgWin, avgLoss, maxWinStreak, maxLossStreak, avgPeakPnl, avgFallPnl, peakProfitPnl, maxDrawdownPnl, avgDuration, medianPnl, avgConsecutiveWinPnl, avgConsecutiveLossPnl, avgWinDuration, avgLossDuration, }) => ({
1334
+ symbols: currentHeat.symbols.map(({ symbol, totalPnl, winRate, profitFactor, maxDrawdown, expectancy, totalTrades, sortinoRatio, calmarRatio, recoveryFactor, sharpeRatio, annualizedSharpeRatio, certaintyRatio, expectedYearlyReturns, tradesPerYear, avgPnl, stdDev, avgWin, avgLoss, maxWinStreak, maxLossStreak, avgPeakPnl, avgFallPnl, peakProfitPnl, maxDrawdownPnl, avgDuration, medianPnl, avgConsecutiveWinPnl, avgConsecutiveLossPnl, avgWinDuration, avgLossDuration, medianStepSize, buyerPressure, sellerPressure, buyerStrength, sellerStrength, pressureImbalance, trend, trendStrength, trendConfidence, }) => ({
1326
1335
  symbol,
1327
1336
  totalPnl,
1328
1337
  winRate,
@@ -1354,6 +1363,15 @@ class StatusViewService {
1354
1363
  avgConsecutiveLossPnl,
1355
1364
  avgWinDuration,
1356
1365
  avgLossDuration,
1366
+ medianStepSize,
1367
+ buyerPressure,
1368
+ sellerPressure,
1369
+ buyerStrength,
1370
+ sellerStrength,
1371
+ pressureImbalance,
1372
+ trend,
1373
+ trendStrength,
1374
+ trendConfidence,
1357
1375
  })),
1358
1376
  backtest: false,
1359
1377
  };
@@ -1 +1 @@
1
- import{b as c,f as v}from"./index-fsQnmonU.js";const h=c(v("path",{d:"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-5 14H7v-2h7v2zm3-4H7v-2h10v2zm0-4H7V7h10v2z"}),"Article");export{h as A};
1
+ import{b as c,f as v}from"./index-DMjmH2fE.js";const h=c(v("path",{d:"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-5 14H7v-2h7v2zm3-4H7v-2h10v2zm0-4H7V7h10v2z"}),"Article");export{h as A};
@@ -1 +1 @@
1
- import{f as n,S as o}from"./index-fsQnmonU.js";const d=()=>n(o,{children:"\n body {\n background-color: #ddd !important;\n }\n "});export{d as B};
1
+ import{f as n,S as o}from"./index-DMjmH2fE.js";const d=()=>n(o,{children:"\n body {\n background-color: #ddd !important;\n }\n "});export{d as B};
@@ -1 +1 @@
1
- import{f as e,i as t,B as r,J as s}from"./index-fsQnmonU.js";const o=({className:o,symbol:i,style:a,sx:n})=>e(s,{children:async()=>{try{const s=(await t.symbolGlobalService.getSymbolMap())[i],l=(null==s?void 0:s.logo)||(null==s?void 0:s.icon),c=(null==s?void 0:s.color)||"#ccc";return e(r,{className:o,sx:{position:"relative",width:24,height:24,borderRadius:"50%",display:"flex",alignItems:"center",justifyContent:"center",background:l?"transparent":c,...n},style:a,children:l?e("img",{loading:"lazy",crossOrigin:"anonymous",src:l,alt:i,style:{width:"100%",height:"100%",borderRadius:"50%",objectFit:"contain"},onError:e=>{const t=e.target,r=t.parentElement;r&&(r.style.background=c,t.style.display="none")}}):e(r,{sx:{width:"60%",height:"60%",borderRadius:"50%",backgroundColor:"rgba(255, 255, 255, 0.2)"}})})}catch(s){return e(r,{className:o,sx:{position:"relative",width:24,height:24,borderRadius:"50%",display:"flex",alignItems:"center",justifyContent:"center",background:"#ccc",...n},style:a,children:e(r,{sx:{width:"60%",height:"60%",borderRadius:"50%",backgroundColor:"rgba(255, 255, 255, 0.2)"}})})}}});export{o as I};
1
+ import{f as e,i as t,B as r,V as s}from"./index-DMjmH2fE.js";const o=({className:o,symbol:i,style:a,sx:n})=>e(s,{children:async()=>{try{const s=(await t.symbolGlobalService.getSymbolMap())[i],l=(null==s?void 0:s.logo)||(null==s?void 0:s.icon),c=(null==s?void 0:s.color)||"#ccc";return e(r,{className:o,sx:{position:"relative",width:24,height:24,borderRadius:"50%",display:"flex",alignItems:"center",justifyContent:"center",background:l?"transparent":c,...n},style:a,children:l?e("img",{loading:"lazy",crossOrigin:"anonymous",src:l,alt:i,style:{width:"100%",height:"100%",borderRadius:"50%",objectFit:"contain"},onError:e=>{const t=e.target,r=t.parentElement;r&&(r.style.background=c,t.style.display="none")}}):e(r,{sx:{width:"60%",height:"60%",borderRadius:"50%",backgroundColor:"rgba(255, 255, 255, 0.2)"}})})}catch(s){return e(r,{className:o,sx:{position:"relative",width:24,height:24,borderRadius:"50%",display:"flex",alignItems:"center",justifyContent:"center",background:"#ccc",...n},style:a,children:e(r,{sx:{width:"60%",height:"60%",borderRadius:"50%",backgroundColor:"rgba(255, 255, 255, 0.2)"}})})}}});export{o as I};
@@ -1 +1 @@
1
- import{b as o,f as r}from"./index-fsQnmonU.js";const a=o(r("path",{d:"M15.41 16.59 10.83 12l4.58-4.59L14 6l-6 6 6 6 1.41-1.41z"}),"KeyboardArrowLeft");export{a as K};
1
+ import{b as o,f as r}from"./index-DMjmH2fE.js";const a=o(r("path",{d:"M15.41 16.59 10.83 12l4.58-4.59L14 6l-6 6 6 6 1.41-1.41z"}),"KeyboardArrowLeft");export{a as K};
@@ -1 +1 @@
1
- import{b as h,f as c}from"./index-fsQnmonU.js";const v=h(c("path",{d:"M20 2H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H8V4h12v12zM4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6zm12 6V9c0-.55-.45-1-1-1h-2v5h2c.55 0 1-.45 1-1zm-2-3h1v3h-1V9zm4 2h1v-1h-1V9h1V8h-2v5h1zm-8 0h1c.55 0 1-.45 1-1V9c0-.55-.45-1-1-1H9v5h1v-2zm0-2h1v1h-1V9z"}),"PictureAsPdfOutlined");export{v as P};
1
+ import{b as h,f as c}from"./index-DMjmH2fE.js";const v=h(c("path",{d:"M20 2H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H8V4h12v12zM4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6zm12 6V9c0-.55-.45-1-1-1h-2v5h2c.55 0 1-.45 1-1zm-2-3h1v3h-1V9zm4 2h1v-1h-1V9h1V8h-2v5h1zm-8 0h1c.55 0 1-.45 1-1V9c0-.55-.45-1-1-1H9v5h1v-2zm0-2h1v1h-1V9z"}),"PictureAsPdfOutlined");export{v as P};
@@ -1 +1 @@
1
- import{bx as e,d as t,r as a,_ as s,f as i,by as n,j as o,bz as r,k as d,bA as m,g as u,u as p,s as x,b as c}from"./index-fsQnmonU.js";const h=e(),b=["className","component","disableGutters","fixed","maxWidth","classes"],l=m(),f=h("div",{name:"MuiContainer",slot:"Root",overridesResolver:(e,t)=>{const{ownerState:a}=e;return[t.root,t[`maxWidth${o(String(a.maxWidth))}`],a.fixed&&t.fixed,a.disableGutters&&t.disableGutters]}}),g=e=>r({props:e,name:"MuiContainer",defaultTheme:l});const W=function(e={}){const{createStyledComponent:r=f,useThemeProps:m=g,componentName:p="MuiContainer"}=e,x=r(({theme:e,ownerState:a})=>t({width:"100%",marginLeft:"auto",boxSizing:"border-box",marginRight:"auto",display:"block"},!a.disableGutters&&{paddingLeft:e.spacing(2),paddingRight:e.spacing(2),[e.breakpoints.up("sm")]:{paddingLeft:e.spacing(3),paddingRight:e.spacing(3)}}),({theme:e,ownerState:t})=>t.fixed&&Object.keys(e.breakpoints.values).reduce((t,a)=>{const s=a,i=e.breakpoints.values[s];return 0!==i&&(t[e.breakpoints.up(s)]={maxWidth:`${i}${e.breakpoints.unit}`}),t},{}),({theme:e,ownerState:a})=>t({},"xs"===a.maxWidth&&{[e.breakpoints.up("xs")]:{maxWidth:Math.max(e.breakpoints.values.xs,444)}},a.maxWidth&&"xs"!==a.maxWidth&&{[e.breakpoints.up(a.maxWidth)]:{maxWidth:`${e.breakpoints.values[a.maxWidth]}${e.breakpoints.unit}`}}));return a.forwardRef(function(e,a){const r=m(e),{className:c,component:h="div",disableGutters:l=!1,fixed:f=!1,maxWidth:g="lg"}=r,W=s(r,b),k=t({},r,{component:h,disableGutters:l,fixed:f,maxWidth:g}),S=((e,t)=>{const{classes:a,fixed:s,disableGutters:i,maxWidth:n}=e,r={root:["root",n&&`maxWidth${o(String(n))}`,s&&"fixed",i&&"disableGutters"]};return d(r,e=>u(t,e),a)})(k,p);return i(x,t({as:h,ownerState:k,className:n(S.root,c),ref:a},W))})}({createStyledComponent:x("div",{name:"MuiContainer",slot:"Root",overridesResolver:(e,t)=>{const{ownerState:a}=e;return[t.root,t[`maxWidth${o(String(a.maxWidth))}`],a.fixed&&t.fixed,a.disableGutters&&t.disableGutters]}}),useThemeProps:e=>p({props:e,name:"MuiContainer"})}),k=c(i("path",{d:"M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z"}),"Refresh");export{W as C,k as R};
1
+ import{by as e,d as t,r as a,_ as s,f as i,bz as n,j as o,bA as r,k as d,bB as m,g as u,u as p,s as x,b as c}from"./index-DMjmH2fE.js";const h=e(),b=["className","component","disableGutters","fixed","maxWidth","classes"],l=m(),f=h("div",{name:"MuiContainer",slot:"Root",overridesResolver:(e,t)=>{const{ownerState:a}=e;return[t.root,t[`maxWidth${o(String(a.maxWidth))}`],a.fixed&&t.fixed,a.disableGutters&&t.disableGutters]}}),g=e=>r({props:e,name:"MuiContainer",defaultTheme:l});const W=function(e={}){const{createStyledComponent:r=f,useThemeProps:m=g,componentName:p="MuiContainer"}=e,x=r(({theme:e,ownerState:a})=>t({width:"100%",marginLeft:"auto",boxSizing:"border-box",marginRight:"auto",display:"block"},!a.disableGutters&&{paddingLeft:e.spacing(2),paddingRight:e.spacing(2),[e.breakpoints.up("sm")]:{paddingLeft:e.spacing(3),paddingRight:e.spacing(3)}}),({theme:e,ownerState:t})=>t.fixed&&Object.keys(e.breakpoints.values).reduce((t,a)=>{const s=a,i=e.breakpoints.values[s];return 0!==i&&(t[e.breakpoints.up(s)]={maxWidth:`${i}${e.breakpoints.unit}`}),t},{}),({theme:e,ownerState:a})=>t({},"xs"===a.maxWidth&&{[e.breakpoints.up("xs")]:{maxWidth:Math.max(e.breakpoints.values.xs,444)}},a.maxWidth&&"xs"!==a.maxWidth&&{[e.breakpoints.up(a.maxWidth)]:{maxWidth:`${e.breakpoints.values[a.maxWidth]}${e.breakpoints.unit}`}}));return a.forwardRef(function(e,a){const r=m(e),{className:c,component:h="div",disableGutters:l=!1,fixed:f=!1,maxWidth:g="lg"}=r,W=s(r,b),k=t({},r,{component:h,disableGutters:l,fixed:f,maxWidth:g}),S=((e,t)=>{const{classes:a,fixed:s,disableGutters:i,maxWidth:n}=e,r={root:["root",n&&`maxWidth${o(String(n))}`,s&&"fixed",i&&"disableGutters"]};return d(r,e=>u(t,e),a)})(k,p);return i(x,t({as:h,ownerState:k,className:n(S.root,c),ref:a},W))})}({createStyledComponent:x("div",{name:"MuiContainer",slot:"Root",overridesResolver:(e,t)=>{const{ownerState:a}=e;return[t.root,t[`maxWidth${o(String(a.maxWidth))}`],a.fixed&&t.fixed,a.disableGutters&&t.disableGutters]}}),useThemeProps:e=>p({props:e,name:"MuiContainer"})}),k=c(i("path",{d:"M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z"}),"Refresh");export{W as C,k as R};
@@ -0,0 +1 @@
1
+ import{a8 as o}from"./index-DMjmH2fE.js";const r=new o;export{r};
@@ -1 +1 @@
1
- import{i as a,bv as e,bw as t}from"./index-fsQnmonU.js";const i=(i,o=a.routerService.location.pathname)=>!!e(t.filter(({path:a})=>i.includes(a)),o);export{i as h};
1
+ import{i as a,bw as e,bx as t}from"./index-DMjmH2fE.js";const i=(i,o=a.routerService.location.pathname)=>!!e(t.filter(({path:a})=>i.includes(a)),o);export{i as h};
@@ -1 +1 @@
1
- import{bB as e,bD as t}from"./index-fsQnmonU.js";function r(e,t){for(var r=0;r<t.length;r++){const o=t[r];if("string"!=typeof o&&!Array.isArray(o))for(const t in o)if("default"!==t&&!(t in e)){const r=Object.getOwnPropertyDescriptor(o,t);r&&Object.defineProperty(e,t,r.get?r:{enumerable:!0,get:()=>o[t]})}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}var o=t();const n=r({__proto__:null,default:e(o)},[o]);export{n as h};
1
+ import{bC as e,bE as t}from"./index-DMjmH2fE.js";function r(e,t){for(var r=0;r<t.length;r++){const o=t[r];if("string"!=typeof o&&!Array.isArray(o))for(const t in o)if("default"!==t&&!(t in e)){const r=Object.getOwnPropertyDescriptor(o,t);r&&Object.defineProperty(e,t,r.get?r:{enumerable:!0,get:()=>o[t]})}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}var o=t();const n=r({__proto__:null,default:e(o)},[o]);export{n as h};
@@ -0,0 +1 @@
1
+ import{b as a,f as e,aZ as t,B as o,A as r,a9 as n,T as i,H as s,a3 as c,F as l,G as d,P as h,aO as p,a$ as u,b0 as b,aG as w,a8 as f,i as x,aH as g,al as y,aL as v,O as m,R as S,b1 as L,a_ as k,D as j,Z as A}from"./index-DMjmH2fE.js";import{A as H}from"./Article-Cep1zZez.js";import{C as R,R as z}from"./Refresh-DDS1Dl8a.js";import{K as C}from"./KeyboardArrowLeft-uHSkdvcT.js";const B=a(e("path",{d:"M20 8h-2.81c-.45-.78-1.07-1.45-1.82-1.96L17 4.41 15.59 3l-2.17 2.17C12.96 5.06 12.49 5 12 5c-.49 0-.96.06-1.41.17L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20V8zm-6 8h-4v-2h4v2zm0-4h-4v-2h4v2z"}),"BugReport"),D=a=>{const t={color:"white",fontSize:28};switch(a.type){case"debug":return e(B,{sx:t});case"info":return e(u,{sx:t});case"warn":return e(p,{sx:t});default:return e(H,{sx:t})}},E=t.virtualize(({data:a,sx:t})=>{const p=(a=>{switch(a.type){case"debug":default:return"#9E9E9E";case"info":return"#2196F3";case"warn":return"#FF9800";case"log":return"#4CAF50"}})(a);return e(h,{variant:"outlined",sx:{display:"flex",alignItems:"stretch",justifyContent:"stretch",...t},children:e(o,{sx:{flex:1,position:"relative",overflow:"clip",height:"100%",width:"100%",borderRadius:"12px"},children:[e(r,{direction:"row",spacing:2,sx:{p:2},children:[e(n,{sx:{width:56,height:56,background:p},children:D(a)}),e(r,{flex:1,spacing:1,children:[e(r,{direction:"row",justifyContent:"space-between",alignItems:"flex-start",children:[e(i,{variant:"h6",sx:{fontWeight:600,wordBreak:"break-all"},children:a.topic}),e(i,{variant:"body2",color:"text.secondary",sx:{whiteSpace:"nowrap",ml:2},children:s(a.createdAt).format("HH:mm DD/MM/YYYY")})]}),e(r,{direction:"row",spacing:1,flexWrap:"wrap",children:e(c,{size:"small",label:a.type.toUpperCase(),sx:{background:p,color:"white",fontWeight:500}})}),a.args.length>0&&e(l,{children:[e(d,{sx:{my:1}}),e(o,{component:"pre",sx:{m:0,fontSize:"0.75rem",whiteSpace:"pre-wrap",wordBreak:"break-all",color:"text.secondary"},children:JSON.stringify(1===a.args.length?a.args[0]:a.args,null,2)})]})]})]}),e(o,{sx:{position:"absolute",top:0,left:0,bottom:0,width:6,zIndex:1,background:p}})]})})}),F=[{action:"download-action",label:"Download",icon:()=>e(A,{icon:j,color:"#4caf50"})},{divider:!0},{action:"update-now",label:"Refresh manually",icon:()=>e(A,{icon:z,color:"#4caf50"})}],M=[{type:S.Link,action:"back-action",label:e(C,{sx:{display:"block"}})},{type:S.Link,action:"back-action",label:"Main"},{type:S.Link,action:"back-action",label:"Logs"},{type:S.Button,icon:L,action:"search-action",label:"Search"}],O=new f,Y=()=>{const[a,o]=b(""),{data:r,hasMore:n,loading:i,onSkip:s}=w({handler:async(e,t)=>{const o=await x.logViewService.getList(),r=g(e,t);for(const n of o)if(new RegExp(a.current,"i").test(n.topic)&&r([n]).done)break;return r().rows},onLoadStart:()=>x.layoutService.setAppbarLoader(!0),onLoadEnd:()=>x.layoutService.setAppbarLoader(!1),reloadSubject:O}),c=y(r),{execute:l}=v(async()=>{const a=new Blob([JSON.stringify(c.current,null,2)],{type:"application/json"}),e=URL.createObjectURL(a);x.layoutService.downloadFile(e,`logs_${Date.now()}.json`)},{onLoadStart:()=>x.layoutService.setAppbarLoader(!0),onLoadEnd:()=>x.layoutService.setAppbarLoader(!1)});return e(R,{children:[e(m,{items:M,actions:F,onAction:async a=>{"back-action"===a&&x.routerService.push("/"),"download-action"===a&&l(),"update-now"===a&&(o(""),await O.next()),"search-action"===a&&(async()=>{const a=await x.layoutService.prompt("Search keyword");if(a)return o(a),void O.next();o(""),O.next()})()}}),e(t,{sx:{height:"calc(100vh - 155px)"},withScrollbar:!0,minHeight:72,loading:i,onDataRequest:s,bufferSize:k,hasMore:n,children:r.map(a=>e(E,{data:a,sx:{mb:1}},a.id))})]})};export{Y as LogPage,Y as default};
@@ -1 +1 @@
1
- import{h as e,f as t,c as n,r,i,S as o,m as a,U as l}from"./index-fsQnmonU.js";const[c,s]=e("pine-code-context"),u=e=>t(c,{initialState:'//@version=5\nindicator("Simple MA", overlay=true)\n\nlength = input.int(20, "Length")\nsma = ta.sma(close, length)\n\nplot(sma, "SMA", color.blue, linewidth=2)',children:e.children}),[d,h]=e("pine-from-date-context"),v=e=>t(d,{initialState:"",children:e.children}),[m,p]=e("pine-limit-context"),g=e=>t(m,{initialState:250,children:e.children}),[f,y]=e("pine-symbol-context"),b=e=>t(f,{initialState:"BTCUSDT",children:e.children}),[C,D]=e("pine-timeframe-context"),x=e=>t(C,{initialState:"1",children:e.children}),[S,w]=e("pine-to-date-context"),T=e=>t(S,{initialState:"",children:e.children}),k=n(e=>t("div",{style:e.v0,children:[t("input",{type:"text",value:e.v1,onChange:e.v2,style:e.v3,placeholder:"BTCUSDT"}),t("select",{value:e.v4,onChange:e.v5,style:e.v6,children:e.v7}),t("input",{type:"number",value:e.v8,min:100,step:100,onChange:e.v9,style:e.v10,title:"Bars limit"}),t("input",{type:"date",value:e.v11,onChange:e.v12,style:e.v13,title:"From date"}),t("input",{type:"date",value:e.v14,onChange:e.v15,style:e.v16,title:"To date"}),t("button",{onClick:e.v17,disabled:e.v18,style:e.v19,children:e.v20}),e.v21]}),{name:"Toolbar_1",portals:["v7","v20","v21"]}),R=function({symbol:e,timeframe:n,fromDate:r,toDate:i,limit:o,running:a,status:l,onSymbolChange:c,onTimeframeChange:s,onFromDateChange:u,onToDateChange:d,onLimitChange:h,onRun:v}){return t(k,{v0:{display:"flex",gap:8,padding:"8px 12px",background:"#1e293b",alignItems:"center",flexShrink:0},v1:e,v2:e=>c(e.target.value.toUpperCase()),v3:{...B,width:100},v4:n,v5:e=>s(e.target.value),v6:B,v7:z.map(e=>t("option",{children:e},e)),v8:o,v9:e=>h(Number(e.target.value)),v10:{...B,width:80},v11:r,v12:e=>u(e.target.value),v13:F,v14:i,v15:e=>d(e.target.value),v16:F,v17:v,v18:a,v19:{background:"#3b82f6",color:"#fff",border:"none",borderRadius:4,padding:"5px 16px",fontSize:13,cursor:"pointer"},v20:a?"...":"▶ Run",v21:l&&t("span",{style:{fontSize:12,color:"#94a3b8",marginLeft:8},children:l})})},z=["1","5","15","60","D"],B={background:"#1e293b",color:"#e2e8f0",border:"1px solid #334155",borderRadius:4,padding:"4px 8px",fontSize:13},F={...B,colorScheme:"dark"},U=n(e=>t("textarea",{value:e.v0,onChange:e.v1,onKeyDown:e.v2,spellCheck:!1,style:e.v3}),{name:"CodeEditor_1"}),E=function({value:e,onChange:n,onRun:r}){return t(U,{v0:e,v1:e=>n(e.target.value),v2:e=>{e.ctrlKey&&"Enter"===e.key&&(e.preventDefault(),r())},v3:{width:320,flexShrink:0,resize:"none",background:"#1e293b",color:"#e2e8f0",border:"none",borderRight:"1px solid #334155",padding:12,fontFamily:"monospace",fontSize:13,lineHeight:1.5,outline:"none"}})},$={1:"1m",3:"3m",5:"5m",15:"15m",30:"30m",60:"1h",120:"2h",240:"4h",360:"6h",480:"8h","1D":"1d",D:"1d"};function L(e){return{time:e.openTime,open:e.open,high:e.high,low:e.low,close:e.close,volume:e.volume}}class I{async getMarketData(e,t,n,r,o){const a=e.toUpperCase().replace(/^BINANCE:|^BYBIT:|^OKX:/,""),l=$[t]??t;return(await i.exchangeViewService.getRangeCandles({symbol:a,interval:l,limit:n,sDate:r,eDate:o})).map(e=>({openTime:e.timestamp,open:e.open,high:e.high,low:e.low,close:e.close,volume:e.volume}))}async getSymbolInfo(e){const t=e.toUpperCase().replace(/^BINANCE:|^BYBIT:|^OKX:/,""),n=t.replace(/USDT$|BUSD$|USD$/,""),r=t.replace(n,"");return{ticker:t,tickerid:t,description:`${n}/${r}`,type:"crypto",basecurrency:n,currency:r||"USDT",timezone:"UTC"}}}const M=()=>t(o,{children:"\n #root > .MuiBox-root {\n padding-left: 0;\n padding-right: 0;\n }\n "}),P=()=>{const e=r.useRef(null),[n,i]=s(),[o,l]=y(),[c,u]=D(),[d,v]=h(),[m,g]=w(),[f,b]=p(),{run:C,status:x,running:S}=function(){const e=r.useRef(null),t=r.useRef(null),n=r.useRef(null),[i,o]=r.useState(""),[a,l]=r.useState(!1);function c(){if(n.current){try{n.current.stop()}catch{}n.current=null}}function s(){e.current&&(e.current.destroy(),e.current=null,t.current=null)}function u(e){o(`Error: ${e.message}`),l(!1)}return r.useEffect(()=>{const t=()=>{var t;return null==(t=e.current)?void 0:t.resize()};return window.addEventListener("resize",t),()=>{window.removeEventListener("resize",t),c(),s()}},[]),{run:function({symbol:r,timeframe:i,fromDate:a,toDate:d,limit:h,code:v,containerRef:m}){if(!m.current)return;l(!0),o("Connecting..."),c(),s();const p=/indicator\([^)]*overlay\s*=\s*true/i.test(v);let g=!1;try{const c=a?new Date(a).getTime():void 0,s=d?new Date(d).getTime():void 0,f=new I,y=new PineTS(f,r,i,h,c,s).stream(v,{pageSize:500,live:!0,interval:3e3});n.current=y,y.on("data",a=>{var c,s;if(n.current===y)if(g)t.current&&a.plots&&t.current.updateData(a.plots),null==(s=e.current)||s.updateData([L(a.marketData[a.marketData.length-1])]);else{g=!0;const n=a.marketData.map(L);m.current.innerHTML="",e.current=new QFChart.QFChart(m.current,{title:`${r} · ${i}`,backgroundColor:"#0f172a",height:"100%",padding:.1,databox:{position:"right",triggerOn:"mousemove"},dataZoom:{visible:!0,position:"top",height:6,start:80,end:101},layout:{mainPaneHeight:"70%",gap:5},controls:{collapse:!1,maximize:!1,fullscreen:!1}}),e.current.setMarketData(n);const s=(null==(c=a.fullContext)?void 0:c.plots)??a.plots;t.current=e.current.addIndicator("indicator",s,{overlay:p,height:p?void 0:30,controls:{collapse:!1,maximize:!1}}),e.current.registerPlugin(new QFChart.MeasureTool),e.current.registerPlugin(new QFChart.LineTool),e.current.registerPlugin(new QFChart.FibonacciTool),o(`${n.length} bars loaded`),l(!1)}}),y.on("error",u)}catch(f){u(f)}},status:i,running:a}}();function T(){C({symbol:o,timeframe:c,fromDate:d,toDate:m,limit:f,code:n,containerRef:e})}return t(a,{children:t("div",{style:{display:"flex",flexDirection:"column",height:"100vh",background:"#0f172a",color:"#e2e8f0",fontFamily:"monospace"},children:[t(R,{symbol:o,timeframe:c,fromDate:d,toDate:m,limit:f,running:S,status:x,onSymbolChange:l,onTimeframeChange:u,onFromDateChange:v,onToDateChange:g,onLimitChange:b,onRun:T}),t("div",{style:{display:"flex",flex:1,overflow:"clip"},children:[t(E,{value:n,onChange:i,onRun:T}),t("div",{style:{flex:1},children:t("div",{ref:e,style:{width:"100%",height:"100%"},children:t("p",{style:{color:"#475569",textAlign:"center",marginTop:"20%"},children:["Press ",t("b",{children:"▶ Run"})," or ",t("b",{children:"Ctrl+Enter"})," to load the chart"]})})})]}),t(M,{})]})})},A=l(e=>t(u,{children:e}),e=>t(v,{children:e}),e=>t(T,{children:e}),e=>t(g,{children:e}),e=>t(b,{children:e}),e=>t(x,{children:e})),N=()=>A(t(P,{}));export{N as PinePage,N as default};
1
+ import{h as e,f as t,c as n,r,i,S as o,m as a,U as l}from"./index-DMjmH2fE.js";const[c,s]=e("pine-code-context"),u=e=>t(c,{initialState:'//@version=5\nindicator("Simple MA", overlay=true)\n\nlength = input.int(20, "Length")\nsma = ta.sma(close, length)\n\nplot(sma, "SMA", color.blue, linewidth=2)',children:e.children}),[d,h]=e("pine-from-date-context"),v=e=>t(d,{initialState:"",children:e.children}),[m,p]=e("pine-limit-context"),g=e=>t(m,{initialState:250,children:e.children}),[f,y]=e("pine-symbol-context"),b=e=>t(f,{initialState:"BTCUSDT",children:e.children}),[C,D]=e("pine-timeframe-context"),x=e=>t(C,{initialState:"1",children:e.children}),[S,w]=e("pine-to-date-context"),T=e=>t(S,{initialState:"",children:e.children}),k=n(e=>t("div",{style:e.v0,children:[t("input",{type:"text",value:e.v1,onChange:e.v2,style:e.v3,placeholder:"BTCUSDT"}),t("select",{value:e.v4,onChange:e.v5,style:e.v6,children:e.v7}),t("input",{type:"number",value:e.v8,min:100,step:100,onChange:e.v9,style:e.v10,title:"Bars limit"}),t("input",{type:"date",value:e.v11,onChange:e.v12,style:e.v13,title:"From date"}),t("input",{type:"date",value:e.v14,onChange:e.v15,style:e.v16,title:"To date"}),t("button",{onClick:e.v17,disabled:e.v18,style:e.v19,children:e.v20}),e.v21]}),{name:"Toolbar_1",portals:["v7","v20","v21"]}),R=function({symbol:e,timeframe:n,fromDate:r,toDate:i,limit:o,running:a,status:l,onSymbolChange:c,onTimeframeChange:s,onFromDateChange:u,onToDateChange:d,onLimitChange:h,onRun:v}){return t(k,{v0:{display:"flex",gap:8,padding:"8px 12px",background:"#1e293b",alignItems:"center",flexShrink:0},v1:e,v2:e=>c(e.target.value.toUpperCase()),v3:{...B,width:100},v4:n,v5:e=>s(e.target.value),v6:B,v7:z.map(e=>t("option",{children:e},e)),v8:o,v9:e=>h(Number(e.target.value)),v10:{...B,width:80},v11:r,v12:e=>u(e.target.value),v13:F,v14:i,v15:e=>d(e.target.value),v16:F,v17:v,v18:a,v19:{background:"#3b82f6",color:"#fff",border:"none",borderRadius:4,padding:"5px 16px",fontSize:13,cursor:"pointer"},v20:a?"...":"▶ Run",v21:l&&t("span",{style:{fontSize:12,color:"#94a3b8",marginLeft:8},children:l})})},z=["1","5","15","60","D"],B={background:"#1e293b",color:"#e2e8f0",border:"1px solid #334155",borderRadius:4,padding:"4px 8px",fontSize:13},F={...B,colorScheme:"dark"},U=n(e=>t("textarea",{value:e.v0,onChange:e.v1,onKeyDown:e.v2,spellCheck:!1,style:e.v3}),{name:"CodeEditor_1"}),E=function({value:e,onChange:n,onRun:r}){return t(U,{v0:e,v1:e=>n(e.target.value),v2:e=>{e.ctrlKey&&"Enter"===e.key&&(e.preventDefault(),r())},v3:{width:320,flexShrink:0,resize:"none",background:"#1e293b",color:"#e2e8f0",border:"none",borderRight:"1px solid #334155",padding:12,fontFamily:"monospace",fontSize:13,lineHeight:1.5,outline:"none"}})},$={1:"1m",3:"3m",5:"5m",15:"15m",30:"30m",60:"1h",120:"2h",240:"4h",360:"6h",480:"8h","1D":"1d",D:"1d"};function L(e){return{time:e.openTime,open:e.open,high:e.high,low:e.low,close:e.close,volume:e.volume}}class I{async getMarketData(e,t,n,r,o){const a=e.toUpperCase().replace(/^BINANCE:|^BYBIT:|^OKX:/,""),l=$[t]??t;return(await i.exchangeViewService.getRangeCandles({symbol:a,interval:l,limit:n,sDate:r,eDate:o})).map(e=>({openTime:e.timestamp,open:e.open,high:e.high,low:e.low,close:e.close,volume:e.volume}))}async getSymbolInfo(e){const t=e.toUpperCase().replace(/^BINANCE:|^BYBIT:|^OKX:/,""),n=t.replace(/USDT$|BUSD$|USD$/,""),r=t.replace(n,"");return{ticker:t,tickerid:t,description:`${n}/${r}`,type:"crypto",basecurrency:n,currency:r||"USDT",timezone:"UTC"}}}const M=()=>t(o,{children:"\n #root > .MuiBox-root {\n padding-left: 0;\n padding-right: 0;\n }\n "}),P=()=>{const e=r.useRef(null),[n,i]=s(),[o,l]=y(),[c,u]=D(),[d,v]=h(),[m,g]=w(),[f,b]=p(),{run:C,status:x,running:S}=function(){const e=r.useRef(null),t=r.useRef(null),n=r.useRef(null),[i,o]=r.useState(""),[a,l]=r.useState(!1);function c(){if(n.current){try{n.current.stop()}catch{}n.current=null}}function s(){e.current&&(e.current.destroy(),e.current=null,t.current=null)}function u(e){o(`Error: ${e.message}`),l(!1)}return r.useEffect(()=>{const t=()=>{var t;return null==(t=e.current)?void 0:t.resize()};return window.addEventListener("resize",t),()=>{window.removeEventListener("resize",t),c(),s()}},[]),{run:function({symbol:r,timeframe:i,fromDate:a,toDate:d,limit:h,code:v,containerRef:m}){if(!m.current)return;l(!0),o("Connecting..."),c(),s();const p=/indicator\([^)]*overlay\s*=\s*true/i.test(v);let g=!1;try{const c=a?new Date(a).getTime():void 0,s=d?new Date(d).getTime():void 0,f=new I,y=new PineTS(f,r,i,h,c,s).stream(v,{pageSize:500,live:!0,interval:3e3});n.current=y,y.on("data",a=>{var c,s;if(n.current===y)if(g)t.current&&a.plots&&t.current.updateData(a.plots),null==(s=e.current)||s.updateData([L(a.marketData[a.marketData.length-1])]);else{g=!0;const n=a.marketData.map(L);m.current.innerHTML="",e.current=new QFChart.QFChart(m.current,{title:`${r} · ${i}`,backgroundColor:"#0f172a",height:"100%",padding:.1,databox:{position:"right",triggerOn:"mousemove"},dataZoom:{visible:!0,position:"top",height:6,start:80,end:101},layout:{mainPaneHeight:"70%",gap:5},controls:{collapse:!1,maximize:!1,fullscreen:!1}}),e.current.setMarketData(n);const s=(null==(c=a.fullContext)?void 0:c.plots)??a.plots;t.current=e.current.addIndicator("indicator",s,{overlay:p,height:p?void 0:30,controls:{collapse:!1,maximize:!1}}),e.current.registerPlugin(new QFChart.MeasureTool),e.current.registerPlugin(new QFChart.LineTool),e.current.registerPlugin(new QFChart.FibonacciTool),o(`${n.length} bars loaded`),l(!1)}}),y.on("error",u)}catch(f){u(f)}},status:i,running:a}}();function T(){C({symbol:o,timeframe:c,fromDate:d,toDate:m,limit:f,code:n,containerRef:e})}return t(a,{children:t("div",{style:{display:"flex",flexDirection:"column",height:"100vh",background:"#0f172a",color:"#e2e8f0",fontFamily:"monospace"},children:[t(R,{symbol:o,timeframe:c,fromDate:d,toDate:m,limit:f,running:S,status:x,onSymbolChange:l,onTimeframeChange:u,onFromDateChange:v,onToDateChange:g,onLimitChange:b,onRun:T}),t("div",{style:{display:"flex",flex:1,overflow:"clip"},children:[t(E,{value:n,onChange:i,onRun:T}),t("div",{style:{flex:1},children:t("div",{ref:e,style:{width:"100%",height:"100%"},children:t("p",{style:{color:"#475569",textAlign:"center",marginTop:"20%"},children:["Press ",t("b",{children:"▶ Run"})," or ",t("b",{children:"Ctrl+Enter"})," to load the chart"]})})})]}),t(M,{})]})})},A=l(e=>t(u,{children:e}),e=>t(v,{children:e}),e=>t(T,{children:e}),e=>t(g,{children:e}),e=>t(b,{children:e}),e=>t(x,{children:e})),N=()=>A(t(P,{}));export{N as PinePage,N as default};
@@ -0,0 +1 @@
1
+ import{b as e,f as o,Q as t,x as i,i as a,O as n,R as l,p as s,a2 as r,Z as c,T as p,b2 as d,W as m,B as u,F as h,a3 as b,E as y,A as f,a5 as g,l as k,n as v,a4 as C,a6 as S,r as x,aD as L,bp as w,bq as P,br as T,bs as V,bt as $,bu as H,H as z,J as M,N,al as O,X as A,b9 as _,a$ as I,G as E,P as R,a1 as F,az as j,bv as G,a8 as D,aI as W,aJ as B,b3 as U,ag as Y,I as J,ad as K,D as q,aj as Q}from"./index-DMjmH2fE.js";import{h as X}from"./hasRouteMatch-DTIimlwJ.js";import{I as Z}from"./IconPhoto-BV2g32_b.js";import{C as ee,R as oe}from"./Refresh-DDS1Dl8a.js";import{K as te}from"./KeyboardArrowLeft-uHSkdvcT.js";const ie=e([o("path",{d:"M5 19h14V5H5v14zm4-4h4v-2h-2v-2h2V9H9V7h4c1.1 0 2 .89 2 2v1.5c0 .83-.67 1.5-1.5 1.5.83 0 1.5.67 1.5 1.5V15c0 1.11-.9 2-2 2H9v-2z",opacity:".3"}),o("path",{d:"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V5h14v14zm-4-4v-1.5c0-.83-.67-1.5-1.5-1.5.83 0 1.5-.67 1.5-1.5V9c0-1.11-.9-2-2-2H9v2h4v2h-2v2h2v2H9v2h4c1.1 0 2-.89 2-2z"})],"Looks3TwoTone"),ae=e([o("path",{d:"M19 5H5v14h14V5zm-5 12h-2V9h-2V7h4v10z",opacity:".3"}),o("path",{d:"M5 21h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2zM5 5h14v14H5V5zm5 4h2v8h2V7h-4z"})],"LooksOneTwoTone"),ne=e([o("path",{d:"M19 5H5v14h14V5zm-4 6c0 1.11-.9 2-2 2h-2v2h4v2H9v-4c0-1.11.9-2 2-2h2V9H9V7h4c1.1 0 2 .89 2 2v2z",opacity:".3"}),o("path",{d:"M5 21h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2zM5 5h14v14H5V5zm8 2H9v2h4v2h-2c-1.1 0-2 .89-2 2v4h6v-2h-4v-2h2c1.1 0 2-.89 2-2V9c0-1.11-.9-2-2-2z"})],"LooksTwoTwoTone"),le="backtest-kit__groupHeader",se="backtest-kit__groupRoot",re="backtest-kit__symbolImage",ce=s()({root:{[`& .${se}:hover .${le}`]:{opacity:"1 !important"}}});function pe(e){return S(e,"#000000")>S(e,"#FFFFFF")}const de=[{type:l.Link,action:"back-action",label:o(te,{sx:{display:"block"}})},{type:l.Link,action:"back-action",label:"Main"},{type:l.Link,action:"back-action",label:"Price Chart"}],me=[{action:"update-now",label:"Refresh",icon:()=>o(c,{icon:oe,color:"#4caf50"})}],ue=(e,t)=>({type:r.Group,className:se,sx:{p:2},tabletColumns:"12",desktopColumns:"3",fields:[{type:r.Component,className:le,style:{transition:"opacity 500ms",opacity:.5},element:()=>o(f,{direction:"row",children:[o(b,{variant:"outlined",size:"small",color:"info",label:`${y.bullet} ${e}`,sx:{mb:1,pr:.5,fontSize:"14px",background:"white",cursor:"not-allowed"}}),o(u,{flex:1})]})},{type:r.Group,fields:t.map(({symbol:e,label:t,color:i})=>((e,t,i)=>({type:r.Component,desktopColumns:"6",tabletColumns:"6",phoneColumns:"12",fieldRightMargin:"1",fieldBottomMargin:"1",element:()=>o(C,{component:g,onClick:()=>{a.routerService.push(`/price_chart/${e.toLowerCase()}`)},sx:{width:"100%",background:i,color:"white",fontWeight:"bold",fontSize:"14px",height:"75px",minHeight:"75px",textWrap:"wrap",padding:"16px",[`& .${re}`]:{transition:"filter 500ms"},"&:hover":{background:()=>pe(i)?k(i,.33):v(i,.33),[`& .${re}`]:{transition:"filter 500ms",filter:pe(i)?"brightness(0.7) contrast(1.2)":"brightness(1.3) contrast(0.5)"}},transition:"background 500ms"},startIcon:o(Z,{className:re,symbol:e}),children:o(u,{sx:{overflow:"hidden",textOverflow:"ellipsis",width:"75px"},children:t})})}))(e,t,i))}]}),he="backtest-kit__groupHeader",be="backtest-kit__groupRoot",ye="backtest-kit__symbolImage",fe=s()({root:{[`& .${be}:hover .${he}`]:{opacity:"1 !important"}}});function ge(e){return S(e,"#000000")>S(e,"#FFFFFF")}const ke=[{type:l.Link,action:"back-action",label:o(te,{sx:{display:"block"}})},{type:l.Link,action:"back-action",label:"Main"},{type:l.Link,action:"back-action",label:"Price Chart"},{type:l.Link,action:"back-action",compute:e=>String(e).toUpperCase()}],ve=(e,t)=>({type:r.Group,className:be,sx:{p:2},desktopColumns:"6",tabletColumns:"6",phoneColumns:"12",fields:[{type:r.Component,className:he,style:{transition:"opacity 500ms",opacity:.5},element:()=>o(f,{direction:"row",children:[o(b,{variant:"outlined",size:"medium",color:"info",label:`${y.bullet} ${e}`,sx:{mb:1,pr:.5,fontSize:"16px",background:"white",cursor:"not-allowed"}}),o(u,{flex:1})]})},{type:r.Group,fields:t.map(({label:e,to:t,color:i,icon:n})=>((e,t,i,n)=>({type:r.Component,desktopColumns:"6",tabletColumns:"12",phoneColumns:"12",fieldRightMargin:"1",fieldBottomMargin:"1",element:()=>o(C,{component:g,onClick:()=>{a.routerService.push(e)},sx:{width:"100%",background:i,color:"white",fontWeight:"bold",fontSize:"18px",height:"75px",minHeight:"125px",textWrap:"wrap",padding:"16px",[`& .${ye}`]:{transition:"filter 500ms"},"&:hover":{background:()=>ge(i)?k(i,.33):v(i,.33),[`& .${ye}`]:{transition:"filter 500ms",filter:ge(i)?"brightness(0.7) contrast(1.2)":"brightness(1.3) contrast(0.5)"}},transition:"background 500ms"},startIcon:o(n,{className:ye}),children:t})}))(t,e,i,n))}]}),Ce=s()({root:{position:"relative"},tooltip:{position:"absolute",margin:0,left:5,top:5,backgroundColor:"#343434",zIndex:999,color:"white",fontWeight:"bold",padding:"5px 10px",borderRadius:3,fontSize:"12px",pointerEvents:"none",touchAction:"none"}}),Se={layout:{textColor:"#d4d4d8",backgroundColor:"#ffffff"},rightPriceScale:{scaleMargins:{top:.3,bottom:.25}},crosshair:{vertLine:{width:4,color:"#ebe0e301",style:0},horzLine:{visible:!1,labelVisible:!1}},grid:{vertLines:{color:"#f8b3"},horzLines:{color:"#f8b3"}},handleScroll:{vertTouchDrag:!1}},xe=({height:e,width:t,items:i,position:a,priceOpen:n,priceStopLoss:l,priceTakeProfit:s})=>{const{classes:r}=Ce(),c=x.useRef(void 0),[p,d]=x.useState(null);return x.useLayoutEffect(()=>{const{current:o}=c,r=L(o,{...Se,localization:{priceFormatter:e=>M(e,N(e))},width:t,height:e,crosshair:{mode:w.Normal,vertLine:{labelVisible:!1},horzLine:{visible:!1,labelVisible:!0}},timeScale:{timeVisible:!0,secondsVisible:!0,tickMarkFormatter:e=>{const o=i.find(o=>o.timestamp===Number(e))||i[0];if(!o||!o.timestamp)return"Invalid date";const t=z(o.timestamp);return t.isValid()?t.format("HH:mm:ss"):"Invalid date"}}}),p=r.addLineSeries({lastValueVisible:!1,color:P[400]}),m=i.map(e=>({time:Math.floor(e.timestamp),value:parseFloat(e.close)}));if(p.setData(m),a&&n){const e="long"===a?P[700]:V[700];p.createPriceLine({price:n,color:e,lineWidth:2,lineStyle:T.Solid,axisLabelVisible:!0,title:"long"===a?"LONG Entry":"SHORT Entry"})}return l&&p.createPriceLine({price:l,color:$[500],lineWidth:2,lineStyle:T.Solid,axisLabelVisible:!0,title:"SL"}),s&&p.createPriceLine({price:s,color:H[500],lineWidth:2,lineStyle:T.Solid,axisLabelVisible:!0,title:"TP"}),r.subscribeCrosshairMove(e=>{if(e.time){const o=i.find(o=>o.timestamp===Number(e.time));if(o){const e=z(o.timestamp).format("DD/MM/YYYY HH:mm:ss"),t=M(o.close,N(o.close));d(`${e}: ${t}`)}else d(null)}else d(null)}),r.timeScale().fitContent(),()=>{r.remove()}},[e,t,i]),o("div",{ref:c,className:r.root,children:p&&o("div",{className:r.tooltip,children:p})})},Le={"1m":"#2979ff","15m":"#f3a43a","1h":"#d500f9"},we={"1m":"1 minute","15m":"15 minutes","1h":"1 hour"};const Pe=({symbol:e,interval:t,reloadSubject:n,downloadSubject:l,onInfoClick:s,disableInfo:r,position:c,priceOpen:d,priceStopLoss:m,priceTakeProfit:h,sx:y})=>{const[f,{loading:g,execute:k}]=i(async()=>await a.exchangeViewService.getLastCandles(e,t),{onLoadStart:()=>a.layoutService.setAppbarLoader(!0),onLoadEnd:()=>a.layoutService.setAppbarLoader(!1),deps:[e,t]}),v=O(f);A(()=>n.subscribe(k)),A(()=>l.subscribe(()=>{const{current:o}=v;!function(e,o="data.json"){const t=new Blob([e],{type:"application/json"}),i=window.URL.createObjectURL(t);a.layoutService.downloadFile(i,o)}(JSON.stringify(o,null,2),`${e}-${t}.json`)}));return o(R,{sx:{...y,display:"flex",flexDirection:"column",alignItems:"stretch",overflow:"clip"},children:[o(u,{sx:{background:Le[t]||"#607d8b",minHeight:"48px",display:"flex",alignItems:"center",pl:2,pr:1},children:[o(p,{variant:"h6",sx:{color:"white",fontWeight:"bold",mr:1},children:we[t]||t}),!!c&&o(b,{variant:"filled",sx:{color:"white"},color:"short"===c?"warning":"success",label:String(c).toUpperCase()}),o(u,{sx:{flex:1}}),o(_,{disabled:r,onClick:s,children:o(I,{style:{color:"white",opacity:r?.5:1}})})]}),o(E,{}),!f||g?o(F,{sx:{height:"100%",width:"100%"}}):o(u,{sx:{position:"relative",flex:1},children:o(j,{style:{position:"absolute"},children:({height:e,width:t})=>o(xe,{items:f,height:e,width:t,position:c,priceOpen:d,priceStopLoss:m,priceTakeProfit:h})})})]})},Te=[{type:l.Link,action:"back-action",label:o(te,{sx:{display:"block"}})},{type:l.Link,action:"back-action",label:"Main"},{type:l.Link,action:"back-action",label:"Price Chart"},{type:l.Link,action:"back-action",compute:({symbol:e})=>String(e).toUpperCase()},{type:l.Link,action:"back-action",compute:({interval:e})=>String(e).toUpperCase()}],Ve=[{action:"download-now",label:"Download",icon:()=>o(c,{icon:q,color:"#4caf50"})},{divider:!0},{action:"update-now",label:"Refresh",icon:()=>o(c,{icon:oe,color:"#4caf50"})}],$e=new D,He=new D,ze=[{type:r.Text,outlined:!1,desktopColumns:"12",tabletColumns:"12",phoneColumns:"12",name:"symbol",title:"Symbol",readonly:!0,compute:e=>e.symbol||"N/A"},{type:r.Text,outlined:!1,desktopColumns:"12",tabletColumns:"12",phoneColumns:"12",name:"position",title:"Position",readonly:!0,compute:e=>"long"===e.position?"🔵 LONG (profit on rise)":"🟠 SHORT (profit on fall)"},{type:r.Text,outlined:!1,desktopColumns:"12",tabletColumns:"12",phoneColumns:"12",name:"priceOpen",title:"Entry",readonly:!0,compute:e=>e.priceOpen?`${M(e.priceOpen)}$`:"N/A"},{type:r.Text,outlined:!1,desktopColumns:"12",tabletColumns:"12",phoneColumns:"12",name:"originalPriceOpen",title:"Original Entry",readonly:!0,isVisible:e=>null!=e.originalPriceOpen&&e.originalPriceOpen!==e.priceOpen,compute:e=>e.originalPriceOpen?`${M(e.originalPriceOpen)}$`:"N/A"},{type:r.Text,outlined:!1,desktopColumns:"12",tabletColumns:"12",phoneColumns:"12",name:"priceTakeProfit",title:"Take Profit",readonly:!0,compute:e=>e.priceTakeProfit?`${M(e.priceTakeProfit)}$`:"N/A"},{type:r.Text,outlined:!1,desktopColumns:"12",tabletColumns:"12",phoneColumns:"12",name:"originalPriceTakeProfit",title:"Original Take Profit",readonly:!0,isVisible:e=>null!=e.originalPriceTakeProfit&&e.originalPriceTakeProfit!==e.priceTakeProfit,compute:e=>e.originalPriceTakeProfit?`${M(e.originalPriceTakeProfit)}$`:"N/A"},{type:r.Text,outlined:!1,desktopColumns:"12",tabletColumns:"12",phoneColumns:"12",name:"priceStopLoss",title:"Stop Loss",readonly:!0,compute:e=>e.priceStopLoss?`${M(e.priceStopLoss)}$`:"N/A"},{type:r.Text,outlined:!1,desktopColumns:"12",tabletColumns:"12",phoneColumns:"12",name:"originalPriceStopLoss",title:"Original Stop Loss",readonly:!0,isVisible:e=>null!=e.originalPriceStopLoss&&e.originalPriceStopLoss!==e.priceStopLoss,compute:e=>e.originalPriceStopLoss?`${M(e.originalPriceStopLoss)}$`:"N/A"},{type:r.Text,outlined:!1,desktopColumns:"12",tabletColumns:"12",phoneColumns:"12",name:"totalEntries",title:"Total Entries",readonly:!0,isVisible:e=>null!=e.totalEntries&&e.totalEntries>1,compute:e=>String(e.totalEntries)},{type:r.Text,outlined:!1,desktopColumns:"12",tabletColumns:"12",phoneColumns:"12",name:"totalPartials",title:"Total Closes",readonly:!0,isVisible:e=>null!=e.totalPartials&&e.totalPartials>0,compute:e=>String(e.totalPartials)},{type:r.Component,sx:{mt:2},element:({payload:e})=>o(C,{variant:"outlined",onClick:e.handleClose,children:"Back"})}],Me=[{id:"chart",element:({params:e})=>{const t=G(()=>({symbol:String(e.symbol).toUpperCase(),interval:e.interval})),[l,{loading:s,execute:r}]=i(async()=>{const o=String(e.symbol).toUpperCase();return await a.signalViewService.getPendingSignal(o)},{onLoadStart:()=>a.layoutService.setAppbarLoader(!0),onLoadEnd:()=>a.layoutService.setAppbarLoader(!1),deps:[e.symbol]});A(()=>$e.subscribe(r));const c=x.useMemo(()=>l?l.priceTakeProfit:0,[l]),p=x.useMemo(()=>l?l.priceStopLoss:0,[l]),d=x.useMemo(()=>l?l.priceOpen:0,[l]),m=x.useMemo(()=>l?l.position:null,[l]),[u,h]=W(null),{pickData:b,setOpen:y,render:g}=B({title:"Info",AfterTitle:({onClose:e})=>o(f,{direction:"row",gap:2,children:[o(Y,{onClick:()=>a.layoutService.pickSignal(u.current.id),variant:"outlined",children:"Show Details"}),o(J,{size:"small",onClick:e,children:o(K,{})})]}),payload:()=>({handleClose(){y(!1)}}),fields:ze,handler:()=>u.current,withActionButton:!1}),k=U(async()=>{l&&(h(l),b(l.id))});return o(ee,{children:[o(n,{items:Te,actions:Ve,payload:t,onAction:async o=>{"back-action"===o&&a.routerService.push(`/price_chart/${e.symbol}`),"update-now"===o&&await $e.next(),"download-now"===o&&await He.next()}}),s?null:o(Pe,{symbol:t.symbol,interval:t.interval,disableInfo:!l,reloadSubject:$e,downloadSubject:He,onInfoClick:k,position:m,priceOpen:d,priceStopLoss:p,priceTakeProfit:c,sx:{height:"calc(100dvh - 165px)"}}),g()]})},isActive:e=>X(["/price_chart/:symbol/:interval"],e)},{id:"coin",element:({params:e})=>{const{classes:t}=fe(),i=e.symbol,l=x.useMemo(()=>[{label:"1 minute",to:`/price_chart/${i}/1m`,color:"#2979ff",icon:ae},{label:"15 minutes",to:`/price_chart/${i}/15m`,color:"#f3a43a",icon:ne},{label:"1 hour",to:`/price_chart/${i}/1h`,color:"#d500f9",icon:ie}],[i]),s=x.useMemo(()=>[ve("Chart",l)],[l]);return o(ee,{children:[o(n,{items:ke,payload:i,onAction:e=>{"back-action"===e&&a.routerService.push("/price_chart")}}),o(m,{className:t.root,fields:s}),o(u,{paddingBottom:"24px"})]})},isActive:e=>X(["/price_chart/:symbol"],e)},{id:"main",element:()=>{const{classes:e}=ce(),{reloadTrigger:l,doReload:s}=t(),[c,{loading:b}]=i(async()=>await(async()=>{const[e,o]=await Promise.all([a.symbolGlobalService.getSymbolList(),a.symbolGlobalService.getSymbolMap()]),t={};e.forEach((e,i)=>{const a=o[e],n=i+1,l=(null==a?void 0:a.priority)||n;t[l]||(t[l]=[]),t[l].push({symbol:e,label:(null==a?void 0:a.displayName)||e,color:(null==a?void 0:a.color)||"#ccc"})});const i=Object.entries(t).map(([e,o])=>({priority:parseInt(e),routes:o})).sort(({priority:e,routes:{length:o}},{priority:t,routes:{length:i}})=>i-o||t-e),n=[],l=[],s=[];return i.forEach(({routes:e,priority:o},t)=>{const i=ue(`Priority ${o}`,e);t%2==0&&n.push(i),t%2==1&&l.push(i),s.push(i)}),s.length?[{type:r.Group,columns:"6",className:"tabletLeftColumn",phoneHidden:!0,desktopHidden:!0,fields:n},{type:r.Group,columns:"6",className:"tabletRightColumn",phoneHidden:!0,desktopHidden:!0,fields:l},{type:r.Group,columns:"12",className:"wideColumn",tabletHidden:!0,fields:s}]:[]})(),{onLoadStart:()=>a.layoutService.setAppbarLoader(!0),onLoadEnd:()=>a.layoutService.setAppbarLoader(!1),deps:[l]});return o(ee,{children:[o(n,{items:de,actions:me,onAction:e=>{"back-action"===e&&a.routerService.push("/"),"update-now"===e&&s()}}),b||!c?o(d,{children:o(p,{variant:"h6",sx:{opacity:.5},children:"Loading..."})}):c.length?o(h,{children:[o(m,{className:e.root,fields:c},l),o(u,{paddingBottom:"24px"})]}):o(d,{children:o(p,{variant:"h6",sx:{opacity:.5},children:"No symbols found"})})]})},isActive:e=>X(["/price_chart"],e)}],Ne=({symbol:e,interval:t})=>o(Q,{history:a.routerService,onLoadStart:()=>a.layoutService.setAppbarLoader(!0),onLoadEnd:()=>a.layoutService.setAppbarLoader(!1),routes:Me,params:{symbol:e,interval:t}});export{Ne as PriceChartPage,Ne as default};
@@ -0,0 +1 @@
1
+ import{b as e,f as t,i as o,aw as a,H as n,ax as l,r as i,ay as r,p as s,T as c,J as d,c as p,P as u,F as m,az as h,aA as g,aB as f,B as y,ao as v,aC as b,aD as x,aa as C,aE as k,aF as w,aG as P,aH as S,aI as L,aJ as M,a2 as N,ag as R,I as $,ad as T,A as D,aK as j,E as B,a4 as I,Z as V,V as A,x as E,aL as O,X as z,a8 as F,O as U,R as W,D as H,aM as G,aN as _,W as Y}from"./index-DMjmH2fE.js";import{I as K}from"./IconPhoto-BV2g32_b.js";import{C as J,R as X}from"./Refresh-DDS1Dl8a.js";import{K as Z}from"./KeyboardArrowLeft-uHSkdvcT.js";const q=e(t("path",{d:"M12 4c4.41 0 8 3.59 8 8s-3.59 8-8 8-8-3.59-8-8 3.59-8 8-8m0-2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 10V8h-2v4H8l4 4 4-4h-3z"}),"ArrowCircleDown"),Q=e(t("path",{d:"M12 20c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0 2c5.52 0 10-4.48 10-10S17.52 2 12 2 2 6.48 2 12s4.48 10 10 10zm-1-10v4h2v-4h3l-4-4-4 4h3z"}),"ArrowCircleUp"),ee=e(t("path",{d:"M7.5 5.6 10 7 8.6 4.5 10 2 7.5 3.4 5 2l1.4 2.5L5 7zm12 9.8L17 14l1.4 2.5L17 19l2.5-1.4L22 19l-1.4-2.5L22 14zM22 2l-2.5 1.4L17 2l1.4 2.5L17 7l2.5-1.4L22 7l-1.4-2.5zm-7.63 5.29a.9959.9959 0 0 0-1.41 0L1.29 18.96c-.39.39-.39 1.02 0 1.41l2.34 2.34c.39.39 1.02.39 1.41 0L16.7 11.05c.39-.39.39-1.02 0-1.41l-2.33-2.35zm-1.03 5.49-2.12-2.12 2.44-2.44 2.12 2.12-2.44 2.44z"}),"AutoFixHigh"),te=e(t("path",{d:"M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2z"}),"Circle"),oe=l(async e=>"live"===e?await o.storageViewService.listSignalLive():await o.storageViewService.listSignalBacktest(),{key:([e])=>`${e}`,timeout:45e3}),ae=async(e,t)=>(await oe(t)).filter(t=>"closed"===t.status&&t.symbol===e),ne=async(e,t)=>{const o=await ae(e,t);return{total:o.length,resolvedCount:o.filter(e=>e.pnl.pnlPercentage>0).length,rejectedCount:o.filter(e=>e.pnl.pnlPercentage<=0).length}},le=async(e,t)=>{const o=await ae(e,t),a=e=>Math.abs(e.pnl.priceClose-e.priceTakeProfit)/e.priceTakeProfit<.005,n=e=>Math.abs(e.pnl.priceClose-e.priceStopLoss)/e.priceStopLoss<.005;return{resolvedTakeProfitCount:o.filter(e=>e.pnl.pnlPercentage>0&&a(e)).length,rejectedStopLossCount:o.filter(e=>e.pnl.pnlPercentage<=0&&n(e)).length,resolvedCloseCount:o.filter(e=>e.pnl.pnlPercentage>0&&!a(e)).length,rejectedCloseCount:o.filter(e=>e.pnl.pnlPercentage<=0&&!n(e)).length}},ie=async(e,t)=>{const o=await ae(e,t),l=new Map;for(const i of o){const e=a(n(i.updatedAt)),t=l.get(e)??{resolved:0,rejected:0};i.pnl.pnlPercentage>0?l.set(e,{...t,resolved:t.resolved+1}):l.set(e,{...t,rejected:t.rejected+1})}return Array.from(l.entries()).map(([e,{resolved:t,rejected:o}])=>({stamp:e,count:t+o,resolved:t,rejected:o}))},re=async(e,t)=>{const o=await ae(e,t),a="backtest"===t&&o.length?o.reduce((e,t)=>Math.max(e,t.updatedAt),0):Date.now(),l=n(a).startOf("day").valueOf(),i=l-864e5,r=l-6048e5,s=l-26784e5,c=e=>e.reduce((e,t)=>e+t.pnl.pnlCost,0),d=o.filter(e=>e.updatedAt>=l),p=o.filter(e=>e.updatedAt>=i&&e.updatedAt<l),u=o.filter(e=>e.updatedAt>=r),m=o.filter(e=>e.updatedAt>=s);return{symbol:e,todayRevenue:c(d),yesterdayRevenue:c(p),sevenDaysRevenue:c(u),thirtyOneDaysRevenue:c(m),todayCount:d.length,yesterdayCount:p.length,sevenDaysCount:u.length,thirtyOneDaysCount:m.length}};var se=(e=>(e.Red="#DD4049",e.Orange="#F3A43A",e.Green="#2EA96F",e.Blue="#2979ff",e.Violet="#d500f9",e))(se||{});const ce=i.createContext(null),de=({value:e,children:o})=>t(ce.Provider,{value:e,children:o}),pe=()=>i.useContext(ce);var ue=(e=>(e.Semi="semi",e.Solid="solid",e.Unset="unset",e))(ue||{});const me=s()(e=>({root:{display:"flex",alignItems:"center",justifyContent:"stretch",whiteSpace:"nowrap",gap:"8px",overflow:"clip",padding:"10px",borderTop:`1px solid ${e.palette.divider}`,"& > *":{flex:1}},solidBackground:{color:"#fff","& svg":{fill:"#fff"}},unsetBackground:{color:e.palette.text.primary,"& svg":{fill:e.palette.text.primary}},semiBackground:{color:e.palette.text.primary,"& svg":{fill:e.palette.text.primary}}})),he=({className:e,style:o,backgroundColor:a})=>{const{classes:n}=me(),{footerLabel:l,backgroundMode:s=ue.Solid}=pe(),c=i.useMemo(()=>({...o,...s===ue.Solid&&{backgroundColor:a}}),[a,s,o]);return t("div",{className:r(e,n.root,{[n.solidBackground]:s===ue.Solid,[n.unsetBackground]:s===ue.Unset,[n.semiBackground]:s===ue.Semi}),style:c,children:l})},ge=(e,t=2)=>{let o=1;for(let a=0;a<t;a++)o*=10;return Math.round(e*o)/o},fe=s()({root:{position:"relative",width:"100%",height:"0px"},container:{position:"absolute",top:0,left:0,width:"100%",display:"flex",alignItems:"center",justifyContent:"center"}}),ye=({caption:e})=>{const{classes:o}=fe();return t("div",{className:o.root,children:t("div",{className:o.container,children:t(c,{variant:"caption",sx:{opacity:.5,fontSize:12,textAlign:"center",padding:"0 8px"},children:e})})})},ve=s()(e=>({root:{display:"flex",alignItems:"center",justifyContent:"center",flexDirection:"column"},solidBackground:{"& > :first-of-type":{color:"#fff",fontWeight:"bold"},"& > :last-of-type":{color:"#fff"}},unsetBackground:{"& > :first-of-type":{color:e.palette.text.primary,fontWeight:"bold"},"& > :last-of-type":{color:e.palette.text.primary}},semiBackground:{"& > :first-of-type":{color:e.palette.text.primary,fontWeight:"bold"},"& > :last-of-type":{color:e.palette.text.primary}},content:{display:"flex",alignItems:"baseline",flexDirection:"row",gap:"2.5px","& > *":{fontWeight:"bold"},"& > :first-of-type":{fontSize:"22px"},"& > :last-of-type":{fontSize:"16px",opacity:.85}}})),be=p(e=>t("div",{className:e.v0,style:e.v1,children:[t("div",{className:e.v2,children:[e.v3,e.v4]}),e.v5]}),{name:"Content_1",portals:["v3","v4","v5"]}),xe=({className:e,style:o,backgroundColor:a})=>{const{classes:n}=ve(),{backgroundMode:l=ue.Solid,roundDigits:s=2,value:p,caption:u,valueUnit:m="Unit"}=pe(),h=i.useMemo(()=>({...o,...l===ue.Solid&&{backgroundColor:a}}),[a,l,o]);return t(be,{v0:r(e,n.root),v1:h,v2:r(n.content,{[n.solidBackground]:l===ue.Solid,[n.unsetBackground]:l===ue.Unset,[n.semiBackground]:l===ue.Semi}),v3:t(c,{fontWeight:"bold",children:d(ge(p,s))}),v4:t(c,{children:m}),v5:!!u&&t(ye,{caption:u})})},Ce=s()(e=>({root:{display:"flex",alignItems:"center",whiteSpace:"nowrap",fontWeight:700,fontSize:"18px",paddingLeft:"8px",gap:"8px",overflow:"clip",borderBottom:`1px solid ${e.palette.divider}`},solidBackground:{color:"#fff",padding:"10px","& svg":{fill:"#fff"}},semiBackground:{color:"#fff",padding:"10px","& svg":{fill:"#fff"}},unsetBackground:{color:e.palette.text.primary,padding:"10px","& svg":{fill:e.palette.text.primary}}})),ke=({className:e,style:o,backgroundColor:a})=>{const{classes:n}=Ce(),{headerLabel:l,backgroundMode:s=ue.Solid}=pe(),c=i.useMemo(()=>({...o,...(s===ue.Solid||s===ue.Semi)&&{backgroundColor:a}}),[a,s,o]);return t("div",{className:r(e,n.root,{[n.solidBackground]:s===ue.Solid,[n.unsetBackground]:s===ue.Unset,[n.semiBackground]:s===ue.Semi}),style:c,children:l})},we=s()({root:{overflow:"clip",height:"100%",width:"100%",display:"flex",alignItems:"stretch",justifyContent:"stretch",flexDirection:"column"},click:{cursor:"pointer"},header:{minHeight:"36px"},content:{flex:1},footer:{minHeight:"32px"}}),Pe=({className:e,style:o})=>{const{classes:a}=we(),{backgroundColor:n,onClick:l,footerLabel:i}=pe();return t(u,{className:r(e,a.root,{[a.click]:!!l}),onClick:l,style:o,children:[t(ke,{backgroundColor:n}),t(xe,{backgroundColor:n,className:a.content}),!!i&&t(he,{backgroundColor:n,className:a.footer})]})},Se=i.memo(({className:e,style:o,...a})=>t(de,{value:a,children:t(Pe,{className:e,style:o})})),Le=(e,{one:t,many:o,two:a=o})=>`${(()=>{if(0===e||e>=11&&e<20)return o;let n=e%10;return 0===n?o:1===n?t:n<5?a:o})()}`,Me=i.createContext(null),Ne=({value:e,children:o})=>t(Me.Provider,{value:e,children:o}),Re=()=>i.useContext(Me),$e=s()({root:{display:"flex",alignItems:"stretch",justifyContent:"stretch",paddingLeft:"20px",paddingRight:"20px",overflow:"clip"},container:{flex:1,display:"flex",alignItems:"stretch",justifyContent:"center",gap:"40px"},item:{gap:"4px",display:"flex",alignItems:"center",justifyContent:"center","& > span":{fontWeight:500,fontSize:"12px",color:"var(--black-6)",whiteSpace:"nowrap"}},circle:{borderRadius:"50%",height:"8px",width:"8px"}}),Te=p(e=>t("div",{className:e.v0,style:e.v1,children:t("div",{className:e.v2,children:e.v3})}),{name:"Footer_1",portals:["v3"]}),De=({className:e,style:o})=>{const{classes:a}=$e(),{items:n}=Re();return t(Te,{v0:r(e,a.root),v1:o,v2:a.container,v3:[...n].sort(({maxValue:e},{maxValue:t})=>e-t).map((e,o)=>t("div",{className:a.item,children:[t("div",{className:a.circle,style:{background:e.color}}),t("span",{children:[e.label," ",e.value?e.value():e.maxValue]})]},o))})},je=s()(()=>({circle:{position:"absolute",transform:"translate(-50%, 50%)",bottom:"0",left:"50%","& > div":{borderRadius:"50%"}}})),Be=p(e=>t("div",{className:e.v0,style:e.v1,children:t("div",{style:e.v2})}),{name:"Circle_1"}),Ie=({className:e,style:o,lineWidth:a,side:n,color:l,rotate:i})=>{const{classes:s}=je();return t(Be,{v0:r(e,s.circle),v1:{...o},v2:{borderTop:`${a}px solid ${l}`,borderLeft:`${a}px solid ${l}`,borderRight:`${a}px solid transparent`,borderBottom:`${a}px solid transparent`,transform:`rotate(${i}deg)`,height:n,width:n}})},Ve=s()(e=>({dot:{position:"absolute",transform:"translate(-50%, 50%)",bottom:"0",left:"50%",borderRadius:"50%",background:e.palette.background.paper}})),Ae=({side:e})=>{const{classes:o}=Ve();return t("div",{className:o.dot,style:{height:e,width:e}})},Ee=s()(e=>({line:{position:"absolute",background:e.palette.background.paper,height:"100%",width:"1px",left:"50%",transformOrigin:"center bottom"}})),Oe=({angle:e})=>{const{classes:o}=Ee();return t("div",{className:o.line,style:{transform:`rotate(${e}deg)`}})},ze=s()(e=>({dot:{position:"absolute",transform:"translate(-50%, 50%)",bottom:"0",left:"50%",borderRadius:"50%",outline:`100vmax solid ${e.palette.background.paper}`}})),Fe=({side:e})=>{const{classes:o}=ze();return t("div",{className:o.dot,style:{height:e,width:e}})},Ue=s()(e=>({pointer:{position:"absolute",left:"21%",width:"29%",bottom:"0%",zIndex:1,transformOrigin:"right center",fill:e.palette.text.primary}})),We=p(e=>t("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 87 8",className:e.v0,style:e.v1,...e.v2,children:[t("rect",{x:"0.5",y:"2.5",width:"79",height:"3"}),t("circle",{cx:"82.5",cy:"4",r:"4"})]}),{name:"Pointer_1",svg:!0}),He=({className:e,style:o,angle:a,scale:n=1,...l})=>{const{classes:i}=Ue();return t(We,{v0:r(e,i.pointer),v1:{...o,transform:`rotate(${a}deg) scale(${n}) translateX(5px)`},v2:l})},Ge=e=>e*Math.PI/180,_e=(e,t)=>({left:t*Math.cos(Ge(e))+t,top:t*Math.sin(Ge(e))+t}),Ye=s()(e=>({root:{position:"absolute",transform:"translate(-50%, 50%)",bottom:"0",left:"50%",display:"flex",alignItems:"stretch",justifyContent:"stretch"},container:{flex:1,position:"relative"},label:{position:"absolute",transform:"translate(-50%, -50%)",color:e.palette.text.primary,zIndex:2}})),Ke=p(e=>t("div",{className:e.v0,style:e.v1,children:t("div",{className:e.v2,children:e.v3})}),{name:"Labels_1",portals:["v3"]}),Je=({items:e,side:o})=>{const{classes:a}=Ye(),n=i.useMemo(()=>Math.floor(o/2),[o]);return t(Ke,{v0:a.root,v1:{height:o,width:o},v2:a.container,v3:e.slice(0,e.length-1).map(({angle:e,value:o},l)=>t("span",{className:a.label,style:{..._e(e+180,n),...e<90&&{marginLeft:10},...e>90&&{marginLeft:-10},...e>15&&e<165&&{marginTop:5}},children:o},l))})},Xe=({width:e,side:o,chunks:a,maxValue:n,minValue:l,value:r})=>{const s=i.useMemo(()=>.5*o,[o]),c=i.useMemo(()=>.63*o,[o]),d=i.useMemo(()=>.58*o,[o]),p=i.useCallback(e=>180/(n-l)*(e.minValue-l)+45,[n,l]),u=i.useMemo(()=>Math.min(r/n*180,180),[n,r]),h=i.useMemo(()=>e>o?c/e*1.5:1,[c,e,o]),g=i.useMemo(()=>[...a].sort(({maxValue:e},{maxValue:t})=>e-t).slice(0,a.length-1).map(e=>({angle:180/n*e.maxValue,value:e.maxValue})),[a,n]),f=i.useMemo(()=>[{angle:0,value:0},...g,{angle:180,value:n}],[g,n]);return t(m,{children:[t(He,{angle:u,scale:h}),[...a].sort(({maxValue:e},{maxValue:t})=>e-t).map((e,a)=>t(Ie,{rotate:p(e),color:e.color,side:o,lineWidth:s},`${e.color}-${a}`)),g.map(({angle:e},o)=>t(Oe,{angle:e-90},`${e}-${o}`)),t(Fe,{side:o}),t(Ae,{side:c}),t(Je,{items:f,side:d})]})},Ze=s()({root:{display:"flex",alignItems:"stretch",justifyContent:"stretch",overflow:"clip"},container:{flex:1,position:"relative",display:"flex",alignItems:"center",justifyContent:"center"},bottomCenterLabel:{position:"absolute",zIndex:2,bottom:"0",display:"flex",alignItems:"center",justifyContent:"center",flexDirection:"row",gap:"4px","& > *":{fontSize:"20px",lineHeight:"24px"},"& > :first-of-type":{fontWeight:"bold"},"& > :last-of-type":{color:"var(--black-6)"}}}),qe=({className:e,height:o,width:a})=>{const{classes:n}=Ze(),{value:l,items:s}=Re(),c=Math.min(2*o,a),d=i.useMemo(()=>[...s].filter(e=>!e.hidden).sort(({maxValue:e},{maxValue:t})=>t-e).map((e,t,o)=>{const a=o[t+1],n=a?a.maxValue:0;return{...e,minValue:n,value:e.maxValue-n}}),[s]),p=i.useMemo(()=>{const e=d.find(({minValue:e,maxValue:t})=>l>=e&&l<=t);if(e)return e.color;return d.reduce((e,t)=>t.minValue>=e.minValue?t:e).color},[d,l]),u=i.useMemo(()=>d.reduce((e,{minValue:t})=>Math.min(e,t),Number.POSITIVE_INFINITY),[d]),m=i.useMemo(()=>d.reduce((e,{maxValue:t})=>Math.max(e,t),Number.NEGATIVE_INFINITY),[d]);return t("div",{className:r(e,n.root),children:t("div",{className:n.container,children:t(Xe,{chunks:d,value:l,minValue:u,maxValue:m,side:c,width:a,color:p})})})},Qe=s()(e=>({root:{display:"flex",alignItems:"center",justifyContent:"center",borderLeft:0,borderRight:0,borderWidth:"1px 0",borderStyle:"solid",borderColor:e.palette.divider},container:{display:"flex",alignItems:"center",justifyContent:"center",flexDirection:"row"},content:{display:"flex",alignItems:"baseline",gap:"2.5px","& > *":{fontWeight:"bold"},"& > :first-of-type":{fontSize:"22px"},"& > :last-of-type":{fontSize:"16px",opacity:.85}}})),et=p(e=>t("div",{className:e.v0,style:e.v1,children:t("div",{className:e.v2,children:t("div",{className:e.v3,children:[e.v4,e.v5]})})}),{name:"Note_1",portals:["v4","v5"]}),tt=({className:e,style:o})=>{const{classes:a}=Qe(),{value:n,roundDigits:l=3,valueUnit:i="Unit"}=Re();return t(et,{v0:r(e,a.root),v1:o,v2:a.container,v3:a.content,v4:t(c,{children:ge(n,l)}),v5:t(c,{children:i})})},ot=s()(e=>({root:{position:"relative",overflow:"clip",height:"100%",width:"100%",background:e.palette.background.paper},container:{position:"absolute",top:"0",left:"0"},content:{display:"flex",alignItems:"stretch",justifyContent:"stretch",flexDirection:"column"},chart:{flex:1,paddingTop:"6px",paddingBottom:"6px"},footer:{minHeight:"32px"},note:{minHeight:"60px"}})),at=({className:e,style:o})=>{const{classes:a}=ot(),n=e=>{let t=e;return t-=32,t-=12,t-=60,t},l=e=>{let t=e;return t-=12,t};return t(u,{className:r(e,a.root),style:o,children:t(h,{className:a.container,children:({height:e=0,width:o=0})=>t("div",{className:a.content,style:{height:e,width:o},children:[t(qe,{className:a.chart,height:n(e),width:l(o)}),t(tt,{className:a.note}),t(De,{className:a.footer})]})})})},nt=i.memo(({className:e,style:o,...a})=>t(Ne,{value:a,children:t(at,{className:e,style:o})})),lt=s()({root:{position:"relative",height:10,flex:1},bar:{position:"absolute !important",top:"42%",left:0,right:10}}),it=e=>{const{classes:o}=lt(),a=["done","inprogress","waiting","archive"],n=t=>{var o;return null==(o=e.data[t])?void 0:o.value},l=a.map(t=>{const o=n(t);var a,l;return`${a=t,(null==(l=e.data[a])?void 0:l.title)||t} - ${o}`}).join(" | "),i=a.map(t=>{const o=(t=>{var o;return null==(o=e.data[t])?void 0:o.color})(t);return{color:o,value:n(t),key:t}}).map(({color:e,value:t,key:o},l)=>{let i=0;if(0!==l)for(let r=l-1;r>=0;r--)i+=n(a[r]);return{value:t>0?t+i:t,key:o,color:e}}).sort(({value:e},{value:t})=>t-e),r=Math.max(...i.map(({value:e})=>e));return t(f,{title:l,arrow:!0,children:t("div",{className:o.root,children:i.map(({color:e,value:a,key:n},l)=>{const i=((e,t=100)=>Math.min(100,Math.round(Math.max(Number(e),0)/t*100)))(a,r);return t(g,{sx:{height:"10px !important",zIndex:`${l+1} !important`,backgroundColor:"transparent !important","& .MuiLinearProgress-bar":{borderTopRightRadius:5,borderBottomRightRadius:5,backgroundColor:`${e} !important`}},variant:"determinate",className:o.bar,value:i},`${l}-${n}`)})})})},rt=s()({root:{display:"flex"},work:{display:"flex",alignItems:"center"},row:{flex:1,paddingLeft:5,paddingRight:5,paddingBottom:15}}),st=({title:e,description:o,avatar:a,done:n,inprogress:l,waiting:i,archive:r})=>{const{classes:s}=rt();return t(y,{className:s.root,children:t(y,{className:s.row,children:[t(y,{className:s.work,children:[t(a,{}),t(v,{primary:e,secondary:o,sx:{flex:"none",marginLeft:"0.5em"}})]}),t(y,{flex:"1",children:t(it,{data:{done:{color:"#7FB537",title:"Take profit",value:n},inprogress:{color:"#4FC0E8",title:"Resolved",value:l},waiting:{color:"#FE9B31",title:"Rejected",value:i},archive:{color:"#FA5F5A",title:"Stop loss",value:r}}})})]})})},ct=s()({root:{position:"relative",width:"100%"},container:{position:"absolute",top:0,height:"100%",width:"100%",overflowY:"auto",overflowX:"hidden"},content:{display:"flex",alignItems:"stretch",justifyContent:"stretch",flexDirection:"column"}}),dt=({items:e,sx:o})=>{const{classes:a}=ct();return t(u,{className:a.root,sx:o,children:[t(b,{disableRight:!0,color:"#fff",className:a.container,children:t("div",{className:a.content,children:e.map((e,o)=>t(st,{...e},o))})}),t(y,{sx:{position:"absolute",bottom:10,right:10,zIndex:10,pointerEvents:"auto",background:"rgba(255, 255, 255, 0.1)",backdropFilter:"blur(10px)",borderRadius:"12px",border:"1px solid rgba(255, 255, 255, 0.2)",padding:"12px 16px",boxShadow:"0 8px 32px rgba(0, 0, 0, 0.1)",opacity:.35,transition:"opacity 0.3s ease","&:hover":{opacity:1}},children:[t(y,{sx:{display:"flex",alignItems:"center"},children:[t("div",{style:{background:"#7FB537",width:15,height:15,borderRadius:"3px",marginRight:"5px"}}),t("span",{children:"Take profit"})]}),t(y,{sx:{display:"flex",alignItems:"center"},children:[t("div",{style:{background:"#4FC0E8",width:15,height:15,borderRadius:"3px",marginRight:"5px"}}),t("span",{children:"Resolved"})]}),t(y,{sx:{display:"flex",alignItems:"center"},children:[t("div",{style:{background:"#FE9B31",width:15,height:15,borderRadius:"3px",marginRight:"5px"}}),t("span",{children:"Rejected"})]}),t(y,{sx:{display:"flex",alignItems:"center"},children:[t("div",{style:{background:"#FA5F5A",width:15,height:15,borderRadius:"3px",marginRight:"5px"}}),t("span",{children:"Stop loss"})]})]})]})},pt=s()({root:{position:"relative"},tooltip:{position:"absolute",color:"gray",margin:0,left:5,top:5}}),ut={layout:{textColor:"#d1d4dc",backgroundColor:"#0000"},rightPriceScale:{scaleMargins:{top:.3,bottom:.25}},crosshair:{vertLine:{width:4,color:"#ebe0e301",style:0},horzLine:{visible:!1,labelVisible:!1}},grid:{vertLines:{color:"#f8b3"},horzLines:{color:"#f8b3"}},handleScroll:{vertTouchDrag:!1}},mt={color:"#90cbfa",lineWidth:2,crosshairMarkerVisible:!1,lastValueVisible:!1,priceLineVisible:!1},ht=({height:e,width:o,items:a})=>{const{classes:n}=pt(),l=i.useRef(void 0),r=i.useRef(void 0);return i.useLayoutEffect(()=>{const{current:t}=l,{current:n}=r,i=x(t,{...ut,height:e,width:o});i.addLineSeries({...mt}).setData(a);const s=({time:e})=>{if(e)try{const{day:t,month:o,year:l}=e,i=a.find(({time:e})=>e.day===t&&e.month===o&&e.year===l);if(i){const e=Math.round(Math.round(100*i.value)/100);n.innerHTML=`${C("Total")}: ${e}, ${C("Resolved")}: ${i.resolved}, ${C("Rejected")}: ${i.rejected}`}else n.innerHTML=""}catch(t){console.log(t),n.innerHTML=""}else n.innerHTML=""};return i.timeScale().fitContent(),i.subscribeCrosshairMove(s),()=>{i.unsubscribeCrosshairMove(s),i.remove()}},[e,o,a]),t("div",{ref:l,className:n.root,children:t("p",{ref:r,className:n.tooltip})})},gt=({items:e})=>t(h,{children:({height:o,width:a})=>t(ht,{height:o,width:a,items:e})}),ft=s()({root:{},container:{position:"relative",margin:0,padding:0,overflow:"clip"},editor:{position:"absolute",top:0,left:0,right:0,bottom:0}}),yt=({items:e,sx:o})=>{const{classes:a}=ft(),n=i.useMemo(()=>[...e].sort(({stamp:e},{stamp:t})=>e-t).map(({count:e,rejected:t,resolved:o,stamp:a})=>{const n=k(a);return{time:{year:n.get("year"),month:n.get("month")+1,day:n.get("date")},rejected:t,resolved:o,value:e}}),[e]);return t(u,{className:a.container,sx:o,children:t("div",{className:a.editor,children:t(gt,{items:n})})})},vt=e=>P({handler:async(t,a)=>{const n=S(t,a);for await(const l of(e=>w(async()=>{const t="live"===e?await o.storageViewService.listSignalLive():await o.storageViewService.listSignalBacktest(),a=t.filter(e=>"closed"===e.status).map(e=>({id:e.id,symbol:e.symbol,position:e.position,takeProfitPrice:e.priceTakeProfit,originalTakeProfitPrice:e.originalPriceTakeProfit,stopLossPrice:e.priceStopLoss,originalStopLossPrice:e.originalPriceStopLoss,profitLossPercentage:e.pnl.pnlPercentage,pnlCost:e.pnl.pnlCost,pnlEntries:e.pnl.pnlEntries,buyPrice:e.priceOpen,originalBuyPrice:e.originalPriceOpen,cost:e.cost,totalEntries:e.totalEntries,totalPartials:e.totalPartials,partialExecuted:e.partialExecuted,date:new Date(e.createdAt).toISOString(),status:"finished"}));return"backtest"===e?a:[...t.filter(e=>"opened"===e.status).map(e=>({id:e.id,symbol:e.symbol,position:e.position,takeProfitPrice:e.priceTakeProfit,originalTakeProfitPrice:e.originalPriceTakeProfit,stopLossPrice:e.priceStopLoss,originalStopLossPrice:e.originalPriceStopLoss,profitLossPercentage:e.pnl.pnlPercentage,pnlCost:e.pnl.pnlCost,pnlEntries:e.pnl.pnlEntries,buyPrice:e.priceOpen,originalBuyPrice:e.originalPriceOpen,cost:e.cost,totalEntries:e.totalEntries,totalPartials:e.totalPartials,partialExecuted:e.partialExecuted,date:new Date(e.createdAt).toISOString(),status:"pending"})),...a]}))(e))if(n([l]).done)break;return n([]).rows}}),bt=[{field:"color",label:B.nbsp,minWidth:45,width:()=>45,format:({symbol:e})=>t(A,{children:async()=>{var a;try{const n=await o.symbolGlobalService.getSymbolMap();return t(te,{sx:{color:(null==(a=n[e])?void 0:a.color)||"#ccc"}})}catch(n){return t(te,{sx:{color:"#ccc"}})}}})},{field:"symbol",label:"Symbol",minWidth:115,width:e=>Math.max(e-45-90-145-80-90-80,45),format:({symbol:e})=>t(y,{sx:{width:"75px",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e})},{field:"position",label:"Position",minWidth:90,width:()=>90,format:({position:e})=>{const o="long"===e;return t("span",{style:{color:o?"#1976D2":"#F57C00",padding:"4px 8px",borderRadius:"4px",fontWeight:"bold",fontSize:"11px"},children:o?"🔵 LONG":"🟠 SHORT"})}},{field:"buyPrice",label:"Entry",minWidth:145,width:()=>145,format:({buyPrice:e})=>`${d(e)}$`},{field:"pnlEntries",label:"Invested",minWidth:80,width:()=>80,format:({pnlEntries:e})=>`${d(e)}$`},{field:"profitLossPercentage",label:"PNL %",minWidth:90,width:()=>90,format:({profitLossPercentage:e})=>{const o=e>=0;return t("span",{style:{color:o?"green":"red"},children:[o?"+":"",e.toFixed(2),"%"]})}},{field:"pnlCost",label:"PNL $",minWidth:80,width:()=>80,format:({pnlCost:e})=>{const o=e>=0;return t("span",{style:{color:o?"green":"red"},children:[o?"+":"",d(e),"$"]})}}],xt=[{type:N.Text,outlined:!1,desktopColumns:"12",tabletColumns:"12",phoneColumns:"12",name:"symbol",title:"Symbol",readonly:!0,compute:e=>e.symbol||"N/A"},{type:N.Text,outlined:!1,desktopColumns:"12",tabletColumns:"12",phoneColumns:"12",name:"position",title:"Position",readonly:!0,compute:e=>"long"===e.position?"🔵 LONG (profit on rise)":"🟠 SHORT (profit on fall)"},{type:N.Text,outlined:!1,desktopColumns:"12",tabletColumns:"12",phoneColumns:"12",name:"date",title:"Date",readonly:!0,compute:e=>e.date?n(e.date).format("DD/MM/YYYY HH:mm"):""},{type:N.Text,outlined:!1,desktopColumns:"12",tabletColumns:"12",phoneColumns:"12",name:"buyPrice",title:"Entry",readonly:!0,compute:e=>e.buyPrice?`${d(e.buyPrice)}$`:"N/A"},{type:N.Text,outlined:!1,desktopColumns:"12",tabletColumns:"12",phoneColumns:"12",name:"originalBuyPrice",title:"Original Entry",readonly:!0,isVisible:e=>null!=e.originalBuyPrice&&e.originalBuyPrice!==e.buyPrice,compute:e=>e.originalBuyPrice?`${d(e.originalBuyPrice)}$`:"N/A"},{type:N.Text,outlined:!1,desktopColumns:"12",tabletColumns:"12",phoneColumns:"12",name:"takeProfitPrice",title:"Take Profit",readonly:!0,compute:e=>e.takeProfitPrice?`${d(e.takeProfitPrice)}$`:"N/A"},{type:N.Text,outlined:!1,desktopColumns:"12",tabletColumns:"12",phoneColumns:"12",name:"originalTakeProfitPrice",title:"Original Take Profit",readonly:!0,isVisible:e=>null!=e.originalTakeProfitPrice&&e.originalTakeProfitPrice!==e.takeProfitPrice,compute:e=>e.originalTakeProfitPrice?`${d(e.originalTakeProfitPrice)}$`:"N/A"},{type:N.Text,outlined:!1,desktopColumns:"12",tabletColumns:"12",phoneColumns:"12",name:"stopLossPrice",title:"Stop Loss",readonly:!0,compute:e=>e.stopLossPrice?`${d(e.stopLossPrice)}$`:"N/A"},{type:N.Text,outlined:!1,desktopColumns:"12",tabletColumns:"12",phoneColumns:"12",name:"originalStopLossPrice",title:"Original Stop Loss",readonly:!0,isVisible:e=>null!=e.originalStopLossPrice&&e.originalStopLossPrice!==e.stopLossPrice,compute:e=>e.originalStopLossPrice?`${d(e.originalStopLossPrice)}$`:"N/A"},{type:N.Text,outlined:!1,desktopColumns:"12",tabletColumns:"12",phoneColumns:"12",name:"pnlEntries",title:"Invested",readonly:!0,compute:e=>`${d(e.pnlEntries)}$`},{type:N.Text,outlined:!1,desktopColumns:"12",tabletColumns:"12",phoneColumns:"12",name:"profitLossPercentage",title:"PNL %",readonly:!0,trailingIcon:({data:e})=>e.profitLossPercentage<0?t(q,{sx:{color:"red"}}):t(Q,{sx:{color:"green"}}),compute:e=>`${e.profitLossPercentage>=0?"+":""}${e.profitLossPercentage.toFixed(2)}%`},{type:N.Text,outlined:!1,desktopColumns:"12",tabletColumns:"12",phoneColumns:"12",name:"pnlCost",title:"PNL $",readonly:!0,compute:e=>`${e.pnlCost>=0?"+":""}${d(e.pnlCost)}$`},{type:N.Text,outlined:!1,desktopColumns:"12",tabletColumns:"12",phoneColumns:"12",name:"totalEntries",title:"Total Entries",readonly:!0,isVisible:e=>null!=e.totalEntries&&e.totalEntries>1,compute:e=>String(e.totalEntries)},{type:N.Text,outlined:!1,desktopColumns:"12",tabletColumns:"12",phoneColumns:"12",name:"totalPartials",title:"Total Closes",readonly:!0,isVisible:e=>null!=e.totalPartials&&e.totalPartials>0,compute:e=>String(e.totalPartials)},{type:N.Component,sx:{mt:2},element:({payload:e})=>t(I,{variant:"outlined",onClick:e.handleClose,children:"Back"})}],Ct=[{label:"Details",icon:()=>t(V,{icon:ee,color:"#4caf50"}),action:"open-action"}],kt=({sx:e,mode:a})=>{const n=vt(a),[l,i]=L(null),{pickData:r,setOpen:s,render:c}=M({title:"Info",AfterTitle:({onClose:e})=>t(D,{direction:"row",gap:2,children:[t(R,{onClick:()=>o.layoutService.pickSignal(l.current.id),variant:"outlined",children:"Show Details"}),t($,{size:"small",onClick:e,children:t(T,{})})]}),payload:()=>({handleClose(){s(!1)}}),fields:xt,handler:()=>l.current,withActionButton:!1});return t(m,{children:[t(u,{sx:{display:"flex",alignItems:"stretch",justifyContent:"stretch",flexDirection:"column",background:"whitesmote",overflow:"clip",...e},children:t(j,{sx:{flex:1,background:"transparent !important"},rowColor:({status:e})=>"pending"===e?"#ffc40085":"transparent",hasMore:n.hasMore,loading:n.loading,onSkip:n.onSkip,data:n.data,columns:bt,rowActions:Ct,onRowClick:e=>{i(e),r(e.id)},onRowAction:(e,t)=>{"open-action"===e&&o.layoutService.pickSignal(t.id)}})}),c()]})},wt=[{type:N.Component,desktopColumns:"3",tabletColumns:"6",phoneColumns:"12",fieldRightMargin:"1",fieldBottomMargin:"1",element:({revenueCount:e})=>{const o=(null==e?void 0:e.thirtyOneDaysRevenue)||0,a=(null==e?void 0:e.thirtyOneDaysCount)||0,n=o<0?se.Red:o>0?se.Green:se.Orange;return t(Se,{style:{height:"max(calc((100dvh - 100px) / 3), 275px)"},value:o,backgroundColor:n,backgroundMode:ue.Semi,valueUnit:"USDT",headerLabel:"31 days",footerLabel:"Profit for 31 days",caption:`${a} ${Le(a,{one:"trade",many:"trades"})}`})}},{type:N.Component,desktopColumns:"3",tabletColumns:"6",phoneColumns:"12",fieldRightMargin:"1",fieldBottomMargin:"1",element:({revenueCount:e})=>{const o=(null==e?void 0:e.sevenDaysRevenue)||0,a=(null==e?void 0:e.sevenDaysCount)||0,n=o<0?se.Red:o>0?se.Green:se.Orange;return t(Se,{style:{height:"max(calc((100dvh - 100px) / 3), 275px)"},value:o,backgroundColor:n,backgroundMode:ue.Semi,valueUnit:"USDT",headerLabel:"7 days",footerLabel:"Profit for 7 days",caption:`${a} ${Le(a,{one:"trade",many:"trades"})}`})}},{type:N.Component,desktopColumns:"3",tabletColumns:"6",phoneColumns:"12",fieldRightMargin:"1",fieldBottomMargin:"1",element:({revenueCount:e})=>{const o=(null==e?void 0:e.yesterdayRevenue)||0,a=(null==e?void 0:e.yesterdayCount)||0,n=o<0?se.Red:o>0?se.Green:se.Orange;return t(Se,{style:{height:"max(calc((100dvh - 100px) / 3), 275px)"},value:o,backgroundColor:n,backgroundMode:ue.Semi,valueUnit:"USDT",headerLabel:"Yesterday",footerLabel:"Yesterday's profit",caption:`${a} ${Le(a,{one:"trade",many:"trades"})}`})}},{type:N.Component,desktopColumns:"3",tabletColumns:"6",phoneColumns:"12",fieldRightMargin:"1",fieldBottomMargin:"1",element:({revenueCount:e})=>{const o=(null==e?void 0:e.todayRevenue)||0,a=(null==e?void 0:e.todayCount)||0,n=o<0?se.Red:o>0?se.Green:se.Orange;return t(Se,{style:{height:"max(calc((100dvh - 100px) / 3), 275px)"},value:o,backgroundColor:n,backgroundMode:ue.Semi,valueUnit:"USDT",headerLabel:"Today",footerLabel:"Today's profit",caption:`${a} ${Le(a,{one:"trade",many:"trades"})}`})}},{type:N.Component,desktopColumns:"6",tabletColumns:"6",phoneColumns:"12",fieldRightMargin:"1",fieldBottomMargin:"1",element:({tradePerfomance:e})=>{const o=[{color:"#DD4049",label:"Failed",maxValue:Math.max(e.rejectedCount+1,1),value:()=>e.rejectedCount},{color:"#2EA96F",label:"Successful",maxValue:Math.max(e.rejectedCount+e.resolvedCount+2,2),value:()=>e.resolvedCount},{color:"#F3A43A",label:"Total",hidden:!0,maxValue:Math.max(e.total+3,3),value:()=>e.total}];return t(nt,{style:{height:"max(calc((100dvh - 100px) / 2), 450px)"},items:o,valueUnit:Le(Math.abs(e.resolvedCount),{one:"Successful signal",many:"Successful signals"}),value:e.resolvedCount})}},{type:N.Component,desktopColumns:"6",tabletColumns:"6",phoneColumns:"12",fieldRightMargin:"1",fieldBottomMargin:"1",element:({dailyTrades:e})=>t(yt,{sx:{height:"max(calc((100dvh - 100px) / 2), 450px)"},items:e})},{type:N.Component,desktopColumns:"6",tabletColumns:"6",phoneColumns:"12",fieldRightMargin:"1",fieldBottomMargin:"1",element:({successRate:e})=>{const o=e.map(({symbol:e,displayName:o,rejectedCloseCount:a,rejectedStopLossCount:n,resolvedCloseCount:l,resolvedTakeProfitCount:i})=>({title:o||e,description:e,avatar:()=>t(K,{symbol:e}),done:i,archive:n,waiting:a,inprogress:l})).filter(({done:e,archive:t,waiting:o,inprogress:a})=>{let n=!1;return n=n||!!e,n=n||!!t,n=n||!!o,n=n||!!a,n});return t(dt,{sx:{height:"max(calc((100dvh - 100px) / 2), 450px)"},items:o})}},{type:N.Component,desktopColumns:"6",tabletColumns:"6",phoneColumns:"12",fieldRightMargin:"1",fieldBottomMargin:"1",element:({payload:e})=>t(kt,{sx:{height:"max(calc((100dvh - 100px) / 2), 450px)"},mode:e.mode})}],Pt={rejectedCount:0,resolvedCount:0,total:0},St=[{action:"download-action",label:"Download",icon:()=>t(V,{icon:H,color:"#4caf50"})},{divider:!0},{action:"live-action",label:"Switch to LIVE",isVisible:e=>"backtest"===e,icon:()=>t(V,{icon:G,color:"#4caf50"})},{action:"backtest-action",label:"Switch to BACKTEST",isVisible:e=>"live"===e,icon:()=>t(V,{icon:_,color:"#4caf50"})},{divider:!0},{action:"update-now",label:"Refresh manually",icon:()=>t(V,{icon:X,color:"#4caf50"})}],Lt=[{type:W.Link,action:"back-action",label:t(Z,{sx:{display:"block"}})},{type:W.Link,action:"back-action",label:"Main"},{type:W.Link,action:"back-action",label:"Dashboard"},{type:W.Link,action:"back-action",compute:e=>`KPI ${String(e).toUpperCase()}`}],Mt=new F,Nt=({mode:e="backtest"})=>{const[a,{loading:n,execute:l}]=E(async()=>{const t=await(async e=>{const t=await o.symbolGlobalService.getSymbolList(),a=await oe(e),n=new Set(a.map(e=>e.symbol));return t.forEach(e=>n.delete(e)),t.concat(Array.from(n))})(e),a=await o.symbolGlobalService.getSymbolMap(),n=new Map,l=[],i={...Pt};let r={symbol:"TOTAL",todayRevenue:0,yesterdayRevenue:0,sevenDaysRevenue:0,thirtyOneDaysRevenue:0,todayCount:0,yesterdayCount:0,sevenDaysCount:0,thirtyOneDaysCount:0};await Promise.all(t.map(async t=>{var o;const[s=[],c,d,p]=await Promise.all([ie(t,e),le(t,e),ne(t,e),re(t,e)]);for(const e of s){const t=n.get(e.stamp)||{count:0,resolved:0,rejected:0};n.set(e.stamp,{count:t.count+e.count,resolved:t.resolved+e.resolved,rejected:t.rejected+e.rejected})}l.push({...c,symbol:t,displayName:(null==(o=a[t])?void 0:o.displayName)||t}),i.rejectedCount+=d.rejectedCount,i.resolvedCount+=d.resolvedCount,i.total+=d.total,r.todayRevenue+=p.todayRevenue,r.yesterdayRevenue+=p.yesterdayRevenue,r.sevenDaysRevenue+=p.sevenDaysRevenue,r.thirtyOneDaysRevenue+=p.thirtyOneDaysRevenue,r.todayCount+=p.todayCount,r.yesterdayCount+=p.yesterdayCount,r.sevenDaysCount+=p.sevenDaysCount,r.thirtyOneDaysCount+=p.thirtyOneDaysCount}));return{dailyTrades:Array.from(n).map(([e,{count:t,resolved:o,rejected:a}])=>({stamp:e,count:t,resolved:o,rejected:a})),successRate:l,tradePerfomance:i,revenueCount:r}},{onLoadStart:()=>o.layoutService.setModalLoader(!0),onLoadEnd:()=>o.layoutService.setModalLoader(!1),deps:[e]}),{execute:i}=O(async()=>{const t=await oe(e),a=new Blob([JSON.stringify(t,null,2)],{type:"application/json"}),n=URL.createObjectURL(a);o.layoutService.downloadFile(n,`signals_${e}_${Date.now()}.json`)},{onLoadStart:()=>o.layoutService.setAppbarLoader(!0),onLoadEnd:()=>o.layoutService.setAppbarLoader(!1)});z(()=>Mt.subscribe(l));return t(J,{children:[t(U,{items:Lt,actions:St,payload:e,onAction:async e=>{"download-action"===e&&await i(),"update-now"===e&&(oe.clear(),await Mt.next()),"live-action"===e&&o.routerService.push("/dashboard/live"),"backtest-action"===e&&o.routerService.push("/dashboard/backtest"),"back-action"===e&&o.routerService.push("/")}}),a?n?null:t(Y,{handler:a,payload:()=>({handleUpdate(){Mt.next()},mode:e}),fields:wt}):null]})};export{Nt as DashboardPage,Nt as default};
@@ -1 +1 @@
1
- import{b as e,f as t,a4 as i,i as n,a5 as a,a6 as o,x as r,y as l,E as s,A as d,G as c,H as p,Z as m,z as g,w as f,a7 as u,T as _,l as h,B as y,a8 as C,P as E,a9 as A,aa as x,a0 as b,D as w,ab as S,ac as M,ad as R,ae as v,a3 as T,af as O,ag as D,ah as N}from"./index-fsQnmonU.js";import{h as L}from"./hasRouteMatch-DHHNIPte.js";import{P as k}from"./PictureAsPdfOutlined-CrADy_Z6.js";import{C as I,R as B}from"./Refresh-BnizeO5c.js";import{K as P}from"./KeyboardArrowLeft-Cesmg5AP.js";const W=e(t("path",{d:"M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"}),"Settings"),F=e(t("path",{d:"M9.78 18.65l.28-4.23 7.68-6.92c.34-.31-.07-.46-.52-.19L7.74 13.3 3.64 12c-.88-.25-.89-.86.2-1.3l15.97-6.16c.73-.33 1.43.18 1.15 1.3l-2.72 12.81c-.19.91-.74 1.13-1.5.71L12.6 16.3l-1.99 1.93c-.23.23-.42.42-.83.42z"}),"Telegram"),V=144,G=[{type:l.Link,action:"back-action",label:t(P,{sx:{display:"block"}})},{type:l.Link,action:"back-action",label:"Dashboard"},{type:l.Link,action:"back-action",label:"Performance"},{type:l.Button,action:"download-pdf",label:"Download PDF",icon:k},{type:l.Fab,action:"setup-action",label:"Settings",icon:W}],K=[{action:"setup-action",label:"Settings",icon:()=>t(s,{icon:W,color:"#4caf50"})},{divider:!0},{action:"download-json",label:"Download JSON",icon:()=>t(s,{icon:d,color:"#4caf50"})},{action:"download-markdown",label:"Download Markdown",icon:()=>t(s,{icon:c,color:"#4caf50"})},{action:"download-pdf",label:"Download PDF",icon:()=>t(s,{icon:p,color:"#4caf50"})},{divider:!0},{action:"update-now",label:"Refresh",icon:()=>t(s,{icon:B,color:"#4caf50"})}],X=({name:e,title:t})=>({type:m.Box,sx:{display:"grid",gridTemplateColumns:"auto 1fr auto",paddingBottom:"8px",alignItems:"center"},fields:[{type:m.Typography,fieldBottomMargin:"0",typoVariant:"body1",placeholder:t},{type:m.Div},{type:m.Typography,typoVariant:"h6",style:{textAlign:"right",fontWeight:"bold"},fieldBottomMargin:"0",fieldRightMargin:"0",compute:({[e]:t})=>t||0===t?"totalEvents"===e?Number(t).toFixed(2):"totalDuration"===e||"avgDuration"===e?`${Number(t).toFixed(2)} ${C("ms")}`:t:"-",name:e}]}),H=({name:e,title:i})=>({type:m.Box,sx:{display:"grid",gridTemplateColumns:"auto 1fr auto",paddingBottom:"8px",alignItems:"center"},fields:[{type:m.Typography,fieldBottomMargin:"0",typoVariant:"body1",placeholder:i},{type:m.Div},{type:m.Component,style:{textAlign:"right",fontWeight:"bold"},fieldBottomMargin:"0",fieldRightMargin:"0",element:({[e]:i})=>{const n="github"===e,a=n?"#6A1B9A":"#24A1DE";return t(b,{size:"medium",disabled:!i,startIcon:t(u,{sx:{background:"#eee",height:"25px",width:"25px"},children:t(n?x:F,{sx:{color:a,fontSize:"16px !important",transform:"translate(-0.5px, 0px)"}})}),sx:{background:"white",color:a,"&:hover":{background:"white",color:a}},onClick:()=>{if(n)A(String(i));else{const e=String(i).replaceAll("@","");A(`https://t.me/${e}`)}},children:C(i?"Open":"Not configured")})},name:e}]}),U=[{type:m.Box,sx:{display:"flex",alignItems:"center",justifyContent:"center",height:"80vh"},child:{type:m.Layout,customLayout:({children:e})=>t(E,{sx:{width:"335px"},children:e}),fields:[{type:m.Component,element:()=>t(y,{sx:{background:e=>h(e.palette.background.paper,.13),display:"flex",alignItems:"center",flexDirection:"column",gap:1,p:1},children:[t(u,{sx:{height:V,width:V,marginTop:"36px",marginBottom:"36px"},src:"/logo/icon512_maskable.png"}),t(_,{variant:"subtitle2",sx:{opacity:.5},children:"Backtest Kit"})]})},{type:m.Layout,customLayout:({children:e})=>t(y,{p:1,children:e}),fields:[{type:m.Div,style:{height:"2px"}},{type:m.Div,style:{height:"12px"}},X({name:"totalEvents",title:C("Total events")}),X({name:"totalDuration",title:C("Total time")}),X({name:"avgDuration",title:C("Average time")}),H({name:"channel",title:C("Channel")}),H({name:"github",title:"GitHub"})]}]}}],Y=new o,j=new o,z=({title:e,name:t,idx:i})=>({type:m.Box,sx:{display:"grid",gridTemplateColumns:"auto 1fr 125px",pointerEvents:"none",alignItems:"center",background:e=>i%2==0?O(e.palette.getContrastText(e.palette.background.paper),.04):"transparent",padding:"8px",paddingLeft:"8px",paddingRight:"8px"},fields:[{type:m.Typography,style:{fontSize:"12px"},typoVariant:"subtitle2",fieldBottomMargin:"0",placeholder:e},{type:m.Box,sx:{minWidth:"8px"}},{type:m.Text,readonly:!0,outlined:i%2==0,name:t,compute(e){const i=D.get(e,t);return String(i)},title:"",fieldBottomMargin:"0",fieldRightMargin:"0"}]}),$=[{type:m.Box,sx:{maxWidth:420,minWidth:340},fields:[{type:m.Box,sx:{display:"grid",gridTemplateColumns:"auto 1fr auto auto",alignItems:"center",paddingTop:"4px",paddingBottom:"4px",paddingLeft:"8px",paddingRight:"4px"},fields:[{type:m.Typography,style:{opacity:.5},fieldBottomMargin:"0",typoVariant:"subtitle2",placeholder:"Runtime Configuration"},{type:m.Box},{type:m.Icon,fieldBottomMargin:"0",fieldRightMargin:"0",icon:w,async click(e,t,i,n){await j.next(),await n.handleDownloadConfig()}},{type:m.Icon,fieldBottomMargin:"0",fieldRightMargin:"0",icon:S,click:()=>j.next()}]},{type:m.Layout,customLayout:({children:e})=>t(y,{sx:{overflow:"clip",overflowY:"auto",marginBottom:"16px",maxHeight:{xs:"min(365px, 80vh - 235px)",sm:"min(475px, 80vh - 235px)"},width:"100%"},children:e}),fields:[z({idx:0,title:"CC_SCHEDULE_AWAIT_MINUTES",name:"config.CC_SCHEDULE_AWAIT_MINUTES",description:T.newline("Time to wait for scheduled signal to activate (in minutes).","If signal does not activate within this time, it will be cancelled.")}),z({idx:1,title:"CC_AVG_PRICE_CANDLES_COUNT",name:"config.CC_AVG_PRICE_CANDLES_COUNT",description:T.newline("Number of candles to use for average price calculation (VWAP).","Default: 5 candles (last 5 minutes when using 1m interval).")}),z({idx:2,title:"CC_PERCENT_SLIPPAGE",name:"config.CC_PERCENT_SLIPPAGE",description:T.newline("Slippage percentage applied to entry and exit prices.","Simulates market impact and order book depth.","Applied twice (entry and exit) for realistic execution simulation.","Default: 0.1% per transaction.")}),z({idx:3,title:"CC_PERCENT_FEE",name:"config.CC_PERCENT_FEE",description:T.newline("Fee percentage charged per transaction.","Applied twice (entry and exit) for total fee calculation.","Default: 0.1% per transaction (total 0.2%).")}),z({idx:4,title:"CC_MIN_TAKEPROFIT_DISTANCE_PERCENT",name:"config.CC_MIN_TAKEPROFIT_DISTANCE_PERCENT",description:T.newline("Minimum TakeProfit distance from priceOpen (percentage).","Must be greater than (slippage + fees) to ensure profitable trades.","Default: 0.5% (covers all costs + minimum profit margin).")}),z({idx:5,title:"CC_MIN_STOPLOSS_DISTANCE_PERCENT",name:"config.CC_MIN_STOPLOSS_DISTANCE_PERCENT",description:T.newline("Minimum StopLoss distance from priceOpen (percentage).","Prevents signals from being immediately stopped out due to price volatility.","Default: 0.5% (buffer to avoid instant stop loss on normal market fluctuations).")}),z({idx:6,title:"CC_MAX_STOPLOSS_DISTANCE_PERCENT",name:"config.CC_MAX_STOPLOSS_DISTANCE_PERCENT",description:T.newline("Maximum StopLoss distance from priceOpen (percentage).","Prevents catastrophic losses from extreme StopLoss values.","Default: 20% (one signal cannot lose more than 20% of position).")}),z({idx:7,title:"CC_MAX_SIGNAL_LIFETIME_MINUTES",name:"config.CC_MAX_SIGNAL_LIFETIME_MINUTES",description:T.newline("Maximum signal lifetime in minutes.","Also used as the default when minuteEstimatedTime is not provided in ISignalDto.","Prevents eternal signals that block risk limits for weeks/months.","Use Infinity to allow signals to live indefinitely (until TP/SL or explicit close).","Default: 1440 minutes (1 day).")}),z({idx:8,title:"CC_MAX_SIGNAL_GENERATION_SECONDS",name:"config.CC_MAX_SIGNAL_GENERATION_SECONDS",description:T.newline("Maximum time allowed for signal generation (in seconds).","Prevents long-running or stuck signal generation routines from blocking execution or consuming resources indefinitely.","If generation exceeds this threshold the attempt should be aborted, logged and optionally retried.","Default: 180 seconds (3 minutes).")}),z({idx:9,title:"CC_GET_CANDLES_RETRY_COUNT",name:"config.CC_GET_CANDLES_RETRY_COUNT",description:T.newline("Number of retries for getCandles function.","Default: 3 retries.")}),z({idx:10,title:"CC_GET_CANDLES_RETRY_DELAY_MS",name:"config.CC_GET_CANDLES_RETRY_DELAY_MS",description:T.newline("Delay between retries for getCandles function (in milliseconds).","Default: 5000 ms (5 seconds).")}),z({idx:11,title:"CC_MAX_CANDLES_PER_REQUEST",name:"config.CC_MAX_CANDLES_PER_REQUEST",description:T.newline("Maximum number of candles to request per single API call.","If a request exceeds this limit, data will be fetched using pagination.","Default: 1000 candles per request.")}),z({idx:12,title:"CC_GET_CANDLES_PRICE_ANOMALY_THRESHOLD_FACTOR",name:"config.CC_GET_CANDLES_PRICE_ANOMALY_THRESHOLD_FACTOR",description:T.newline("Maximum allowed deviation factor for price anomaly detection.","Price should not be more than this factor lower than reference price.","Example: BTC at $50,000 median → threshold $50 (catches $0.01-1 anomalies).")}),z({idx:13,title:"CC_GET_CANDLES_MIN_CANDLES_FOR_MEDIAN",name:"config.CC_GET_CANDLES_MIN_CANDLES_FOR_MEDIAN",description:T.newline("Minimum number of candles required for reliable median calculation.","Below this threshold, use simple average instead of median.","Example: 3 candles = 12 points (use average), 5 candles = 20 points (use median).")}),z({idx:14,title:"CC_REPORT_SHOW_SIGNAL_NOTE",name:"config.CC_REPORT_SHOW_SIGNAL_NOTE",description:T.newline("Controls visibility of signal notes in markdown report tables.",'When enabled, the "Note" column will be displayed in all markdown reports (backtest, live, schedule, risk, etc.)',"Default: false (notes are hidden to reduce table width and improve readability).")}),z({idx:15,title:"CC_BREAKEVEN_THRESHOLD",name:"config.CC_BREAKEVEN_THRESHOLD",description:T.newline("Breakeven threshold percentage - minimum profit distance from entry to enable breakeven.","When price moves this percentage in profit direction, stop-loss can be moved to entry (breakeven).","Default: 0.2% (additional buffer above costs to ensure no loss when moving to breakeven).")}),z({idx:16,title:"CC_ORDER_BOOK_TIME_OFFSET_MINUTES",name:"config.CC_ORDER_BOOK_TIME_OFFSET_MINUTES",description:T.newline("Time offset in minutes for order book fetching.","Subtracts this amount from the current time when fetching order book data.","This helps get a more stable snapshot of the order book by avoiding real-time volatility.","Default: 10 minutes.")}),z({idx:17,title:"CC_ORDER_BOOK_MAX_DEPTH_LEVELS",name:"config.CC_ORDER_BOOK_MAX_DEPTH_LEVELS",description:T.newline("Maximum depth levels for order book fetching.","Specifies how many price levels to fetch from both bids and asks.","Default: 20 levels.")}),z({idx:18,title:"CC_AGGREGATED_TRADES_MAX_MINUTES",name:"config.CC_AGGREGATED_TRADES_MAX_MINUTES",description:T.newline("Maximum minutes of aggregated trades to fetch when no limit is provided.","If limit is not specified, the system will fetch aggregated trades for this many minutes starting from the current time minus the offset.","Binance requirement.")}),z({idx:19,title:"CC_MAX_BACKTEST_MARKDOWN_ROWS",name:"config.CC_MAX_BACKTEST_MARKDOWN_ROWS",description:T.newline("Maximum number of events to keep in backtest markdown report storage.","Older events are removed (FIFO) when this limit is exceeded.","Default: 250 events.")}),z({idx:20,title:"CC_MAX_BREAKEVEN_MARKDOWN_ROWS",name:"config.CC_MAX_BREAKEVEN_MARKDOWN_ROWS",description:T.newline("Maximum number of events to keep in breakeven markdown report storage.","Older events are removed (FIFO) when this limit is exceeded.","Default: 250 events.")}),z({idx:21,title:"CC_MAX_HEATMAP_MARKDOWN_ROWS",name:"config.CC_MAX_HEATMAP_MARKDOWN_ROWS",description:T.newline("Maximum number of events to keep in heatmap markdown report storage.","Older events are removed (FIFO) when this limit is exceeded.","Default: 250 events.")}),z({idx:22,title:"CC_MAX_HIGHEST_PROFIT_MARKDOWN_ROWS",name:"config.CC_MAX_HIGHEST_PROFIT_MARKDOWN_ROWS",description:T.newline("Maximum number of events to keep in highest profit markdown report storage.","Older events are removed (FIFO) when this limit is exceeded.","Default: 250 events.")}),z({idx:23,title:"CC_MAX_MAX_DRAWDOWN_MARKDOWN_ROWS",name:"config.CC_MAX_MAX_DRAWDOWN_MARKDOWN_ROWS",description:T.newline("Maximum number of events to keep in max drawdown markdown report storage.","Older events are removed (FIFO) when this limit is exceeded.","Default: 250 events.")}),z({idx:24,title:"CC_MAX_LIVE_MARKDOWN_ROWS",name:"config.CC_MAX_LIVE_MARKDOWN_ROWS",description:T.newline("Maximum number of events to keep in live markdown report storage.","Older events are removed (FIFO) when this limit is exceeded.","Default: 250 events.")}),z({idx:25,title:"CC_MAX_PARTIAL_MARKDOWN_ROWS",name:"config.CC_MAX_PARTIAL_MARKDOWN_ROWS",description:T.newline("Maximum number of events to keep in partial markdown report storage.","Older events are removed (FIFO) when this limit is exceeded.","Default: 250 events.")}),z({idx:26,title:"CC_MAX_RISK_MARKDOWN_ROWS",name:"config.CC_MAX_RISK_MARKDOWN_ROWS",description:T.newline("Maximum number of events to keep in risk markdown report storage.","Older events are removed (FIFO) when this limit is exceeded.","Default: 250 events.")}),z({idx:27,title:"CC_MAX_SCHEDULE_MARKDOWN_ROWS",name:"config.CC_MAX_SCHEDULE_MARKDOWN_ROWS",description:T.newline("Maximum number of events to keep in schedule markdown report storage.","Older events are removed (FIFO) when this limit is exceeded.","Default: 250 events.")}),z({idx:28,title:"CC_MAX_STRATEGY_MARKDOWN_ROWS",name:"config.CC_MAX_STRATEGY_MARKDOWN_ROWS",description:T.newline("Maximum number of events to keep in strategy markdown report storage.","Older events are removed (FIFO) when this limit is exceeded.","Default: 250 events.")}),z({idx:29,title:"CC_MAX_SYNC_MARKDOWN_ROWS",name:"config.CC_MAX_SYNC_MARKDOWN_ROWS",description:T.newline("Maximum number of events to keep in sync markdown report storage.","Older events are removed (FIFO) when this limit is exceeded.","Default: 250 events.")}),z({idx:30,title:"CC_WALKER_MARKDOWN_TOP_N",name:"config.CC_WALKER_MARKDOWN_TOP_N",description:T.newline("Number of top strategies to include in the walker comparison table.","Default: 10 strategies.")}),z({idx:31,title:"CC_MAX_PERFORMANCE_MARKDOWN_ROWS",name:"config.CC_MAX_PERFORMANCE_MARKDOWN_ROWS",description:T.newline("Maximum number of performance metric events to keep in storage.","Older events are removed when this limit is exceeded.","Higher than other report event limits because performance metrics are lightweight and benefit from larger sample sizes for accurate statistical analysis.","Default: 10000 events.")}),z({idx:32,title:"CC_MAX_NOTIFICATIONS",name:"config.CC_MAX_NOTIFICATIONS",description:T.newline("Maximum number of notifications to keep in storage.","Older notifications are removed when this limit is exceeded.","Default: 500 notifications.")}),z({idx:33,title:"CC_MAX_SIGNALS",name:"config.CC_MAX_SIGNALS",description:T.newline("Maximum number of signals to keep in storage.","Older signals are removed when this limit is exceeded.","Default: 50 signals.")}),z({idx:34,title:"CC_MAX_LOG_LINES",name:"config.CC_MAX_LOG_LINES",description:T.newline("Maximum number of log lines to keep in storage.","Older log lines are removed when this limit is exceeded.","This helps prevent unbounded log growth which can consume memory and degrade performance over time.","Default: 1000 log lines.")}),z({idx:35,title:"CC_ENABLE_CANDLE_FETCH_MUTEX",name:"config.CC_ENABLE_CANDLE_FETCH_MUTEX",description:T.newline("Enables mutex locking for candle fetching to prevent concurrent fetches of the same candles.","This can help avoid redundant API calls and ensure data consistency when multiple processes/threads attempt to fetch candles simultaneously.","Default: true (mutex locking enabled for candle fetching).")}),z({idx:36,title:"CC_ENABLE_BACKTEST_PARALLEL_SPIN",name:"config.CC_ENABLE_BACKTEST_PARALLEL_SPIN",description:T.newline("Enables cooperative interleaving of concurrently running backtests after each candle fetch.","Hands the event loop to a peer backtest waiting on the same mutex, so multiple parallel Backtest.run / Walker workloads progress in round-robin fashion instead of one monopolizing the event loop until completion.","Default: true (parallel backtests are interleaved on each candle fetch boundary).")}),z({idx:37,title:"CC_ENABLE_DCA_EVERYWHERE",name:"config.CC_ENABLE_DCA_EVERYWHERE",description:T.newline("Enables DCA (Dollar-Cost Averaging) logic even if antirecord is not broken.","Allows to commitAverageBuy if currentPrice is not the lowest price since entry, but still lower than priceOpen.","Default: false (DCA logic enabled only when antirecord is broken).")}),z({idx:38,title:"CC_ENABLE_PPPL_EVERYWHERE",name:"config.CC_ENABLE_PPPL_EVERYWHERE",description:T.newline("Enables PPPL (Partial Profit, Partial Loss) logic even if this breaks a direction of exits.","Allows to take partial profit or loss on a position even if it results in a mix of profit and loss exits.","Default: false (PPPL logic is only applied when it does not break the direction of exits, ensuring clearer profit/loss outcomes).")}),z({idx:39,title:"CC_ENABLE_LONG_SIGNAL",name:"config.CC_ENABLE_LONG_SIGNAL",description:T.newline("Enables long signals in strategies that are primarily designed for short signals.","This allows the strategy to generate and manage long signals in addition to short signals, even if the original design was focused on short trading.","Default: false (long signals are only enabled in strategies that are designed for them, ensuring strategy logic is aligned with signal types).")}),z({idx:40,title:"CC_ENABLE_SHORT_SIGNAL",name:"config.CC_ENABLE_SHORT_SIGNAL",description:T.newline("Enables short signals in strategies that are primarily designed for long signals.","This allows the strategy to generate and manage short signals in addition to long signals, even if the original design was focused on long trading.")}),z({idx:41,title:"CC_ENABLE_TRAILING_EVERYWHERE",name:"config.CC_ENABLE_TRAILING_EVERYWHERE",description:T.newline("Enables trailing logic (Trailing Take / Trailing Stop) without requiring absorption conditions.","Allows trailing mechanisms to be activated regardless of whether absorption has been detected.","Default: false (trailing logic is applied only when absorption conditions are met).")}),z({idx:42,title:"CC_POSITION_ENTRY_COST",name:"config.CC_POSITION_ENTRY_COST",description:T.newline("Cost of entering a position (in USD).","This is used as a default value for calculating position size and risk management when cost data is not provided by the strategy.","Default: $100 per position.")})]},{type:m.Box,sx:{p:1},child:{type:m.Button,fieldBottomMargin:"0",fieldRightMargin:"0",buttonVariant:"contained",title:"Download",click:async(e,t,i,n)=>{await j.next(),await n.handleDownloadConfig()},icon:w}}]}],q=[{type:m.Group,fieldRightMargin:"1",phoneColumns:"12",tabletColumns:"12",desktopColumns:"6",fields:[{type:m.Paper,fieldBottomMargin:"1",fields:[{type:m.Box,sx:{display:"grid",gridTemplateColumns:"auto 1fr auto",alignItems:"center"},fields:[{type:m.Box,sx:{display:"grid",gridTemplateColumns:"1fr"},fields:[{type:m.Typography,fieldBottomMargin:"1",typoVariant:"h6",placeholder:"Running mode"},{type:m.Typography,fieldBottomMargin:"1",isVisible:({running_mode:e})=>"backtest"===e,style:{color:"orange"},typoVariant:"body1",placeholder:"Historical data processing"},{type:m.Typography,fieldBottomMargin:"1",isVisible:({running_mode:e})=>"live"===e,style:{color:"green"},typoVariant:"body1",placeholder:"Real-time exchange integration"},{type:m.Typography,fieldBottomMargin:"1",isVisible:({running_mode:e})=>"none"===e,style:{color:"red"},typoVariant:"body1",placeholder:"UI only"}]},{type:m.Box},{type:m.Component,fieldBottomMargin:"0",element:({_fieldData:e,payload:i})=>t(M,{noBadge:!0,size:"small",sx:{transform:"translate(10px, -28px)",opacity:"0.5",transition:"opacity 500ms","&:hover":{opacity:"1.0"}},oneSx:{padding:"0 !important"},fields:$,closeSubject:j,payload:i,handler:()=>e,children:t(W,{})})}]},{type:m.Radio,readonly:!0,fieldBottomMargin:"0",name:"running_mode",radioValue:"backtest",title:"Historical data"},{type:m.Radio,readonly:!0,fieldBottomMargin:"0",name:"running_mode",radioValue:"live",title:"Real-time"},{type:m.Radio,readonly:!0,fieldBottomMargin:"0",name:"running_mode",radioValue:"none",title:"Frontend only"}]},{type:m.Paper,fieldBottomMargin:"1",innerPadding:"0px",fields:[{type:m.Box,sx:{paddingTop:"16px",paddingLeft:"16px",paddingRight:"16px"},fields:[{type:m.Typography,fieldBottomMargin:"1",typoVariant:"h6",placeholder:"Log mode"},{type:m.Typography,fieldBottomMargin:"2",style:{opacity:.5},typoVariant:"caption",placeholder:"Logs take up disk space but are needed for debugging"}]},...[{title:"JSONL files",description:"Files processed by Claude Code, HuggingFace, Parquet",name:"recent_enabled"},{title:"Markdown files",description:"Human-readable files. Useful when running without a GUI",name:"markdown_enabled"},{title:"Dump files",description:"Conversation dump with the AI agent used for trading signals",name:"dump_enabled"}].map(({name:e,title:t,description:i},n)=>(({title:e,description:t,name:i,idx:n})=>({type:m.Box,sx:{display:"grid",alignItems:"center",gridTemplateColumns:"1fr auto",paddingLeft:"16px",paddingRight:"16px",paddingTop:"4px",paddingBottom:"4px",background:e=>n%2==0?O(e.palette.getContrastText(e.palette.background.paper),.04):"transparent"},fields:[{type:m.Box,fields:[{type:m.Typography,fieldBottomMargin:"0",typoVariant:"body1",placeholder:e},{type:m.Typography,fieldBottomMargin:"0",style:{opacity:.5},typoVariant:"caption",placeholder:t}]},{type:m.Checkbox,readonly:!0,fieldBottomMargin:"0",fieldRightMargin:"0",title:"",name:i}]}))({name:e,title:t,description:i,idx:n}))]},{type:m.Paper,fieldBottomMargin:"1",fields:[{type:m.Typography,fieldBottomMargin:"1",typoVariant:"h6",placeholder:"User interface"},{type:m.Switch,readonly:!0,fieldBottomMargin:"0",title:"Save notifications",name:"notification_enabled"},{type:m.Typography,fieldBottomMargin:"1",style:{opacity:.5},typoVariant:"caption",placeholder:"Event history is saved to disk"},{type:m.Switch,readonly:!0,fieldBottomMargin:"0",title:"Save signals",name:"storage_enabled"},{type:m.Typography,fieldBottomMargin:"0",style:{opacity:.5},typoVariant:"caption",placeholder:"Latest signal state is saved to disk"}]}]},{type:m.Group,fieldRightMargin:"1",fieldBottomMargin:"2",phoneColumns:"12",tabletColumns:"12",desktopColumns:"6",fields:[{type:m.Paper,fieldBottomMargin:"1",fields:[{type:m.Typography,fieldBottomMargin:"3",typoVariant:"h6",placeholder:"Strategy"},{type:m.Typography,placeholder:"Broker"},{type:m.Outline,fieldBottomMargin:"3",fields:[{type:m.Checkbox,readonly:!0,fieldBottomMargin:"0",title:"Connected to mainnet (production)",name:"broker_enabled"}]},{type:m.Typography,placeholder:"Market signals"},{type:m.Outline,fieldBottomMargin:"4",fields:[{type:m.Checkbox,readonly:!0,fieldBottomMargin:"0",title:"Use BM25 for RAG",name:"memory_enabled"},{type:m.Checkbox,readonly:!0,fieldBottomMargin:"0",title:"Use stateful strategies",name:"state_enabled"},{type:m.Checkbox,readonly:!0,fieldBottomMargin:"0",title:"Save previous signal",name:"recent_enabled"}]}]},{type:m.Paper,fieldBottomMargin:"1",fields:[{type:m.Typography,fieldBottomMargin:"2",typoVariant:"h6",placeholder:"Risk management"},{type:m.Typography,fieldBottomMargin:"3",style:{opacity:.5},typoVariant:"body1",placeholder:"Use LONG or SHORT positions depending on market conditions"},{type:m.Checkbox,readonly:!0,fieldBottomMargin:"0",title:"Enable LONG",name:"enable_long"},{type:m.Checkbox,readonly:!0,fieldBottomMargin:"1",title:"Enable SHORT",name:"enable_short"}]}]},{type:m.Component,desktopHidden:!0,fieldBottomMargin:"5",fieldRightMargin:"1",element:({payload:e})=>{const i=R();return t(v,{variant:"contained",size:"large",startIcon:t(B,{}),onClick:async()=>{await e.handleReload(),i()},children:"Refresh"})}}],J=[{type:l.Link,action:"back-action",label:t(P,{sx:{display:"block"}})},{type:l.Link,action:"back-action",label:"Dashboard"},{type:l.Link,action:"back-action",label:"Performance"},{type:l.Link,action:"back-action",label:"Settings"},{type:l.Button,action:"update-now",label:"Refresh",icon:B}],Q=[{action:"update-now",label:"Refresh",icon:()=>t(s,{icon:B,color:"#4caf50"})}],Z=new o,ee=async()=>{n.setupViewService.getSetupData.clear(),await Z.next()},te=async()=>{const{config:e}=await n.setupViewService.getSetupData(),t=new Blob([JSON.stringify(e,null,2)],{type:"application/json"}),i=URL.createObjectURL(t);n.layoutService.downloadFile(i,`config_${Date.now()}.json`)},ie=[{id:"search",element:()=>{const[e,{execute:o,loading:l}]=i(async()=>await n.performanceViewService.getPerformanceData(),{onLoadStart:()=>n.layoutService.setAppbarLoader(!0),onLoadEnd:()=>n.layoutService.setAppbarLoader(!1)});a(()=>Y.subscribe(o));const[s,{execute:d,loading:c}]=i(async()=>await n.environmentViewService.getEnvironmentData());a(()=>Y.subscribe(d));return t(I,{children:[t(r,{items:G,actions:K,onAction:async e=>{"back-action"===e&&n.routerService.push("/main"),"setup-action"===e&&n.routerService.push("/about/setup"),"update-now"===e&&await(async()=>{n.performanceViewService.getPerformanceData.clear(),n.performanceViewService.getPerformanceReport.clear(),n.environmentViewService.getEnvironmentData.clear(),await Y.next()})(),"download-markdown"===e&&await(async()=>{const e=await n.performanceViewService.getPerformanceReport(),t=new Blob([e],{type:"text/plain"}),i=URL.createObjectURL(t);n.layoutService.downloadFile(i,`performance_${Date.now()}.md`)})(),"download-pdf"===e&&await(async()=>{const e=await n.performanceViewService.getPerformanceReport();await f(e)})(),"download-json"===e&&await(async()=>{const e=await n.performanceViewService.getPerformanceData(),t=JSON.stringify(e,null,2),i=new Blob([t],{type:"text/plain"}),a=URL.createObjectURL(i);n.layoutService.downloadFile(a,`performance_${Date.now()}.json`)})()}}),e&&s?l||c?null:t(g,{handler:()=>{const t=e.totalEvents>0?e.totalDuration/e.totalEvents:0;return{channel:s.telegram_channel,github:"https://github.com/tripolskypetr/backtest-kit",totalEvents:e.totalEvents,totalDuration:e.totalDuration,avgDuration:t}},fields:U}):null]})},isActive:e=>L(["/about"],e)},{id:"main",element:()=>{const[e,{execute:o,loading:l}]=i(async()=>await n.setupViewService.getSetupData(),{onLoadStart:()=>n.layoutService.setAppbarLoader(!0),onLoadEnd:()=>n.layoutService.setAppbarLoader(!1)});a(()=>Z.subscribe(o));return t(I,{children:[t(r,{items:J,actions:Q,onAction:async e=>{"back-action"===e&&n.routerService.push("/about"),"update-now"===e&&await ee()}}),e?l?null:t(g,{handler:e,payload:()=>({handleReload:ee,handleDownloadConfig:te}),fields:q}):null]})},isActive:e=>L(["/about/setup"],e)}],ne=()=>t(N,{history:n.routerService,onLoadStart:()=>n.layoutService.setAppbarLoader(!0),onLoadEnd:()=>n.layoutService.setAppbarLoader(!1),routes:ie});export{ne as AboutPage,ne as default};
1
+ import{b as e,f as t,x as i,i as n,X as a,a8 as o,O as r,R as l,Z as s,Y as d,$ as c,a0 as p,a2 as m,W as g,w as f,a9 as u,T as _,l as h,B as y,aa as C,P as E,ab as A,ac as x,a4 as b,D as w,ad as S,ae as M,af as R,ag as v,a7 as T,ah as O,ai as D,aj as N}from"./index-DMjmH2fE.js";import{h as L}from"./hasRouteMatch-DTIimlwJ.js";import{P as k}from"./PictureAsPdfOutlined-DWr8-Wu_.js";import{C as I,R as B}from"./Refresh-DDS1Dl8a.js";import{K as P}from"./KeyboardArrowLeft-uHSkdvcT.js";const W=e(t("path",{d:"M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"}),"Settings"),F=e(t("path",{d:"M9.78 18.65l.28-4.23 7.68-6.92c.34-.31-.07-.46-.52-.19L7.74 13.3 3.64 12c-.88-.25-.89-.86.2-1.3l15.97-6.16c.73-.33 1.43.18 1.15 1.3l-2.72 12.81c-.19.91-.74 1.13-1.5.71L12.6 16.3l-1.99 1.93c-.23.23-.42.42-.83.42z"}),"Telegram"),V=144,G=[{type:l.Link,action:"back-action",label:t(P,{sx:{display:"block"}})},{type:l.Link,action:"back-action",label:"Dashboard"},{type:l.Link,action:"back-action",label:"Performance"},{type:l.Button,action:"download-pdf",label:"Download PDF",icon:k},{type:l.Fab,action:"setup-action",label:"Settings",icon:W}],K=[{action:"setup-action",label:"Settings",icon:()=>t(s,{icon:W,color:"#4caf50"})},{divider:!0},{action:"download-json",label:"Download JSON",icon:()=>t(s,{icon:d,color:"#4caf50"})},{action:"download-markdown",label:"Download Markdown",icon:()=>t(s,{icon:c,color:"#4caf50"})},{action:"download-pdf",label:"Download PDF",icon:()=>t(s,{icon:p,color:"#4caf50"})},{divider:!0},{action:"update-now",label:"Refresh",icon:()=>t(s,{icon:B,color:"#4caf50"})}],X=({name:e,title:t})=>({type:m.Box,sx:{display:"grid",gridTemplateColumns:"auto 1fr auto",paddingBottom:"8px",alignItems:"center"},fields:[{type:m.Typography,fieldBottomMargin:"0",typoVariant:"body1",placeholder:t},{type:m.Div},{type:m.Typography,typoVariant:"h6",style:{textAlign:"right",fontWeight:"bold"},fieldBottomMargin:"0",fieldRightMargin:"0",compute:({[e]:t})=>t||0===t?"totalEvents"===e?Number(t).toFixed(2):"totalDuration"===e||"avgDuration"===e?`${Number(t).toFixed(2)} ${C("ms")}`:t:"-",name:e}]}),H=({name:e,title:i})=>({type:m.Box,sx:{display:"grid",gridTemplateColumns:"auto 1fr auto",paddingBottom:"8px",alignItems:"center"},fields:[{type:m.Typography,fieldBottomMargin:"0",typoVariant:"body1",placeholder:i},{type:m.Div},{type:m.Component,style:{textAlign:"right",fontWeight:"bold"},fieldBottomMargin:"0",fieldRightMargin:"0",element:({[e]:i})=>{const n="github"===e,a=n?"#6A1B9A":"#24A1DE";return t(b,{size:"medium",disabled:!i,startIcon:t(u,{sx:{background:"#eee",height:"25px",width:"25px"},children:t(n?x:F,{sx:{color:a,fontSize:"16px !important",transform:"translate(-0.5px, 0px)"}})}),sx:{background:"white",color:a,"&:hover":{background:"white",color:a}},onClick:()=>{if(n)A(String(i));else{const e=String(i).replaceAll("@","");A(`https://t.me/${e}`)}},children:C(i?"Open":"Not configured")})},name:e}]}),U=[{type:m.Box,sx:{display:"flex",alignItems:"center",justifyContent:"center",height:"80vh"},child:{type:m.Layout,customLayout:({children:e})=>t(E,{sx:{width:"335px"},children:e}),fields:[{type:m.Component,element:()=>t(y,{sx:{background:e=>h(e.palette.background.paper,.13),display:"flex",alignItems:"center",flexDirection:"column",gap:1,p:1},children:[t(u,{sx:{height:V,width:V,marginTop:"36px",marginBottom:"36px"},src:"/logo/icon512_maskable.png"}),t(_,{variant:"subtitle2",sx:{opacity:.5},children:"Backtest Kit"})]})},{type:m.Layout,customLayout:({children:e})=>t(y,{p:1,children:e}),fields:[{type:m.Div,style:{height:"2px"}},{type:m.Div,style:{height:"12px"}},X({name:"totalEvents",title:C("Total events")}),X({name:"totalDuration",title:C("Total time")}),X({name:"avgDuration",title:C("Average time")}),H({name:"channel",title:C("Channel")}),H({name:"github",title:"GitHub"})]}]}}],Y=new o,j=new o,z=({title:e,name:t,idx:i})=>({type:m.Box,sx:{display:"grid",gridTemplateColumns:"auto 1fr 125px",pointerEvents:"none",alignItems:"center",background:e=>i%2==0?O(e.palette.getContrastText(e.palette.background.paper),.04):"transparent",padding:"8px",paddingLeft:"8px",paddingRight:"8px"},fields:[{type:m.Typography,style:{fontSize:"12px"},typoVariant:"subtitle2",fieldBottomMargin:"0",placeholder:e},{type:m.Box,sx:{minWidth:"8px"}},{type:m.Text,readonly:!0,outlined:i%2==0,name:t,compute(e){const i=D.get(e,t);return String(i)},title:"",fieldBottomMargin:"0",fieldRightMargin:"0"}]}),$=[{type:m.Box,sx:{maxWidth:420,minWidth:340},fields:[{type:m.Box,sx:{display:"grid",gridTemplateColumns:"auto 1fr auto auto",alignItems:"center",paddingTop:"4px",paddingBottom:"4px",paddingLeft:"8px",paddingRight:"4px"},fields:[{type:m.Typography,style:{opacity:.5},fieldBottomMargin:"0",typoVariant:"subtitle2",placeholder:"Runtime Configuration"},{type:m.Box},{type:m.Icon,fieldBottomMargin:"0",fieldRightMargin:"0",icon:w,async click(e,t,i,n){await j.next(),await n.handleDownloadConfig()}},{type:m.Icon,fieldBottomMargin:"0",fieldRightMargin:"0",icon:S,click:()=>j.next()}]},{type:m.Layout,customLayout:({children:e})=>t(y,{sx:{overflow:"clip",overflowY:"auto",marginBottom:"16px",maxHeight:{xs:"min(365px, 80vh - 235px)",sm:"min(475px, 80vh - 235px)"},width:"100%"},children:e}),fields:[z({idx:0,title:"CC_SCHEDULE_AWAIT_MINUTES",name:"config.CC_SCHEDULE_AWAIT_MINUTES",description:T.newline("Time to wait for scheduled signal to activate (in minutes).","If signal does not activate within this time, it will be cancelled.")}),z({idx:1,title:"CC_AVG_PRICE_CANDLES_COUNT",name:"config.CC_AVG_PRICE_CANDLES_COUNT",description:T.newline("Number of candles to use for average price calculation (VWAP).","Default: 5 candles (last 5 minutes when using 1m interval).")}),z({idx:2,title:"CC_PERCENT_SLIPPAGE",name:"config.CC_PERCENT_SLIPPAGE",description:T.newline("Slippage percentage applied to entry and exit prices.","Simulates market impact and order book depth.","Applied twice (entry and exit) for realistic execution simulation.","Default: 0.1% per transaction.")}),z({idx:3,title:"CC_PERCENT_FEE",name:"config.CC_PERCENT_FEE",description:T.newline("Fee percentage charged per transaction.","Applied twice (entry and exit) for total fee calculation.","Default: 0.1% per transaction (total 0.2%).")}),z({idx:4,title:"CC_MIN_TAKEPROFIT_DISTANCE_PERCENT",name:"config.CC_MIN_TAKEPROFIT_DISTANCE_PERCENT",description:T.newline("Minimum TakeProfit distance from priceOpen (percentage).","Must be greater than (slippage + fees) to ensure profitable trades.","Default: 0.5% (covers all costs + minimum profit margin).")}),z({idx:5,title:"CC_MIN_STOPLOSS_DISTANCE_PERCENT",name:"config.CC_MIN_STOPLOSS_DISTANCE_PERCENT",description:T.newline("Minimum StopLoss distance from priceOpen (percentage).","Prevents signals from being immediately stopped out due to price volatility.","Default: 0.5% (buffer to avoid instant stop loss on normal market fluctuations).")}),z({idx:6,title:"CC_MAX_STOPLOSS_DISTANCE_PERCENT",name:"config.CC_MAX_STOPLOSS_DISTANCE_PERCENT",description:T.newline("Maximum StopLoss distance from priceOpen (percentage).","Prevents catastrophic losses from extreme StopLoss values.","Default: 20% (one signal cannot lose more than 20% of position).")}),z({idx:7,title:"CC_MAX_SIGNAL_LIFETIME_MINUTES",name:"config.CC_MAX_SIGNAL_LIFETIME_MINUTES",description:T.newline("Maximum signal lifetime in minutes.","Also used as the default when minuteEstimatedTime is not provided in ISignalDto.","Prevents eternal signals that block risk limits for weeks/months.","Use Infinity to allow signals to live indefinitely (until TP/SL or explicit close).","Default: 1440 minutes (1 day).")}),z({idx:8,title:"CC_MAX_SIGNAL_GENERATION_SECONDS",name:"config.CC_MAX_SIGNAL_GENERATION_SECONDS",description:T.newline("Maximum time allowed for signal generation (in seconds).","Prevents long-running or stuck signal generation routines from blocking execution or consuming resources indefinitely.","If generation exceeds this threshold the attempt should be aborted, logged and optionally retried.","Default: 180 seconds (3 minutes).")}),z({idx:9,title:"CC_GET_CANDLES_RETRY_COUNT",name:"config.CC_GET_CANDLES_RETRY_COUNT",description:T.newline("Number of retries for getCandles function.","Default: 3 retries.")}),z({idx:10,title:"CC_GET_CANDLES_RETRY_DELAY_MS",name:"config.CC_GET_CANDLES_RETRY_DELAY_MS",description:T.newline("Delay between retries for getCandles function (in milliseconds).","Default: 5000 ms (5 seconds).")}),z({idx:11,title:"CC_MAX_CANDLES_PER_REQUEST",name:"config.CC_MAX_CANDLES_PER_REQUEST",description:T.newline("Maximum number of candles to request per single API call.","If a request exceeds this limit, data will be fetched using pagination.","Default: 1000 candles per request.")}),z({idx:12,title:"CC_GET_CANDLES_PRICE_ANOMALY_THRESHOLD_FACTOR",name:"config.CC_GET_CANDLES_PRICE_ANOMALY_THRESHOLD_FACTOR",description:T.newline("Maximum allowed deviation factor for price anomaly detection.","Price should not be more than this factor lower than reference price.","Example: BTC at $50,000 median → threshold $50 (catches $0.01-1 anomalies).")}),z({idx:13,title:"CC_GET_CANDLES_MIN_CANDLES_FOR_MEDIAN",name:"config.CC_GET_CANDLES_MIN_CANDLES_FOR_MEDIAN",description:T.newline("Minimum number of candles required for reliable median calculation.","Below this threshold, use simple average instead of median.","Example: 3 candles = 12 points (use average), 5 candles = 20 points (use median).")}),z({idx:14,title:"CC_REPORT_SHOW_SIGNAL_NOTE",name:"config.CC_REPORT_SHOW_SIGNAL_NOTE",description:T.newline("Controls visibility of signal notes in markdown report tables.",'When enabled, the "Note" column will be displayed in all markdown reports (backtest, live, schedule, risk, etc.)',"Default: false (notes are hidden to reduce table width and improve readability).")}),z({idx:15,title:"CC_BREAKEVEN_THRESHOLD",name:"config.CC_BREAKEVEN_THRESHOLD",description:T.newline("Breakeven threshold percentage - minimum profit distance from entry to enable breakeven.","When price moves this percentage in profit direction, stop-loss can be moved to entry (breakeven).","Default: 0.2% (additional buffer above costs to ensure no loss when moving to breakeven).")}),z({idx:16,title:"CC_ORDER_BOOK_TIME_OFFSET_MINUTES",name:"config.CC_ORDER_BOOK_TIME_OFFSET_MINUTES",description:T.newline("Time offset in minutes for order book fetching.","Subtracts this amount from the current time when fetching order book data.","This helps get a more stable snapshot of the order book by avoiding real-time volatility.","Default: 10 minutes.")}),z({idx:17,title:"CC_ORDER_BOOK_MAX_DEPTH_LEVELS",name:"config.CC_ORDER_BOOK_MAX_DEPTH_LEVELS",description:T.newline("Maximum depth levels for order book fetching.","Specifies how many price levels to fetch from both bids and asks.","Default: 20 levels.")}),z({idx:18,title:"CC_AGGREGATED_TRADES_MAX_MINUTES",name:"config.CC_AGGREGATED_TRADES_MAX_MINUTES",description:T.newline("Maximum minutes of aggregated trades to fetch when no limit is provided.","If limit is not specified, the system will fetch aggregated trades for this many minutes starting from the current time minus the offset.","Binance requirement.")}),z({idx:19,title:"CC_MAX_BACKTEST_MARKDOWN_ROWS",name:"config.CC_MAX_BACKTEST_MARKDOWN_ROWS",description:T.newline("Maximum number of events to keep in backtest markdown report storage.","Older events are removed (FIFO) when this limit is exceeded.","Default: 250 events.")}),z({idx:20,title:"CC_MAX_BREAKEVEN_MARKDOWN_ROWS",name:"config.CC_MAX_BREAKEVEN_MARKDOWN_ROWS",description:T.newline("Maximum number of events to keep in breakeven markdown report storage.","Older events are removed (FIFO) when this limit is exceeded.","Default: 250 events.")}),z({idx:21,title:"CC_MAX_HEATMAP_MARKDOWN_ROWS",name:"config.CC_MAX_HEATMAP_MARKDOWN_ROWS",description:T.newline("Maximum number of events to keep in heatmap markdown report storage.","Older events are removed (FIFO) when this limit is exceeded.","Default: 250 events.")}),z({idx:22,title:"CC_MAX_HIGHEST_PROFIT_MARKDOWN_ROWS",name:"config.CC_MAX_HIGHEST_PROFIT_MARKDOWN_ROWS",description:T.newline("Maximum number of events to keep in highest profit markdown report storage.","Older events are removed (FIFO) when this limit is exceeded.","Default: 250 events.")}),z({idx:23,title:"CC_MAX_MAX_DRAWDOWN_MARKDOWN_ROWS",name:"config.CC_MAX_MAX_DRAWDOWN_MARKDOWN_ROWS",description:T.newline("Maximum number of events to keep in max drawdown markdown report storage.","Older events are removed (FIFO) when this limit is exceeded.","Default: 250 events.")}),z({idx:24,title:"CC_MAX_LIVE_MARKDOWN_ROWS",name:"config.CC_MAX_LIVE_MARKDOWN_ROWS",description:T.newline("Maximum number of events to keep in live markdown report storage.","Older events are removed (FIFO) when this limit is exceeded.","Default: 250 events.")}),z({idx:25,title:"CC_MAX_PARTIAL_MARKDOWN_ROWS",name:"config.CC_MAX_PARTIAL_MARKDOWN_ROWS",description:T.newline("Maximum number of events to keep in partial markdown report storage.","Older events are removed (FIFO) when this limit is exceeded.","Default: 250 events.")}),z({idx:26,title:"CC_MAX_RISK_MARKDOWN_ROWS",name:"config.CC_MAX_RISK_MARKDOWN_ROWS",description:T.newline("Maximum number of events to keep in risk markdown report storage.","Older events are removed (FIFO) when this limit is exceeded.","Default: 250 events.")}),z({idx:27,title:"CC_MAX_SCHEDULE_MARKDOWN_ROWS",name:"config.CC_MAX_SCHEDULE_MARKDOWN_ROWS",description:T.newline("Maximum number of events to keep in schedule markdown report storage.","Older events are removed (FIFO) when this limit is exceeded.","Default: 250 events.")}),z({idx:28,title:"CC_MAX_STRATEGY_MARKDOWN_ROWS",name:"config.CC_MAX_STRATEGY_MARKDOWN_ROWS",description:T.newline("Maximum number of events to keep in strategy markdown report storage.","Older events are removed (FIFO) when this limit is exceeded.","Default: 250 events.")}),z({idx:29,title:"CC_MAX_SYNC_MARKDOWN_ROWS",name:"config.CC_MAX_SYNC_MARKDOWN_ROWS",description:T.newline("Maximum number of events to keep in sync markdown report storage.","Older events are removed (FIFO) when this limit is exceeded.","Default: 250 events.")}),z({idx:30,title:"CC_WALKER_MARKDOWN_TOP_N",name:"config.CC_WALKER_MARKDOWN_TOP_N",description:T.newline("Number of top strategies to include in the walker comparison table.","Default: 10 strategies.")}),z({idx:31,title:"CC_MAX_PERFORMANCE_MARKDOWN_ROWS",name:"config.CC_MAX_PERFORMANCE_MARKDOWN_ROWS",description:T.newline("Maximum number of performance metric events to keep in storage.","Older events are removed when this limit is exceeded.","Higher than other report event limits because performance metrics are lightweight and benefit from larger sample sizes for accurate statistical analysis.","Default: 10000 events.")}),z({idx:32,title:"CC_MAX_NOTIFICATIONS",name:"config.CC_MAX_NOTIFICATIONS",description:T.newline("Maximum number of notifications to keep in storage.","Older notifications are removed when this limit is exceeded.","Default: 500 notifications.")}),z({idx:33,title:"CC_MAX_SIGNALS",name:"config.CC_MAX_SIGNALS",description:T.newline("Maximum number of signals to keep in storage.","Older signals are removed when this limit is exceeded.","Default: 50 signals.")}),z({idx:34,title:"CC_MAX_LOG_LINES",name:"config.CC_MAX_LOG_LINES",description:T.newline("Maximum number of log lines to keep in storage.","Older log lines are removed when this limit is exceeded.","This helps prevent unbounded log growth which can consume memory and degrade performance over time.","Default: 1000 log lines.")}),z({idx:35,title:"CC_ENABLE_CANDLE_FETCH_MUTEX",name:"config.CC_ENABLE_CANDLE_FETCH_MUTEX",description:T.newline("Enables mutex locking for candle fetching to prevent concurrent fetches of the same candles.","This can help avoid redundant API calls and ensure data consistency when multiple processes/threads attempt to fetch candles simultaneously.","Default: true (mutex locking enabled for candle fetching).")}),z({idx:36,title:"CC_ENABLE_BACKTEST_PARALLEL_SPIN",name:"config.CC_ENABLE_BACKTEST_PARALLEL_SPIN",description:T.newline("Enables cooperative interleaving of concurrently running backtests after each candle fetch.","Hands the event loop to a peer backtest waiting on the same mutex, so multiple parallel Backtest.run / Walker workloads progress in round-robin fashion instead of one monopolizing the event loop until completion.","Default: true (parallel backtests are interleaved on each candle fetch boundary).")}),z({idx:37,title:"CC_ENABLE_DCA_EVERYWHERE",name:"config.CC_ENABLE_DCA_EVERYWHERE",description:T.newline("Enables DCA (Dollar-Cost Averaging) logic even if antirecord is not broken.","Allows to commitAverageBuy if currentPrice is not the lowest price since entry, but still lower than priceOpen.","Default: false (DCA logic enabled only when antirecord is broken).")}),z({idx:38,title:"CC_ENABLE_PPPL_EVERYWHERE",name:"config.CC_ENABLE_PPPL_EVERYWHERE",description:T.newline("Enables PPPL (Partial Profit, Partial Loss) logic even if this breaks a direction of exits.","Allows to take partial profit or loss on a position even if it results in a mix of profit and loss exits.","Default: false (PPPL logic is only applied when it does not break the direction of exits, ensuring clearer profit/loss outcomes).")}),z({idx:39,title:"CC_ENABLE_LONG_SIGNAL",name:"config.CC_ENABLE_LONG_SIGNAL",description:T.newline("Enables long signals in strategies that are primarily designed for short signals.","This allows the strategy to generate and manage long signals in addition to short signals, even if the original design was focused on short trading.","Default: false (long signals are only enabled in strategies that are designed for them, ensuring strategy logic is aligned with signal types).")}),z({idx:40,title:"CC_ENABLE_SHORT_SIGNAL",name:"config.CC_ENABLE_SHORT_SIGNAL",description:T.newline("Enables short signals in strategies that are primarily designed for long signals.","This allows the strategy to generate and manage short signals in addition to long signals, even if the original design was focused on long trading.")}),z({idx:41,title:"CC_ENABLE_TRAILING_EVERYWHERE",name:"config.CC_ENABLE_TRAILING_EVERYWHERE",description:T.newline("Enables trailing logic (Trailing Take / Trailing Stop) without requiring absorption conditions.","Allows trailing mechanisms to be activated regardless of whether absorption has been detected.","Default: false (trailing logic is applied only when absorption conditions are met).")}),z({idx:42,title:"CC_POSITION_ENTRY_COST",name:"config.CC_POSITION_ENTRY_COST",description:T.newline("Cost of entering a position (in USD).","This is used as a default value for calculating position size and risk management when cost data is not provided by the strategy.","Default: $100 per position.")})]},{type:m.Box,sx:{p:1},child:{type:m.Button,fieldBottomMargin:"0",fieldRightMargin:"0",buttonVariant:"contained",title:"Download",click:async(e,t,i,n)=>{await j.next(),await n.handleDownloadConfig()},icon:w}}]}],q=[{type:m.Group,fieldRightMargin:"1",phoneColumns:"12",tabletColumns:"12",desktopColumns:"6",fields:[{type:m.Paper,fieldBottomMargin:"1",fields:[{type:m.Box,sx:{display:"grid",gridTemplateColumns:"auto 1fr auto",alignItems:"center"},fields:[{type:m.Box,sx:{display:"grid",gridTemplateColumns:"1fr"},fields:[{type:m.Typography,fieldBottomMargin:"1",typoVariant:"h6",placeholder:"Running mode"},{type:m.Typography,fieldBottomMargin:"1",isVisible:({running_mode:e})=>"backtest"===e,style:{color:"orange"},typoVariant:"body1",placeholder:"Historical data processing"},{type:m.Typography,fieldBottomMargin:"1",isVisible:({running_mode:e})=>"live"===e,style:{color:"green"},typoVariant:"body1",placeholder:"Real-time exchange integration"},{type:m.Typography,fieldBottomMargin:"1",isVisible:({running_mode:e})=>"none"===e,style:{color:"red"},typoVariant:"body1",placeholder:"UI only"}]},{type:m.Box},{type:m.Component,fieldBottomMargin:"0",element:({_fieldData:e,payload:i})=>t(M,{noBadge:!0,size:"small",sx:{transform:"translate(10px, -28px)",opacity:"0.5",transition:"opacity 500ms","&:hover":{opacity:"1.0"}},oneSx:{padding:"0 !important"},fields:$,closeSubject:j,payload:i,handler:()=>e,children:t(W,{})})}]},{type:m.Radio,readonly:!0,fieldBottomMargin:"0",name:"running_mode",radioValue:"backtest",title:"Historical data"},{type:m.Radio,readonly:!0,fieldBottomMargin:"0",name:"running_mode",radioValue:"live",title:"Real-time"},{type:m.Radio,readonly:!0,fieldBottomMargin:"0",name:"running_mode",radioValue:"none",title:"Frontend only"}]},{type:m.Paper,fieldBottomMargin:"1",innerPadding:"0px",fields:[{type:m.Box,sx:{paddingTop:"16px",paddingLeft:"16px",paddingRight:"16px"},fields:[{type:m.Typography,fieldBottomMargin:"1",typoVariant:"h6",placeholder:"Log mode"},{type:m.Typography,fieldBottomMargin:"2",style:{opacity:.5},typoVariant:"caption",placeholder:"Logs take up disk space but are needed for debugging"}]},...[{title:"JSONL files",description:"Files processed by Claude Code, HuggingFace, Parquet",name:"recent_enabled"},{title:"Markdown files",description:"Human-readable files. Useful when running without a GUI",name:"markdown_enabled"},{title:"Dump files",description:"Conversation dump with the AI agent used for trading signals",name:"dump_enabled"}].map(({name:e,title:t,description:i},n)=>(({title:e,description:t,name:i,idx:n})=>({type:m.Box,sx:{display:"grid",alignItems:"center",gridTemplateColumns:"1fr auto",paddingLeft:"16px",paddingRight:"16px",paddingTop:"4px",paddingBottom:"4px",background:e=>n%2==0?O(e.palette.getContrastText(e.palette.background.paper),.04):"transparent"},fields:[{type:m.Box,fields:[{type:m.Typography,fieldBottomMargin:"0",typoVariant:"body1",placeholder:e},{type:m.Typography,fieldBottomMargin:"0",style:{opacity:.5},typoVariant:"caption",placeholder:t}]},{type:m.Checkbox,readonly:!0,fieldBottomMargin:"0",fieldRightMargin:"0",title:"",name:i}]}))({name:e,title:t,description:i,idx:n}))]},{type:m.Paper,fieldBottomMargin:"1",fields:[{type:m.Typography,fieldBottomMargin:"1",typoVariant:"h6",placeholder:"User interface"},{type:m.Switch,readonly:!0,fieldBottomMargin:"0",title:"Save notifications",name:"notification_enabled"},{type:m.Typography,fieldBottomMargin:"1",style:{opacity:.5},typoVariant:"caption",placeholder:"Event history is saved to disk"},{type:m.Switch,readonly:!0,fieldBottomMargin:"0",title:"Save signals",name:"storage_enabled"},{type:m.Typography,fieldBottomMargin:"0",style:{opacity:.5},typoVariant:"caption",placeholder:"Latest signal state is saved to disk"}]}]},{type:m.Group,fieldRightMargin:"1",fieldBottomMargin:"2",phoneColumns:"12",tabletColumns:"12",desktopColumns:"6",fields:[{type:m.Paper,fieldBottomMargin:"1",fields:[{type:m.Typography,fieldBottomMargin:"3",typoVariant:"h6",placeholder:"Strategy"},{type:m.Typography,placeholder:"Broker"},{type:m.Outline,fieldBottomMargin:"3",fields:[{type:m.Checkbox,readonly:!0,fieldBottomMargin:"0",title:"Connected to mainnet (production)",name:"broker_enabled"}]},{type:m.Typography,placeholder:"Market signals"},{type:m.Outline,fieldBottomMargin:"4",fields:[{type:m.Checkbox,readonly:!0,fieldBottomMargin:"0",title:"Use BM25 for RAG",name:"memory_enabled"},{type:m.Checkbox,readonly:!0,fieldBottomMargin:"0",title:"Use stateful strategies",name:"state_enabled"},{type:m.Checkbox,readonly:!0,fieldBottomMargin:"0",title:"Save previous signal",name:"recent_enabled"}]}]},{type:m.Paper,fieldBottomMargin:"1",fields:[{type:m.Typography,fieldBottomMargin:"2",typoVariant:"h6",placeholder:"Risk management"},{type:m.Typography,fieldBottomMargin:"3",style:{opacity:.5},typoVariant:"body1",placeholder:"Use LONG or SHORT positions depending on market conditions"},{type:m.Checkbox,readonly:!0,fieldBottomMargin:"0",title:"Enable LONG",name:"enable_long"},{type:m.Checkbox,readonly:!0,fieldBottomMargin:"1",title:"Enable SHORT",name:"enable_short"}]}]},{type:m.Component,desktopHidden:!0,fieldBottomMargin:"5",fieldRightMargin:"1",element:({payload:e})=>{const i=R();return t(v,{variant:"contained",size:"large",startIcon:t(B,{}),onClick:async()=>{await e.handleReload(),i()},children:"Refresh"})}}],J=[{type:l.Link,action:"back-action",label:t(P,{sx:{display:"block"}})},{type:l.Link,action:"back-action",label:"Dashboard"},{type:l.Link,action:"back-action",label:"Performance"},{type:l.Link,action:"back-action",label:"Settings"},{type:l.Button,action:"update-now",label:"Refresh",icon:B}],Q=[{action:"update-now",label:"Refresh",icon:()=>t(s,{icon:B,color:"#4caf50"})}],Z=new o,ee=async()=>{n.setupViewService.getSetupData.clear(),await Z.next()},te=async()=>{const{config:e}=await n.setupViewService.getSetupData(),t=new Blob([JSON.stringify(e,null,2)],{type:"application/json"}),i=URL.createObjectURL(t);n.layoutService.downloadFile(i,`config_${Date.now()}.json`)},ie=[{id:"search",element:()=>{const[e,{execute:o,loading:l}]=i(async()=>await n.performanceViewService.getPerformanceData(),{onLoadStart:()=>n.layoutService.setAppbarLoader(!0),onLoadEnd:()=>n.layoutService.setAppbarLoader(!1)});a(()=>Y.subscribe(o));const[s,{execute:d,loading:c}]=i(async()=>await n.environmentViewService.getEnvironmentData());a(()=>Y.subscribe(d));return t(I,{children:[t(r,{items:G,actions:K,onAction:async e=>{"back-action"===e&&n.routerService.push("/main"),"setup-action"===e&&n.routerService.push("/about/setup"),"update-now"===e&&await(async()=>{n.performanceViewService.getPerformanceData.clear(),n.performanceViewService.getPerformanceReport.clear(),n.environmentViewService.getEnvironmentData.clear(),await Y.next()})(),"download-markdown"===e&&await(async()=>{const e=await n.performanceViewService.getPerformanceReport(),t=new Blob([e],{type:"text/plain"}),i=URL.createObjectURL(t);n.layoutService.downloadFile(i,`performance_${Date.now()}.md`)})(),"download-pdf"===e&&await(async()=>{const e=await n.performanceViewService.getPerformanceReport();await f(e)})(),"download-json"===e&&await(async()=>{const e=await n.performanceViewService.getPerformanceData(),t=JSON.stringify(e,null,2),i=new Blob([t],{type:"text/plain"}),a=URL.createObjectURL(i);n.layoutService.downloadFile(a,`performance_${Date.now()}.json`)})()}}),e&&s?l||c?null:t(g,{handler:()=>{const t=e.totalEvents>0?e.totalDuration/e.totalEvents:0;return{channel:s.telegram_channel,github:"https://github.com/tripolskypetr/backtest-kit",totalEvents:e.totalEvents,totalDuration:e.totalDuration,avgDuration:t}},fields:U}):null]})},isActive:e=>L(["/about"],e)},{id:"main",element:()=>{const[e,{execute:o,loading:l}]=i(async()=>await n.setupViewService.getSetupData(),{onLoadStart:()=>n.layoutService.setAppbarLoader(!0),onLoadEnd:()=>n.layoutService.setAppbarLoader(!1)});a(()=>Z.subscribe(o));return t(I,{children:[t(r,{items:J,actions:Q,onAction:async e=>{"back-action"===e&&n.routerService.push("/about"),"update-now"===e&&await ee()}}),e?l?null:t(g,{handler:e,payload:()=>({handleReload:ee,handleDownloadConfig:te}),fields:q}):null]})},isActive:e=>L(["/about/setup"],e)}],ne=()=>t(N,{history:n.routerService,onLoadStart:()=>n.layoutService.setAppbarLoader(!0),onLoadEnd:()=>n.layoutService.setAppbarLoader(!1),routes:ie});export{ne as AboutPage,ne as default};
@@ -0,0 +1 @@
1
+ import{f as e,b7 as t,M as a,B as i,q as r,b8 as o,i as n,b9 as l,v as s,b3 as c,ba as d,Y as w,Z as p,$ as h,a0 as m,b0 as k,bb as g,aI as b,bc as v,av as y,bd as u,b5 as f,ad as S,A as x,be as _,ax as D,w as V,Q as N,x as O,O as R,R as L,p as B,a2 as A,T as P,b2 as C,W as $,F as J,a3 as M,E as j,a5 as G,l as F,n as X,a4 as H,a6 as I,aj as E}from"./index-DMjmH2fE.js";import{h as z}from"./hasRouteMatch-DTIimlwJ.js";import{I as T}from"./IconPhoto-BV2g32_b.js";import{C as U,R as W}from"./Refresh-DDS1Dl8a.js";import{K as q}from"./KeyboardArrowLeft-uHSkdvcT.js";const K=[{id:"backtest",element:({data:r})=>e(i,{sx:{height:"100%",width:"100%",pt:1},children:e(t,{withScrollbar:!0,hideOverflowX:!0,sx:{height:"100%"},children:e("div",{children:[e(a,{content:r||"# Нет данных"}),e(i,{sx:{paddingBottom:"65px"}})]})})}),isActive:e=>e.includes("/markdown_report/backtest")},{id:"live",element:({data:r})=>e(i,{sx:{height:"100%",width:"100%",pt:1},children:e(t,{withScrollbar:!0,hideOverflowX:!0,sx:{height:"100%"},children:e("div",{children:[e(a,{content:r||"# Нет данных"}),e(i,{sx:{paddingBottom:"65px"}})]})})}),isActive:e=>e.includes("/markdown_report/live")},{id:"breakeven",element:({data:r})=>e(i,{sx:{height:"100%",width:"100%",pt:1},children:e(t,{withScrollbar:!0,hideOverflowX:!0,sx:{height:"100%"},children:e("div",{children:[e(a,{content:r||"# Нет данных"}),e(i,{sx:{paddingBottom:"65px"}})]})})}),isActive:e=>e.includes("/markdown_report/breakeven")},{id:"risk",element:({data:r})=>e(i,{sx:{height:"100%",width:"100%",pt:1},children:e(t,{withScrollbar:!0,hideOverflowX:!0,sx:{height:"100%"},children:e("div",{children:[e(a,{content:r||"# Нет данных"}),e(i,{sx:{paddingBottom:"65px"}})]})})}),isActive:e=>e.includes("/markdown_report/risk")},{id:"partial",element:({data:r})=>e(i,{sx:{height:"100%",width:"100%",pt:1},children:e(t,{withScrollbar:!0,hideOverflowX:!0,sx:{height:"100%"},children:e("div",{children:[e(a,{content:r||"# Нет данных"}),e(i,{sx:{paddingBottom:"65px"}})]})})}),isActive:e=>e.includes("/markdown_report/partial")},{id:"highest_profit",element:({data:r})=>e(i,{sx:{height:"100%",width:"100%",pt:1},children:e(t,{withScrollbar:!0,hideOverflowX:!0,sx:{height:"100%"},children:e("div",{children:[e(a,{content:r||"# Нет данных"}),e(i,{sx:{paddingBottom:"65px"}})]})})}),isActive:e=>e.includes("/markdown_report/highest_profit")},{id:"max_drawdown",element:({data:r})=>e(i,{sx:{height:"100%",width:"100%",pt:1},children:e(t,{withScrollbar:!0,hideOverflowX:!0,sx:{height:"100%"},children:e("div",{children:[e(a,{content:r||"# Нет данных"}),e(i,{sx:{paddingBottom:"65px"}})]})})}),isActive:e=>e.includes("/markdown_report/max_drawdown")},{id:"schedule",element:({data:r})=>e(i,{sx:{height:"100%",width:"100%",pt:1},children:e(t,{withScrollbar:!0,hideOverflowX:!0,sx:{height:"100%"},children:e("div",{children:[e(a,{content:r||"# Нет данных"}),e(i,{sx:{paddingBottom:"65px"}})]})})}),isActive:e=>e.includes("/markdown_report/schedule")},{id:"performance",element:({data:r})=>e(i,{sx:{height:"100%",width:"100%",pt:1},children:e(t,{withScrollbar:!0,hideOverflowX:!0,sx:{height:"100%"},children:e("div",{children:[e(a,{content:r||"# Нет данных"}),e(i,{sx:{paddingBottom:"65px"}})]})})}),isActive:e=>e.includes("/markdown_report/performance")},{id:"sync",element:({data:r})=>e(i,{sx:{height:"100%",width:"100%",pt:1},children:e(t,{withScrollbar:!0,hideOverflowX:!0,sx:{height:"100%"},children:e("div",{children:[e(a,{content:r||"# Нет данных"}),e(i,{sx:{paddingBottom:"65px"}})]})})}),isActive:e=>e.includes("/markdown_report/sync")},{id:"heat",element:({data:r})=>e(i,{sx:{height:"100%",width:"100%",pt:1},children:e(t,{withScrollbar:!0,hideOverflowX:!0,sx:{height:"100%"},children:e("div",{children:[e(a,{content:r||"# Нет данных"}),e(i,{sx:{paddingBottom:"65px"}})]})})}),isActive:e=>e.includes("/markdown_report/heat")},{id:"strategy",element:({data:r})=>e(i,{sx:{height:"100%",width:"100%",pt:1},children:e(t,{withScrollbar:!0,hideOverflowX:!0,sx:{height:"100%"},children:e("div",{children:[e(a,{content:r||"# Нет данных"}),e(i,{sx:{paddingBottom:"65px"}})]})})}),isActive:e=>e.includes("/markdown_report/strategy")}],Q=[{id:"backtest",label:"Backtest",isVisible:({type:e})=>"backtest"===e},{id:"live",label:"Live",isVisible:({type:e})=>"live"===e},{id:"strategy",label:"Strategy"},{id:"breakeven",label:"Breakeven"},{id:"risk",label:"Risk"},{id:"partial",label:"Partial"},{id:"highest_profit",label:"Highest Profit"},{id:"max_drawdown",label:"Max Drawdown"},{id:"schedule",label:"Schedule"},{id:"performance",label:"Performance"},{id:"sync",label:"Sync"},{id:"heat",label:"Heat"}],Y=({disabled:t,className:a,style:i,sx:c,onClick:d,color:w})=>e(l,{className:a,style:i,sx:c,disabled:t,color:w,size:36,onClick:async e=>{const[t,{resolve:a}]=o();e.preventDefault(),e.stopPropagation(),await d(e,e=>a(e));const i=await t;await(async e=>{let t=!1;t=t||"string"==typeof e,t=t||"number"==typeof e,t=t||"boolean"==typeof e,t=t||void 0===e,t=t||null===e,t&&await s(String(e))})(i),n.alertService.notify("Copied!")},children:e(r,{})}),Z=[{action:"json",label:"Download JSON",icon:()=>e(p,{icon:w,color:"#4caf50"})},{action:"markdown",label:"Download Markdown",icon:()=>e(p,{icon:h,color:"#4caf50"})},{action:"pdf",label:"Download PDF",icon:()=>e(p,{icon:m,color:"#4caf50"})}],ee=({disabled:t,className:a,style:i,sx:r,onDownloadJson:o,onDownloadMarkdown:n,onDownloadPdf:l})=>{const s=c(async e=>{"json"===e?await o():"markdown"===e?await n():"pdf"===e&&await l()});return e(d,{transparent:!0,className:a,style:i,sx:r,disabled:t,options:Z,onAction:s})},te=y(),ae=D(async(e,t)=>{const a=("backtest"===t?await n.backtestGlobalService.list():await n.liveGlobalService.list()).find(t=>t.id===e);if(!a)throw new Error(`Item not found: ${e}`);const{symbol:i,strategyName:r,exchangeName:o,frameName:l}=a,[s,c,d,w,p,h,m,k,g,b,v,y]=await Promise.all(["backtest"===t?n.markdownViewService.getBacktestReport(i,r,o,l):Promise.resolve(""),"live"===t?n.markdownViewService.getLiveReport(i,r,o):Promise.resolve(""),n.markdownViewService.getBreakevenReport(i,r,o,l,"backtest"===t),n.markdownViewService.getRiskReport(i,r,o,l,"backtest"===t),n.markdownViewService.getPartialReport(i,r,o,l,"backtest"===t),n.markdownViewService.getHighestProfitReport(i,r,o,l,"backtest"===t),n.markdownViewService.getMaxDrawdownReport(i,r,o,l,"backtest"===t),n.markdownViewService.getScheduleReport(i,r,o,l,"backtest"===t),n.markdownViewService.getPerformanceReport(i,r,o,l,"backtest"===t),n.markdownViewService.getSyncReport(i,r,o,l,"backtest"===t),n.markdownViewService.getHeatReport(r,o,l,"backtest"===t),n.markdownViewService.getStrategyReport(i,r,o,l,"backtest"===t)]);return{type:t,backtest:s,live:c,breakeven:d,risk:w,partial:p,highest_profit:h,max_drawdown:m,schedule:k,performance:g,sync:b,heat:v,strategy:y}},{timeout:45e3,key:([e,t])=>`${e}_${t}`}),ie=()=>{const[t,a]=k(""),[r,o]=k("backtest"),s=g(),{push:c,pop:d}=s,[w,p]=b(te.location.pathname),h=async()=>{const e=(await ae(t.current,r.current))[w.current.replace("/markdown_report/","")];"string"==typeof e&&await V(e)},m=async()=>{const e=await ae(t.current,r.current),a=w.current.replace("/markdown_report/",""),i=e[a];if("string"==typeof i){const e=new Blob([i],{type:"text/plain"}),t=URL.createObjectURL(e);n.layoutService.downloadFile(t,`${a}_${r.current}_${Date.now()}.md`)}},y=async()=>{const e=("backtest"===r.current?await n.backtestGlobalService.list():await n.liveGlobalService.list()).find(e=>e.id===t.current);if(!e)throw new Error(`Item not found: ${t.current}`);const{symbol:a,strategyName:i,exchangeName:o,frameName:l}=e,s=w.current.replace("/markdown_report/",""),c="backtest"===r.current;let d;if("backtest"===s?d=await n.markdownViewService.getBacktestData(a,i,o,l):"live"===s?d=await n.markdownViewService.getLiveData(a,i,o):"breakeven"===s?d=await n.markdownViewService.getBreakevenData(a,i,o,l,c):"risk"===s?d=await n.markdownViewService.getRiskData(a,i,o,l,c):"partial"===s?d=await n.markdownViewService.getPartialData(a,i,o,l,c):"highest_profit"===s?d=await n.markdownViewService.getHighestProfitData(a,i,o,l,c):"max_drawdown"===s?d=await n.markdownViewService.getMaxDrawdownData(a,i,o,l,c):"schedule"===s?d=await n.markdownViewService.getScheduleData(a,i,o,l,c):"performance"===s?d=await n.markdownViewService.getPerformanceData(a,i,o,l,c):"sync"===s?d=await n.markdownViewService.getSyncData(a,i,o,l,c):"heat"===s?d=await n.markdownViewService.getHeatData(i,o,l,c):"strategy"===s&&(d=await n.markdownViewService.getStrategyData(a,i,o,l,c)),void 0!==d){const e=new Blob([JSON.stringify(d,null,2)],{type:"application/json"}),t=URL.createObjectURL(e);n.layoutService.downloadFile(t,`${s}_${r.current}_${Date.now()}.json`)}},{pickData:D,render:N}=v({tabs:Q,withStaticAction:!0,onTabChange:(e,t)=>{const a=`/markdown_report/${e}`;t.replace(a),p(a)},animation:"none",title:"Markdown Report",sizeRequest:u,history:te,routes:K,BeforeTitle:({onClose:t})=>{const{total:a}=g();return e(i,{sx:{mr:1,display:1===a?"none":"flex"},children:e(l,{onClick:t,children:e(_,{})})})},AfterTitle:({onClose:a})=>e(x,{direction:"row",gap:1,children:[e(l,{sx:{mr:"10px"},onClick:()=>h(),children:e(f,{})}),e(Y,{onClick:async(e,a)=>{await(async(e,t,a,i)=>{const r=("backtest"===a?await n.backtestGlobalService.list():await n.liveGlobalService.list()).find(e=>e.id===t);if(!r)throw new Error(`Item not found: ${t}`);const{symbol:o,strategyName:l,exchangeName:s,frameName:c}=r,d="backtest"===a;e.includes("/markdown_report/backtest")?i(JSON.stringify(await n.markdownViewService.getBacktestData(o,l,s,c),null,2)):e.includes("/markdown_report/live")?i(JSON.stringify(await n.markdownViewService.getLiveData(o,l,s),null,2)):e.includes("/markdown_report/breakeven")?i(JSON.stringify(await n.markdownViewService.getBreakevenData(o,l,s,c,d),null,2)):e.includes("/markdown_report/risk")?i(JSON.stringify(await n.markdownViewService.getRiskData(o,l,s,c,d),null,2)):e.includes("/markdown_report/partial")?i(JSON.stringify(await n.markdownViewService.getPartialData(o,l,s,c,d),null,2)):e.includes("/markdown_report/highest_profit")?i(JSON.stringify(await n.markdownViewService.getHighestProfitData(o,l,s,c,d),null,2)):e.includes("/markdown_report/max_drawdown")?i(JSON.stringify(await n.markdownViewService.getMaxDrawdownData(o,l,s,c,d),null,2)):e.includes("/markdown_report/schedule")?i(JSON.stringify(await n.markdownViewService.getScheduleData(o,l,s,c,d),null,2)):e.includes("/markdown_report/performance")?i(JSON.stringify(await n.markdownViewService.getPerformanceData(o,l,s,c,d),null,2)):e.includes("/markdown_report/sync")?i(JSON.stringify(await n.markdownViewService.getSyncData(o,l,s,c,d),null,2)):e.includes("/markdown_report/heat")?i(JSON.stringify(await n.markdownViewService.getHeatData(l,s,c,d),null,2)):e.includes("/markdown_report/strategy")&&i(JSON.stringify(await n.markdownViewService.getStrategyData(o,l,s,c,d),null,2))})(w.current,t.current,r.current,a)},sx:{mr:"10px",mt:"2.5px"}}),e(ee,{sx:{mr:"10px",mt:"0.5px"},onDownloadJson:y,onDownloadMarkdown:m,onDownloadPdf:h}),e(l,{onClick:a,children:e(S,{})})]}),fetchState:async()=>await ae(t.current,r.current),mapInitialData:([{type:e,backtest:t,live:a,breakeven:i,risk:r,partial:o,highest_profit:n,max_drawdown:l,schedule:s,performance:c,sync:d,heat:w,strategy:p}])=>({backtest:t,live:a,breakeven:i,risk:r,partial:o,highest_profit:n,max_drawdown:l,schedule:s,performance:c,sync:d,heat:w,strategy:p,type:e}),mapPayload:([{type:e}])=>({type:e}),onLoadStart:()=>n.layoutService.setAppbarLoader(!0),onLoadEnd:()=>n.layoutService.setAppbarLoader(!1),onClose:()=>{d()}});return(e,t)=>{c({id:"markdown_report_modal",render:N,onInit:()=>{const e="live"===t?"/markdown_report/live":"/markdown_report/backtest";te.push(e),p(e)},onMount:()=>{a(e),o(t),D()}})}},re="backtest-kit__groupHeader",oe="backtest-kit__groupRoot",ne="backtest-kit__symbolImage",le=B()({root:{[`& .${oe}:hover .${re}`]:{opacity:"1 !important"}}});function se(e){return I(e,"#000000")>I(e,"#FFFFFF")}const ce=[{type:L.Link,action:"back-action",label:e(q,{sx:{display:"block"}})},{type:L.Link,action:"back-action",label:"Main"},{type:L.Link,action:"back-action",label:"Markdown Report"}],de=[{action:"update-now",label:"Refresh",icon:()=>e(p,{icon:W,color:"#4caf50"})}],we=(t,a)=>({type:A.Group,className:oe,sx:{p:2},tabletColumns:"12",desktopColumns:"3",fields:[{type:A.Component,className:re,style:{transition:"opacity 500ms",opacity:.5},element:()=>e(x,{direction:"row",children:[e(M,{variant:"outlined",size:"small",color:"info",label:`${j.bullet} ${t}`,sx:{mb:1,pr:.5,fontSize:"14px",background:"white",cursor:"not-allowed"}}),e(i,{flex:1})]})},{type:A.Group,fields:a.map(({symbol:t,label:a,id:r,type:o,color:n})=>((t,a,r,o,n)=>({type:A.Component,desktopColumns:"6",tabletColumns:"6",phoneColumns:"12",fieldRightMargin:"1",fieldBottomMargin:"1",element:({payload:l})=>e(H,{component:G,onClick:()=>{l.handleOpen(t,a)},sx:{width:"100%",background:n,color:"white",fontWeight:"bold",fontSize:"14px",height:"75px",minHeight:"75px",textWrap:"wrap",padding:"16px",[`& .${ne}`]:{transition:"filter 500ms"},"&:hover":{background:()=>se(n)?F(n,.33):X(n,.33),[`& .${ne}`]:{transition:"filter 500ms",filter:se(n)?"brightness(0.7) contrast(1.2)":"brightness(1.3) contrast(0.5)"}},transition:"background 500ms"},startIcon:e(T,{className:ne,symbol:r}),children:e(i,{sx:{overflow:"hidden",textOverflow:"ellipsis",width:"75px"},children:o})})}))(r,o,t,a,n))}]}),pe=[{id:"main",element:()=>{const{classes:t}=le(),{reloadTrigger:a,doReload:r}=N(),[o,{loading:l}]=O(async()=>await(async()=>{const[e,t,a]=await Promise.all([n.symbolGlobalService.getSymbolMap(),n.backtestGlobalService.list(),n.liveGlobalService.list()]),i={},r={};t.forEach(t=>{const a=e[t.symbol],r=t.strategyName;i[r]||(i[r]=[]),i[r].push({symbol:t.symbol,label:(null==a?void 0:a.displayName)||t.symbol,color:(null==a?void 0:a.color)||"#ccc",type:"backtest",id:t.id})}),a.forEach(t=>{const a=e[t.symbol],i=t.strategyName;r[i]||(r[i]=[]),r[i].push({symbol:t.symbol,label:(null==a?void 0:a.displayName)||t.symbol,color:(null==a?void 0:a.color)||"#ccc",id:t.id,type:"live"})});const o=Object.entries(i).sort(([,e],[,t])=>t.length-e.length).map(([e,t])=>we(e,t)),l=Object.entries(r).sort(([,e],[,t])=>t.length-e.length).map(([e,t])=>we(e,t));return l.length||o.length?[{type:A.Fragment,isVisible:()=>!!o.length,fields:[{type:A.Line,title:"Backtest"},{type:A.Group,columns:"12",fields:o}]},{type:A.Fragment,isVisible:()=>!!l.length,fields:[{type:A.Line,title:"Live"},{type:A.Group,columns:"12",fields:l}]}]:[]})(),{onLoadStart:()=>n.layoutService.setAppbarLoader(!0),onLoadEnd:()=>n.layoutService.setAppbarLoader(!1),deps:[a]}),s=ie(),c=(e,t)=>{s(e,t)};return e(U,{children:[e(R,{items:ce,actions:de,onAction:e=>{"back-action"===e&&n.routerService.push("/"),"update-now"===e&&r()}}),l||!o?e(C,{children:e(P,{variant:"h6",sx:{opacity:.5},children:"Loading..."})}):o.length?e(J,{children:[e($,{className:t.root,fields:o,payload:()=>({handleOpen:c})},a),e(i,{paddingBottom:"24px"})]}):e(C,{children:e(P,{variant:"h6",sx:{opacity:.5},children:"No pending signals"})})]})},isActive:e=>z(["/report"],e)}],he=({id:t})=>e(E,{history:n.routerService,onLoadStart:()=>n.layoutService.setAppbarLoader(!0),onLoadEnd:()=>n.layoutService.setAppbarLoader(!1),routes:pe,params:{id:t}});export{he as StatusPage,he as default};