a6ea4d967c
Signed-off-by: TIANHE <TIANHE@GMAIL.COM>
1 line
36 KiB
JavaScript
1 line
36 KiB
JavaScript
"use strict";(self["webpackChunkvue_antd_pro"]=self["webpackChunkvue_antd_pro"]||[]).push([[622],{82622:function(t,a,e){e.r(a),e.d(a,{default:function(){return _}});var s=function(){var t=this,a=t._self._c;return a("div",{staticClass:"dashboard-pro",class:{"theme-dark":t.isDarkTheme}},[a("div",{staticClass:"kpi-grid"},[a("div",{staticClass:"kpi-card kpi-primary"},[a("div",{staticClass:"kpi-glow"}),a("div",{staticClass:"kpi-content"},[a("div",{staticClass:"kpi-header"},[a("span",{staticClass:"kpi-icon"},[a("a-icon",{attrs:{type:"wallet"}})],1),a("span",{staticClass:"kpi-label"},[t._v(t._s(t.$t("dashboard.totalEquity")))])]),a("div",{staticClass:"kpi-value"},[a("span",{staticClass:"currency"},[t._v("$")]),a("span",{staticClass:"amount"},[t._v(t._s(t.formatNumber(t.summary.total_equity)))])]),a("div",{staticClass:"kpi-sub"},[a("span",{class:t.summary.total_pnl>=0?"positive":"negative"},[t._v(" "+t._s(t.summary.total_pnl>=0?"+":"")+t._s(t.formatNumber(t.summary.total_pnl))+" ")]),a("span",{staticClass:"label"},[t._v(t._s(t.$t("dashboard.label.totalPnl")))])])])]),a("div",{staticClass:"kpi-card kpi-win-rate"},[a("div",{staticClass:"kpi-content"},[a("div",{staticClass:"kpi-header"},[a("span",{staticClass:"kpi-icon"},[a("a-icon",{attrs:{type:"trophy"}})],1),a("span",{staticClass:"kpi-label"},[t._v(t._s(t.$t("dashboard.winRate")||"胜率"))])]),a("div",{staticClass:"kpi-value"},[a("span",{staticClass:"amount"},[t._v(t._s(t.formatNumber(t.performance.win_rate,1)))]),a("span",{staticClass:"unit"},[t._v("%")])]),a("div",{staticClass:"kpi-sub"},[a("span",{staticClass:"positive"},[t._v(t._s(t.performance.winning_trades))]),a("span",{staticClass:"label"},[t._v(t._s(t.$t("dashboard.label.win")))]),a("span",{staticClass:"divider"},[t._v("/")]),a("span",{staticClass:"negative"},[t._v(t._s(t.performance.losing_trades))]),a("span",{staticClass:"label"},[t._v(t._s(t.$t("dashboard.label.lose")))])])]),a("div",{staticClass:"kpi-ring"},[a("svg",{attrs:{viewBox:"0 0 36 36"}},[a("path",{staticClass:"ring-bg",attrs:{d:"M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831"}}),a("path",{staticClass:"ring-progress",attrs:{"stroke-dasharray":"".concat(t.performance.win_rate||0,", 100"),d:"M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831"}})])])]),a("div",{staticClass:"kpi-card kpi-profit-factor"},[a("div",{staticClass:"kpi-content"},[a("div",{staticClass:"kpi-header"},[a("span",{staticClass:"kpi-icon"},[a("a-icon",{attrs:{type:"rise"}})],1),a("span",{staticClass:"kpi-label"},[t._v(t._s(t.$t("dashboard.profitFactor")||"盈亏比"))])]),a("div",{staticClass:"kpi-value"},[a("span",{staticClass:"amount"},[t._v(t._s(t.formatNumber(t.performance.profit_factor,2)))]),a("span",{staticClass:"unit"},[t._v(":1")])]),a("div",{staticClass:"kpi-sub"},[a("span",[t._v(t._s(t.$t("dashboard.label.avgProfit"))+" ")]),a("span",{staticClass:"positive"},[t._v("$"+t._s(t.formatNumber(t.performance.avg_win)))])])])]),a("div",{staticClass:"kpi-card kpi-drawdown"},[a("div",{staticClass:"kpi-content"},[a("div",{staticClass:"kpi-header"},[a("span",{staticClass:"kpi-icon"},[a("a-icon",{attrs:{type:"fall"}})],1),a("span",{staticClass:"kpi-label"},[t._v(t._s(t.$t("dashboard.maxDrawdown")||"最大回撤"))])]),a("div",{staticClass:"kpi-value"},[a("span",{staticClass:"amount negative"},[t._v(t._s(t.formatNumber(t.performance.max_drawdown_pct,1)))]),a("span",{staticClass:"unit"},[t._v("%")])]),a("div",{staticClass:"kpi-sub"},[a("span",[t._v("$"+t._s(t.formatNumber(t.performance.max_drawdown)))])])])]),a("div",{staticClass:"kpi-card kpi-trades"},[a("div",{staticClass:"kpi-content"},[a("div",{staticClass:"kpi-header"},[a("span",{staticClass:"kpi-icon"},[a("a-icon",{attrs:{type:"swap"}})],1),a("span",{staticClass:"kpi-label"},[t._v(t._s(t.$t("dashboard.totalTrades")||"总交易"))])]),a("div",{staticClass:"kpi-value"},[a("span",{staticClass:"amount"},[t._v(t._s(t.performance.total_trades))]),a("span",{staticClass:"unit"},[t._v(t._s(t.$t("dashboard.unit.trades")))])]),a("div",{staticClass:"kpi-sub"},[a("span",[t._v(t._s(t.$t("dashboard.label.avgDaily"))+" ")]),a("span",[t._v(t._s(t.avgTradesPerDay))]),a("span",{staticClass:"label"},[t._v(" "+t._s(t.$t("dashboard.unit.trades")))])])])]),a("div",{staticClass:"kpi-card kpi-strategies clickable",on:{click:function(a){return t.$router.push("/trading-assistant")}}},[a("div",{staticClass:"kpi-content"},[a("div",{staticClass:"kpi-header"},[a("span",{staticClass:"kpi-icon"},[a("a-icon",{attrs:{type:"thunderbolt",theme:"filled"}})],1),a("span",{staticClass:"kpi-label"},[t._v(t._s(t.$t("dashboard.runningStrategies")||"运行中策略"))])]),a("div",{staticClass:"kpi-value"},[a("span",{staticClass:"amount"},[t._v(t._s(t.summary.indicator_strategy_count))]),a("span",{staticClass:"unit"},[t._v(t._s(t.$t("dashboard.unit.strategies")))])]),a("div",{staticClass:"kpi-sub"},[a("span",{staticClass:"highlight"},[t._v(t._s(t.summary.indicator_strategy_count))]),a("span",{staticClass:"label"},[t._v(" "+t._s(t.$t("dashboard.label.indicator")))])])]),a("div",{staticClass:"card-arrow"},[a("a-icon",{attrs:{type:"right"}})],1)])]),a("div",{staticClass:"chart-row"},[a("div",{staticClass:"chart-panel chart-main"},[a("div",{staticClass:"panel-header"},[a("div",{staticClass:"panel-title"},[a("a-icon",{attrs:{type:"calendar"}}),a("span",[t._v(t._s(t.$t("dashboard.profitCalendar")||"收益日曆"))])],1),a("div",{staticClass:"calendar-nav"},[a("a-button",{attrs:{type:"link",size:"small",disabled:t.currentCalendarIndex>=t.calendarMonths.length-1},on:{click:t.prevMonth}},[a("a-icon",{attrs:{type:"left"}})],1),a("span",{staticClass:"current-month"},[t._v(t._s(t.currentMonthLabel))]),a("a-button",{attrs:{type:"link",size:"small",disabled:t.currentCalendarIndex<=0},on:{click:t.nextMonth}},[a("a-icon",{attrs:{type:"right"}})],1)],1)]),a("div",{staticClass:"profit-calendar"},[t.currentCalendarMonth?[a("div",{staticClass:"month-summary"},[a("div",{staticClass:"summary-item"},[a("span",{staticClass:"summary-label"},[t._v(t._s(t.$t("dashboard.ranking.totalProfit")))]),a("span",{staticClass:"summary-value",class:t.currentCalendarMonth.total>=0?"positive":"negative"},[t._v(" "+t._s(t.currentCalendarMonth.total>=0?"+":"")+"$"+t._s(t.formatNumber(t.currentCalendarMonth.total))+" ")])]),a("div",{staticClass:"summary-item"},[a("span",{staticClass:"summary-label"},[t._v(t._s(t.$t("dashboard.label.win")))]),a("span",{staticClass:"summary-value positive"},[t._v(t._s(t.currentCalendarMonth.win_days))])]),a("div",{staticClass:"summary-item"},[a("span",{staticClass:"summary-label"},[t._v(t._s(t.$t("dashboard.label.lose")))]),a("span",{staticClass:"summary-value negative"},[t._v(t._s(t.currentCalendarMonth.lose_days))])])]),a("div",{staticClass:"calendar-weekdays"},t._l(t.weekdays,function(e){return a("div",{key:e,staticClass:"weekday"},[t._v(t._s(e))])}),0),a("div",{staticClass:"calendar-grid"},[t._l(t.calendarFirstDayOffset,function(t){return a("div",{key:"empty-"+t,staticClass:"calendar-cell empty"})}),t._l(t.currentCalendarMonth.days_in_month,function(e){return a("div",{key:e,staticClass:"calendar-cell",class:t.getDayClass(e)},[a("span",{staticClass:"day-number"},[t._v(t._s(e))]),null!==t.getDayProfit(e)?a("span",{staticClass:"day-profit",class:t.getDayProfit(e)>=0?"positive":"negative"},[t._v(" "+t._s(t.getDayProfit(e)>=0?"+":"")+t._s(t.formatCompactNumber(t.getDayProfit(e)))+" ")]):t._e()])})],2)]:a("div",{staticClass:"calendar-empty"},[a("a-icon",{attrs:{type:"inbox"}}),a("span",[t._v(t._s(t.$t("dashboard.noData")))])],1)],2)]),a("div",{staticClass:"chart-panel chart-side"},[a("div",{staticClass:"panel-header"},[a("div",{staticClass:"panel-title"},[a("a-icon",{attrs:{type:"pie-chart"}}),a("span",[t._v(t._s(t.$t("dashboard.strategyAllocation")||"策略分布"))])],1)]),a("div",{ref:"pieChart",staticClass:"chart-body"})])]),a("div",{staticClass:"chart-row"},[a("div",{staticClass:"chart-panel chart-half"},[a("div",{staticClass:"panel-header"},[a("div",{staticClass:"panel-title"},[a("a-icon",{attrs:{type:"area-chart"}}),a("span",[t._v(t._s(t.$t("dashboard.drawdownCurve")||"回撤曲线"))])],1)]),a("div",{ref:"drawdownChart",staticClass:"chart-body chart-sm"})]),a("div",{staticClass:"chart-panel chart-half"},[a("div",{staticClass:"panel-header"},[a("div",{staticClass:"panel-title"},[a("a-icon",{attrs:{type:"clock-circle"}}),a("span",[t._v(t._s(t.$t("dashboard.hourlyDistribution")||"交易时段"))])],1)]),a("div",{ref:"hourlyChart",staticClass:"chart-body chart-sm"})])]),a("div",{staticClass:"chart-panel"},[a("div",{staticClass:"panel-header"},[a("div",{staticClass:"panel-title"},[a("a-icon",{attrs:{type:"ordered-list"}}),a("span",[t._v(t._s(t.$t("dashboard.strategyRanking")||"策略排行榜"))])],1)]),a("div",{staticClass:"strategy-ranking"},[0===t.strategyStats.length?a("div",{staticClass:"empty-state"},[a("a-icon",{attrs:{type:"inbox"}}),a("span",[t._v(t._s(t.$t("dashboard.noStrategyData")))])],1):a("div",{staticClass:"ranking-grid"},t._l(t.strategyStats.slice(0,6),function(e,s){return a("div",{key:e.strategy_id,staticClass:"ranking-card",class:{"rank-top":s<3}},[a("div",{staticClass:"rank-badge",class:"rank-".concat(s+1)},[t._v(t._s(s+1))]),a("div",{staticClass:"rank-info"},[a("div",{staticClass:"rank-name"},[t._v(t._s(e.strategy_name))]),a("div",{staticClass:"rank-stats"},[a("span",{staticClass:"stat"},[a("label",[t._v(t._s(t.$t("dashboard.ranking.totalProfit")))]),a("span",{class:e.total_pnl>=0?"positive":"negative"},[t._v(" "+t._s(e.total_pnl>=0?"+":"")+"$"+t._s(t.formatNumber(e.total_pnl))+" ")])]),a("span",{staticClass:"stat"},[a("label",[t._v(t._s(t.$t("dashboard.winRate")))]),a("span",[t._v(t._s(t.formatNumber(e.win_rate,1))+"%")])]),a("span",{staticClass:"stat"},[a("label",[t._v(t._s(t.$t("dashboard.profitFactor")))]),a("span",[t._v(t._s(t.formatNumber(e.profit_factor,2)))])]),a("span",{staticClass:"stat"},[a("label",[t._v(t._s(t.$t("dashboard.ranking.trades")))]),a("span",[t._v(t._s(e.total_trades))])])])]),a("div",{staticClass:"rank-pnl-bar"},[a("div",{staticClass:"bar-fill",class:e.total_pnl>=0?"positive":"negative",style:{width:"".concat(Math.min(100,Math.abs(e.total_pnl)/t.maxStrategyPnl*100),"%")}})])])}),0)])]),a("div",{staticClass:"table-row"},[a("div",{staticClass:"table-panel"},[a("div",{staticClass:"panel-header"},[a("div",{staticClass:"panel-title"},[a("a-icon",{attrs:{type:"stock"}}),a("span",[t._v(t._s(t.$t("dashboard.currentPositions")))])],1),a("div",{staticClass:"panel-badge"},[t._v(t._s((t.summary.current_positions||[]).length))])]),a("a-table",{staticClass:"pro-table",attrs:{columns:t.positionColumns,"data-source":t.summary.current_positions,rowKey:"id",pagination:!1,size:"small",scroll:{x:"max-content"}},scopedSlots:t._u([{key:"symbol",fn:function(e,s){return[a("div",{staticClass:"symbol-cell"},[a("span",{staticClass:"symbol-name"},[t._v(t._s(e))]),a("span",{staticClass:"symbol-strategy"},[t._v(t._s(s.strategy_name))])])]}},{key:"side",fn:function(e){return[a("span",{staticClass:"side-tag",class:"long"===e?"long":"short"},[t._v(" "+t._s("long"===e?"LONG":"SHORT")+" ")])]}},{key:"unrealized_pnl",fn:function(e,s){return[a("div",{staticClass:"pnl-cell"},[a("span",{class:e>=0?"positive":"negative"},[t._v(" "+t._s(e>=0?"+":"")+"$"+t._s(t.formatNumber(e))+" ")]),a("span",{staticClass:"pnl-percent",class:s.pnl_percent>=0?"positive":"negative"},[t._v(" "+t._s(s.pnl_percent>=0?"+":"")+t._s(t.formatNumber(s.pnl_percent))+"% ")])])]}}])})],1),a("div",{staticClass:"table-panel"},[a("div",{staticClass:"panel-header"},[a("div",{staticClass:"panel-title"},[a("a-icon",{attrs:{type:"history"}}),a("span",[t._v(t._s(t.$t("dashboard.recentTrades")))])],1)]),a("a-table",{staticClass:"pro-table",attrs:{columns:t.columns,"data-source":t.summary.recent_trades,rowKey:"id",pagination:{pageSize:8,size:"small"},size:"small",scroll:{x:"max-content"}},scopedSlots:t._u([{key:"type",fn:function(e){return[a("span",{staticClass:"type-tag",class:t.getTypeClass(e)},[t._v(" "+t._s(t.getSignalTypeText(e))+" ")])]}},{key:"profit",fn:function(e,s){return[a("span",{class:"--"!==t.formatProfitValue(e,s)?e>=0?"positive":"negative":""},[t._v(" "+t._s(t.formatProfitValue(e,s))+" ")])]}},{key:"time",fn:function(e){return[a("span",{staticClass:"time-cell"},[t._v(t._s(t.formatTime(e)))])]}}])})],1)]),a("div",{staticClass:"chart-panel orders-panel"},[a("div",{staticClass:"panel-header"},[a("div",{staticClass:"panel-title"},[a("a-icon",{attrs:{type:"unordered-list"}}),a("span",[t._v(t._s(t.$t("dashboard.pendingOrders")))]),a("a-tooltip",{attrs:{title:t.soundEnabled?t.$t("dashboard.clickToMute"):t.$t("dashboard.clickToUnmute")}},[a("a-icon",{staticClass:"sound-toggle",class:{"sound-off":!t.soundEnabled},attrs:{type:t.soundEnabled?"sound":"audio-muted"},on:{click:t.toggleSound}})],1)],1),a("div",{staticClass:"panel-badge"},[t._v(t._s(t.ordersPagination.total))])]),a("a-table",{staticClass:"pro-table",attrs:{columns:t.orderColumns,"data-source":t.pendingOrders,rowKey:"id",pagination:{current:t.ordersPagination.current,pageSize:t.ordersPagination.pageSize,total:t.ordersPagination.total,showSizeChanger:!0,size:"small",showTotal:function(a){return t.$t("dashboard.totalOrders",{total:a})}},size:"small",loading:t.ordersLoading,scroll:{x:1200}},on:{change:t.handleOrdersTableChange},scopedSlots:t._u([{key:"strategy_name",fn:function(e,s){return[a("div",{staticClass:"symbol-cell"},[a("span",{staticClass:"symbol-name"},[t._v(t._s(e||"-"))]),a("span",{staticClass:"symbol-strategy"},[t._v("ID: "+t._s(s.strategy_id))])])]}},{key:"symbol",fn:function(e){return[a("span",{staticClass:"symbol-tag"},[t._v(t._s(e))])]}},{key:"signal_type",fn:function(e){return[a("span",{staticClass:"type-tag",class:t.getTypeClass(e)},[t._v(" "+t._s(t.getSignalTypeText(e))+" ")])]}},{key:"exchange",fn:function(e,s){return[s&&(s.exchange_display||s.exchange_id||e)?a("span",{staticClass:"exchange-tag",class:(s.exchange_display||s.exchange_id||e).toLowerCase()},[t._v(" "+t._s(String(s.exchange_display||s.exchange_id||e).toUpperCase())+" ")]):a("span",{staticClass:"text-muted"},[t._v("-")]),s&&s.market_type?a("div",{staticClass:"market-type"},[t._v(" "+t._s(String(s.market_type).toUpperCase())+" ")]):t._e()]}},{key:"notify",fn:function(e,s){return[a("div",{staticClass:"notify-icons"},[t._l(s&&s.notify_channels?s.notify_channels:[],function(e){return a("a-tooltip",{key:"".concat(s.id,"-").concat(e),attrs:{title:String(e)}},[a("a-icon",{staticClass:"notify-icon",attrs:{type:t.getNotifyIconType(e)}})],1)}),s&&s.notify_channels&&0!==s.notify_channels.length?t._e():a("span",{staticClass:"text-muted"},[t._v("-")])],2)]}},{key:"status",fn:function(e,s){return[a("span",{staticClass:"status-tag",class:e},[t._v(" "+t._s(t.getStatusText(e))+" ")]),"failed"===e&&s.error_message?a("div",{staticClass:"error-hint"},[a("a-tooltip",{attrs:{title:s.error_message}},[a("a-icon",{attrs:{type:"exclamation-circle"}}),a("span",[t._v(t._s(t.$t("dashboard.viewError")))])],1)],1):t._e()]}},{key:"amount",fn:function(e,s){return[a("div",[t._v(t._s(t.formatNumber(e,8)))]),s.filled_amount?a("div",{staticClass:"sub-text"},[t._v(" "+t._s(t.$t("dashboard.filled"))+": "+t._s(t.formatNumber(s.filled_amount,8))+" ")]):t._e()]}},{key:"price",fn:function(e,s){return[s.filled_price?a("div",[t._v(t._s(t.formatNumber(s.filled_price)))]):a("div",{staticClass:"text-muted"},[t._v("-")])]}},{key:"time_info",fn:function(e,s){return[a("div",{staticClass:"time-cell"},[t._v(t._s(t.formatTime(s.created_at)))]),s.executed_at?a("div",{staticClass:"sub-text"},[t._v(" "+t._s(t.formatTime(s.executed_at))+" ")]):t._e()]}}])})],1)])},r=[],n=e(81127),i=e(56252),o=e(57532),l=e(2403),d=e(76338),c=e(86529),u=e(75769),p={summary:"/api/dashboard/summary",pendingOrders:"/api/dashboard/pendingOrders"};function h(){return(0,u.Ay)({url:p.summary,method:"get"})}function f(t){return(0,u.Ay)({url:p.pendingOrders,method:"get",params:t})}var m=e(95353),g={name:"Dashboard",data:function(){return{summary:{ai_strategy_count:0,indicator_strategy_count:0,total_equity:0,total_pnl:0,total_realized_pnl:0,total_unrealized_pnl:0,performance:{},strategy_stats:[],daily_pnl_chart:[],strategy_pnl_chart:[],monthly_returns:[],hourly_distribution:[],calendar_months:[],recent_trades:[],current_positions:[]},currentCalendarIndex:0,pieChart:null,drawdownChart:null,hourlyChart:null,pendingOrders:[],ordersLoading:!1,ordersPagination:{current:1,pageSize:20,total:0},orderPollTimer:null,lastOrderId:0,orderPollIntervalMs:5e3,soundEnabled:!0,beepCtx:null}},computed:(0,d.A)((0,d.A)({},(0,m.aH)({navTheme:function(t){return t.app.theme}})),{},{isDarkTheme:function(){return"dark"===this.navTheme||"realdark"===this.navTheme},performance:function(){return this.summary.performance||{}},strategyStats:function(){return this.summary.strategy_stats||[]},maxStrategyPnl:function(){var t=this.strategyStats;return t.length?Math.max.apply(Math,(0,l.A)(t.map(function(t){return Math.abs(t.total_pnl||0)})).concat([1])):1},avgTradesPerDay:function(){var t=this.summary.daily_pnl_chart||[],a=t.length||1,e=this.performance.total_trades||0;return(e/a).toFixed(1)},calendarMonths:function(){return this.summary.calendar_months||[]},currentCalendarMonth:function(){var t=this.calendarMonths;return t.length&&t[this.currentCalendarIndex]||null},currentMonthLabel:function(){var t=this.currentCalendarMonth;if(!t)return"-";var a=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];return"".concat(a[t.month-1]," ").concat(t.year)},weekdays:function(){return["Mon","Tue","Wed","Thu","Fri","Sat","Sun"]},calendarFirstDayOffset:function(){var t=this.currentCalendarMonth;return t?t.first_weekday:0},orderStrategyFilters:function(){var t,a=Array.isArray(this.pendingOrders)?this.pendingOrders:[],e=new Map,s=(0,o.A)(a);try{for(s.s();!(t=s.n()).done;){var r=t.value,n=r&&r.strategy_id;if(void 0!==n&&null!==n&&!e.has(String(n))){var i=r&&r.strategy_name?String(r.strategy_name):"",l=i?"".concat(i," (ID: ").concat(n,")"):"ID: ".concat(n);e.set(String(n),{text:l,value:String(n)})}}}catch(d){s.e(d)}finally{s.f()}return Array.from(e.values()).sort(function(t,a){return String(t.text).localeCompare(String(a.text))})},columns:function(){var t=this;return[{title:this.$t("dashboard.table.time"),dataIndex:"created_at",scopedSlots:{customRender:"time"},width:150},{title:this.$t("dashboard.table.symbol"),dataIndex:"symbol",width:100},{title:this.$t("dashboard.table.type"),dataIndex:"type",scopedSlots:{customRender:"type"},width:90},{title:this.$t("dashboard.table.price"),dataIndex:"price",customRender:function(a){return t.formatNumber(a)},width:100},{title:this.$t("dashboard.table.profit"),dataIndex:"profit",scopedSlots:{customRender:"profit"},align:"right",width:100}]},positionColumns:function(){var t=this;return[{title:this.$t("dashboard.table.symbol"),dataIndex:"symbol",scopedSlots:{customRender:"symbol"}},{title:this.$t("dashboard.table.side"),dataIndex:"side",scopedSlots:{customRender:"side"}},{title:this.$t("dashboard.table.size"),dataIndex:"size",customRender:function(a){return t.formatNumber(a,4)}},{title:this.$t("dashboard.table.entryPrice"),dataIndex:"entry_price",customRender:function(a){return t.formatNumber(a)}},{title:this.$t("dashboard.table.pnl"),dataIndex:"unrealized_pnl",scopedSlots:{customRender:"unrealized_pnl"},align:"right"}]},orderColumns:function(){return[{title:this.$t("dashboard.orderTable.strategy"),dataIndex:"strategy_name",scopedSlots:{customRender:"strategy_name"},filters:this.orderStrategyFilters,filterMultiple:!0,onFilter:function(t,a){return String(a&&a.strategy_id)===String(t)},width:150},{title:this.$t("dashboard.orderTable.exchange"),dataIndex:"exchange_id",scopedSlots:{customRender:"exchange"},width:120},{title:this.$t("dashboard.orderTable.notify"),dataIndex:"notify_channels",scopedSlots:{customRender:"notify"},width:100},{title:this.$t("dashboard.orderTable.symbol"),dataIndex:"symbol",scopedSlots:{customRender:"symbol"},width:110},{title:this.$t("dashboard.orderTable.signalType"),dataIndex:"signal_type",scopedSlots:{customRender:"signal_type"},width:100},{title:this.$t("dashboard.orderTable.amount"),dataIndex:"amount",scopedSlots:{customRender:"amount"},width:130},{title:this.$t("dashboard.orderTable.price"),dataIndex:"filled_price",scopedSlots:{customRender:"price"},width:100},{title:this.$t("dashboard.orderTable.status"),dataIndex:"status",scopedSlots:{customRender:"status"},width:130},{title:this.$t("dashboard.orderTable.timeInfo"),dataIndex:"created_at",scopedSlots:{customRender:"time_info"},width:160}]}}),mounted:function(){this.fetchData(),this.fetchPendingOrders(),this.startOrderPolling(),window.addEventListener("resize",this.handleResize)},beforeDestroy:function(){this.stopOrderPolling(),window.removeEventListener("resize",this.handleResize),this.pieChart&&this.pieChart.dispose(),this.drawdownChart&&this.drawdownChart.dispose(),this.hourlyChart&&this.hourlyChart.dispose()},methods:{fetchData:function(){var t=this;return(0,i.A)((0,n.A)().m(function a(){var e;return(0,n.A)().w(function(a){while(1)switch(a.p=a.n){case 0:return a.p=0,a.n=1,h();case 1:e=a.v,1===e.code&&(t.summary=(0,d.A)((0,d.A)({},t.summary),e.data),t.$nextTick(function(){t.initCharts()})),a.n=3;break;case 2:a.p=2,a.v;case 3:return a.a(2)}},a,null,[[0,2]])}))()},fetchPendingOrders:function(t,a){var e=this;return(0,i.A)((0,n.A)().m(function s(){var r,i,o,l;return(0,n.A)().w(function(s){while(1)switch(s.p=s.n){case 0:return e.ordersLoading=!0,s.p=1,r=t||e.ordersPagination.current||1,i=a||e.ordersPagination.pageSize||20,s.n=2,f({page:r,pageSize:i});case 2:o=s.v,1===o.code&&(l=o.data||{},e.pendingOrders=l.list||[],e.ordersPagination.current=Number(l.page||r||1),e.ordersPagination.pageSize=Number(l.pageSize||i||20),e.ordersPagination.total=Number(l.total||0)),s.n=4;break;case 3:s.p=3,s.v;case 4:return s.p=4,e.ordersLoading=!1,s.f(4);case 5:return s.a(2)}},s,null,[[1,3,4,5]])}))()},playOrderBeep:function(){if(this.soundEnabled)try{var t=window.AudioContext||window.webkitAudioContext;if(!t)return;this.beepCtx||(this.beepCtx=new t);var a=this.beepCtx;"suspended"===a.state&&"function"===typeof a.resume&&a.resume().catch(function(){});var e=function(t,e){var s=a.createOscillator(),r=a.createGain();s.type="sine",s.frequency.value=e,r.gain.value=.08,s.connect(r),r.connect(a.destination),s.start(t),s.stop(t+.12)},s=a.currentTime;e(s,880),e(s+.18,1100)}catch(r){}},startOrderPolling:function(){var t=this;this.stopOrderPolling(),this.initLastOrderId(),this.orderPollTimer=setInterval(function(){t.pollNewOrders()},this.orderPollIntervalMs)},stopOrderPolling:function(){this.orderPollTimer&&(clearInterval(this.orderPollTimer),this.orderPollTimer=null)},initLastOrderId:function(){var t=this;return(0,i.A)((0,n.A)().m(function a(){var e;return(0,n.A)().w(function(a){while(1)switch(a.p=a.n){case 0:return a.p=0,a.n=1,f({page:1,pageSize:1});case 1:e=a.v,1===e.code&&e.data&&e.data.list&&e.data.list.length>0&&(t.lastOrderId=e.data.list[0].id||0),a.n=3;break;case 2:a.p=2,a.v;case 3:return a.a(2)}},a,null,[[0,2]])}))()},pollNewOrders:function(){var t=this;return(0,i.A)((0,n.A)().m(function a(){var e,s,r,i,l,d,c,u;return(0,n.A)().w(function(a){while(1)switch(a.p=a.n){case 0:return a.p=0,a.n=1,f({page:1,pageSize:10});case 1:if(e=a.v,1===e.code&&e.data&&e.data.list){a.n=2;break}return a.a(2);case 2:if(s=e.data.list||[],0!==s.length){a.n=3;break}return a.a(2);case 3:r=!1,i=t.lastOrderId,l=(0,o.A)(s);try{for(l.s();!(d=l.n()).done;)c=d.value,u=c.id||0,u>t.lastOrderId&&(r=!0,u>i&&(i=u))}catch(n){l.e(n)}finally{l.f()}r&&(t.lastOrderId=i,t.playOrderBeep(),t.fetchPendingOrders(),t.$notification.info({message:t.$t("dashboard.newOrderNotify"),description:t.$t("dashboard.newOrderDesc"),duration:4})),a.n=5;break;case 4:a.p=4,a.v;case 5:return a.a(2)}},a,null,[[0,4]])}))()},toggleSound:function(){this.soundEnabled=!this.soundEnabled,this.soundEnabled?this.$message.success(this.$t("dashboard.soundEnabled")):this.$message.info(this.$t("dashboard.soundDisabled"))},handleOrdersTableChange:function(t){var a=t&&t.current?t.current:1,e=t&&t.pageSize?t.pageSize:this.ordersPagination.pageSize||20;this.ordersPagination.current=a,this.ordersPagination.pageSize=e,this.fetchPendingOrders(a,e)},getTypeClass:function(t){if(!t)return"";var a=t.toLowerCase();return a.includes("open_long")||a.includes("add_long")?"long":a.includes("open_short")||a.includes("add_short")?"short":a.includes("close_long")?"close-long":a.includes("close_short")?"close-short":""},getSignalTypeColor:function(t){return t?(t=t.toLowerCase(),t.includes("open_long")||t.includes("add_long")?"green":t.includes("open_short")||t.includes("add_short")?"red":t.includes("close_long")?"orange":t.includes("close_short")?"purple":"blue"):"default"},getSignalTypeText:function(t){if(!t)return"-";var a={open_long:this.$t("dashboard.signalType.openLong"),open_short:this.$t("dashboard.signalType.openShort"),close_long:this.$t("dashboard.signalType.closeLong"),close_short:this.$t("dashboard.signalType.closeShort"),add_long:this.$t("dashboard.signalType.addLong"),add_short:this.$t("dashboard.signalType.addShort")};return a[t.toLowerCase()]||t.toUpperCase()},getStatusColor:function(t){var a={pending:"orange",processing:"blue",completed:"green",failed:"red",cancelled:"default"};return a[t]||"default"},getStatusText:function(t){if(!t)return"-";var a={pending:this.$t("dashboard.status.pending"),processing:this.$t("dashboard.status.processing"),completed:this.$t("dashboard.status.completed"),failed:this.$t("dashboard.status.failed"),cancelled:this.$t("dashboard.status.cancelled")};return a[t.toLowerCase()]||t.toUpperCase()},getNotifyIconType:function(t){var a=String(t||"").trim().toLowerCase(),e={browser:"bell",webhook:"link",discord:"comment",telegram:"message",tg:"message",tele:"message",email:"mail",phone:"phone"};return e[a]||"notification"},getExchangeTagColor:function(t){var a=String(t||"").trim().toLowerCase(),e={binance:"gold",okx:"purple",bitget:"cyan",signal:"geekblue"};return e[a]||"blue"},formatNumber:function(t){var a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:2;return void 0===t||null===t?"0.00":Number(t).toLocaleString("en-US",{minimumFractionDigits:a,maximumFractionDigits:a})},formatProfitValue:function(t,a){if(null===t||void 0===t)return"--";var e=parseFloat(t),s=["open_long","open_short","add_long","add_short"];if(0===e&&a&&s.includes(a.type))return"--";if(Math.abs(e)<1e-6)return a&&s.includes(a.type)?"--":"$0.00";var r=e>=0?"+":"";return"".concat(r,"$").concat(this.formatNumber(e))},formatCompactNumber:function(t){if(void 0===t||null===t)return"0";var a=Math.abs(t);return a>=1e6?(t/1e6).toFixed(1)+"M":a>=1e3?(t/1e3).toFixed(1)+"k":a>=100?Math.round(t):t.toFixed(0)},prevMonth:function(){this.currentCalendarIndex<this.calendarMonths.length-1&&this.currentCalendarIndex++},nextMonth:function(){this.currentCalendarIndex>0&&this.currentCalendarIndex--},getDayProfit:function(t){var a=this.currentCalendarMonth;if(!a||!a.days)return null;var e=String(t).padStart(2,"0");return void 0!==a.days[e]?a.days[e]:null},getDayClass:function(t){var a=this.getDayProfit(t);return null===a?"no-data":a>0?"profit":a<0?"loss":"zero"},formatTime:function(t){if(!t)return"-";try{var a;if("string"===typeof t&&t.includes("-")&&t.includes(":"))a=new Date(t);else{if(!("number"===typeof t||"string"===typeof t&&/^\d+$/.test(t)))return"-";var e="string"===typeof t?parseInt(t,10):t,s=e<1e12?1e3*e:e;a=new Date(s)}return isNaN(a.getTime())?"-":a.toLocaleString()}catch(r){return"-"}},initCharts:function(){this.initPieChart(),this.initDrawdownChart(),this.initHourlyChart()},initPieChart:function(){var t=this,a=this.$refs.pieChart;if(a){this.pieChart=c.Ts(a);var e=Array.isArray(this.summary.strategy_stats)?this.summary.strategy_stats:[],s=Array.isArray(this.summary.strategy_pnl_chart)?this.summary.strategy_pnl_chart:[],r=[];r=e.length>0?e.map(function(t){var a=t&&t.strategy_name?String(t.strategy_name):"-",e=Number(t&&t.total_pnl?t.total_pnl:0),s=Number(t&&t.total_trades?t.total_trades:0),r=0!==e?Math.abs(e):s;return{name:a,value:r,signedValue:e,trades:s}}).filter(function(t){return t.value>0}):s.map(function(t){var a=t&&t.name?String(t.name):"-",e=Number(t&&t.value?t.value:0);return{name:a,value:Math.abs(e),signedValue:e}}).filter(function(t){return t.value>0});var n=this.isDarkTheme,i=n?"#9ca3af":"#6b7280",o=[new c.fA.W4(0,0,1,1,[{offset:0,color:"#3b82f6"},{offset:1,color:"#1d4ed8"}]),new c.fA.W4(0,0,1,1,[{offset:0,color:"#8b5cf6"},{offset:1,color:"#6d28d9"}]),new c.fA.W4(0,0,1,1,[{offset:0,color:"#10b981"},{offset:1,color:"#059669"}]),new c.fA.W4(0,0,1,1,[{offset:0,color:"#f59e0b"},{offset:1,color:"#d97706"}]),new c.fA.W4(0,0,1,1,[{offset:0,color:"#ec4899"},{offset:1,color:"#be185d"}]),new c.fA.W4(0,0,1,1,[{offset:0,color:"#06b6d4"},{offset:1,color:"#0891b2"}])],l={backgroundColor:"transparent",tooltip:{trigger:"item",backgroundColor:n?"rgba(17, 24, 39, 0.95)":"rgba(255, 255, 255, 0.95)",borderColor:n?"#374151":"#e5e7eb",textStyle:{color:n?"#f3f4f6":"#1f2937"},formatter:function(a){var e=a&&a.data&&"number"===typeof a.data.signedValue?a.data.signedValue:0,s=(e>=0?"+":"")+t.formatNumber(e,2),r=e>=0?"#10b981":"#ef4444";return'\n <div style="padding: 4px 0;">\n <div style="font-weight:600;margin-bottom:6px;">'.concat(a.name,'</div>\n <div style="color:').concat(i,'">占比 <span style="font-weight:600;color:').concat(n?"#f3f4f6":"#1f2937",'">').concat(a.percent,'%</span></div>\n <div style="color:').concat(i,'">PNL <span style="font-weight:600;color:').concat(r,'">$').concat(s,"</span></div>\n </div>\n ")}},legend:{bottom:10,left:"center",itemWidth:12,itemHeight:12,itemGap:16,textStyle:{color:i,fontSize:11}},color:o,series:[{name:"策略分布",type:"pie",radius:["50%","75%"],center:["50%","45%"],avoidLabelOverlap:!1,itemStyle:{borderRadius:6,borderColor:n?"#1f2937":"#ffffff",borderWidth:3},label:{show:!1},emphasis:{label:{show:!0,fontSize:14,fontWeight:"bold",color:n?"#f3f4f6":"#1f2937"},scaleSize:8},labelLine:{show:!1},data:r.length>0?r:[{value:1,name:this.$t("dashboard.noData"),signedValue:0}]}]};this.pieChart.setOption(l)}},initDrawdownChart:function(){var t=this,a=this.$refs.drawdownChart;if(a){this.drawdownChart=c.Ts(a);var e,s=(this.summary.daily_pnl_chart||[]).map(function(t){return t.date}),r=(this.summary.daily_pnl_chart||[]).map(function(t){return Number(t.profit||0)}),n=[],i=0,l=(0,o.A)(r);try{for(l.s();!(e=l.n()).done;){var d=e.value;i+=Number(d||0),n.push(i)}}catch(y){l.e(y)}finally{l.f()}var u=-1/0,p=0,h=0,f=n.map(function(t,a){u=Math.max(u,t);var e=Number((t-u).toFixed(2));return e<p&&(p=e,h=a),e}),m=this.isDarkTheme,g=m?"#a1a1aa":"#52525b",v=m?"rgba(63, 63, 70, 0.5)":"rgba(228, 228, 231, 0.8)",b={backgroundColor:"transparent",animation:!0,animationDuration:800,animationEasing:"cubicOut",tooltip:{trigger:"axis",backgroundColor:m?"rgba(24, 24, 27, 0.96)":"rgba(255, 255, 255, 0.96)",borderColor:m?"rgba(63, 63, 70, 0.8)":"rgba(228, 228, 231, 0.8)",borderWidth:1,padding:[12,16],textStyle:{color:m?"#fafafa":"#18181b",fontSize:13},extraCssText:"box-shadow: 0 8px 32px rgba(0,0,0,0.12); border-radius: 12px;",axisPointer:{type:"line",lineStyle:{color:"rgba(239, 68, 68, 0.4)",type:"dashed"}},formatter:function(a){var e=Array.isArray(a)?a[0]:null,s=e?e.axisValue:"",r=e?Number(e.data||0):0,n=t.formatNumber(Math.abs(r),2),i=0!==p?Math.abs(r/p*100).toFixed(0):0;return'\n <div style="min-width: 140px;">\n <div style="font-weight:600;margin-bottom:10px;font-size:14px;color:'.concat(m?"#fafafa":"#18181b",'">').concat(s,'</div>\n <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:6px;">\n <span style="display:flex;align-items:center;gap:8px;">\n <span style="width:10px;height:10px;border-radius:2px;background:linear-gradient(180deg,#f87171,#dc2626);"></span>\n <span style="color:').concat(g,'">').concat(t.$t("dashboard.drawdown")||"Drawdown",'</span>\n </span>\n <span style="font-weight:700;color:#ef4444;font-family:monospace;">-$').concat(n,'</span>\n </div>\n <div style="background:').concat(m?"rgba(63,63,70,0.5)":"rgba(228,228,231,0.5)",';height:6px;border-radius:3px;overflow:hidden;">\n <div style="width:').concat(i,'%;height:100%;background:linear-gradient(90deg,#f87171,#ef4444);border-radius:3px;"></div>\n </div>\n </div>\n ')}},grid:{left:55,right:20,bottom:35,top:20,containLabel:!1},xAxis:{type:"category",data:s,axisLine:{show:!1},axisTick:{show:!1},axisLabel:{color:g,fontSize:10,formatter:function(t){return t.slice(5)}}},yAxis:{type:"value",axisLine:{show:!1},axisTick:{show:!1},axisLabel:{color:g,fontSize:10,formatter:function(t){return Math.abs(t)>=1e3?"-$"+(Math.abs(t)/1e3).toFixed(1)+"k":0===t?"0":"-$"+Math.abs(t)}},splitLine:{lineStyle:{color:v,type:[4,4]}},max:0},series:[{name:this.$t("dashboard.drawdown")||"Drawdown",type:"line",data:f,smooth:.3,showSymbol:!1,lineStyle:{width:2.5,color:new c.fA.W4(0,0,1,0,[{offset:0,color:"#ef4444"},{offset:.5,color:"#f87171"},{offset:1,color:"#fca5a5"}]),shadowColor:"rgba(239, 68, 68, 0.4)",shadowBlur:8,shadowOffsetY:4},areaStyle:{color:new c.fA.W4(0,0,0,1,[{offset:0,color:m?"rgba(239, 68, 68, 0.4)":"rgba(239, 68, 68, 0.25)"},{offset:.5,color:m?"rgba(248, 113, 113, 0.15)":"rgba(248, 113, 113, 0.1)"},{offset:1,color:"transparent"}])},markPoint:p<0?{symbol:"pin",symbolSize:45,itemStyle:{color:new c.fA.W4(0,0,0,1,[{offset:0,color:"#f87171"},{offset:1,color:"#dc2626"}]),shadowColor:"rgba(239, 68, 68, 0.5)",shadowBlur:10},label:{show:!0,color:"#fff",fontSize:10,fontWeight:"bold",formatter:function(){return t.$t("dashboard.label.maxDrawdownPoint")||"MAX"}},data:[{name:this.$t("dashboard.maxDrawdown")||"Max Drawdown",coord:[h,p]}]}:void 0,markLine:{silent:!0,symbol:"none",lineStyle:{color:m?"#52525b":"#a1a1aa",type:"dashed",width:1},data:[{yAxis:0}],label:{show:!1}}}]};this.drawdownChart.setOption(b)}},initHourlyChart:function(){var t=this,a=this.$refs.hourlyChart;if(a){this.hourlyChart=c.Ts(a);var e=this.summary.hourly_distribution||[],s=e.map(function(t){return"".concat(String(t.hour).padStart(2,"0"),":00")}),r=e.map(function(t){return t.count||0}),n=e.map(function(t){return t.profit||0}),i=this.isDarkTheme,l=i?"#9ca3af":"#6b7280",d=i?"rgba(75, 85, 99, 0.3)":"rgba(229, 231, 235, 0.8)",u={backgroundColor:"transparent",tooltip:{trigger:"axis",backgroundColor:i?"rgba(17, 24, 39, 0.95)":"rgba(255, 255, 255, 0.95)",borderColor:i?"#374151":"#e5e7eb",textStyle:{color:i?"#f3f4f6":"#1f2937"},formatter:function(a){var e,s=Array.isArray(a)?a:[],r=s[0]&&s[0].axisValue?s[0].axisValue:"",n=0,d=0,c=t.$t("dashboard.tradeCount")||"Trade Count",u=t.$t("dashboard.profit")||"Profit",p=t.$t("dashboard.unit.trades")||"",h=(0,o.A)(s);try{for(h.s();!(e=h.n()).done;){var f=e.value;f.seriesName===c&&(n=f.data||0),f.seriesName===u&&(d=f.data||0)}}catch(v){h.e(v)}finally{h.f()}var m=d>=0?"#10b981":"#ef4444",g=(d>=0?"+":"")+t.formatNumber(d,2);return'\n <div style="padding: 4px 0;">\n <div style="font-weight:600;margin-bottom:6px;">'.concat(r,'</div>\n <div style="color:').concat(l,'">').concat(c,' <span style="font-weight:600;color:').concat(i?"#f3f4f6":"#1f2937",'">').concat(n," ").concat(p,'</span></div>\n <div style="color:').concat(l,'">').concat(u,' <span style="font-weight:600;color:').concat(m,'">$').concat(g,"</span></div>\n </div>\n ")}},grid:{left:50,right:20,bottom:30,top:10,containLabel:!1},xAxis:{type:"category",data:s,axisLine:{show:!1},axisTick:{show:!1},axisLabel:{color:l,fontSize:10,interval:3}},yAxis:{type:"value",axisLine:{show:!1},axisTick:{show:!1},axisLabel:{color:l,fontSize:10},splitLine:{lineStyle:{color:d,type:"dashed"}}},series:[{name:this.$t("dashboard.tradeCount")||"Trade Count",type:"bar",data:r,barMaxWidth:16,itemStyle:{borderRadius:[3,3,0,0],color:new c.fA.W4(0,0,0,1,[{offset:0,color:"#60a5fa"},{offset:1,color:"#3b82f6"}])}},{name:this.$t("dashboard.profit")||"Profit",type:"line",data:n,smooth:!0,showSymbol:!1,lineStyle:{width:2,color:"#a855f7"}}]};this.hourlyChart.setOption(u)}},handleResize:function(){this.pieChart&&this.pieChart.resize(),this.drawdownChart&&this.drawdownChart.resize(),this.hourlyChart&&this.hourlyChart.resize()}}},v=g,b=e(81656),y=(0,b.A)(v,s,r,!1,null,"16dc1b35",null),_=y.exports}}]); |