1 line
79 KiB
JavaScript
1 line
79 KiB
JavaScript
"use strict";(self["webpackChunkvue_antd_pro"]=self["webpackChunkvue_antd_pro"]||[]).push([[194],{37194:function(t,e,a){a.r(e),a.d(e,{default:function(){return B}});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),e("div",{staticClass:"section",staticStyle:{"margin-top":"8px"}},[e("div",{staticClass:"field-label"},[t._v(t._s(t.$t("backtest-center.config.signalTiming")))]),e("div",{staticClass:"field-hint",staticStyle:{"margin-bottom":"6px","font-size":"12px",color:"#888"}},[t._v(" "+t._s(t.$t("backtest-center.config.signalTimingHelp"))+" ")]),e("a-radio-group",{attrs:{size:"small","button-style":"solid"},model:{value:t.signalTiming,callback:function(e){t.signalTiming=e},expression:"signalTiming"}},[e("a-radio-button",{attrs:{value:"next_bar_open"}},[t._v(t._s(t.$t("backtest-center.config.signalTimingNext")))]),e("a-radio-button",{attrs:{value:"same_bar_close"}},[t._v(t._s(t.$t("backtest-center.config.signalTimingSame")))])],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,"user-id":t.userId,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-summary-card"},[e("div",{staticClass:"strategy-summary-head"},[e("div",{staticClass:"strategy-summary-title"},[t._v(t._s(t.selectedStrategyObj.strategy_name||"Strategy #"+t.selectedStrategyObj.id))]),e("a-tag",{attrs:{size:"small",color:t.strategyTypeColor(t.selectedStrategyObj)}},[t._v(t._s(t.strategyTypeLabel(t.selectedStrategyObj)))])],1),e("div",{staticClass:"strategy-summary-meta"},[t.selectedStrategyObj.market_category?e("a-tag",{attrs:{size:"small"}},[t._v(t._s(t.selectedStrategyObj.market_category))]):t._e(),t.selectedStrategyObj.symbol?e("a-tag",{attrs:{size:"small"}},[t._v(t._s(t.selectedStrategyObj.symbol))]):t._e(),t.selectedStrategyObj.timeframe?e("a-tag",{attrs:{size:"small"}},[t._v(t._s(t.selectedStrategyObj.timeframe))]):t._e()],1),e("div",{staticClass:"strategy-summary-text"},[t._v(t._s(t.strategySummaryText(t.selectedStrategyObj)))]),e("a-button",{staticStyle:{"padding-left":"0"},attrs:{type:"link",size:"small"},on:{click:function(e){return t.goToStrategyEditor(t.selectedStrategyObj)}}},[t._v(" "+t._s(t.$t("backtest-center.strategy.goToAssistant"))+" ")])],1):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.strategy.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.strategy.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,"user-id":t.userId,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","wrap-class-name":t.isDarkTheme?"bc-modal-wrap bc-modal-wrap--dark":"bc-modal-wrap"},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,strategyId:t.historyStrategyId,runType:t.historyRunType,isMobile:!1,isDark:t.isDarkTheme},on:{cancel:function(e){t.showHistoryDrawer=!1},view:t.handleViewRun}}),e("backtest-run-viewer",{attrs:{visible:t.showRunViewer,run:t.selectedRun,isDark:t.isDarkTheme},on:{cancel:function(e){t.showRunViewer=!1,t.selectedRun=null}}})],1)},i=[],r=a(15863),n=a(76338),o=a(81127),c=a(56252),l=a(57532),d=(a(74423),a(95093)),u=a.n(d),h=a(29362),m=a(55434),p=a(75769),g=a(505),b=a(35038),f=a(36911),y=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,wrapClassName:t.drawerWrapClass},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),t.selectedRowKeys.length?e("span",{staticClass:"selected-tip"},[t._v(" "+t._s(t.$t("dashboard.indicator.backtest.historySelectedCount",{count:t.selectedRowKeys.length}))+" ")]):t._e()],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:1120},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(Number(a).toFixed(2))+"% ")]):e("span",[t._v("-")])]}},{key:"fillTiming",fn:function(a,s){return["same"===t.fillTimingKind(s)?e("a-tag",{attrs:{size:"small",color:"orange"}},[t._v(" "+t._s(t.$t("dashboard.indicator.backtest.historyFillTimingSame"))+" ")]):e("a-tag",{attrs:{size:"small",color:"blue"}},[t._v(" "+t._s(t.$t("dashboard.indicator.backtest.historyFillTimingNext"))+" ")])]}},{key:"createdAt",fn:function(a){return[e("span",[t._v(t._s(t.formatLocalDateTime(a)))])]}},{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"))+" ")]),e("a-button",{attrs:{type:"link",size:"small",loading:t.analyzingRunId===s.id},on:{click:function(e){return t.handleAIAnalyze(s)}}},[t._v(" "+t._s(t.$t("dashboard.indicator.backtest.historyAISuggestShort"))+" ")])]}}])}),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,wrapClassName:t.aiModalWrapClass},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-modal-content"},[e("div",{staticClass:"ai-meta-card"},[e("div",{staticClass:"ai-meta-top"},[e("div",{staticClass:"ai-meta-left"},[e("a-tag",{attrs:{color:"blue"}},[t._v(t._s(t.$t("dashboard.indicator.backtest.historyAISuggest")))]),e("a-tag",[t._v(t._s(t.aiModeLabel))]),t.lastAnalyzeRunIds.length?e("a-tag",[t._v(t._s(t.$t("dashboard.indicator.backtest.historySelectedCount",{count:t.lastAnalyzeRunIds.length})))]):t._e()],1),e("div",{staticClass:"ai-meta-actions"},[e("a-button",{attrs:{size:"small"},on:{click:t.copyAIResult}},[e("a-icon",{attrs:{type:"copy"}}),t._v(" "+t._s(t.$t("dashboard.indicator.backtest.historyAICopy"))+" ")],1),e("a-button",{attrs:{size:"small",type:"primary",ghost:"",disabled:!t.lastAnalyzeRunIds.length},on:{click:function(e){return t.handleAIAnalyze(null,t.lastAnalyzeRunIds)}}},[e("a-icon",{attrs:{type:"redo"}}),t._v(" "+t._s(t.$t("dashboard.indicator.backtest.historyAIRetry"))+" ")],1)],1)]),t.analyzeRunSummaries.length?e("div",{staticClass:"ai-run-tags"},t._l(t.analyzeRunSummaries,function(a){return e("a-tag",{key:a.id,attrs:{color:"purple"}},[t._v(" #"+t._s(a.id)+" "+t._s(a.symbol||"-")+" / "+t._s(a.timeframe||"-")+" ")])}),1):t._e(),e("a-alert",{staticStyle:{"margin-top":"12px"},attrs:{type:"info","show-icon":"",message:t.$t("dashboard.indicator.backtest.historyAIHint")}})],1),t.aiResult?e("div",{staticClass:"ai-markdown-card"},[e("div",{staticClass:"ai-markdown-content",domProps:{innerHTML:t._s(t.renderedAIHtml)}})]):e("div",{staticClass:"ai-result-content"},[t._v(" "+t._s(t.$t("dashboard.indicator.backtest.historyNoAIResult"))+" ")])])])],1)},v=[],k=a(2403),_={name:"BacktestHistoryDrawer",props:{visible:{type:Boolean,default:!1},userId:{type:[Number,String],default:1},indicatorId:{type:[Number,String],default:null},strategyId:{type:[Number,String],default:null},runType:{type:String,default:""},symbol:{type:String,default:""},market:{type:String,default:""},timeframe:{type:String,default:""},isMobile:{type:Boolean,default:!1},isDark:{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,analyzingRunId:null,lastAnalyzeRunIds:[],aiMode:""}},computed:{isStrategyHistory:function(){return!!this.strategyId||0===String(this.runType||"").indexOf("strategy_")},aiModeLabel:function(){return"llm"===this.aiMode?this.$t("dashboard.indicator.backtest.historyAIModeLLM"):"heuristic"===this.aiMode||"heuristic_fallback"===this.aiMode?this.$t("dashboard.indicator.backtest.historyAIModeRule"):this.$t("dashboard.indicator.backtest.historyAIModeUnknown")},analyzeRunSummaries:function(){var t=new Set((this.lastAnalyzeRunIds||[]).map(function(t){return Number(t)}));return(this.runs||[]).filter(function(e){return t.has(Number(e.id))}).slice(0,8)},renderedAIHtml:function(){return this.markdownToHtml(this.aiResult||"")},drawerWrapClass:function(){return this.isDark?"backtest-history-drawer-wrap backtest-history-drawer-wrap--dark":"backtest-history-drawer-wrap"},aiModalWrapClass:function(){return this.isDark?"backtest-history-ai-modal backtest-history-ai-modal--dark":"backtest-history-ai-modal"}},watch:{visible:function(t){t&&(this.initColumns(),this.filterSymbol="",this.filterTimeframe=void 0,this.selectedRowKeys=[],this.aiResult="",this.aiMode="",this.lastAnalyzeRunIds=[],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)},fillTimingKind:function(t){var e=t&&t.strategy_config||{},a=(e.execution||{}).signalTiming;if(null==a||""===String(a).trim())return"next";var s=String(a).toLowerCase();return"same_bar_close"===s||"current_bar_close"===s||"bar_close"===s||"close"===s?"same":"next"},initColumns:function(){var t=[{title:"#",dataIndex:"id",key:"id",width:60}].concat((0,k.A)(this.isStrategyHistory?[{title:this.$t("backtest-center.strategy.selectStrategy")||"Strategy",dataIndex:"strategy_name",key:"strategy_name",width:180}]:[]),[{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.historyFillTimingCol"),key:"fillTiming",width:96,scopedSlots:{customRender:"fillTiming"}},{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:180,scopedSlots:{customRender:"createdAt"}},{title:"",key:"actions",width:180,scopedSlots:{customRender:"actions"}}]);this.columns=t},formatLocalDateTime:function(t){var e=this.parseDateTimeToLocal(t);return e?e.format("YYYY-MM-DD HH:mm:ss"):"-"},parseDateTimeToLocal:function(t){if(!t&&0!==t)return null;if(u().isMoment(t))return t.clone();if("number"===typeof t)return String(t).length<=10?u().unix(t):u()(t);var e=String(t).trim();if(!e)return null;if(/^\d+$/.test(e)){var a=Number(e);return e.length<=10?u().unix(a):u()(a)}if(/[zZ]|[-+]\d{2}:\d{2}$/.test(e)){var s=u()(e);return s.isValid()?s.local():null}if(/^\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}(:\d{2})?$/.test(e)){var i=u().utc(e,["YYYY-MM-DD HH:mm:ss","YYYY-MM-DD HH:mm","YYYY-MM-DDTHH:mm:ss",u().ISO_8601],!0);return i.isValid()?i.local():null}var r=u()(e);return r.isValid()?r:null},copyAIResult:function(){var t=this;return(0,c.A)((0,o.A)().m(function e(){return(0,o.A)().w(function(e){while(1)switch(e.p=e.n){case 0:if(t.aiResult){e.n=1;break}return e.a(2);case 1:return e.p=1,e.n=2,navigator.clipboard.writeText(t.aiResult);case 2:t.$message.success(t.$t("dashboard.indicator.backtest.historyAICopySuccess")),e.n=4;break;case 3:e.p=3,e.v,t.$message.warning(t.$t("dashboard.indicator.backtest.historyAICopyFailed"));case 4:return e.a(2)}},e,null,[[1,3]])}))()},escapeHtml:function(t){return String(t||"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")},formatInlineMarkdown:function(t){var e=this.escapeHtml(t);return e=e.replace(/`([^`]+)`/g,"<code>$1</code>"),e=e.replace(/\*\*([^*]+)\*\*/g,"<strong>$1</strong>"),e=e.replace(/__([^_]+)__/g,"<strong>$1</strong>"),e=e.replace(/\*([^*]+)\*/g,"<em>$1</em>"),e=e.replace(/_([^_]+)_/g,"<em>$1</em>"),e},markdownToHtml:function(t){var e=String(t||"").replace(/\r\n/g,"\n").trim();if(!e)return"";var a,s=e.split("\n"),i=[],r=!1,n=!1,o=!1,c=[],d=function(){r&&(i.push("</ul>"),r=!1),n&&(i.push("</ol>"),n=!1)},u=(0,l.A)(s);try{for(u.s();!(a=u.n()).done;){var h=a.value,m=h.trimRight(),p=m.trim();p.startsWith("```")?(d(),o?(i.push("<pre><code>".concat(this.escapeHtml(c.join("\n")),"</code></pre>")),o=!1,c=[]):(o=!0,c=[])):o?c.push(h):p?/^###\s+/.test(p)?(d(),i.push("<h3>".concat(this.formatInlineMarkdown(p.replace(/^###\s+/,"")),"</h3>"))):/^##\s+/.test(p)?(d(),i.push("<h2>".concat(this.formatInlineMarkdown(p.replace(/^##\s+/,"")),"</h2>"))):/^#\s+/.test(p)?(d(),i.push("<h1>".concat(this.formatInlineMarkdown(p.replace(/^#\s+/,"")),"</h1>"))):/^【.+】$/.test(p)?(d(),i.push("<h3>".concat(this.formatInlineMarkdown(p.replace(/^【|】$/g,"")),"</h3>"))):/^>\s+/.test(p)?(d(),i.push("<blockquote>".concat(this.formatInlineMarkdown(p.replace(/^>\s+/,"")),"</blockquote>"))):/^[-*]\s+/.test(p)?(n&&(i.push("</ol>"),n=!1),r||(i.push("<ul>"),r=!0),i.push("<li>".concat(this.formatInlineMarkdown(p.replace(/^[-*]\s+/,"")),"</li>"))):/^\d+\.\s+/.test(p)?(r&&(i.push("</ul>"),r=!1),n||(i.push("<ol>"),n=!0),i.push("<li>".concat(this.formatInlineMarkdown(p.replace(/^\d+\.\s+/,"")),"</li>"))):(d(),i.push("<p>".concat(this.formatInlineMarkdown(p),"</p>"))):d()}}catch(g){u.e(g)}finally{u.f()}return d(),o&&i.push("<pre><code>".concat(this.escapeHtml(c.join("\n")),"</code></pre>")),i.join("")},loadRuns:function(){var t=this;return(0,c.A)((0,o.A)().m(function e(){var a,s;return(0,o.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.strategyId&&(a.strategyId=t.strategyId),t.runType&&(a.runType=t.runType),t.filterSymbol&&(a.symbol=t.filterSymbol),t.filterTimeframe&&(a.timeframe=t.filterTimeframe),e.n=3,(0,p.Ay)({url:t.isStrategyHistory?"/api/strategies/backtest/history":"/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,c.A)((0,o.A)().m(function a(){var s;return(0,o.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,p.Ay)({url:e.isStrategyHistory?"/api/strategies/backtest/get":"/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=arguments,e=this;return(0,c.A)((0,o.A)().m(function a(){var s,i,r,n,c,l;return(0,o.A)().w(function(a){while(1)switch(a.p=a.n){case 0:if(s=t.length>0&&void 0!==t[0]?t[0]:null,i=t.length>1&&void 0!==t[1]?t[1]:null,r=i||(s&&s.id?[s.id]:e.selectedRowKeys),e.userId){a.n=1;break}return a.a(2);case 1:if(r&&r.length){a.n=2;break}return e.$message.warning(e.$t("dashboard.indicator.backtest.historyAISelectPrompt")),a.a(2);case 2:return e.analyzing=!0,e.analyzingRunId=s&&s.id?s.id:null,e.lastAnalyzeRunIds=(0,k.A)(r),e.showAIResult=!0,e.aiResult="",e.aiMode="",a.p=3,n=e.$i18n&&e.$i18n.locale?e.$i18n.locale:"zh-CN",a.n=4,(0,p.Ay)({url:"/api/indicator/backtest/aiAnalyze",method:"post",timeout:p.v0,data:{userid:e.userId,runIds:r,lang:n}});case 4:c=a.v,c&&1===c.code&&c.data&&c.data.analysis?(e.aiResult=c.data.analysis,e.aiMode=c.data.mode||""):e.aiResult=c.msg||e.$t("dashboard.indicator.backtest.historyNoAIResult"),a.n=6;break;case 5:a.p=5,l=a.v,e.aiResult=l&&l.message||e.$t("dashboard.indicator.backtest.historyAIFailed");case 6:return a.p=6,e.analyzing=!1,e.analyzingRunId=null,a.f(6);case 7:return a.a(2)}},a,null,[[3,5,6,7]])}))()}}},S=_,w=a(845),$=(0,w.A)(S,y,v,!1,null,"9c4d8af2",null),I=$.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,wrapClassName:s.modalWrapClass},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("backtest-execution-assumptions-alert",{attrs:{assumptions:s.result.executionAssumptions,"strategy-config":s.run.strategy_config,timeframe:s.run.timeframe||""}}),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.normalizedTrades,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":s.isDark?"rgba(255,255,255,0.65)":"#666"}},[s._v(" "+s._s(s.formatMoney(t))+" ")])]}},{key:"time",fn:function(t){return[i("span",{staticClass:"trade-time-text"},[s._v(s._s(s.formatLocalDateTime(t)))])]}},{key:"detail",fn:function(t,e){return[i("span",{staticClass:"trade-detail-text"},[s._v(s._s(s.getTradeDetailText(e.type)))])]}}])})],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)},x=[],R=function(){var t=this,e=t._self._c;return t.lines.length||t.showLegacy?e("a-alert",{staticStyle:{"margin-bottom":"12px"},attrs:{type:t.showLegacy?"warning":"info","show-icon":""}},[e("template",{slot:"message"},[t._v(" "+t._s(t.showLegacy?t.$t("dashboard.indicator.backtest.executionAssumptions.legacyTitle"):t.$t("dashboard.indicator.backtest.executionAssumptions.title"))+" ")]),e("template",{slot:"description"},[t.showLegacy?e("div",{staticStyle:{"font-size":"12px","line-height":"1.5"}},[t._v(" "+t._s(t.$t("dashboard.indicator.backtest.executionAssumptions.legacyBody"))+" ")]):e("div",t._l(t.lines,function(a,s){return e("div",{key:s,staticStyle:{"font-size":"12px","line-height":"1.5"}},[t._v(" "+t._s(a)+" ")])}),0)])],2):t._e()},T=[],A=a(44735),D={name:"BacktestExecutionAssumptionsAlert",props:{assumptions:{type:Object,default:null},strategyConfig:{type:Object,default:null},timeframe:{type:String,default:""}},computed:{resolved:function(){var t=this.assumptions;if(t&&"object"===(0,A.A)(t)&&Object.keys(t).length&&(null!=t.signalTiming||null!=t.defaultFillPrice||null!=t.simulationMode))return t;var e=this.strategyConfig||{},a=(e.execution||{}).signalTiming;if(null!=a&&""!==String(a).trim()){var s=String(a).toLowerCase(),i=["next_bar_open","next_open","nextopen","next"].includes(s);return{signalTiming:i?"next_bar_open":"same_bar_close",defaultFillPrice:i?"open":"close",simulationMode:"standard",mtfRequested:!1,mtfActive:!1}}return null},showLegacy:function(){return!this.resolved},lines:function(){var t=this.resolved;if(!t)return[];var e=[];if("same_bar_close"===t.signalTiming?e.push(this.$t("dashboard.indicator.backtest.executionAssumptions.bodySameBar")):e.push(this.$t("dashboard.indicator.backtest.executionAssumptions.bodyNextBar")),"open"===t.defaultFillPrice?e.push(this.$t("dashboard.indicator.backtest.executionAssumptions.fillOpen")):e.push(this.$t("dashboard.indicator.backtest.executionAssumptions.fillClose")),"mtf"===t.simulationMode&&t.executionTimeframe){var a=t.strategyTimeframe||this.timeframe||"";e.push(this.$t("dashboard.indicator.backtest.executionAssumptions.bodyMtf",{sig:a,exec:t.executionTimeframe}))}return t.mtfRequested&&!t.mtfActive&&e.push(this.$t("dashboard.indicator.backtest.executionAssumptions.mtfFallback")),e}}},M=D,z=(0,w.A)(M,R,T,!1,null,null,null),L=z.exports,P={name:"BacktestRunViewer",components:{BacktestExecutionAssumptionsAlert:L},props:{visible:{type:Boolean,default:!1},run:{type:Object,default:null},isDark:{type:Boolean,default:!1}},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()},modalWrapClass:function(){return this.isDark?"backtest-run-viewer-wrap backtest-run-viewer-wrap--dark":"backtest-run-viewer-wrap"},normalizedTrades:function(){return(this.result.trades||[]).map(function(t,e){return(0,n.A)((0,n.A)({},t),{},{_rowKey:"".concat(e,"-").concat(t.time||"","-").concat(t.type||"")})})}},watch:{visible:function(t){var e=this;t?this.$nextTick(function(){e.initColumns(),e.renderEquityChart()}):this.equityChart&&(this.equityChart.dispose(),this.equityChart=null)},isDark:function(){var t=this;this.visible&&this.$nextTick(function(){return t.renderEquityChart()})}},methods:{rowKey:function(t,e){return t._rowKey||e},initColumns:function(){this.tradeColumns=[{title:this.$t("dashboard.indicator.backtest.tradeTime"),dataIndex:"time",key:"time",width:170,scopedSlots:{customRender:"time"}},{title:this.$t("dashboard.indicator.backtest.tradeType"),dataIndex:"type",key:"type",width:150,scopedSlots:{customRender:"type"}},{title:this.$t("dashboard.indicator.backtest.tradeDetail"),dataIndex:"detail",key:"detail",width:180,scopedSlots:{customRender:"detail"}},{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},getTradeDetailText:function(t){var e={open_long:this.$t("dashboard.indicator.backtest.tradeDetailOpenLong"),add_long:this.$t("dashboard.indicator.backtest.tradeDetailAddLong"),close_long:this.$t("dashboard.indicator.backtest.tradeDetailCloseLong"),close_long_stop:this.$t("dashboard.indicator.backtest.tradeDetailCloseLongStop"),close_long_profit:this.$t("dashboard.indicator.backtest.tradeDetailCloseLongProfit"),close_long_trailing:this.$t("dashboard.indicator.backtest.tradeDetailCloseLongTrailing"),reduce_long:this.$t("dashboard.indicator.backtest.tradeDetailReduceLong"),open_short:this.$t("dashboard.indicator.backtest.tradeDetailOpenShort"),add_short:this.$t("dashboard.indicator.backtest.tradeDetailAddShort"),close_short:this.$t("dashboard.indicator.backtest.tradeDetailCloseShort"),close_short_stop:this.$t("dashboard.indicator.backtest.tradeDetailCloseShortStop"),close_short_profit:this.$t("dashboard.indicator.backtest.tradeDetailCloseShortProfit"),close_short_trailing:this.$t("dashboard.indicator.backtest.tradeDetailCloseShortTrailing"),reduce_short:this.$t("dashboard.indicator.backtest.tradeDetailReduceShort"),liquidation:this.$t("dashboard.indicator.backtest.tradeDetailLiquidation"),buy:this.$t("dashboard.indicator.backtest.tradeDetailBuy"),sell:this.$t("dashboard.indicator.backtest.tradeDetailSell")};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}))},parseDateTimeToLocal:function(t){if(!t&&0!==t)return null;if(u().isMoment(t))return t.clone();if("number"===typeof t)return String(t).length<=10?u().unix(t):u()(t);var e=String(t).trim();if(!e)return null;if(/^\d+$/.test(e)){var a=Number(e);return e.length<=10?u().unix(a):u()(a)}if(/[zZ]|[-+]\d{2}:\d{2}$/.test(e)){var s=u()(e);return s.isValid()?s.local():null}if(/^\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}(:\d{2})?$/.test(e)){var i=u().utc(e,["YYYY-MM-DD HH:mm:ss","YYYY-MM-DD HH:mm","YYYY-MM-DDTHH:mm:ss",u().ISO_8601],!0);return i.isValid()?i.local():null}var r=u()(e);return r.isValid()?r:null},formatLocalDateTime:function(t){var e=this.parseDateTimeToLocal(t);return e?e.format("YYYY-MM-DD HH:mm:ss"):"--"},formatAxisDateTime:function(t){var e=this.parseDateTimeToLocal(t);return e?e.format("MM-DD HH:mm"):String(t||"")},renderEquityChart:function(){var t=this;if(this.$refs.equityChartRef){this.equityChart&&this.equityChart.dispose(),this.equityChart=h.init(this.$refs.equityChartRef);var e=this.result.equityCurve||[],a=e.map(function(e){return t.formatAxisDateTime(e.time||e.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,o=n?"#52c41a":"#f5222d",c=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={backgroundColor:"transparent",tooltip:{trigger:"axis",backgroundColor:this.isDark?"#1f1f1f":"#fff",borderColor:this.isDark?"#434343":"#ddd",textStyle:{color:this.isDark?"rgba(255,255,255,0.88)":"#333"}},grid:{left:"3%",right:"4%",bottom:"12%",top:"8%",containLabel:!0},xAxis:{type:"category",data:a,boundaryGap:!1,axisLabel:{color:this.isDark?"rgba(255,255,255,0.45)":"#8c8c8c"},axisLine:{lineStyle:{color:this.isDark?"#303030":"#d9d9d9"}}},yAxis:{type:"value",axisLabel:{color:this.isDark?"rgba(255,255,255,0.45)":"#8c8c8c"},splitLine:{lineStyle:{color:this.isDark?"rgba(255,255,255,0.08)":"#f0f0f0"}}},series:[{name:this.$t("dashboard.indicator.backtest.strategy"),type:"line",data:s,smooth:.4,symbol:"none",sampling:"lttb",lineStyle:{width:2.5,color:o},areaStyle:{color:new h.graphic.LinearGradient(0,0,0,1,c)}}]};this.equityChart.setOption(l),window.addEventListener("resize",function(){return t.equityChart&&t.equityChart.resize()})}}}},H=P,Y=(0,w.A)(H,C,x,!1,null,"1082877a",null),F=Y.exports,q={"1m":30,"5m":180,"15m":365,"30m":365,"1H":730,"4H":1460,"1D":3650,"1W":7300},K=[{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}],W={name:"ResultView",components:{BacktestExecutionAssumptionsAlert:L},props:{running:Boolean,runTip:String,hasResult:Boolean,result:Object,userId:[Number,String],backtestRunId:[Number,String],symbol:String,market:String,timeframe:String,isDark:Boolean},data:function(){return{chartInstance:null,elapsedSec:0,elapsedTimer:null,aiAnalyzing:!1,showAIResult:!1,aiResult:"",aiMode:""}},mounted:function(){this.running&&this._startElapsed()},computed:{aiModeLabel:function(){return"llm"===this.aiMode?this.$t("dashboard.indicator.backtest.historyAIModeLLM"):"heuristic"===this.aiMode||"heuristic_fallback"===this.aiMode?this.$t("dashboard.indicator.backtest.historyAIModeRule"):this.$t("dashboard.indicator.backtest.historyAIModeUnknown")},renderedAIHtml:function(){return this.markdownToHtml(this.aiResult||"")},pairedTrades:function(){for(var t=this.result&&this.result.trades||[],e=[],a=null,s=1,i=0;i<t.length;i++){var r=t[i],n=t[i+1],o=(r.type||"").toLowerCase();if(o.startsWith("open_")||"buy"===o)a=r;else if(a){var c=a.type.includes("long")||"buy"===a.type?"long":"short",l=this.getCloseReason(o,r,n);e.push({id:s++,type:c,openAction:"long"===c?"openLong":"openShort",closeReason:l,closeType:o,entryDate:a.time||"",exitDate:r.time||"",entryPrice:a.price,exitPrice:r.price,amount:a.amount||r.amount||0,profit:r.profit||0,balance:null!=r.balance?r.balance:null!=a.balance?a.balance:0}),a=null}}return e},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.colOpenAction"),dataIndex:"openAction",scopedSlots:{customRender:"openAction"},width:90},{title:this.$t("backtest-center.result.colCloseReason"),dataIndex:"closeReason",scopedSlots:{customRender:"closeReason"},width:120},{title:this.$t("backtest-center.result.colEntry"),dataIndex:"entryDate",width:140},{title:this.$t("backtest-center.result.colExit"),dataIndex:"exitDate",width:140},{title:this.$t("backtest-center.result.colEntryPrice"),dataIndex:"entryPrice",scopedSlots:{customRender:"price"},width:100},{title:this.$t("backtest-center.result.colExitPrice"),dataIndex:"exitPrice",scopedSlots:{customRender:"price"},width:100},{title:this.$t("backtest-center.result.colProfit"),dataIndex:"profit",scopedSlots:{customRender:"profit"},width:120},{title:this.$t("backtest-center.result.colBalance"),dataIndex:"balance",scopedSlots:{customRender:"money"},width:130}]}},watch:{running:function(t){t?this._startElapsed():this._stopElapsed()},hasResult:function(t){var e=this;t&&this.$nextTick(function(){return e.renderChart()})},isDark:function(){var t=this;this.hasResult&&this.$nextTick(function(){return t.renderChart()})}},beforeDestroy:function(){this.chartInstance&&this.chartInstance.dispose(),this._stopElapsed()},methods:{_startElapsed:function(){var t=this;this.elapsedSec=0,clearInterval(this.elapsedTimer),this.elapsedTimer=setInterval(function(){t.elapsedSec++},1e3)},_stopElapsed:function(){clearInterval(this.elapsedTimer),this.elapsedTimer=null},fmtElapsed:function(t){return t<60?"".concat(t,"s"):"".concat(Math.floor(t/60),"m ").concat(t%60,"s")},fmtPct:function(t){if(null==t||isNaN(t))return"--";var e=t>=0?"+":"";return e+Number(t).toFixed(2)+"%"},fmtMoney:function(t){if(null==t||isNaN(t))return"$0.00";var e=Math.abs(t).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2});return(t>=0?"":"-")+"$"+e},fmtPrice:function(t){return null==t||isNaN(t)?"--":Number(t).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:4})},escapeHtml:function(t){return String(t||"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")},formatInlineMarkdown:function(t){var e=this.escapeHtml(t);return e=e.replace(/`([^`]+)`/g,"<code>$1</code>"),e=e.replace(/\*\*([^*]+)\*\*/g,"<strong>$1</strong>"),e=e.replace(/__([^_]+)__/g,"<strong>$1</strong>"),e=e.replace(/\*([^*]+)\*/g,"<em>$1</em>"),e=e.replace(/_([^_]+)_/g,"<em>$1</em>"),e},markdownToHtml:function(t){var e=String(t||"").replace(/\r\n/g,"\n").trim();if(!e)return"";var a,s=e.split("\n"),i=[],r=!1,n=!1,o=!1,c=[],d=function(){r&&(i.push("</ul>"),r=!1),n&&(i.push("</ol>"),n=!1)},u=(0,l.A)(s);try{for(u.s();!(a=u.n()).done;){var h=a.value,m=h.trimRight(),p=m.trim();p.startsWith("```")?(d(),o?(i.push("<pre><code>".concat(this.escapeHtml(c.join("\n")),"</code></pre>")),o=!1,c=[]):(o=!0,c=[])):o?c.push(h):p?/^###\s+/.test(p)?(d(),i.push("<h3>".concat(this.formatInlineMarkdown(p.replace(/^###\s+/,"")),"</h3>"))):/^##\s+/.test(p)?(d(),i.push("<h2>".concat(this.formatInlineMarkdown(p.replace(/^##\s+/,"")),"</h2>"))):/^#\s+/.test(p)?(d(),i.push("<h1>".concat(this.formatInlineMarkdown(p.replace(/^#\s+/,"")),"</h1>"))):/^【.+】$/.test(p)?(d(),i.push("<h3>".concat(this.formatInlineMarkdown(p.replace(/^【|】$/g,"")),"</h3>"))):/^>\s+/.test(p)?(d(),i.push("<blockquote>".concat(this.formatInlineMarkdown(p.replace(/^>\s+/,"")),"</blockquote>"))):/^[-*]\s+/.test(p)?(n&&(i.push("</ol>"),n=!1),r||(i.push("<ul>"),r=!0),i.push("<li>".concat(this.formatInlineMarkdown(p.replace(/^[-*]\s+/,"")),"</li>"))):/^\d+\.\s+/.test(p)?(r&&(i.push("</ul>"),r=!1),n||(i.push("<ol>"),n=!0),i.push("<li>".concat(this.formatInlineMarkdown(p.replace(/^\d+\.\s+/,"")),"</li>"))):(d(),i.push("<p>".concat(this.formatInlineMarkdown(p),"</p>"))):d()}}catch(g){u.e(g)}finally{u.f()}return d(),o&&i.push("<pre><code>".concat(this.escapeHtml(c.join("\n")),"</code></pre>")),i.join("")},copyAIResult:function(){var t=this;return(0,c.A)((0,o.A)().m(function e(){return(0,o.A)().w(function(e){while(1)switch(e.p=e.n){case 0:if(t.aiResult){e.n=1;break}return e.a(2);case 1:return e.p=1,e.n=2,navigator.clipboard.writeText(t.aiResult);case 2:t.$message.success(t.$t("dashboard.indicator.backtest.historyAICopySuccess")),e.n=4;break;case 3:e.p=3,e.v,t.$message.warning(t.$t("dashboard.indicator.backtest.historyAICopyFailed"));case 4:return e.a(2)}},e,null,[[1,3]])}))()},handleAIAnalyze:function(){var t=this;return(0,c.A)((0,o.A)().m(function e(){var a,s,i,r;return(0,o.A)().w(function(e){while(1)switch(e.p=e.n){case 0:if(a=t.backtestRunId,t.userId&&a){e.n=1;break}return t.$message.warning(t.$t("dashboard.indicator.backtest.historyAISelectPrompt")),e.a(2);case 1:return t.aiAnalyzing=!0,t.showAIResult=!0,t.aiResult="",t.aiMode="",e.p=2,s=t.$i18n&&t.$i18n.locale?t.$i18n.locale:"zh-CN",e.n=3,(0,p.Ay)({url:"/api/indicator/backtest/aiAnalyze",method:"post",timeout:p.v0,data:{userid:t.userId,runIds:[a],lang:s}});case 3:i=e.v,i&&1===i.code&&i.data&&i.data.analysis?(t.aiResult=i.data.analysis,t.aiMode=i.data.mode||""):t.aiResult=i&&i.msg||t.$t("dashboard.indicator.backtest.historyNoAIResult"),e.n=5;break;case 4:e.p=4,r=e.v,t.aiResult=r&&r.message||t.$t("dashboard.indicator.backtest.historyAIFailed");case 5:return e.p=5,t.aiAnalyzing=!1,e.f(5);case 6:return e.a(2)}},e,null,[[2,4,5,6]])}))()},getCloseReason:function(t,e,a){if(t.includes("_stop"))return"stopLoss";if(t.includes("_profit"))return"takeProfit";if(t.includes("_trailing"))return"trailingStop";if("liquidation"===t)return"liquidation";if(("close_long"===t||"close_short"===t)&&a){var s=String(a.type||"").toLowerCase(),i=String(a.time||"")===String(e.time||"");if(i&&("open_long"===s||"open_short"===s))return"reverse"}return"signal"},reasonColor:function(t){return{stopLoss:"red",takeProfit:"green",trailingStop:"cyan",reverse:"orange",liquidation:"volcano",signal:"blue"}[t]||"default"},renderChart:function(){var t=this,e=this.result;if(e&&e.equityCurve&&e.equityCurve.length){var a=this.$refs.eqChart;if(a){this.chartInstance&&this.chartInstance.dispose(),this.chartInstance=h.init(a);var s=this.isDark,i=e.equityCurve,r=i.length>1&&(i[i.length-1].value||0)>=(i[0].value||0),n=r?"#52c41a":"#f5222d";this.chartInstance.setOption({backgroundColor:"transparent",tooltip:{trigger:"axis",backgroundColor:s?"#1f1f1f":"#fff",borderColor:s?"#434343":"#ddd",textStyle:{color:s?"rgba(255,255,255,0.85)":"#333",fontSize:12},formatter:function(t){var e=t[0];return'<div style="font-size:11px;color:'.concat(s?"rgba(255,255,255,0.5)":"#999",'">').concat(e.name,'</div><div style="font-size:13px;font-weight:600;color:').concat(s?"rgba(255,255,255,0.85)":"#333",'">$').concat(Number(e.value).toLocaleString("en-US",{minimumFractionDigits:2}),"</div>")}},grid:{left:65,right:20,top:20,bottom:30},xAxis:{type:"category",data:i.map(function(t){return t.time||""}),axisLabel:{color:s?"rgba(255,255,255,0.35)":"#999",fontSize:10,rotate:0,interval:Math.floor(i.length/6)},axisLine:{lineStyle:{color:s?"#303030":"#e0e0e0"}},axisTick:{show:!1}},yAxis:{type:"value",axisLabel:{color:s?"rgba(255,255,255,0.35)":"#999",fontSize:11,formatter:function(t){return"$"+(t/1e3).toFixed(1)+"k"}},splitLine:{lineStyle:{color:s?"rgba(255,255,255,0.06)":"#f0f0f0",type:"dashed"}}},series:[{type:"line",data:i.map(function(t){return t.value||0}),smooth:.3,showSymbol:!1,lineStyle:{width:2,color:n},areaStyle:{color:new h.graphic.LinearGradient(0,0,0,1,[{offset:0,color:r?"rgba(82,196,26,0.2)":"rgba(245,34,45,0.2)"},{offset:1,color:"rgba(0,0,0,0)"}])}}]}),window.addEventListener("resize",function(){t.chartInstance&&t.chartInstance.resize()})}}}},render:function(t){var e=this,a=this.isDark;if(this.running){var s=[{key:"fetch",label:this.$t("backtest-center.tip.fetching"),icon:"cloud-download"},{key:"compute",label:this.$t("backtest-center.tip.computing"),icon:"calculator"},{key:"analyze",label:this.$t("backtest-center.tip.analyzing"),icon:"bar-chart"}],i=this.elapsedSec,r=i<4?0:i<10?1:2;return t("div",{class:"running-overlay"},[t("div",{class:"running-content"},[t("div",{class:"running-spinner"},[t("div",{class:"spinner-track"}),t("div",{class:"spinner-fill"})]),t("div",{class:"running-title"},this.$t("backtest-center.running")),t("div",{class:"running-elapsed"},this.fmtElapsed(i)),t("div",{class:"running-steps"},s.map(function(e,a){return t("div",{class:["step-item",a<r?"done":a===r?"active":""]},[t("div",{class:"step-icon"},[t("a-icon",a<r?{props:{type:"check-circle",theme:"filled"}}:{props:{type:e.icon}})]),t("span",{class:"step-label"},e.label)])}))])])}if(!this.hasResult)return t("div",{class:"empty-result"},[t("div",{class:"empty-icon"},[t("a-icon",{props:{type:"bar-chart"},style:{color:a?"#177ddc":"#1890ff"}})]),t("h3",this.$t("backtest-center.emptyTitle")),t("p",this.$t("backtest-center.emptyDesc"))]);var n=this.result||{},o=[{label:"totalReturn",value:this.fmtPct(n.totalReturn),cls:(n.totalReturn||0)>=0?"positive":"negative",sub:this.fmtMoney(n.totalProfit)},{label:"annualReturn",value:this.fmtPct(n.annualReturn),cls:(n.annualReturn||0)>=0?"positive":"negative"},{label:"maxDrawdown",value:this.fmtPct(n.maxDrawdown),cls:"negative"},{label:"sharpe",value:(n.sharpeRatio||0).toFixed(2),cls:(n.sharpeRatio||0)>=1?"positive":(n.sharpeRatio||0)<0?"negative":""},{label:"winRate",value:this.fmtPct(n.winRate),cls:(n.winRate||0)>=50?"positive":""},{label:"profitFactor",value:(n.profitFactor||0).toFixed(2),cls:(n.profitFactor||0)>=1.5?"positive":(n.profitFactor||0)<1?"negative":""},{label:"trades",value:String(n.totalTrades||0),cls:""},{label:"commission",value:this.fmtMoney(-(n.totalCommission||0)),cls:""}],c=t(L,{props:{assumptions:n.executionAssumptions||null,strategyConfig:null,timeframe:this.timeframe||""}});return t("div",{class:"result-content"},[t("div",{class:"result-header"},[t("div",{class:"result-header-left"},[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:"result-header-actions"},[t("a-button",{props:{type:"primary",ghost:!0,size:"small",loading:this.aiAnalyzing,disabled:!this.backtestRunId},on:{click:this.handleAIAnalyze}},[t("a-icon",{props:{type:"bulb"},style:{color:a?"#177ddc":void 0}}),this.$t("dashboard.indicator.backtest.historyAISuggest")])])]),c,t("div",{class:"metrics-cards"},o.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"},[t("a-icon",{props:{type:"area-chart"},style:{marginRight:"6px",color:a?"rgba(255,255,255,0.72)":"rgba(0,0,0,0.45)"}}),this.$t("backtest-center.result.equityCurve")]),t("div",{ref:"eqChart",class:"equity-chart"})]),t("div",{class:"trades-section"},[t("div",{class:"chart-title"},[t("a-icon",{props:{type:"swap"},style:{marginRight:"6px",color:a?"rgba(255,255,255,0.72)":"rgba(0,0,0,0.45)"}}),this.$t("backtest-center.result.tradeHistory"),t("span",{style:{fontWeight:400,fontSize:"12px",marginLeft:"8px",color:a?"rgba(255,255,255,0.45)":"#999"}},"(".concat(this.pairedTrades.length,")"))]),t("a-table",{props:{columns:this.tradeColumns,dataSource:this.pairedTrades,pagination:{pageSize:10,size:"small",showTotal:function(t){return"".concat(t," trades")}},size:"small",scroll:{x:980},rowKey:"id"},scopedSlots:{type:function(e){return t("a-tag",{props:{color:"long"===e?"green":"red"},style:"margin:0"},"long"===e?"LONG":"SHORT")},openAction:function(a){return t("a-tag",{props:{color:"openLong"===a?"green":"red"},style:"margin:0"},e.$t("backtest-center.result."+a))},closeReason:function(a){return t("a-tag",{props:{color:e.reasonColor(a)},style:"margin:0"},e.$t("backtest-center.result."+a))},price:function(a){return t("span",{style:"font-variant-numeric: tabular-nums"},e.fmtPrice(a))},profit:function(s){return t("span",{style:{color:s>0?"#52c41a":s<0?"#f5222d":a?"rgba(255,255,255,0.65)":"#666",fontWeight:"600",fontVariantNumeric:"tabular-nums"}},e.fmtMoney(s))},money:function(s){return t("span",{style:{color:a?"rgba(255,255,255,0.88)":"#262626",fontWeight:"600",fontVariantNumeric:"tabular-nums"}},e.fmtMoney(s))}}})]),t("a-modal",{props:{title:this.$t("dashboard.indicator.backtest.historyAISuggestTitle"),visible:this.showAIResult,footer:null,width:900,wrapClassName:this.isDark?"bc-modal-wrap bc-modal-wrap--dark":"bc-modal-wrap"},on:{cancel:function(){e.showAIResult=!1}}},[this.aiAnalyzing?t("div",{class:"result-ai-loading"},[t("a-spin",{props:{size:"large"}}),t("div",{class:"result-ai-loading-text"},this.$t("dashboard.indicator.backtest.historyAISuggestLoading"))]):t("div",{class:"result-ai-content"},[t("div",{class:"result-ai-meta-card"},[t("div",{class:"result-ai-meta-top"},[t("div",{class:"result-ai-meta-left"},[t("a-tag",{props:{color:"blue"}},this.$t("dashboard.indicator.backtest.historyAISuggest")),t("a-tag",{},this.aiModeLabel),this.backtestRunId?t("a-tag",{props:{color:"purple"}},"#".concat(this.backtestRunId)):null]),t("div",{class:"result-ai-meta-actions"},[t("a-button",{props:{size:"small"},on:{click:this.copyAIResult}},[t("a-icon",{props:{type:"copy"}}),this.$t("dashboard.indicator.backtest.historyAICopy")]),t("a-button",{props:{size:"small",type:"primary",ghost:!0,disabled:!this.backtestRunId},on:{click:this.handleAIAnalyze}},[t("a-icon",{props:{type:"redo"}}),this.$t("dashboard.indicator.backtest.historyAIRetry")])])]),t("a-alert",{style:{marginTop:"12px"},props:{type:"info",showIcon:!0,message:this.$t("dashboard.indicator.backtest.historyAIHint")}})]),this.aiResult?t("div",{class:"result-ai-markdown-card"},[t("div",{class:"result-ai-markdown-content",domProps:{innerHTML:this.renderedAIHtml}})]):t("div",{class:"result-ai-empty"},this.$t("dashboard.indicator.backtest.historyNoAIResult"))])])])}},N={name:"BacktestCenter",mixins:[m.t],components:{BacktestHistoryDrawer:I,BacktestRunViewer:F,ResultView:W},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:u()().subtract(6,"months"),endDate:u()(),datePreset:"6m",initialCapital:1e4,leverage:1,commission:.02,slippage:.02,signalTiming:"next_bar_open",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:u()().subtract(6,"months"),stEndDate:u()(),stDatePreset:"6m",stInitialCapital:1e4,stLeverage:1,stCommission:.02,stSlippage:0,stRunning:!1,stRunTip:"",stRunTimer:null,stHasResult:!1,stBacktestRunId:null,stResult:{},showHistoryDrawer:!1,historyIndicatorId:null,historyStrategyId:null,historyRunType:"",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 q[this.timeframe]||3650},stTfMaxDays:function(){return q[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 K.filter(function(e){return e.days<=t.tfMaxDays})},stFilteredDatePresets:function(){var t=this;return K.filter(function(e){return e.days<=t.stTfMaxDays})}},created:function(){var t=this;return(0,c.A)((0,o.A)().m(function e(){return(0,o.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,c.A)((0,o.A)().m(function e(){var a;return(0,o.A)().w(function(e){while(1)switch(e.p=e.n){case 0:return e.p=0,e.n=1,(0,g.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,c.A)((0,o.A)().m(function e(){var a;return(0,o.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,p.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,c.A)((0,o.A)().m(function e(){var a,s,i;return(0,o.A)().w(function(e){while(1)switch(e.p=e.n){case 0:return t.loadingStrategies=!0,e.p=1,e.n=2,(0,f.EM)();case 2:s=e.v,i=Array.isArray(null===s||void 0===s||null===(a=s.data)||void 0===a?void 0:a.strategies)?s.data.strategies:[],t.strategies=i,t.selectedStrategyId&&t.$nextTick(function(){return t.onStrategyChange()}),e.n=4;break;case 3:e.p=3,e.v,t.strategies=[];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,c.A)((0,o.A)().m(function e(){var a;return(0,o.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,b.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,c.A)((0,o.A)().m(function e(){var a;return(0,o.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,b._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,c.A)((0,o.A)().m(function e(){var a,s,i,r;return(0,o.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,b.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=u()(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=K;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=u()().subtract(t.days,"days"),this.endDate=u()()},applyStDatePreset:function(t){this.stDatePreset=t.key,this.stStartDate=u()().subtract(t.days,"days"),this.stEndDate=u()()},onIndicatorChange:function(){this.hasResult=!1},onStrategyChange:function(){this.stHasResult=!1;var t=this.selectedStrategyObj,e=t&&t.trading_config||{};if(t&&(t.symbol||e.symbol)){var a=t.market_category||t.market_type||"Crypto",s=t.symbol||e.symbol;this.stSelectedWatchlistKey="".concat(a,":").concat(s),this.stMarket=a,this.stSymbol=s,this.stTimeframe=e.timeframe||t.timeframe||this.stTimeframe,this.stInitialCapital=e.initial_capital||t.initial_capital||this.stInitialCapital,this.stLeverage=e.leverage||t.leverage||this.stLeverage,this.stCommission=e.commission||0,this.stSlippage=e.slippage||0}},strategyTypeLabel:function(t){return t?"ScriptStrategy"===t.strategy_type||"script"===t.strategy_mode?"Script":"Indicator":"Strategy"},strategyTypeColor:function(t){return t&&("ScriptStrategy"===t.strategy_type||"script"===t.strategy_mode)?"purple":"blue"},strategySummaryText:function(t){if(!t)return"";var e=t.trading_config||{},a=[e.trade_direction||"-",e.market_type||"-",e.timeframe||t.timeframe||"-"];return a.join(" / ")},goToStrategyEditor:function(t){t&&t.id&&this.$router.push({path:"/trading-assistant",query:{mode:"edit",strategy_id:String(t.id)}})},runIndicatorBacktest:function(){var t=this;return(0,c.A)((0,o.A)().m(function e(){var a,s,i,r;return(0,o.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,p.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)},execution:{signalTiming:"same_bar_close"===t.signalTiming?"same_bar_close":"next_bar_open"},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,c.A)((0,o.A)().m(function e(){var a,s,i,r;return(0,o.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:return t.stRunning=!0,t.stHasResult=!1,t.stRunTip="",s=0,t.stRunTimer=setInterval(function(){s++;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(s/5),e.length-1)]},1e3),e.p=3,e.n=4,(0,f.YX)({strategyId:t.selectedStrategyId,startDate:t.stStartDate.format("YYYY-MM-DD"),endDate:t.stEndDate.format("YYYY-MM-DD"),overrideConfig:{market:t.stMarket,symbol:t.stSymbol,timeframe:t.stTimeframe,initialCapital:t.stInitialCapital,commission:t.stCommission,slippage:t.stSlippage,leverage:t.stLeverage,enableMtf:t.stMarket&&"crypto"===t.stMarket.toLowerCase()},timeout:6e5});case 4:i=e.v,1===i.code&&i.data?(i.data.runId&&(t.stBacktestRunId=i.data.runId),t.stResult=i.data.result||i.data,t.stHasResult=!0,t.$message.success(t.$t("backtest-center.result.success"))):t.$message.error(i.msg||t.$t("backtest-center.result.failed")),e.n=6;break;case 5:e.p=5,r=e.v,t.$message.error(r.message||t.$t("backtest-center.result.failed"));case 6:return e.p=6,t.stRunning=!1,clearInterval(t.stRunTimer),t.stRunTip="",e.f(6);case 7:return e.a(2)}},e,null,[[3,5,6,7]])}))()},openHistory:function(t){"strategy"===t?(this.historyIndicatorId=null,this.historyStrategyId=this.selectedStrategyId||null,this.historyRunType="strategy"):(this.historyIndicatorId=this.selectedIndicatorId||null,this.historyStrategyId=null,this.historyRunType=""),this.showHistoryDrawer=!0},handleViewRun:function(t){this.selectedRun=t,this.showRunViewer=!0}}},E=N,O=(0,w.A)(E,s,i,!1,null,"1daf6ac6",null),B=O.exports}}]); |