@backtest-kit/ui 9.8.3 → 10.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +254 -254
- package/build/modules/frontend/build/3rdparty/ace_1.4.12/ace.js +21337 -21337
- package/build/modules/frontend/build/3rdparty/ace_1.4.12/mode-javascript.js +797 -797
- package/build/modules/frontend/build/3rdparty/ace_1.4.12/theme-chrome.js +137 -137
- package/build/modules/frontend/build/3rdparty/ace_1.4.12/theme-twilight.js +115 -115
- package/build/modules/frontend/build/3rdparty/ace_1.4.12/worker-javascript.js +15012 -15012
- package/build/modules/frontend/build/3rdparty/qfchart_0.8.7/echarts.min.js +45 -45
- package/build/modules/frontend/build/assets/{Article-nF44Bhzs.js → Article-BkqQ5EIB.js} +1 -1
- package/build/modules/frontend/build/assets/{Background-DT3hIWwy.js → Background-C5mQFgnc.js} +1 -1
- package/build/modules/frontend/build/assets/{IconPhoto-DeS1EXAM.js → IconPhoto-RmbjSaWd.js} +1 -1
- package/build/modules/frontend/build/assets/{KeyboardArrowLeft-D33Gu2l9.js → KeyboardArrowLeft-BK4kp5pC.js} +1 -1
- package/build/modules/frontend/build/assets/{PictureAsPdfOutlined-otiLymXi.js → PictureAsPdfOutlined-Cjnlpc77.js} +1 -1
- package/build/modules/frontend/build/assets/{Refresh-Ci8GqzD_.js → Refresh-CgnzBUH7.js} +1 -1
- package/build/modules/frontend/build/assets/emitters-CuKGK04t.js +1 -0
- package/build/modules/frontend/build/assets/{hasRouteMatch-C5nvBKVM.js → hasRouteMatch-CF1plm6J.js} +1 -1
- package/build/modules/frontend/build/assets/{html2canvas-b89kRSoc.js → html2canvas-BO4vfy6m.js} +1 -1
- package/build/modules/frontend/build/assets/{index-Cx4mKyDI.js → index-B03OrltK.js} +1 -1
- package/build/modules/frontend/build/assets/{index-BF7ijyG8.js → index-BByqC_Ig.js} +1 -1
- package/build/modules/frontend/build/assets/{index-BHbczcFW.js → index-BKVaOBtA.js} +1 -1
- package/build/modules/frontend/build/assets/{index-jOJ-VhE4.js → index-BuVcnJXz.js} +1 -1
- package/build/modules/frontend/build/assets/index-CPM0uj7h.js +1 -0
- package/build/modules/frontend/build/assets/index-CphF8bwK.js +1 -0
- package/build/modules/frontend/build/assets/{index-B46PEmT3.js → index-DEX3MIOs.js} +1 -1
- package/build/modules/frontend/build/assets/{index-CYhJz_27.js → index-DJ3rrxrG.js} +5 -5
- package/build/modules/frontend/build/assets/{index-DK0yzg18.js → index-DiOBdcv4.js} +1 -1
- package/build/modules/frontend/build/assets/{index-BEVVzgtv.js → index-H4kCggfp.js} +1 -1
- package/build/modules/frontend/build/assets/{index-ClCTBJDG.js → index-rV_l1iV2.js} +1 -1
- package/build/modules/frontend/build/assets/{index-DQ4y6hpE.js → index-vWbtKM2z.js} +1 -1
- package/build/modules/frontend/build/assets/{index-XSHiFfmY.js → index-xkqMMLUq.js} +1 -1
- package/build/modules/frontend/build/assets/{index.es-BBkHVhy6.js → index.es-CJdxwTU5.js} +1 -1
- package/build/modules/frontend/build/assets/{markdownit-KRHYWAb-.js → markdownit-CVGsGRJ-.js} +1 -1
- package/build/modules/frontend/build/index.html +87 -87
- package/build/modules/frontend/build/manifest.json +23 -23
- package/package.json +118 -118
- package/build/modules/frontend/build/assets/emitters-Fs38zfiG.js +0 -1
- package/build/modules/frontend/build/assets/index-aUhRWZqD.js +0 -1
- package/build/modules/frontend/build/assets/index-fybQL467.js +0 -1
package/package.json
CHANGED
|
@@ -1,118 +1,118 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@backtest-kit/ui",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "Full-stack UI framework for visualizing cryptocurrency trading signals, backtests, and real-time market data. React dashboard with candlestick charts, signal tracking, and risk analysis.",
|
|
5
|
-
"author": {
|
|
6
|
-
"name": "Petr Tripolsky",
|
|
7
|
-
"email": "tripolskypetr@gmail.com",
|
|
8
|
-
"url": "https://github.com/tripolskypetr"
|
|
9
|
-
},
|
|
10
|
-
"funding": {
|
|
11
|
-
"type": "individual",
|
|
12
|
-
"url": "http://paypal.me/tripolskypetr"
|
|
13
|
-
},
|
|
14
|
-
"license": "MIT",
|
|
15
|
-
"homepage": "https://backtest-kit.github.io/documents/article_07_ai_news_trading_signals.html",
|
|
16
|
-
"keywords": [
|
|
17
|
-
"backtest",
|
|
18
|
-
"backtesting",
|
|
19
|
-
"trading",
|
|
20
|
-
"crypto",
|
|
21
|
-
"cryptocurrency",
|
|
22
|
-
"bitcoin",
|
|
23
|
-
"ethereum",
|
|
24
|
-
"dashboard",
|
|
25
|
-
"ui",
|
|
26
|
-
"react",
|
|
27
|
-
"material-ui",
|
|
28
|
-
"mui",
|
|
29
|
-
"charts",
|
|
30
|
-
"candlestick",
|
|
31
|
-
"lightweight-charts",
|
|
32
|
-
"signals",
|
|
33
|
-
"trading-signals",
|
|
34
|
-
"risk-management",
|
|
35
|
-
"ccxt",
|
|
36
|
-
"binance",
|
|
37
|
-
"exchange",
|
|
38
|
-
"visualization",
|
|
39
|
-
"trading-bot",
|
|
40
|
-
"algo-trading",
|
|
41
|
-
"algorithmic-trading",
|
|
42
|
-
"quantitative-trading"
|
|
43
|
-
],
|
|
44
|
-
"files": [
|
|
45
|
-
"build",
|
|
46
|
-
"types.d.ts",
|
|
47
|
-
"README.md"
|
|
48
|
-
],
|
|
49
|
-
"repository": {
|
|
50
|
-
"type": "git",
|
|
51
|
-
"url": "https://github.com/tripolskypetr/backtest-kit",
|
|
52
|
-
"documentation": "https://github.com/tripolskypetr/backtest-kit/tree/master/docs"
|
|
53
|
-
},
|
|
54
|
-
"bugs": {
|
|
55
|
-
"url": "https://github.com/tripolskypetr/backtest-kit/issues"
|
|
56
|
-
},
|
|
57
|
-
"scripts": {
|
|
58
|
-
"start": "npm run build && cross-env NODE_ENV=development CC_ENABLE_MOCK=1 npm run serve",
|
|
59
|
-
"serve": "node ./scripts/mock.mjs",
|
|
60
|
-
"build:modules": "npm run build:modules:win",
|
|
61
|
-
"build:modules:win": "dotenv -e .env -- .\\scripts\\win\\build.bat && npm run build:copy && npm run build:postbuild",
|
|
62
|
-
"build:modules:x": "dotenv -e .env -- sh ./scripts/linux/build.sh && npm run build:copy && npm run build:postbuild",
|
|
63
|
-
"build:copy": "node ./scripts/copy.mjs",
|
|
64
|
-
"build:postbuild": "node ./scripts/postbuild.mjs",
|
|
65
|
-
"build": "rollup -c"
|
|
66
|
-
},
|
|
67
|
-
"main": "build/index.cjs",
|
|
68
|
-
"module": "build/index.mjs",
|
|
69
|
-
"source": "src/index.ts",
|
|
70
|
-
"types": "./types.d.ts",
|
|
71
|
-
"exports": {
|
|
72
|
-
"require": "./build/index.cjs",
|
|
73
|
-
"types": "./types.d.ts",
|
|
74
|
-
"import": "./build/index.mjs",
|
|
75
|
-
"default": "./build/index.cjs"
|
|
76
|
-
},
|
|
77
|
-
"devDependencies": {
|
|
78
|
-
"@rollup/plugin-typescript": "11.1.6",
|
|
79
|
-
"@rollup/plugin-terser": "0.4.4",
|
|
80
|
-
"@types/finalhandler": "1.2.3",
|
|
81
|
-
"@types/serve-handler": "6.1.4",
|
|
82
|
-
"cross-env": "7.0.3",
|
|
83
|
-
"@types/node": "22.9.0",
|
|
84
|
-
"glob": "11.0.1",
|
|
85
|
-
"rimraf": "6.0.1",
|
|
86
|
-
"rollup": "3.29.5",
|
|
87
|
-
"rollup-plugin-dts": "6.1.1",
|
|
88
|
-
"rollup-plugin-peer-deps-external": "2.2.4",
|
|
89
|
-
"ts-morph": "27.0.2",
|
|
90
|
-
"tslib": "2.7.0",
|
|
91
|
-
"typedoc": "0.27.9",
|
|
92
|
-
"ccxt": "4.5.24",
|
|
93
|
-
"touch": "3.1.1",
|
|
94
|
-
"worker-testbed": "2.0.0",
|
|
95
|
-
"backtest-kit": "
|
|
96
|
-
"markdown-it": "14.1.0"
|
|
97
|
-
},
|
|
98
|
-
"peerDependencies": {
|
|
99
|
-
"backtest-kit": "^
|
|
100
|
-
"markdown-it": "^14.1.0",
|
|
101
|
-
"ccxt": "^4.5.24",
|
|
102
|
-
"typescript": "^5.0.0"
|
|
103
|
-
},
|
|
104
|
-
"dependencies": {
|
|
105
|
-
"di-kit": "^1.1.1",
|
|
106
|
-
"di-scoped": "^1.0.21",
|
|
107
|
-
"functools-kit": "^2.3.0",
|
|
108
|
-
"get-moment-stamp": "^
|
|
109
|
-
"finalhandler": "^1.3.1",
|
|
110
|
-
"serve-handler": "^6.1.6",
|
|
111
|
-
"cryptocurrency-icons": "^0.18.1",
|
|
112
|
-
"router": "^1.3.8",
|
|
113
|
-
"micro": "^10.0.1"
|
|
114
|
-
},
|
|
115
|
-
"publishConfig": {
|
|
116
|
-
"access": "public"
|
|
117
|
-
}
|
|
118
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@backtest-kit/ui",
|
|
3
|
+
"version": "10.1.0",
|
|
4
|
+
"description": "Full-stack UI framework for visualizing cryptocurrency trading signals, backtests, and real-time market data. React dashboard with candlestick charts, signal tracking, and risk analysis.",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Petr Tripolsky",
|
|
7
|
+
"email": "tripolskypetr@gmail.com",
|
|
8
|
+
"url": "https://github.com/tripolskypetr"
|
|
9
|
+
},
|
|
10
|
+
"funding": {
|
|
11
|
+
"type": "individual",
|
|
12
|
+
"url": "http://paypal.me/tripolskypetr"
|
|
13
|
+
},
|
|
14
|
+
"license": "MIT",
|
|
15
|
+
"homepage": "https://backtest-kit.github.io/documents/article_07_ai_news_trading_signals.html",
|
|
16
|
+
"keywords": [
|
|
17
|
+
"backtest",
|
|
18
|
+
"backtesting",
|
|
19
|
+
"trading",
|
|
20
|
+
"crypto",
|
|
21
|
+
"cryptocurrency",
|
|
22
|
+
"bitcoin",
|
|
23
|
+
"ethereum",
|
|
24
|
+
"dashboard",
|
|
25
|
+
"ui",
|
|
26
|
+
"react",
|
|
27
|
+
"material-ui",
|
|
28
|
+
"mui",
|
|
29
|
+
"charts",
|
|
30
|
+
"candlestick",
|
|
31
|
+
"lightweight-charts",
|
|
32
|
+
"signals",
|
|
33
|
+
"trading-signals",
|
|
34
|
+
"risk-management",
|
|
35
|
+
"ccxt",
|
|
36
|
+
"binance",
|
|
37
|
+
"exchange",
|
|
38
|
+
"visualization",
|
|
39
|
+
"trading-bot",
|
|
40
|
+
"algo-trading",
|
|
41
|
+
"algorithmic-trading",
|
|
42
|
+
"quantitative-trading"
|
|
43
|
+
],
|
|
44
|
+
"files": [
|
|
45
|
+
"build",
|
|
46
|
+
"types.d.ts",
|
|
47
|
+
"README.md"
|
|
48
|
+
],
|
|
49
|
+
"repository": {
|
|
50
|
+
"type": "git",
|
|
51
|
+
"url": "https://github.com/tripolskypetr/backtest-kit",
|
|
52
|
+
"documentation": "https://github.com/tripolskypetr/backtest-kit/tree/master/docs"
|
|
53
|
+
},
|
|
54
|
+
"bugs": {
|
|
55
|
+
"url": "https://github.com/tripolskypetr/backtest-kit/issues"
|
|
56
|
+
},
|
|
57
|
+
"scripts": {
|
|
58
|
+
"start": "npm run build && cross-env NODE_ENV=development CC_ENABLE_MOCK=1 npm run serve",
|
|
59
|
+
"serve": "node ./scripts/mock.mjs",
|
|
60
|
+
"build:modules": "npm run build:modules:win",
|
|
61
|
+
"build:modules:win": "dotenv -e .env -- .\\scripts\\win\\build.bat && npm run build:copy && npm run build:postbuild",
|
|
62
|
+
"build:modules:x": "dotenv -e .env -- sh ./scripts/linux/build.sh && npm run build:copy && npm run build:postbuild",
|
|
63
|
+
"build:copy": "node ./scripts/copy.mjs",
|
|
64
|
+
"build:postbuild": "node ./scripts/postbuild.mjs",
|
|
65
|
+
"build": "rollup -c"
|
|
66
|
+
},
|
|
67
|
+
"main": "build/index.cjs",
|
|
68
|
+
"module": "build/index.mjs",
|
|
69
|
+
"source": "src/index.ts",
|
|
70
|
+
"types": "./types.d.ts",
|
|
71
|
+
"exports": {
|
|
72
|
+
"require": "./build/index.cjs",
|
|
73
|
+
"types": "./types.d.ts",
|
|
74
|
+
"import": "./build/index.mjs",
|
|
75
|
+
"default": "./build/index.cjs"
|
|
76
|
+
},
|
|
77
|
+
"devDependencies": {
|
|
78
|
+
"@rollup/plugin-typescript": "11.1.6",
|
|
79
|
+
"@rollup/plugin-terser": "0.4.4",
|
|
80
|
+
"@types/finalhandler": "1.2.3",
|
|
81
|
+
"@types/serve-handler": "6.1.4",
|
|
82
|
+
"cross-env": "7.0.3",
|
|
83
|
+
"@types/node": "22.9.0",
|
|
84
|
+
"glob": "11.0.1",
|
|
85
|
+
"rimraf": "6.0.1",
|
|
86
|
+
"rollup": "3.29.5",
|
|
87
|
+
"rollup-plugin-dts": "6.1.1",
|
|
88
|
+
"rollup-plugin-peer-deps-external": "2.2.4",
|
|
89
|
+
"ts-morph": "27.0.2",
|
|
90
|
+
"tslib": "2.7.0",
|
|
91
|
+
"typedoc": "0.27.9",
|
|
92
|
+
"ccxt": "4.5.24",
|
|
93
|
+
"touch": "3.1.1",
|
|
94
|
+
"worker-testbed": "2.0.0",
|
|
95
|
+
"backtest-kit": "10.1.0",
|
|
96
|
+
"markdown-it": "14.1.0"
|
|
97
|
+
},
|
|
98
|
+
"peerDependencies": {
|
|
99
|
+
"backtest-kit": "^10.1.0",
|
|
100
|
+
"markdown-it": "^14.1.0",
|
|
101
|
+
"ccxt": "^4.5.24",
|
|
102
|
+
"typescript": "^5.0.0"
|
|
103
|
+
},
|
|
104
|
+
"dependencies": {
|
|
105
|
+
"di-kit": "^1.1.1",
|
|
106
|
+
"di-scoped": "^1.0.21",
|
|
107
|
+
"functools-kit": "^2.3.0",
|
|
108
|
+
"get-moment-stamp": "^2.0.0",
|
|
109
|
+
"finalhandler": "^1.3.1",
|
|
110
|
+
"serve-handler": "^6.1.6",
|
|
111
|
+
"cryptocurrency-icons": "^0.18.1",
|
|
112
|
+
"router": "^1.3.8",
|
|
113
|
+
"micro": "^10.0.1"
|
|
114
|
+
},
|
|
115
|
+
"publishConfig": {
|
|
116
|
+
"access": "public"
|
|
117
|
+
}
|
|
118
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Z as o}from"./index-CYhJz_27.js";const r=new o;export{r};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{aX as t,X as a,i as e,f as o,v as i,w as n,p as s,H as r,z as c,T as l,aY as d,x as p,B as u,F as m,K as b,L as y,N as h,Q as g,l as f,n as S,O as v,V as L,a8 as k,aZ as w,a_ as x,q as A,Y as N,Z as C,a$ as $,D as j,b0 as R,a9 as F}from"./index-CYhJz_27.js";import{h as H}from"./hasRouteMatch-C5nvBKVM.js";import{I as B}from"./IconPhoto-DeS1EXAM.js";import{C as M,R as _}from"./Refresh-Ci8GqzD_.js";import{K as E}from"./KeyboardArrowLeft-D33Gu2l9.js";import{B as V}from"./Background-DT3hIWwy.js";const G="backtest-kit__groupHeader",O="backtest-kit__groupRoot",z="backtest-kit__symbolImage",I=s()({root:{[`& .${O}:hover .${G}`]:{opacity:"1 !important"}}});function P(t){return L(t,"#000000")>L(t,"#FFFFFF")}const D=[{type:n.Link,action:"back-action",label:o(E,{sx:{display:"block"}})},{type:n.Link,action:"back-action",label:"Main"},{type:n.Link,action:"back-action",label:"Status"}],K=[{action:"update-now",label:"Refresh",icon:()=>o(c,{icon:_,color:"#4caf50"})}],T=(t,a)=>({type:r.Group,className:O,sx:{p:2},tabletColumns:"12",desktopColumns:"3",fields:[{type:r.Component,className:G,style:{transition:"opacity 500ms",opacity:.5},element:()=>o(h,{direction:"row",children:[o(b,{variant:"outlined",size:"small",color:"info",label:`${y.bullet} ${t}`,sx:{mb:1,pr:.5,fontSize:"14px",background:"white",cursor:"not-allowed"}}),o(u,{flex:1})]})},{type:r.Group,fields:a.map(({symbol:t,label:a,to:i,color:n})=>((t,a,i,n)=>({type:r.Component,desktopColumns:"6",tabletColumns:"6",phoneColumns:"12",fieldRightMargin:"1",fieldBottomMargin:"1",element:()=>o(v,{component:g,onClick:()=>{e.routerService.push(`/status/${a}`)},sx:{width:"100%",background:n,color:"white",fontWeight:"bold",fontSize:"14px",height:"75px",minHeight:"75px",textWrap:"wrap",padding:"16px",[`& .${z}`]:{transition:"filter 500ms"},"&:hover":{background:()=>P(n)?f(n,.33):S(n,.33),[`& .${z}`]:{transition:"filter 500ms",filter:P(n)?"brightness(0.7) contrast(1.2)":"brightness(1.3) contrast(0.5)"}},transition:"background 500ms"},startIcon:o(B,{className:z,symbol:t}),children:i})}))(t,i,a,n))}]}),U=[{type:n.Link,action:"back-action",label:o(E,{sx:{display:"block"}})},{type:n.Link,action:"back-action",label:"Main"},{type:n.Link,action:"back-action",label:"Status"},{type:n.Link,action:"back-action",compute:t=>t?`${String(t.symbol).toUpperCase()} (${t.strategyName})`:"Live"},{type:n.Button,action:"print-action",label:"Print",icon:$}],W=[{action:"print-action",label:"Print",icon:()=>o(c,{icon:$,color:"#4caf50"})},{action:"download-action",label:"Download",icon:()=>o(c,{icon:j,color:"#4caf50"})},{divider:!0},{action:"update-now",label:"Refresh",icon:()=>o(c,{icon:_,color:"#4caf50"})}],X=new C,Y=[{id:"status",element:({params:t})=>{const[n]=a(async()=>{const a=await e.statusViewService.getStatusMap();return k.get(a,t.id,null)},{onLoadStart:()=>e.layoutService.setAppbarLoader(!0),onLoadEnd:()=>e.layoutService.setAppbarLoader(!1),deps:[t.id]}),[s,{loading:r,execute:c}]=a(async()=>await e.statusViewService.getStatusOne(t.id),{onLoadStart:()=>e.layoutService.setAppbarLoader(!0),onLoadEnd:()=>e.layoutService.setAppbarLoader(!1),deps:[t.id]}),b=w(async()=>{if(!s)return;const t=new Blob([JSON.stringify(s,null,2)],{type:"application/json"}),a=URL.createObjectURL(t);e.layoutService.downloadFile(a,`status_${Date.now()}.json`)}),y=w(async()=>{if(!s)return;const t=e.markdownHelperService.buildMarkdownFromFields(x,s);await A(t)});N(()=>X.subscribe(c));return o(M,{children:[o(i,{items:U,actions:W,payload:n,onAction:async t=>{"back-action"===t&&((async()=>{1!==(await e.statusViewService.getStatusList()).length?e.routerService.push("/status"):e.routerService.push("/")})(),e.routerService.push("/")),"update-now"===t&&await X.next(),"download-action"===t&&await b(),"print-action"===t&&await y()}}),r?o(d,{children:o(l,{variant:"h6",sx:{opacity:.5},children:"Loading..."})}):s?o(m,{children:[o(p,{handler:s,fields:R}),o(u,{paddingBottom:"24px"})]}):o(d,{children:o(l,{variant:"h6",sx:{opacity:.5},children:"No pending signal"})}),o(V,{})]})},isActive:t=>H(["/status/:id"],t)},{id:"main",element:()=>{const{classes:n}=I(),{reloadTrigger:s,doReload:c}=t();a(async()=>{const t=await e.statusViewService.getStatusList();if(1===t.length){const[{id:a}]=t;e.routerService.push(`/status/${a}`)}},{onLoadStart:()=>e.layoutService.setAppbarLoader(!0),onLoadEnd:()=>e.layoutService.setAppbarLoader(!1),deps:[s]});const[b,{loading:y}]=a(async()=>await(async()=>{const[t,a]=await Promise.all([e.symbolGlobalService.getSymbolMap(),e.statusViewService.getStatusList()]);if(!a||0===a.length)return[{type:r.Typography,typoVariant:"h6",placeholder:"Listening for a pending signal...",sx:{textAlign:"center",opacity:.5,mt:4}}];const o={};a.forEach(a=>{const e=t[a.symbol],i=a.strategyName;o[i]||(o[i]=[]),o[i].push({symbol:a.symbol,label:(null==e?void 0:e.displayName)||a.symbol,color:(null==e?void 0:e.color)||"#ccc",to:a.id})});const i=Object.entries(o).sort(([,t],[,a])=>a.length-t.length),n=[],s=[],c=[];return i.forEach(([t,a],e)=>{const o=T(t,a);e%2==0?n.push(o):s.push(o),c.push(o)}),[{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:s},{type:r.Group,columns:"12",className:"wideColumn",tabletHidden:!0,fields:c}]})(),{onLoadStart:()=>e.layoutService.setAppbarLoader(!0),onLoadEnd:()=>e.layoutService.setAppbarLoader(!1),deps:[s]});return o(M,{children:[o(i,{items:D,actions:K,onAction:t=>{"back-action"===t&&e.routerService.push("/"),"update-now"===t&&c()}}),y||!b?o(d,{children:o(l,{variant:"h6",sx:{opacity:.5},children:"Loading..."})}):b.length?o(m,{children:[o(p,{className:n.root,fields:b},s),o(u,{paddingBottom:"24px"})]}):o(d,{children:o(l,{variant:"h6",sx:{opacity:.5},children:"No pending signals"})})]})},isActive:t=>H(["/status"],t)}],Z=({id:t})=>o(F,{history:e.routerService,onLoadStart:()=>e.layoutService.setAppbarLoader(!0),onLoadEnd:()=>e.layoutService.setAppbarLoader(!1),routes:Y,params:{id:t}});export{Z as StatusPage,Z as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{b as e,f as o,aX as t,X as i,i as a,v as n,w as l,p as s,H as r,z as c,T as p,aY as d,x as m,B as u,F as h,K as b,L as y,N as f,Q as g,l as k,n as v,O as C,V as S,r as L,av as x,bl as w,bm as P,bn as T,bo as V,bp as $,bq as H,ao as M,aj as N,ab as z,Y as O,b4 as A,aU as _,aG as I,P as E,G as F,ar as R,br as j,Z as G,aA as B,aB as D,aZ as U,a6 as W,I as Y,a3 as K,D as X,a9 as Z}from"./index-CYhJz_27.js";import{h as q}from"./hasRouteMatch-C5nvBKVM.js";import{I as J}from"./IconPhoto-DeS1EXAM.js";import{C as Q,R as ee}from"./Refresh-Ci8GqzD_.js";import{K as oe}from"./KeyboardArrowLeft-D33Gu2l9.js";const te=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"),ie=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"),ae=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"),ne="backtest-kit__groupHeader",le="backtest-kit__groupRoot",se="backtest-kit__symbolImage",re=s()({root:{[`& .${le}:hover .${ne}`]:{opacity:"1 !important"}}});function ce(e){return S(e,"#000000")>S(e,"#FFFFFF")}const pe=[{type:l.Link,action:"back-action",label:o(oe,{sx:{display:"block"}})},{type:l.Link,action:"back-action",label:"Main"},{type:l.Link,action:"back-action",label:"Price Chart"}],de=[{action:"update-now",label:"Refresh",icon:()=>o(c,{icon:ee,color:"#4caf50"})}],me=(e,t)=>({type:r.Group,className:le,sx:{p:2},tabletColumns:"12",desktopColumns:"3",fields:[{type:r.Component,className:ne,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",[`& .${se}`]:{transition:"filter 500ms"},"&:hover":{background:()=>ce(i)?k(i,.33):v(i,.33),[`& .${se}`]:{transition:"filter 500ms",filter:ce(i)?"brightness(0.7) contrast(1.2)":"brightness(1.3) contrast(0.5)"}},transition:"background 500ms"},startIcon:o(J,{className:se,symbol:e}),children:t})}))(e,t,i))}]}),ue="backtest-kit__groupHeader",he="backtest-kit__groupRoot",be="backtest-kit__symbolImage",ye=s()({root:{[`& .${he}:hover .${ue}`]:{opacity:"1 !important"}}});function fe(e){return S(e,"#000000")>S(e,"#FFFFFF")}const ge=[{type:l.Link,action:"back-action",label:o(oe,{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()}],ke=(e,t)=>({type:r.Group,className:he,sx:{p:2},desktopColumns:"6",tabletColumns:"6",phoneColumns:"12",fields:[{type:r.Component,className:ue,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",[`& .${be}`]:{transition:"filter 500ms"},"&:hover":{background:()=>fe(i)?k(i,.33):v(i,.33),[`& .${be}`]:{transition:"filter 500ms",filter:fe(i)?"brightness(0.7) contrast(1.2)":"brightness(1.3) contrast(0.5)"}},transition:"background 500ms"},startIcon:o(n,{className:be}),children:t})}))(t,e,i,n))}]}),ve=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"}}),Ce={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}},Se=({height:e,width:t,items:i,position:a,priceOpen:n,priceStopLoss:l,priceTakeProfit:s})=>{const{classes:r}=ve(),c=L.useRef(void 0),[p,d]=L.useState(null);return L.useLayoutEffect(()=>{const{current:o}=c,r=x(o,{...Ce,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=M(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=M(o.timestamp).format("DD/MM/YYYY HH:mm:ss"),t=N(o.close.toFixed(6));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"},xe={"1m":"1 minute","15m":"15 minutes","1h":"1 hour"};const we=({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=z(f);O(()=>n.subscribe(k)),O(()=>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(E,{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:xe[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(A,{disabled:r,onClick:s,children:o(_,{style:{color:"white",opacity:r?.5:1}})})]}),o(I,{}),!f||g?o(F,{sx:{height:"100%",width:"100%"}}):o(u,{sx:{position:"relative",flex:1},children:o(R,{style:{position:"absolute"},children:({height:e,width:t})=>o(Se,{items:f,height:e,width:t,position:c,priceOpen:d,priceStopLoss:m,priceTakeProfit:h})})})]})},Pe=[{type:l.Link,action:"back-action",label:o(oe,{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()}],Te=[{action:"download-now",label:"Download",icon:()=>o(c,{icon:X,color:"#4caf50"})},{divider:!0},{action:"update-now",label:"Refresh",icon:()=>o(c,{icon:ee,color:"#4caf50"})}],Ve=new G,$e=new G,He=[{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?`${N(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?`${N(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?`${N(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?`${N(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?`${N(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?`${N(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=j(()=>({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]});O(()=>Ve.subscribe(r));const c=L.useMemo(()=>l?l.priceTakeProfit:0,[l]),p=L.useMemo(()=>l?l.priceStopLoss:0,[l]),d=L.useMemo(()=>l?l.priceOpen:0,[l]),m=L.useMemo(()=>l?l.position:null,[l]),[u,h]=B(null),{pickData:b,setOpen:y,render:g}=D({title:"Info",AfterTitle:({onClose:e})=>o(f,{direction:"row",gap:2,children:[o(W,{onClick:()=>a.layoutService.pickSignal(u.current.id),variant:"outlined",children:"Show Details"}),o(Y,{size:"small",onClick:e,children:o(K,{})})]}),payload:()=>({handleClose(){y(!1)}}),fields:He,handler:()=>u.current,withActionButton:!1}),k=U(async()=>{l&&(h(l),b(l.id))});return o(Q,{children:[o(n,{items:Pe,actions:Te,payload:t,onAction:async o=>{"back-action"===o&&a.routerService.push(`/price_chart/${e.symbol}`),"update-now"===o&&await Ve.next(),"download-now"===o&&await $e.next()}}),s?null:o(we,{symbol:t.symbol,interval:t.interval,disableInfo:!l,reloadSubject:Ve,downloadSubject:$e,onInfoClick:k,position:m,priceOpen:d,priceStopLoss:p,priceTakeProfit:c,sx:{height:"calc(100dvh - 165px)"}}),g()]})},isActive:e=>q(["/price_chart/:symbol/:interval"],e)},{id:"coin",element:({params:e})=>{const{classes:t}=ye(),i=e.symbol,l=L.useMemo(()=>[{label:"1 minute",to:`/price_chart/${i}/1m`,color:"#2979ff",icon:ie},{label:"15 minutes",to:`/price_chart/${i}/15m`,color:"#f3a43a",icon:ae},{label:"1 hour",to:`/price_chart/${i}/1h`,color:"#d500f9",icon:te}],[i]),s=L.useMemo(()=>[ke("Chart",l)],[l]);return o(Q,{children:[o(n,{items:ge,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=>q(["/price_chart/:symbol"],e)},{id:"main",element:()=>{const{classes:e}=re(),{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=me(`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(Q,{children:[o(n,{items:pe,actions:de,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=>q(["/price_chart"],e)}],Ne=({symbol:e,interval:t})=>o(Z,{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};
|