Files
DinQuant/frontend/dist/js/105.3faeb4a2.js
T
Dinger 05117f3f5b v3.0.1
Signed-off-by: Dinger <quantdinger@gmail.com>
2026-03-25 18:07:47 +08:00

1 line
53 KiB
JavaScript

"use strict";(self["webpackChunkvue_antd_pro"]=self["webpackChunkvue_antd_pro"]||[]).push([[105],{65105:function(t,e,a){a.r(e),a.d(e,{default:function(){return K}});var s=function(){var t=this,e=t._self._c;return e("div",{staticClass:"backtest-center",class:{"theme-dark":t.isDarkTheme}},[e("div",{staticClass:"page-header"},[e("h2",{staticClass:"page-title"},[e("a-icon",{staticClass:"title-icon",attrs:{type:"experiment"}}),t._v(" "+t._s(t.$t("backtest-center.title"))+" ")],1),e("p",{staticClass:"page-subtitle"},[t._v(t._s(t.$t("backtest-center.subtitle")))])]),e("a-tabs",{staticClass:"main-tabs",model:{value:t.activeTab,callback:function(e){t.activeTab=e},expression:"activeTab"}},[e("a-tab-pane",{key:"indicator",attrs:{tab:t.$t("backtest-center.tabs.indicator")}},[e("a-row",{staticClass:"workspace",attrs:{gutter:20}},[e("a-col",{staticClass:"config-col",attrs:{xs:24,md:9,lg:8}},[e("div",{staticClass:"config-panel"},[e("div",{staticClass:"section"},[e("div",{staticClass:"section-title"},[t._v(t._s(t.$t("backtest-center.indicator.selectIndicator")))]),e("a-select",{staticStyle:{width:"100%"},attrs:{placeholder:t.$t("backtest-center.indicator.selectIndicatorPlaceholder"),loading:t.loadingIndicators,"allow-clear":"","show-search":"","option-filter-prop":"children"},on:{change:t.onIndicatorChange},model:{value:t.selectedIndicatorId,callback:function(e){t.selectedIndicatorId=e},expression:"selectedIndicatorId"}},t._l(t.indicators,function(a){return e("a-select-option",{key:a.id,attrs:{value:a.id}},[t._v(t._s(a.name||"Indicator #"+a.id))])}),1)],1),e("div",{staticClass:"section"},[e("div",{staticClass:"section-title"},[t._v(t._s(t.$t("backtest-center.config.symbol")))]),e("a-select",{staticStyle:{width:"100%"},attrs:{placeholder:t.$t("backtest-center.config.watchlistPlaceholder"),"show-search":"","allow-clear":"","filter-option":t.filterWatchlistOption},on:{change:t.handleWatchlistChange},model:{value:t.selectedWatchlistKey,callback:function(e){t.selectedWatchlistKey=e},expression:"selectedWatchlistKey"}},[t._l(t.watchlist,function(a){return e("a-select-option",{key:"".concat(a.market,":").concat(a.symbol),attrs:{value:"".concat(a.market,":").concat(a.symbol)}},[e("a-tag",{attrs:{color:t.getMarketColor(a.market),size:"small"}},[t._v(t._s(a.market))]),e("strong",{staticStyle:{"margin-left":"4px"}},[t._v(t._s(a.symbol))]),a.name?e("span",{staticStyle:{color:"#999","margin-left":"4px","font-size":"12px"}},[t._v(t._s(a.name))]):t._e()],1)}),e("a-select-option",{key:"__add__",staticClass:"add-option",attrs:{value:"__add__"}},[e("div",{staticStyle:{"text-align":"center",color:"#1890ff"}},[e("a-icon",{attrs:{type:"plus"}}),t._v(" "+t._s(t.$t("backtest-center.config.addSymbol"))+" ")],1)])],2)],1),e("div",{staticClass:"section"},[e("div",{staticClass:"section-title"},[t._v(" "+t._s(t.$t("backtest-center.config.timeframe"))+" "),e("span",{staticClass:"hint"},[t._v(t._s(t.tfLimitHint))])]),e("a-radio-group",{staticClass:"tf-group",attrs:{"button-style":"solid",size:"small"},on:{change:t.onTimeframeChange},model:{value:t.timeframe,callback:function(e){t.timeframe=e},expression:"timeframe"}},[e("a-radio-button",{attrs:{value:"1m"}},[t._v("1m")]),e("a-radio-button",{attrs:{value:"5m"}},[t._v("5m")]),e("a-radio-button",{attrs:{value:"15m"}},[t._v("15m")]),e("a-radio-button",{attrs:{value:"1H"}},[t._v("1H")]),e("a-radio-button",{attrs:{value:"4H"}},[t._v("4H")]),e("a-radio-button",{attrs:{value:"1D"}},[t._v("1D")]),e("a-radio-button",{attrs:{value:"1W"}},[t._v("1W")])],1)],1),e("div",{staticClass:"section"},[e("div",{staticClass:"section-title"},[t._v(t._s(t.$t("backtest-center.config.dateRange")))]),e("div",{staticClass:"date-presets"},t._l(t.filteredDatePresets,function(a){return e("a-button",{key:a.key,attrs:{size:"small",type:t.datePreset===a.key?"primary":"default"},on:{click:function(e){return t.applyDatePreset(a)}}},[t._v(t._s(a.label))])}),1),e("a-row",{staticStyle:{"margin-top":"8px"},attrs:{gutter:8}},[e("a-col",{attrs:{span:12}},[e("a-date-picker",{staticStyle:{width:"100%"},attrs:{placeholder:t.$t("backtest-center.config.startDate"),size:"small"},model:{value:t.startDate,callback:function(e){t.startDate=e},expression:"startDate"}})],1),e("a-col",{attrs:{span:12}},[e("a-date-picker",{staticStyle:{width:"100%"},attrs:{placeholder:t.$t("backtest-center.config.endDate"),size:"small"},model:{value:t.endDate,callback:function(e){t.endDate=e},expression:"endDate"}})],1)],1)],1),e("div",{staticClass:"section"},[e("div",{staticClass:"section-title"},[t._v(t._s(t.$t("backtest-center.config.capital")))]),e("a-row",{attrs:{gutter:8}},[e("a-col",{attrs:{span:12}},[e("div",{staticClass:"field-label"},[t._v(t._s(t.$t("backtest-center.config.initialCapital")))]),e("a-input-number",{staticStyle:{width:"100%"},attrs:{min:1e3,step:1e4,precision:2,size:"small",formatter:function(t){return"$ ".concat(t).replace(/\B(?=(\d{3})+(?!\d))/g,",")},parser:function(t){return t.replace(/\$\s?|(,*)/g,"")}},model:{value:t.initialCapital,callback:function(e){t.initialCapital=e},expression:"initialCapital"}})],1),e("a-col",{attrs:{span:12}},[e("div",{staticClass:"field-label"},[t._v(t._s(t.$t("backtest-center.config.leverage")))]),e("a-input-number",{staticStyle:{width:"100%"},attrs:{min:1,max:125,step:1,precision:0,size:"small",formatter:function(t){return"".concat(t,"x")},parser:function(t){return t.replace("x","")}},model:{value:t.leverage,callback:function(e){t.leverage=e},expression:"leverage"}})],1)],1),e("a-row",{staticStyle:{"margin-top":"8px"},attrs:{gutter:8}},[e("a-col",{attrs:{span:12}},[e("div",{staticClass:"field-label"},[t._v(t._s(t.$t("backtest-center.config.commission"))+" (%)")]),e("a-input-number",{staticStyle:{width:"100%"},attrs:{min:0,max:10,step:.01,precision:4,size:"small"},model:{value:t.commission,callback:function(e){t.commission=e},expression:"commission"}})],1),e("a-col",{attrs:{span:12}},[e("div",{staticClass:"field-label"},[t._v(t._s(t.$t("backtest-center.config.slippage"))+" (%)")]),e("a-input-number",{staticStyle:{width:"100%"},attrs:{min:0,max:10,step:.01,precision:4,size:"small"},model:{value:t.slippage,callback:function(e){t.slippage=e},expression:"slippage"}})],1)],1)],1),e("div",{staticClass:"section"},[e("div",{staticClass:"section-title"},[t._v(t._s(t.$t("backtest-center.config.direction")))]),e("a-radio-group",{attrs:{size:"small","button-style":"solid"},model:{value:t.tradeDirection,callback:function(e){t.tradeDirection=e},expression:"tradeDirection"}},[e("a-radio-button",{attrs:{value:"long"}},[t._v(t._s(t.$t("backtest-center.config.long")))]),e("a-radio-button",{attrs:{value:"short"}},[t._v(t._s(t.$t("backtest-center.config.short")))]),e("a-radio-button",{attrs:{value:"both"}},[t._v(t._s(t.$t("backtest-center.config.both")))])],1)],1),e("div",{staticClass:"section"},[e("div",{staticClass:"section-title"},[t._v(t._s(t.$t("backtest-center.config.riskPanel")))]),e("a-row",{attrs:{gutter:8}},[e("a-col",{attrs:{span:12}},[e("div",{staticClass:"field-label"},[t._v(t._s(t.$t("backtest-center.config.stopLoss"))+" (%)")]),e("a-input-number",{staticStyle:{width:"100%"},attrs:{min:0,max:100,step:.5,precision:2,size:"small"},model:{value:t.stopLossPct,callback:function(e){t.stopLossPct=e},expression:"stopLossPct"}})],1),e("a-col",{attrs:{span:12}},[e("div",{staticClass:"field-label"},[t._v(t._s(t.$t("backtest-center.config.takeProfit"))+" (%)")]),e("a-input-number",{staticStyle:{width:"100%"},attrs:{min:0,max:1e3,step:.5,precision:2,size:"small"},model:{value:t.takeProfitPct,callback:function(e){t.takeProfitPct=e},expression:"takeProfitPct"}})],1)],1),e("a-row",{staticStyle:{"margin-top":"8px"},attrs:{gutter:8}},[e("a-col",{attrs:{span:12}},[e("div",{staticClass:"field-label"},[t._v(t._s(t.$t("backtest-center.config.entryPct"))+" (%)")]),e("a-input-number",{staticStyle:{width:"100%"},attrs:{min:0,max:100,step:5,precision:2,size:"small"},model:{value:t.entryPct,callback:function(e){t.entryPct=e},expression:"entryPct"}})],1),e("a-col",{attrs:{span:12}},[e("a-checkbox",{staticStyle:{"margin-top":"18px"},model:{value:t.trailingEnabled,callback:function(e){t.trailingEnabled=e},expression:"trailingEnabled"}},[t._v(t._s(t.$t("backtest-center.config.trailing")))])],1)],1),t.trailingEnabled?[e("a-row",{staticStyle:{"margin-top":"8px"},attrs:{gutter:8}},[e("a-col",{attrs:{span:12}},[e("div",{staticClass:"field-label"},[t._v(t._s(t.$t("backtest-center.config.trailingPct"))+" (%)")]),e("a-input-number",{staticStyle:{width:"100%"},attrs:{min:0,max:100,step:.5,precision:2,size:"small"},model:{value:t.trailingStopPct,callback:function(e){t.trailingStopPct=e},expression:"trailingStopPct"}})],1),e("a-col",{attrs:{span:12}},[e("div",{staticClass:"field-label"},[t._v(t._s(t.$t("backtest-center.config.trailingActivation"))+" (%)")]),e("a-input-number",{staticStyle:{width:"100%"},attrs:{min:0,max:1e3,step:.5,precision:2,size:"small"},model:{value:t.trailingActivationPct,callback:function(e){t.trailingActivationPct=e},expression:"trailingActivationPct"}})],1)],1)]:t._e()],2),e("div",{staticClass:"run-section"},[e("a-button",{attrs:{type:"primary",block:"",size:"large",loading:t.running,disabled:!t.canRunIndicator},on:{click:t.runIndicatorBacktest}},[t.running?t._e():e("a-icon",{attrs:{type:"thunderbolt"}}),t._v(" "+t._s(t.running?t.$t("backtest-center.running"):t.$t("backtest-center.indicator.runBacktest"))+" ")],1),e("a-button",{staticStyle:{"margin-top":"8px"},attrs:{block:"",disabled:!t.selectedIndicatorId},on:{click:function(e){return t.openHistory("indicator")}}},[e("a-icon",{attrs:{type:"history"}}),t._v(" "+t._s(t.$t("backtest-center.indicator.history"))+" ")],1)],1)])]),e("a-col",{staticClass:"result-col",attrs:{xs:24,md:15,lg:16}},[e("div",{staticClass:"result-panel"},[e("result-view",{attrs:{running:t.running,"run-tip":t.runTip,"has-result":t.hasResult,result:t.result,backtestRunId:t.backtestRunId,symbol:t.symbol,market:t.market,timeframe:t.timeframe,"is-dark":t.isDarkTheme}})],1)])],1)],1),e("a-tab-pane",{key:"strategy",attrs:{tab:t.$t("backtest-center.tabs.strategy")}},[e("a-row",{staticClass:"workspace",attrs:{gutter:20}},[e("a-col",{staticClass:"config-col",attrs:{xs:24,md:9,lg:8}},[e("div",{staticClass:"config-panel"},[e("div",{staticClass:"section"},[e("div",{staticClass:"section-title"},[t._v(t._s(t.$t("backtest-center.strategy.selectStrategy")))]),e("a-select",{staticStyle:{width:"100%"},attrs:{placeholder:t.$t("backtest-center.strategy.selectStrategyPlaceholder"),loading:t.loadingStrategies,"allow-clear":"","show-search":"","option-filter-prop":"children"},on:{change:t.onStrategyChange},model:{value:t.selectedStrategyId,callback:function(e){t.selectedStrategyId=e},expression:"selectedStrategyId"}},t._l(t.strategies,function(a){return e("a-select-option",{key:a.id,attrs:{value:a.id}},[t._v(t._s(a.strategy_name||"Strategy #"+a.id))])}),1),t.selectedStrategyObj?e("div",{staticClass:"strategy-info"},[t.selectedStrategyObj.symbol?e("span",[e("a-tag",{attrs:{size:"small"}},[t._v(t._s(t.selectedStrategyObj.symbol))])],1):t._e(),"script"===t.selectedStrategyObj.strategy_mode?e("span",{staticStyle:{color:"#9254de","font-size":"11px"}},[t._v("[Script]")]):t._e()]):t._e()],1),e("div",{staticClass:"section"},[e("div",{staticClass:"section-title"},[t._v(t._s(t.$t("backtest-center.config.symbol")))]),e("a-select",{staticStyle:{width:"100%"},attrs:{placeholder:t.$t("backtest-center.config.watchlistPlaceholder"),"show-search":"","allow-clear":"","filter-option":t.filterWatchlistOption},on:{change:t.handleStWatchlistChange},model:{value:t.stSelectedWatchlistKey,callback:function(e){t.stSelectedWatchlistKey=e},expression:"stSelectedWatchlistKey"}},[t._l(t.watchlist,function(a){return e("a-select-option",{key:"".concat(a.market,":").concat(a.symbol),attrs:{value:"".concat(a.market,":").concat(a.symbol)}},[e("a-tag",{attrs:{color:t.getMarketColor(a.market),size:"small"}},[t._v(t._s(a.market))]),e("strong",{staticStyle:{"margin-left":"4px"}},[t._v(t._s(a.symbol))]),a.name?e("span",{staticStyle:{color:"#999","margin-left":"4px","font-size":"12px"}},[t._v(t._s(a.name))]):t._e()],1)}),e("a-select-option",{key:"__add__",staticClass:"add-option",attrs:{value:"__add__"}},[e("div",{staticStyle:{"text-align":"center",color:"#1890ff"}},[e("a-icon",{attrs:{type:"plus"}}),t._v(" "+t._s(t.$t("backtest-center.config.addSymbol"))+" ")],1)])],2)],1),e("div",{staticClass:"section"},[e("div",{staticClass:"section-title"},[t._v(" "+t._s(t.$t("backtest-center.config.timeframe"))+" "),e("span",{staticClass:"hint"},[t._v(t._s(t.stTfLimitHint))])]),e("a-radio-group",{staticClass:"tf-group",attrs:{"button-style":"solid",size:"small"},on:{change:t.onStTimeframeChange},model:{value:t.stTimeframe,callback:function(e){t.stTimeframe=e},expression:"stTimeframe"}},[e("a-radio-button",{attrs:{value:"1m"}},[t._v("1m")]),e("a-radio-button",{attrs:{value:"5m"}},[t._v("5m")]),e("a-radio-button",{attrs:{value:"15m"}},[t._v("15m")]),e("a-radio-button",{attrs:{value:"1H"}},[t._v("1H")]),e("a-radio-button",{attrs:{value:"4H"}},[t._v("4H")]),e("a-radio-button",{attrs:{value:"1D"}},[t._v("1D")]),e("a-radio-button",{attrs:{value:"1W"}},[t._v("1W")])],1)],1),e("div",{staticClass:"section"},[e("div",{staticClass:"section-title"},[t._v(t._s(t.$t("backtest-center.config.dateRange")))]),e("div",{staticClass:"date-presets"},t._l(t.stFilteredDatePresets,function(a){return e("a-button",{key:"st-"+a.key,attrs:{size:"small",type:t.stDatePreset===a.key?"primary":"default"},on:{click:function(e){return t.applyStDatePreset(a)}}},[t._v(t._s(a.label))])}),1),e("a-row",{staticStyle:{"margin-top":"8px"},attrs:{gutter:8}},[e("a-col",{attrs:{span:12}},[e("a-date-picker",{staticStyle:{width:"100%"},attrs:{placeholder:t.$t("backtest-center.config.startDate"),size:"small"},model:{value:t.stStartDate,callback:function(e){t.stStartDate=e},expression:"stStartDate"}})],1),e("a-col",{attrs:{span:12}},[e("a-date-picker",{staticStyle:{width:"100%"},attrs:{placeholder:t.$t("backtest-center.config.endDate"),size:"small"},model:{value:t.stEndDate,callback:function(e){t.stEndDate=e},expression:"stEndDate"}})],1)],1)],1),e("div",{staticClass:"section"},[e("div",{staticClass:"section-title"},[t._v(t._s(t.$t("backtest-center.config.capital")))]),e("a-row",{attrs:{gutter:8}},[e("a-col",{attrs:{span:12}},[e("div",{staticClass:"field-label"},[t._v(t._s(t.$t("backtest-center.config.initialCapital")))]),e("a-input-number",{staticStyle:{width:"100%"},attrs:{min:1e3,step:1e4,precision:2,size:"small",formatter:function(t){return"$ ".concat(t).replace(/\B(?=(\d{3})+(?!\d))/g,",")},parser:function(t){return t.replace(/\$\s?|(,*)/g,"")}},model:{value:t.stInitialCapital,callback:function(e){t.stInitialCapital=e},expression:"stInitialCapital"}})],1),e("a-col",{attrs:{span:12}},[e("div",{staticClass:"field-label"},[t._v(t._s(t.$t("backtest-center.config.leverage")))]),e("a-input-number",{staticStyle:{width:"100%"},attrs:{min:1,max:125,step:1,precision:0,size:"small",formatter:function(t){return"".concat(t,"x")},parser:function(t){return t.replace("x","")}},model:{value:t.stLeverage,callback:function(e){t.stLeverage=e},expression:"stLeverage"}})],1)],1),e("a-row",{staticStyle:{"margin-top":"8px"},attrs:{gutter:8}},[e("a-col",{attrs:{span:12}},[e("div",{staticClass:"field-label"},[t._v(t._s(t.$t("backtest-center.config.commission"))+" (%)")]),e("a-input-number",{staticStyle:{width:"100%"},attrs:{min:0,max:10,step:.01,precision:4,size:"small"},model:{value:t.stCommission,callback:function(e){t.stCommission=e},expression:"stCommission"}})],1),e("a-col",{attrs:{span:12}},[e("div",{staticClass:"field-label"},[t._v(t._s(t.$t("backtest-center.config.slippage"))+" (%)")]),e("a-input-number",{staticStyle:{width:"100%"},attrs:{min:0,max:10,step:.01,precision:4,size:"small"},model:{value:t.stSlippage,callback:function(e){t.stSlippage=e},expression:"stSlippage"}})],1)],1)],1),e("div",{staticClass:"run-section"},[e("a-button",{attrs:{type:"primary",block:"",size:"large",loading:t.stRunning,disabled:!t.canRunStrategy},on:{click:t.runStrategyBacktest}},[t.stRunning?t._e():e("a-icon",{attrs:{type:"thunderbolt"}}),t._v(" "+t._s(t.stRunning?t.$t("backtest-center.running"):t.$t("backtest-center.strategy.runBacktest"))+" ")],1),e("a-button",{staticStyle:{"margin-top":"8px"},attrs:{block:"",disabled:!t.selectedStrategyId},on:{click:function(e){return t.openHistory("strategy")}}},[e("a-icon",{attrs:{type:"history"}}),t._v(" "+t._s(t.$t("backtest-center.indicator.history"))+" ")],1)],1)])]),e("a-col",{staticClass:"result-col",attrs:{xs:24,md:15,lg:16}},[e("div",{staticClass:"result-panel"},[e("result-view",{attrs:{running:t.stRunning,"run-tip":t.stRunTip,"has-result":t.stHasResult,result:t.stResult,backtestRunId:t.stBacktestRunId,symbol:t.stSymbol,market:t.stMarket,timeframe:t.stTimeframe,"is-dark":t.isDarkTheme}})],1)])],1)],1)],1),e("a-modal",{attrs:{title:t.$t("dashboard.analysis.modal.addStock.title"),visible:t.showAddModal,confirmLoading:t.addingStock,width:"560px"},on:{ok:t.handleAddStock,cancel:function(e){t.showAddModal=!1}}},[e("a-tabs",{attrs:{size:"small"},on:{change:t.onAddMarketTabChange},model:{value:t.addMarketTab,callback:function(e){t.addMarketTab=e},expression:"addMarketTab"}},[e("a-tab-pane",{key:"Crypto",attrs:{tab:"Crypto"}}),e("a-tab-pane",{key:"USStock",attrs:{tab:"US Stock"}}),e("a-tab-pane",{key:"HKStock",attrs:{tab:"HK Stock"}}),e("a-tab-pane",{key:"Forex",attrs:{tab:"Forex"}}),e("a-tab-pane",{key:"Futures",attrs:{tab:"Futures"}})],1),e("a-input-search",{staticStyle:{margin:"12px 0"},attrs:{placeholder:t.$t("backtest-center.config.symbolPlaceholder"),loading:t.addSearching,size:"large","allow-clear":""},on:{search:t.doAddSearch,change:t.onAddSearchInput},model:{value:t.addSearchKeyword,callback:function(e){t.addSearchKeyword=e},expression:"addSearchKeyword"}}),t.addSearchResults.length>0?e("a-list",{staticStyle:{"max-height":"240px","overflow-y":"auto"},attrs:{size:"small","data-source":t.addSearchResults},scopedSlots:t._u([{key:"renderItem",fn:function(a){return e("a-list-item",{class:{"add-item-active":t.addSelectedItem&&t.addSelectedItem.symbol===a.symbol},staticStyle:{cursor:"pointer"},on:{click:function(e){t.addSelectedItem=a}}},[e("strong",[t._v(t._s(a.symbol))]),a.name?e("span",{staticStyle:{color:"#999","margin-left":"8px"}},[t._v(t._s(a.name))]):t._e(),t.addSelectedItem&&t.addSelectedItem.symbol===a.symbol?e("a-icon",{staticStyle:{color:"#52c41a","margin-left":"auto"},attrs:{type:"check-circle",theme:"filled"}}):t._e()],1)}}],null,!1,2355352582)}):t._e(),0===t.addSearchResults.length&&t.addSearchKeyword&&t.addSearched?e("div",{staticStyle:{padding:"16px 0","text-align":"center",color:"#999"}},[t._v(" "+t._s(t.$t("backtest-center.config.noSearchResult"))+" ")]):t._e()],1),e("backtest-history-drawer",{attrs:{visible:t.showHistoryDrawer,userId:t.userId,indicatorId:t.historyIndicatorId,isMobile:!1},on:{cancel:function(e){t.showHistoryDrawer=!1},view:t.handleViewRun}}),e("backtest-run-viewer",{attrs:{visible:t.showRunViewer,run:t.selectedRun},on:{cancel:function(e){t.showRunViewer=!1,t.selectedRun=null}}})],1)},i=[],r=a(15863),n=a(76338),c=a(81127),o=a(56252),l=(a(74423),a(95093)),d=a.n(l),u=a(29362),h=a(55434),m=a(75769),b=a(36911),p=a(505),f=a(35038),g=function(){var t=this,e=t._self._c;return e("a-drawer",{staticClass:"backtest-history-drawer",attrs:{title:t.$t("dashboard.indicator.backtest.historyTitle"),visible:t.visible,width:t.isMobile?"100%":1060,maskClosable:!0},on:{close:function(e){return t.$emit("cancel")}}},[e("div",{staticClass:"drawer-toolbar"},[e("div",{staticClass:"toolbar-left"},[e("a-button",{attrs:{type:"primary",loading:t.loading,icon:"reload",size:"small"},on:{click:t.loadRuns}},[t._v(" "+t._s(t.$t("dashboard.indicator.backtest.historyRefresh"))+" ")]),e("a-button",{attrs:{type:"primary",ghost:"",size:"small",disabled:0===t.selectedRowKeys.length,loading:t.analyzing},on:{click:t.handleAIAnalyze}},[e("a-icon",{attrs:{type:"bulb"}}),t._v(" "+t._s(t.$t("dashboard.indicator.backtest.historyAISuggest"))+" ")],1)],1),e("div",{staticClass:"toolbar-right"},[e("a-input",{staticStyle:{width:"160px"},attrs:{size:"small","allow-clear":"",placeholder:t.$t("dashboard.indicator.backtest.historyFilterSymbol")},on:{change:t.debouncedLoad},model:{value:t.filterSymbol,callback:function(e){t.filterSymbol=e},expression:"filterSymbol"}}),e("a-select",{staticStyle:{width:"100px"},attrs:{size:"small",placeholder:t.$t("dashboard.indicator.backtest.historyFilterTimeframe"),"allow-clear":""},on:{change:t.loadRuns},model:{value:t.filterTimeframe,callback:function(e){t.filterTimeframe=e},expression:"filterTimeframe"}},t._l(t.timeframes,function(a){return e("a-select-option",{key:a,attrs:{value:a}},[t._v(t._s(a))])}),1)],1)]),e("a-table",{attrs:{columns:t.columns,"data-source":t.runs,loading:t.loading,size:"small",pagination:{pageSize:15,size:"small"},rowKey:"id",scroll:{x:1e3},rowSelection:{selectedRowKeys:t.selectedRowKeys,onChange:t.onRowSelectionChange}},scopedSlots:t._u([{key:"symbol",fn:function(a,s){return[e("span",{staticStyle:{"font-weight":"600"}},[t._v(t._s(s.symbol||"-"))]),s.market?e("a-tag",{staticStyle:{"margin-left":"4px"},attrs:{size:"small"}},[t._v(t._s(s.market))]):t._e()]}},{key:"range",fn:function(a,s){return[e("span",[t._v(t._s((s.start_date||"").slice(0,10))+" ~ "+t._s((s.end_date||"").slice(0,10)))])]}},{key:"returnPct",fn:function(a){return[null!==a&&void 0!==a?e("span",{style:{color:a>=0?"#52c41a":"#f5222d",fontWeight:600}},[t._v(" "+t._s(a>=0?"+":"")+t._s((100*a).toFixed(2))+"% ")]):e("span",[t._v("-")])]}},{key:"status",fn:function(a){return[e("a-tag",{attrs:{color:"success"===a?"green":"failed"===a?"red":"blue"}},[t._v(" "+t._s("success"===a?t.$t("dashboard.indicator.backtest.historyStatusSuccess"):"failed"===a?t.$t("dashboard.indicator.backtest.historyStatusFailed"):a)+" ")])]}},{key:"actions",fn:function(a,s){return[e("a-button",{attrs:{type:"link",size:"small",loading:t.detailLoadingId===s.id},on:{click:function(e){return t.viewRun(s)}}},[t._v(" "+t._s(t.$t("dashboard.indicator.backtest.historyView"))+" ")])]}}])}),t.loading||0!==t.runs.length?t._e():e("a-empty",{attrs:{description:t.$t("dashboard.indicator.backtest.historyNoData")}}),e("a-modal",{attrs:{title:t.$t("dashboard.indicator.backtest.historyAISuggestTitle"),visible:t.showAIResult,footer:null,width:t.isMobile?"100%":900},on:{cancel:function(e){t.showAIResult=!1}}},[t.analyzing?e("div",{staticStyle:{padding:"24px 0","text-align":"center"}},[e("a-spin",{attrs:{size:"large"}}),e("div",{staticStyle:{"margin-top":"12px",color:"#999"}},[t._v(t._s(t.$t("dashboard.indicator.backtest.historyAISuggestLoading")))])],1):e("div",{staticClass:"ai-result-content"},[t._v(" "+t._s(t.aiResult||t.$t("dashboard.indicator.backtest.historyNoAIResult"))+" ")])])],1)},y=[],v={name:"BacktestHistoryDrawer",props:{visible:{type:Boolean,default:!1},userId:{type:[Number,String],default:1},indicatorId:{type:[Number,String],default:null},symbol:{type:String,default:""},market:{type:String,default:""},timeframe:{type:String,default:""},isMobile:{type:Boolean,default:!1}},data:function(){return{loading:!1,detailLoadingId:null,analyzing:!1,showAIResult:!1,aiResult:"",filterSymbol:"",filterTimeframe:void 0,timeframes:["1m","5m","15m","30m","1H","4H","1D","1W"],runs:[],columns:[],selectedRowKeys:[],debounceTimer:null}},watch:{visible:function(t){t&&(this.initColumns(),this.filterSymbol="",this.filterTimeframe=void 0,this.selectedRowKeys=[],this.aiResult="",this.showAIResult=!1,this.loadRuns())}},methods:{onRowSelectionChange:function(t){this.selectedRowKeys=t||[]},debouncedLoad:function(){var t=this;clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(function(){return t.loadRuns()},400)},initColumns:function(){this.columns=[{title:"#",dataIndex:"id",key:"id",width:60},{title:this.$t("dashboard.indicator.backtest.historySymbol")||"Symbol",key:"symbol",width:150,scopedSlots:{customRender:"symbol"}},{title:this.$t("dashboard.indicator.backtest.timeframe")||"TF",dataIndex:"timeframe",key:"timeframe",width:70},{title:this.$t("dashboard.indicator.backtest.historyRange"),key:"range",width:180,scopedSlots:{customRender:"range"}},{title:this.$t("dashboard.indicator.backtest.tradeDirection"),dataIndex:"trade_direction",key:"trade_direction",width:80},{title:this.$t("dashboard.indicator.backtest.leverage"),dataIndex:"leverage",key:"leverage",width:60},{title:this.$t("dashboard.indicator.backtest.totalReturn")||"Return",dataIndex:"total_return",key:"total_return",width:100,scopedSlots:{customRender:"returnPct"}},{title:this.$t("dashboard.indicator.backtest.historyStatus"),dataIndex:"status",key:"status",width:80,scopedSlots:{customRender:"status"}},{title:this.$t("dashboard.indicator.backtest.historyCreatedAt"),dataIndex:"created_at",key:"created_at",width:130},{title:"",key:"actions",width:70,scopedSlots:{customRender:"actions"}}]},loadRuns:function(){var t=this;return(0,o.A)((0,c.A)().m(function e(){var a,s;return(0,c.A)().w(function(e){while(1)switch(e.p=e.n){case 0:if(t.userId){e.n=1;break}return e.a(2);case 1:return t.loading=!0,e.p=2,a={userid:t.userId,limit:200,offset:0},t.indicatorId&&(a.indicatorId=t.indicatorId),t.filterSymbol&&(a.symbol=t.filterSymbol),t.filterTimeframe&&(a.timeframe=t.filterTimeframe),e.n=3,(0,m.Ay)({url:"/api/indicator/backtest/history",method:"get",params:a});case 3:s=e.v,s&&1===s.code&&Array.isArray(s.data)?t.runs=s.data:t.runs=[];case 4:return e.p=4,t.loading=!1,e.f(4);case 5:return e.a(2)}},e,null,[[2,,4,5]])}))()},viewRun:function(t){var e=this;return(0,o.A)((0,c.A)().m(function a(){var s;return(0,c.A)().w(function(a){while(1)switch(a.p=a.n){case 0:if(t&&t.id){a.n=1;break}return a.a(2);case 1:return e.detailLoadingId=t.id,a.p=2,a.n=3,(0,m.Ay)({url:"/api/indicator/backtest/get",method:"get",params:{userid:e.userId,runId:t.id}});case 3:s=a.v,s&&1===s.code&&s.data&&e.$emit("view",s.data);case 4:return a.p=4,e.detailLoadingId=null,a.f(4);case 5:return a.a(2)}},a,null,[[2,,4,5]])}))()},handleAIAnalyze:function(){var t=this;return(0,o.A)((0,c.A)().m(function e(){var a,s;return(0,c.A)().w(function(e){while(1)switch(e.p=e.n){case 0:if(t.userId&&t.selectedRowKeys.length){e.n=1;break}return e.a(2);case 1:return t.analyzing=!0,t.showAIResult=!0,t.aiResult="",e.p=2,a=t.$i18n&&t.$i18n.locale?t.$i18n.locale:"zh-CN",e.n=3,(0,m.Ay)({url:"/api/indicator/backtest/aiAnalyze",method:"post",data:{userid:t.userId,runIds:t.selectedRowKeys,lang:a}});case 3:s=e.v,s&&1===s.code&&s.data&&s.data.analysis?t.aiResult=s.data.analysis:t.aiResult=s.msg||t.$t("dashboard.indicator.backtest.historyNoAIResult");case 4:return e.p=4,t.analyzing=!1,e.f(4);case 5:return e.a(2)}},e,null,[[2,,4,5]])}))()}}},k=v,_=a(845),S=(0,_.A)(k,g,y,!1,null,"02074648",null),w=S.exports,C=function(){var t,e,a,s=this,i=s._self._c;return i("a-modal",{staticClass:"backtest-run-viewer",attrs:{title:s.modalTitle,visible:s.visible,width:1100,maskClosable:!1},on:{cancel:function(t){return s.$emit("cancel")}}},[s.run&&s.run.result?i("div",[s.run.id?i("a-alert",{staticStyle:{"margin-bottom":"12px"},attrs:{type:"info","show-icon":"",message:s.$t("dashboard.indicator.backtest.savedRunId",{id:s.run.id})}}):s._e(),i("div",{staticClass:"metrics-cards"},[i("div",{staticClass:"metric-card",class:{positive:s.result.totalReturn>0,negative:s.result.totalReturn<0}},[i("div",{staticClass:"metric-label"},[s._v(s._s(s.$t("dashboard.indicator.backtest.totalReturn")))]),i("div",{staticClass:"metric-value"},[s._v(s._s(s.formatPercent(s.result.totalReturn)))]),i("div",{staticClass:"metric-amount"},[s._v(s._s(s.formatMoney(s.result.totalProfit)))])]),i("div",{staticClass:"metric-card",class:{positive:s.result.annualReturn>0,negative:s.result.annualReturn<0}},[i("div",{staticClass:"metric-label"},[s._v(s._s(s.$t("dashboard.indicator.backtest.annualReturn")))]),i("div",{staticClass:"metric-value"},[s._v(s._s(s.formatPercent(s.result.annualReturn)))])]),i("div",{staticClass:"metric-card negative"},[i("div",{staticClass:"metric-label"},[s._v(s._s(s.$t("dashboard.indicator.backtest.maxDrawdown")))]),i("div",{staticClass:"metric-value"},[s._v(s._s(s.formatPercent(s.result.maxDrawdown)))])]),i("div",{staticClass:"metric-card"},[i("div",{staticClass:"metric-label"},[s._v(s._s(s.$t("dashboard.indicator.backtest.sharpeRatio")))]),i("div",{staticClass:"metric-value"},[s._v(s._s((null!==(t=s.result.sharpeRatio)&&void 0!==t?t:0).toFixed(2)))])]),i("div",{staticClass:"metric-card"},[i("div",{staticClass:"metric-label"},[s._v(s._s(s.$t("dashboard.indicator.backtest.winRate")))]),i("div",{staticClass:"metric-value"},[s._v(s._s(s.formatPercent(s.result.winRate)))])]),i("div",{staticClass:"metric-card",class:{positive:s.result.profitFactor>=1.5,negative:s.result.profitFactor<1}},[i("div",{staticClass:"metric-label"},[s._v(s._s(s.$t("dashboard.indicator.backtest.profitFactor")))]),i("div",{staticClass:"metric-value"},[s._v(s._s((null!==(e=s.result.profitFactor)&&void 0!==e?e:0).toFixed(2)))])]),i("div",{staticClass:"metric-card"},[i("div",{staticClass:"metric-label"},[s._v(s._s(s.$t("dashboard.indicator.backtest.totalTrades")))]),i("div",{staticClass:"metric-value"},[s._v(s._s(null!==(a=s.result.totalTrades)&&void 0!==a?a:0))])]),i("div",{staticClass:"metric-card negative"},[i("div",{staticClass:"metric-label"},[s._v(s._s(s.$t("dashboard.indicator.backtest.totalCommission")))]),i("div",{staticClass:"metric-value"},[s._v("-$"+s._s(s.result.totalCommission?s.result.totalCommission.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2}):"0.00"))])])]),i("div",{staticClass:"chart-section"},[i("div",{staticClass:"chart-title"},[s._v(s._s(s.$t("dashboard.indicator.backtest.equityCurve")))]),i("div",{ref:"equityChartRef",staticClass:"equity-chart"})]),i("div",{staticClass:"trades-section"},[i("div",{staticClass:"chart-title"},[s._v(s._s(s.$t("dashboard.indicator.backtest.tradeHistory")))]),i("a-table",{attrs:{columns:s.tradeColumns,"data-source":s.result.trades||[],pagination:{pageSize:10,size:"small"},size:"small",scroll:{x:800},rowKey:s.rowKey},scopedSlots:s._u([{key:"type",fn:function(t){return[i("a-tag",{attrs:{color:s.getTradeTypeColor(t)}},[s._v(" "+s._s(s.getTradeTypeText(t))+" ")])]}},{key:"balance",fn:function(t){return[i("span",{staticStyle:{color:"#1890ff","font-weight":"500"}},[s._v(" $"+s._s(t?t.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2}):"--")+" ")])]}},{key:"profit",fn:function(t){return[i("span",{style:{color:t>0?"#52c41a":t<0?"#f5222d":"#666"}},[s._v(" "+s._s(s.formatMoney(t))+" ")])]}}])})],1)],1):i("div",{staticStyle:{padding:"12px 0"}},[i("a-empty",{attrs:{description:s.$t("dashboard.indicator.backtest.historyNoData")}})],1),i("template",{slot:"footer"},[i("a-button",{on:{click:function(t){return s.$emit("cancel")}}},[s._v(s._s(s.$t("dashboard.indicator.backtest.close")))])],1)],2)},$=[],I={name:"BacktestRunViewer",props:{visible:{type:Boolean,default:!1},run:{type:Object,default:null}},data:function(){return{equityChart:null,tradeColumns:[]}},computed:{result:function(){return this.run&&this.run.result?this.run.result:{}},modalTitle:function(){var t=this.run&&this.run.id?"#".concat(this.run.id):"";return"".concat(this.$t("dashboard.indicator.backtest.historyTitle")," ").concat(t).trim()}},watch:{visible:function(t){var e=this;t?this.$nextTick(function(){e.initColumns(),e.renderEquityChart()}):this.equityChart&&(this.equityChart.dispose(),this.equityChart=null)}},methods:{rowKey:function(t,e){return e},initColumns:function(){this.tradeColumns.length||(this.tradeColumns=[{title:this.$t("dashboard.indicator.backtest.tradeTime"),dataIndex:"time",key:"time",width:160},{title:this.$t("dashboard.indicator.backtest.tradeType"),dataIndex:"type",key:"type",width:150,scopedSlots:{customRender:"type"}},{title:this.$t("dashboard.indicator.backtest.price"),dataIndex:"price",key:"price",width:110},{title:this.$t("dashboard.indicator.backtest.amount"),dataIndex:"amount",key:"amount",width:100},{title:this.$t("dashboard.indicator.backtest.profit"),dataIndex:"profit",key:"profit",width:110,scopedSlots:{customRender:"profit"}},{title:this.$t("dashboard.indicator.backtest.balance"),dataIndex:"balance",key:"balance",width:120,scopedSlots:{customRender:"balance"}}])},getTradeTypeColor:function(t){var e={buy:"green",sell:"red",liquidation:"orange",open_long:"green",add_long:"cyan",close_long:"orange",close_long_stop:"red",close_long_profit:"lime",close_long_trailing:"gold",reduce_long:"volcano",open_short:"red",add_short:"magenta",close_short:"blue",close_short_stop:"red",close_short_profit:"cyan",close_short_trailing:"gold",reduce_short:"volcano"};return e[t]||"default"},getTradeTypeText:function(t){var e={open_long:this.$t("dashboard.indicator.backtest.openLong"),add_long:this.$t("dashboard.indicator.backtest.addLong"),close_long:this.$t("dashboard.indicator.backtest.closeLong"),close_long_stop:this.$t("dashboard.indicator.backtest.closeLongStop"),close_long_profit:this.$t("dashboard.indicator.backtest.closeLongProfit"),close_long_trailing:this.$t("dashboard.indicator.backtest.closeLongTrailing"),reduce_long:this.$t("dashboard.indicator.backtest.reduceLong"),open_short:this.$t("dashboard.indicator.backtest.openShort"),add_short:this.$t("dashboard.indicator.backtest.addShort"),close_short:this.$t("dashboard.indicator.backtest.closeShort"),close_short_stop:this.$t("dashboard.indicator.backtest.closeShortStop"),close_short_profit:this.$t("dashboard.indicator.backtest.closeShortProfit"),close_short_trailing:this.$t("dashboard.indicator.backtest.closeShortTrailing"),reduce_short:this.$t("dashboard.indicator.backtest.reduceShort"),liquidation:this.$t("dashboard.indicator.backtest.liquidation")};return e[t]||t},formatPercent:function(t){if(null===t||void 0===t)return"--";var e=t>=0?"+":"";return"".concat(e).concat(Number(t).toFixed(2),"%")},formatMoney:function(t){if(null===t||void 0===t)return"--";var e=t>=0?"+":"-";return"".concat(e,"$").concat(Math.abs(t).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2}))},renderEquityChart:function(){var t=this;if(this.$refs.equityChartRef){this.equityChart&&this.equityChart.dispose(),this.equityChart=u.init(this.$refs.equityChartRef);var e=this.result.equityCurve||[],a=e.map(function(t){return t.time||t.date}),s=e.map(function(t){return void 0!==t.value?t.value:t.equity}),i=s[0]||1e5,r=s[s.length-1]||i,n=r>=i,c=n?"#52c41a":"#f5222d",o=n?[{offset:0,color:"rgba(82, 196, 26, 0.35)"},{offset:1,color:"rgba(82, 196, 26, 0.02)"}]:[{offset:0,color:"rgba(245, 34, 45, 0.35)"},{offset:1,color:"rgba(245, 34, 45, 0.02)"}],l={tooltip:{trigger:"axis"},grid:{left:"3%",right:"4%",bottom:"12%",top:"8%",containLabel:!0},xAxis:{type:"category",data:a,boundaryGap:!1},yAxis:{type:"value"},series:[{name:this.$t("dashboard.indicator.backtest.strategy"),type:"line",data:s,smooth:.4,symbol:"none",sampling:"lttb",lineStyle:{width:2.5,color:c},areaStyle:{color:new u.graphic.LinearGradient(0,0,0,1,o)}}]};this.equityChart.setOption(l),window.addEventListener("resize",function(){return t.equityChart&&t.equityChart.resize()})}}}},x=I,R=(0,_.A)(x,C,$,!1,null,"a484239a",null),D=R.exports,T={"1m":30,"5m":180,"15m":365,"30m":365,"1H":730,"4H":1460,"1D":3650,"1W":7300},A=[{key:"1m",label:"1M",days:30},{key:"3m",label:"3M",days:90},{key:"6m",label:"6M",days:180},{key:"1y",label:"1Y",days:365},{key:"2y",label:"2Y",days:730},{key:"5y",label:"5Y",days:1825}],P={name:"ResultView",props:{running:Boolean,runTip:String,hasResult:Boolean,result:Object,backtestRunId:[Number,String],symbol:String,market:String,timeframe:String,isDark:Boolean},data:function(){return{chartInstance:null}},computed:{tradeColumns:function(){return[{title:"#",dataIndex:"id",width:50},{title:this.$t("backtest-center.result.colType"),dataIndex:"type",scopedSlots:{customRender:"type"},width:80},{title:this.$t("backtest-center.result.colEntry"),dataIndex:"entryDate",width:120},{title:this.$t("backtest-center.result.colExit"),dataIndex:"exitDate",width:120},{title:this.$t("backtest-center.result.colEntryPrice"),dataIndex:"entryPrice",width:100},{title:this.$t("backtest-center.result.colExitPrice"),dataIndex:"exitPrice",width:100},{title:this.$t("backtest-center.result.colProfit"),dataIndex:"profit",scopedSlots:{customRender:"profit"},width:120}]}},watch:{hasResult:function(t){var e=this;t&&this.$nextTick(function(){return e.renderChart()})}},beforeDestroy:function(){this.chartInstance&&this.chartInstance.dispose()},methods:{fmtPct:function(t){return null==t?"--":(t>=0?"+":"")+(100*t).toFixed(2)+"%"},fmtMoney:function(t){return null==t?"$0.00":(t>=0?"+":"")+"$"+Math.abs(t).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})},renderChart:function(){var t=this.result;if(t&&t.equityCurve&&t.equityCurve.length){var e=this.$refs.eqChart;if(e){this.chartInstance&&this.chartInstance.dispose(),this.chartInstance=u.init(e);var a=this.isDark,s=t.equityCurve;this.chartInstance.setOption({backgroundColor:"transparent",tooltip:{trigger:"axis",backgroundColor:a?"#1e222d":"#fff",borderColor:a?"#333":"#ddd",textStyle:{color:a?"#d1d4dc":"#333"}},grid:{left:60,right:20,top:20,bottom:30},xAxis:{type:"category",data:s.map(function(t){return t.date||t[0]}),axisLabel:{color:a?"#666":"#999",fontSize:11},axisLine:{lineStyle:{color:a?"#333":"#e0e0e0"}}},yAxis:{type:"value",axisLabel:{color:a?"#666":"#999",formatter:function(t){return"$"+t.toLocaleString()}},splitLine:{lineStyle:{color:a?"rgba(255,255,255,0.06)":"#f0f0f0"}}},series:[{type:"line",data:s.map(function(t){return t.equity||t[1]}),smooth:.3,showSymbol:!1,lineStyle:{width:2,color:"#1890ff"},areaStyle:{color:new u.graphic.LinearGradient(0,0,0,1,[{offset:0,color:"rgba(24,144,255,0.25)"},{offset:1,color:"rgba(24,144,255,0.02)"}])}}]})}}}},render:function(t){var e=this;if(this.running)return t("div",{class:"running-overlay"},[t("div",{class:"running-content"},[t("div",{class:"chart-bars"},[1,2,3,4,5].map(function(e){return t("div",{class:"bar bar".concat(e)})})),t("div",{class:"running-text"},this.$t("backtest-center.running")),t("div",{class:"running-sub"},this.runTip)])]);if(!this.hasResult)return t("div",{class:"empty-result"},[t("div",{class:"empty-icon"},[t("a-icon",{props:{type:"bar-chart"}})]),t("h3",this.$t("backtest-center.emptyTitle")),t("p",this.$t("backtest-center.emptyDesc"))]);var a=this.result||{},s=[{label:"totalReturn",value:this.fmtPct(a.totalReturn),cls:(a.totalReturn||0)>=0?"positive":"negative",sub:this.fmtMoney(a.totalProfit)},{label:"annualReturn",value:this.fmtPct(a.annualReturn),cls:(a.annualReturn||0)>=0?"positive":"negative"},{label:"maxDrawdown",value:this.fmtPct(a.maxDrawdown),cls:"negative"},{label:"sharpe",value:(a.sharpeRatio||0).toFixed(2),cls:""},{label:"winRate",value:this.fmtPct(a.winRate),cls:""},{label:"profitFactor",value:(a.profitFactor||0).toFixed(2),cls:(a.profitFactor||0)>=1.5?"positive":(a.profitFactor||0)<1?"negative":""},{label:"trades",value:String(a.totalTrades||0),cls:""},{label:"commission",value:"-"+this.fmtMoney(a.totalCommission),cls:""}];return t("div",{class:"result-content"},[t("div",{class:"result-header"},[t("span",{class:"result-tag"},[t("a-tag",{props:{color:"blue"}},this.symbol),t("a-tag",{},this.market),t("a-tag",{},this.timeframe)]),this.backtestRunId?t("span",{class:"run-id"},"Run #"+this.backtestRunId):null]),t("div",{class:"metrics-cards"},s.map(function(a){return t("div",{class:["metric-card",a.cls]},[t("div",{class:"metric-label"},e.$t("backtest-center.result."+a.label)),t("div",{class:"metric-value"},a.value),a.sub?t("div",{class:"metric-sub"},a.sub):null])})),t("div",{class:"chart-section"},[t("div",{class:"chart-title"},this.$t("backtest-center.result.equityCurve")),t("div",{ref:"eqChart",class:"equity-chart"})]),t("div",{class:"trades-section"},[t("div",{class:"chart-title"},this.$t("backtest-center.result.tradeHistory")),t("a-table",{props:{columns:this.tradeColumns,dataSource:a.trades||[],pagination:{pageSize:8,size:"small"},size:"small",scroll:{x:700},rowKey:"id"},scopedSlots:{type:function(e){return t("a-tag",{props:{color:"long"===e||"buy"===e?"green":"red"}},"long"===e||"buy"===e?"LONG":"SHORT")},profit:function(a){return t("span",{style:{color:a>0?"#52c41a":a<0?"#f5222d":"#666"}},e.fmtMoney(a))}}})])])}},M={name:"BacktestCenter",mixins:[h.t],components:{BacktestHistoryDrawer:w,BacktestRunViewer:D,ResultView:P},data:function(){return{activeTab:"indicator",userId:null,watchlist:[],loadingWatchlist:!1,showAddModal:!1,addingStock:!1,addMarketTab:"Crypto",addSearchKeyword:"",addSearchResults:[],addSearching:!1,addSelectedItem:null,addSearched:!1,addSearchTimer:null,addTriggerSource:"",indicators:[],loadingIndicators:!1,selectedIndicatorId:void 0,selectedWatchlistKey:void 0,market:"Crypto",symbol:"",timeframe:"1D",startDate:d()().subtract(6,"months"),endDate:d()(),datePreset:"6m",initialCapital:1e4,leverage:1,commission:.02,slippage:0,tradeDirection:"long",stopLossPct:0,takeProfitPct:0,entryPct:100,trailingEnabled:!1,trailingStopPct:0,trailingActivationPct:0,running:!1,runTip:"",runTimer:null,hasResult:!1,backtestRunId:null,result:{},strategies:[],loadingStrategies:!1,selectedStrategyId:void 0,stSelectedWatchlistKey:void 0,stMarket:"Crypto",stSymbol:"",stTimeframe:"1D",stStartDate:d()().subtract(6,"months"),stEndDate:d()(),stDatePreset:"6m",stInitialCapital:1e4,stLeverage:1,stCommission:.02,stSlippage:0,stRunning:!1,stRunTip:"",stRunTimer:null,stHasResult:!1,stBacktestRunId:null,stResult:{},showHistoryDrawer:!1,historyIndicatorId:null,showRunViewer:!1,selectedRun:null}},computed:{isDarkTheme:function(){return"dark"===this.navTheme||"realdark"===this.navTheme},selectedIndicatorObj:function(){var t=this;return this.selectedIndicatorId?this.indicators.find(function(e){return e.id===t.selectedIndicatorId}):null},selectedStrategyObj:function(){var t=this;return this.selectedStrategyId?this.strategies.find(function(e){return e.id===t.selectedStrategyId}):null},canRunIndicator:function(){return this.selectedIndicatorId&&this.symbol&&this.startDate&&this.endDate},canRunStrategy:function(){return this.selectedStrategyId&&this.stSymbol&&this.stStartDate&&this.stEndDate},tfMaxDays:function(){return T[this.timeframe]||3650},stTfMaxDays:function(){return T[this.stTimeframe]||3650},tfLimitHint:function(){var t=this.tfMaxDays;return t<=30?"(≤ 1".concat(this.$t("backtest-center.config.monthUnit"),")"):t<=180?"(≤ 6".concat(this.$t("backtest-center.config.monthUnit"),")"):t<=365?"(≤ 1".concat(this.$t("backtest-center.config.yearUnit"),")"):t<=730?"(≤ 2".concat(this.$t("backtest-center.config.yearUnit"),")"):"(≤ ".concat(Math.round(t/365)).concat(this.$t("backtest-center.config.yearUnit"),")")},stTfLimitHint:function(){var t=this.stTfMaxDays;return t<=30?"(≤ 1".concat(this.$t("backtest-center.config.monthUnit"),")"):t<=180?"(≤ 6".concat(this.$t("backtest-center.config.monthUnit"),")"):t<=365?"(≤ 1".concat(this.$t("backtest-center.config.yearUnit"),")"):t<=730?"(≤ 2".concat(this.$t("backtest-center.config.yearUnit"),")"):"(≤ ".concat(Math.round(t/365)).concat(this.$t("backtest-center.config.yearUnit"),")")},filteredDatePresets:function(){var t=this;return A.filter(function(e){return e.days<=t.tfMaxDays})},stFilteredDatePresets:function(){var t=this;return A.filter(function(e){return e.days<=t.stTfMaxDays})}},created:function(){var t=this;return(0,o.A)((0,c.A)().m(function e(){return(0,c.A)().w(function(e){while(1)switch(e.n){case 0:return e.n=1,t.loadUserId();case 1:t.loadIndicators(),t.loadStrategies(),t.loadWatchlistData(),t.parseQuery();case 2:return e.a(2)}},e)}))()},beforeDestroy:function(){clearInterval(this.runTimer),clearInterval(this.stRunTimer),clearTimeout(this.addSearchTimer)},methods:{loadUserId:function(){var t=this;return(0,o.A)((0,c.A)().m(function e(){var a;return(0,c.A)().w(function(e){while(1)switch(e.p=e.n){case 0:return e.p=0,e.n=1,(0,p.ug)();case 1:a=e.v,a&&a.data&&(t.userId=a.data.id||a.data.user_id||1),e.n=3;break;case 2:e.p=2,e.v,t.userId=1;case 3:return e.a(2)}},e,null,[[0,2]])}))()},loadIndicators:function(){var t=this;return(0,o.A)((0,c.A)().m(function e(){var a;return(0,c.A)().w(function(e){while(1)switch(e.p=e.n){case 0:if(t.userId){e.n=1;break}return e.a(2);case 1:return t.loadingIndicators=!0,e.p=2,e.n=3,(0,m.Ay)({url:"/api/indicator/getIndicators",method:"get",params:{userid:t.userId}});case 3:a=e.v,a&&a.data&&Array.isArray(a.data)&&(t.indicators=a.data.map(function(t){return(0,n.A)((0,n.A)({},t),{},{type:"python"})})),e.n=5;break;case 4:e.p=4,e.v;case 5:return e.p=5,t.loadingIndicators=!1,e.f(5);case 6:return e.a(2)}},e,null,[[2,4,5,6]])}))()},loadStrategies:function(){var t=this;return(0,o.A)((0,c.A)().m(function e(){var a;return(0,c.A)().w(function(e){while(1)switch(e.p=e.n){case 0:return t.loadingStrategies=!0,e.p=1,e.n=2,(0,b.EM)();case 2:a=e.v,a&&a.data&&Array.isArray(a.data)&&(t.strategies=a.data),e.n=4;break;case 3:e.p=3,e.v;case 4:return e.p=4,t.loadingStrategies=!1,e.f(4);case 5:return e.a(2)}},e,null,[[1,3,4,5]])}))()},loadWatchlistData:function(){var t=this;return(0,o.A)((0,c.A)().m(function e(){var a;return(0,c.A)().w(function(e){while(1)switch(e.p=e.n){case 0:if(t.userId){e.n=1;break}return e.a(2);case 1:return t.loadingWatchlist=!0,e.p=2,e.n=3,(0,f.Qo)({userid:t.userId});case 3:a=e.v,a&&1===a.code&&a.data&&(t.watchlist=a.data),e.n=5;break;case 4:e.p=4,e.v;case 5:return e.p=5,t.loadingWatchlist=!1,e.f(5);case 6:return e.a(2)}},e,null,[[2,4,5,6]])}))()},parseQuery:function(){var t=this,e=this.$route.query;"strategy"===e.tab&&(this.activeTab="strategy"),e.indicator_id&&(this.selectedIndicatorId=Number(e.indicator_id)||void 0),e.strategy_id&&(this.selectedStrategyId=Number(e.strategy_id)||void 0),"history"===e.view&&this.$nextTick(function(){return t.openHistory(t.activeTab)})},filterWatchlistOption:function(t,e){var a=(e.componentOptions.propsData.value||"").toLowerCase();return"__add__"===a||a.includes(t.toLowerCase())},handleWatchlistChange:function(t){var e=this;if("__add__"===t)return this.addTriggerSource="indicator",this.showAddModal=!0,void this.$nextTick(function(){e.selectedWatchlistKey=void 0});if(t){var a=t.split(":"),s=(0,r.A)(a,2),i=s[0],n=s[1];this.market=i,this.symbol=n}else this.market="",this.symbol=""},handleStWatchlistChange:function(t){var e=this;if("__add__"===t)return this.addTriggerSource="strategy",this.showAddModal=!0,void this.$nextTick(function(){e.stSelectedWatchlistKey=void 0});if(t){var a=t.split(":"),s=(0,r.A)(a,2),i=s[0],n=s[1];this.stMarket=i,this.stSymbol=n}else this.stMarket="",this.stSymbol=""},getMarketColor:function(t){var e={Crypto:"orange",USStock:"blue",HKStock:"red",Forex:"green",Futures:"purple",PredictionMarket:"cyan"};return e[t]||"default"},onAddMarketTabChange:function(){this.addSearchKeyword="",this.addSearchResults=[],this.addSelectedItem=null,this.addSearched=!1},onAddSearchInput:function(){var t=this;clearTimeout(this.addSearchTimer),this.addSearchKeyword?this.addSearchTimer=setTimeout(function(){return t.doAddSearch()},400):this.addSearchResults=[]},doAddSearch:function(){var t=this;return(0,o.A)((0,c.A)().m(function e(){var a;return(0,c.A)().w(function(e){while(1)switch(e.p=e.n){case 0:if(t.addSearchKeyword){e.n=1;break}return e.a(2);case 1:return t.addSearching=!0,e.p=2,e.n=3,(0,f._3)({market:t.addMarketTab,keyword:t.addSearchKeyword,limit:20});case 3:a=e.v,a&&a.data&&Array.isArray(a.data)?t.addSearchResults=a.data:t.addSearchResults=[],t.addSearched=!0,0===t.addSearchResults.length&&(t.addSelectedItem={market:t.addMarketTab,symbol:t.addSearchKeyword.trim().toUpperCase(),name:""}),e.n=5;break;case 4:e.p=4,e.v,t.addSelectedItem={market:t.addMarketTab,symbol:t.addSearchKeyword.trim().toUpperCase(),name:""};case 5:return e.p=5,t.addSearching=!1,e.f(5);case 6:return e.a(2)}},e,null,[[2,4,5,6]])}))()},handleAddStock:function(){var t=this;return(0,o.A)((0,c.A)().m(function e(){var a,s,i,r;return(0,c.A)().w(function(e){while(1)switch(e.p=e.n){case 0:if(a=t.addSelectedItem,a&&a.symbol){e.n=1;break}return t.$message.warning(t.$t("backtest-center.config.symbolRequired")),e.a(2);case 1:return t.addingStock=!0,e.p=2,s=a.market||t.addMarketTab,e.n=3,(0,f.dp)({userid:t.userId,market:s,symbol:a.symbol,name:a.name||""});case 3:return t.$message.success(t.$t("backtest-center.config.addSuccess")),e.n=4,t.loadWatchlistData();case 4:i="".concat(s,":").concat(a.symbol),"strategy"===t.addTriggerSource?(t.stSelectedWatchlistKey=i,t.stMarket=s,t.stSymbol=a.symbol):(t.selectedWatchlistKey=i,t.market=s,t.symbol=a.symbol),t.showAddModal=!1,e.n=6;break;case 5:e.p=5,r=e.v,t.$message.error(r.message||"Failed");case 6:return e.p=6,t.addingStock=!1,e.f(6);case 7:return e.a(2)}},e,null,[[2,5,6,7]])}))()},onTimeframeChange:function(){this.clampDateRange("indicator"),this.datePreset=this.matchPreset(this.startDate,this.endDate)},onStTimeframeChange:function(){this.clampDateRange("strategy"),this.stDatePreset=this.matchPreset(this.stStartDate,this.stEndDate)},clampDateRange:function(t){var e="strategy"===t?this.stTfMaxDays:this.tfMaxDays,a="strategy"===t?this.stStartDate:this.startDate,s="strategy"===t?this.stEndDate:this.endDate;if(a&&s){var i=s.diff(a,"days");if(i>e){var r=d()(s).subtract(e,"days");"strategy"===t?this.stStartDate=r:this.startDate=r}}},matchPreset:function(t,e){if(!t||!e)return"";for(var a=e.diff(t,"days"),s=0,i=A;s<i.length;s++){var r=i[s];if(Math.abs(a-r.days)<5)return r.key}return""},applyDatePreset:function(t){this.datePreset=t.key,this.startDate=d()().subtract(t.days,"days"),this.endDate=d()()},applyStDatePreset:function(t){this.stDatePreset=t.key,this.stStartDate=d()().subtract(t.days,"days"),this.stEndDate=d()()},onIndicatorChange:function(){this.hasResult=!1},onStrategyChange:function(){this.stHasResult=!1;var t=this.selectedStrategyObj;if(t&&t.symbol){var e=t.market_category||t.market_type||"Crypto",a=t.symbol;this.stSelectedWatchlistKey="".concat(e,":").concat(a),this.stMarket=e,this.stSymbol=a}},runIndicatorBacktest:function(){var t=this;return(0,o.A)((0,c.A)().m(function e(){var a,s,i,r;return(0,c.A)().w(function(e){while(1)switch(e.p=e.n){case 0:if(t.canRunIndicator){e.n=1;break}return e.a(2);case 1:return t.running=!0,t.hasResult=!1,t.runTip="",a=0,t.runTimer=setInterval(function(){a++;var e=[t.$t("backtest-center.tip.fetching"),t.$t("backtest-center.tip.computing"),t.$t("backtest-center.tip.analyzing")];t.runTip=e[Math.min(Math.floor(a/5),e.length-1)]},1e3),e.p=2,s=function(t){return Number(t||0)/100},e.n=3,(0,m.Ay)({url:"/api/indicator/backtest",method:"post",data:{userid:t.userId||1,indicatorId:t.selectedIndicatorId,symbol:t.symbol,market:t.market,timeframe:t.timeframe,startDate:t.startDate.format("YYYY-MM-DD"),endDate:t.endDate.format("YYYY-MM-DD"),initialCapital:t.initialCapital,commission:s(t.commission),slippage:s(t.slippage),leverage:t.leverage,tradeDirection:t.tradeDirection,strategyConfig:{risk:{stopLossPct:s(t.stopLossPct),takeProfitPct:s(t.takeProfitPct),trailing:{enabled:t.trailingEnabled,pct:s(t.trailingStopPct),activationPct:s(t.trailingActivationPct)}},position:{entryPct:s(t.entryPct)},scale:{trendAdd:{enabled:!1},dcaAdd:{enabled:!1},trendReduce:{enabled:!1},adverseReduce:{enabled:!1}}},enableMtf:t.market&&"crypto"===t.market.toLowerCase()},timeout:6e5});case 3:i=e.v,1===i.code&&i.data?(i.data.runId&&(t.backtestRunId=i.data.runId),t.result=i.data.result||i.data,t.hasResult=!0,t.$message.success(t.$t("backtest-center.result.success"))):t.$message.error(i.msg||t.$t("backtest-center.result.failed")),e.n=5;break;case 4:e.p=4,r=e.v,t.$message.error(r.message||t.$t("backtest-center.result.failed"));case 5:return e.p=5,t.running=!1,clearInterval(t.runTimer),t.runTip="",e.f(5);case 6:return e.a(2)}},e,null,[[2,4,5,6]])}))()},runStrategyBacktest:function(){var t=this;return(0,o.A)((0,c.A)().m(function e(){var a,s,i,r,n,o,l;return(0,c.A)().w(function(e){while(1)switch(e.p=e.n){case 0:if(t.canRunStrategy){e.n=1;break}return e.a(2);case 1:if(a=t.selectedStrategyObj,a){e.n=2;break}return e.a(2);case 2:if(s=a.indicator_config?a.indicator_config.indicator_id:a.indicator_id,s){e.n=3;break}return t.$message.warning(t.$t("backtest-center.strategy.noIndicator")),e.a(2);case 3:return t.stRunning=!0,t.stHasResult=!1,t.stRunTip="",i=0,t.stRunTimer=setInterval(function(){i++;var e=[t.$t("backtest-center.tip.fetching"),t.$t("backtest-center.tip.computing"),t.$t("backtest-center.tip.analyzing")];t.stRunTip=e[Math.min(Math.floor(i/5),e.length-1)]},1e3),e.p=4,r=function(t){return Number(t||0)/100},n=a.trading_config||{},e.n=5,(0,m.Ay)({url:"/api/indicator/backtest",method:"post",data:{userid:t.userId||1,indicatorId:s,symbol:t.stSymbol,market:t.stMarket,timeframe:t.stTimeframe,startDate:t.stStartDate.format("YYYY-MM-DD"),endDate:t.stEndDate.format("YYYY-MM-DD"),initialCapital:t.stInitialCapital,commission:r(t.stCommission),slippage:r(t.stSlippage),leverage:t.stLeverage,tradeDirection:n.trade_direction||"long",strategyConfig:{risk:{stopLossPct:r(n.stop_loss_pct||0),takeProfitPct:r(n.take_profit_pct||0),trailing:{enabled:!!n.trailing_stop,pct:r(n.trailing_stop_pct||0),activationPct:r(n.trailing_activation_pct||0)}},position:{entryPct:r(n.entry_pct||100)},scale:{trendAdd:{enabled:!1},dcaAdd:{enabled:!1},trendReduce:{enabled:!1},adverseReduce:{enabled:!1}}},enableMtf:t.stMarket&&"crypto"===t.stMarket.toLowerCase()},timeout:6e5});case 5:o=e.v,1===o.code&&o.data?(o.data.runId&&(t.stBacktestRunId=o.data.runId),t.stResult=o.data.result||o.data,t.stHasResult=!0,t.$message.success(t.$t("backtest-center.result.success"))):t.$message.error(o.msg||t.$t("backtest-center.result.failed")),e.n=7;break;case 6:e.p=6,l=e.v,t.$message.error(l.message||t.$t("backtest-center.result.failed"));case 7:return e.p=7,t.stRunning=!1,clearInterval(t.stRunTimer),t.stRunTip="",e.f(7);case 8:return e.a(2)}},e,null,[[4,6,7,8]])}))()},openHistory:function(t){if("strategy"===t){var e=this.selectedStrategyObj;this.historyIndicatorId=e&&e.indicator_config?e.indicator_config.indicator_id:e?e.indicator_id:null}else this.historyIndicatorId=this.selectedIndicatorId||null;this.showHistoryDrawer=!0},handleViewRun:function(t){this.selectedRun=t,this.showRunViewer=!0}}},z=M,L=(0,_.A)(z,s,i,!1,null,"24a3e98e",null),K=L.exports}}]);