1 line
63 KiB
JavaScript
1 line
63 KiB
JavaScript
"use strict";(self["webpackChunkvue_antd_pro"]=self["webpackChunkvue_antd_pro"]||[]).push([[966],{78966:function(t,e,a){a.r(e),a.d(e,{default:function(){return q}});var i=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("div",{staticClass:"header-content"},[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",on:{change:t.handleTabChange},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("div",{staticClass:"tab-content"},[e("a-card",{staticClass:"config-card",attrs:{bordered:!1}},[e("div",{staticClass:"config-section"},[e("a-row",{attrs:{gutter:16,type:"flex",align:"middle"}},[e("a-col",{attrs:{xs:24,sm:12,md:8}},[e("div",{staticClass:"field-label"},[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"},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||a.indicator_name||"Indicator #"+a.id)+" ")])}),1)],1),e("a-col",{attrs:{xs:24,sm:12,md:16}},[e("div",{staticClass:"action-buttons"},[e("a-button",{attrs:{type:"primary",disabled:!t.selectedIndicatorObj},on:{click:t.openIndicatorBacktest}},[e("a-icon",{attrs:{type:"play-circle"}}),t._v(" "+t._s(t.$t("backtest-center.indicator.runBacktest"))+" ")],1),e("a-button",{attrs:{disabled:!t.selectedIndicatorObj},on:{click:t.openIndicatorHistory}},[e("a-icon",{attrs:{type:"history"}}),t._v(" "+t._s(t.$t("backtest-center.indicator.history"))+" ")],1),e("a-button",{on:{click:function(e){return t.$router.push("/indicator-analysis")}}},[e("a-icon",{attrs:{type:"line-chart"}}),t._v(" "+t._s(t.$t("backtest-center.indicator.goToIndicator"))+" ")],1)],1)])],1)],1),t.loadingIndicators||0!==t.indicators.length?t._e():e("a-empty",{staticStyle:{padding:"40px 0"},attrs:{description:t.$t("backtest-center.indicator.noIndicators")}})],1)],1)]),e("a-tab-pane",{key:"strategy",attrs:{tab:t.$t("backtest-center.tabs.strategy")}},[e("div",{staticClass:"tab-content"},[e("a-card",{staticClass:"config-card",attrs:{bordered:!1}},[e("div",{staticClass:"config-section"},[e("a-row",{attrs:{gutter:16,type:"flex",align:"middle"}},[e("a-col",{attrs:{xs:24,sm:12,md:8}},[e("div",{staticClass:"field-label"},[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"},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)+" "),"script"===a.strategy_mode?e("span",{staticStyle:{"margin-left":"6px",color:"#9254de","font-size":"11px"}},[t._v("[Script]")]):t._e()])}),1)],1),e("a-col",{attrs:{xs:24,sm:12,md:16}},[e("div",{staticClass:"action-buttons"},[e("a-button",{attrs:{type:"primary",disabled:!t.selectedStrategyObj},on:{click:t.openStrategyBacktest}},[e("a-icon",{attrs:{type:"play-circle"}}),t._v(" "+t._s(t.$t("backtest-center.strategy.runBacktest"))+" ")],1),e("a-button",{on:{click:function(e){return t.$router.push("/trading-assistant")}}},[e("a-icon",{attrs:{type:"robot"}}),t._v(" "+t._s(t.$t("backtest-center.strategy.goToAssistant"))+" ")],1)],1)])],1)],1),t.loadingStrategies||0!==t.strategies.length?t._e():e("a-empty",{staticStyle:{padding:"40px 0"},attrs:{description:t.$t("backtest-center.strategy.noStrategies")}}),t.strategyBacktestResult?e("div",{staticClass:"strategy-result-section"},[e("a-divider",[t._v(t._s(t.$t("backtest-center.strategy.result")))]),e("div",{staticClass:"metrics-grid"},t._l(t.strategyBacktestResult.metrics,function(a,i){return e("div",{key:i,staticClass:"metric-card"},[e("div",{staticClass:"metric-label"},[t._v(t._s(i))]),e("div",{staticClass:"metric-value"},[t._v(t._s(a))])])}),0)],1):t._e()],1)],1)])],1),e("backtest-modal",{attrs:{visible:t.showBacktestModal,userId:t.userId,indicator:t.backtestIndicator,symbol:t.backtestSymbol,market:t.backtestMarket,timeframe:t.backtestTimeframe},on:{cancel:function(e){t.showBacktestModal=!1,t.backtestIndicator=null}}}),e("backtest-history-drawer",{attrs:{visible:t.showBacktestHistoryDrawer,userId:t.userId,indicatorId:t.historyIndicatorId,symbol:t.backtestSymbol,market:t.backtestMarket,timeframe:t.backtestTimeframe,isMobile:t.isMobile},on:{cancel:function(e){t.showBacktestHistoryDrawer=!1},view:t.handleViewBacktestRun}}),e("backtest-run-viewer",{attrs:{visible:t.showBacktestRunViewer,run:t.selectedBacktestRun},on:{cancel:function(e){t.showBacktestRunViewer=!1,t.selectedBacktestRun=null}}})],1)},s=[],r=a(76338),n=a(81127),o=a(56252),c=a(55434),d=a(75769),l=a(36911),u=a(505),m=function(){var t=this,e=t._self._c;return e("a-modal",{staticClass:"backtest-modal",attrs:{title:t.$t("dashboard.indicator.backtest.title"),visible:t.visible,width:1100,maskClosable:!1},on:{cancel:t.handleCancel}},[e("div",{staticClass:"backtest-content"},[e("a-steps",{staticStyle:{"margin-bottom":"16px"},attrs:{current:t.currentStep,size:"small"}},[e("a-step",{attrs:{title:t.$t("dashboard.indicator.backtest.steps.strategy.title"),description:t.$t("dashboard.indicator.backtest.steps.strategy.desc")}}),e("a-step",{attrs:{title:t.$t("dashboard.indicator.backtest.steps.trading.title"),description:t.$t("dashboard.indicator.backtest.steps.trading.desc")}}),e("a-step",{attrs:{title:t.$t("dashboard.indicator.backtest.steps.results.title"),description:t.$t("dashboard.indicator.backtest.steps.results.desc")}})],1),e("div",{directives:[{name:"show",rawName:"v-show",value:2!==t.currentStep,expression:"currentStep !== 2"}],staticClass:"config-section"},[e("a-form",{attrs:{form:t.form,"label-col":t.labelCol,"wrapper-col":t.wrapperCol}},[e("div",{directives:[{name:"show",rawName:"v-show",value:0===t.currentStep,expression:"currentStep === 0"}]},[e("a-collapse",{staticStyle:{background:"#fafafa"},attrs:{bordered:!1},model:{value:t.step1CollapseKeys,callback:function(e){t.step1CollapseKeys=e},expression:"step1CollapseKeys"}},[e("a-collapse-panel",{key:"risk",attrs:{header:t.$t("dashboard.indicator.backtest.panel.risk")}},[e("a-row",{attrs:{gutter:24}},[e("a-col",{attrs:{span:12}},[e("a-form-item",{attrs:{label:t.$t("dashboard.indicator.backtest.field.stopLossPct")}},[e("a-input-number",{directives:[{name:"decorator",rawName:"v-decorator",value:["stopLossPct",{initialValue:0}],expression:"['stopLossPct', { initialValue: 0 }]"}],staticStyle:{width:"220px"},attrs:{min:0,max:100,step:.01,precision:4}})],1)],1),e("a-col",{attrs:{span:12}},[e("a-form-item",{attrs:{label:t.$t("dashboard.indicator.backtest.field.takeProfitPct")}},[e("a-input-number",{directives:[{name:"decorator",rawName:"v-decorator",value:["takeProfitPct",{initialValue:0}],expression:"['takeProfitPct', { initialValue: 0 }]"}],staticStyle:{width:"220px"},attrs:{min:0,max:1e3,step:.01,precision:4}})],1)],1)],1),e("a-row",{attrs:{gutter:24}},[e("a-col",{attrs:{span:12}},[e("a-form-item",{attrs:{label:t.$t("dashboard.indicator.backtest.field.trailingEnabled")}},[e("a-switch",{directives:[{name:"decorator",rawName:"v-decorator",value:["trailingEnabled",{valuePropName:"checked",initialValue:!1}],expression:"['trailingEnabled', { valuePropName: 'checked', initialValue: false }]"}],on:{change:t.onTrailingToggle}})],1)],1),e("a-col",{attrs:{span:12}})],1),t.trailingEnabledUi?[e("a-row",{attrs:{gutter:24}},[e("a-col",{attrs:{span:12}},[e("a-form-item",{attrs:{label:t.$t("dashboard.indicator.backtest.field.trailingStopPct")}},[e("a-input-number",{directives:[{name:"decorator",rawName:"v-decorator",value:["trailingStopPct",{initialValue:0}],expression:"['trailingStopPct', { initialValue: 0 }]"}],staticStyle:{width:"220px"},attrs:{min:0,max:100,step:.01,precision:4}})],1)],1),e("a-col",{attrs:{span:12}},[e("a-form-item",{attrs:{label:t.$t("dashboard.indicator.backtest.field.trailingActivationPct")}},[e("a-input-number",{directives:[{name:"decorator",rawName:"v-decorator",value:["trailingActivationPct",{initialValue:0}],expression:"['trailingActivationPct', { initialValue: 0 }]"}],staticStyle:{width:"220px"},attrs:{min:0,max:1e3,step:.01,precision:4}})],1)],1)],1)]:t._e()],2),e("a-collapse-panel",{key:"scale",attrs:{header:t.$t("dashboard.indicator.backtest.panel.scale")}},[e("a-row",{attrs:{gutter:24}},[e("a-col",{attrs:{span:12}},[e("a-form-item",{attrs:{label:t.$t("dashboard.indicator.backtest.field.trendAddEnabled")}},[e("a-switch",{directives:[{name:"decorator",rawName:"v-decorator",value:["trendAddEnabled",{valuePropName:"checked",initialValue:!1}],expression:"['trendAddEnabled', { valuePropName: 'checked', initialValue: false }]"}],on:{change:t.onTrendAddToggle}})],1)],1),e("a-col",{attrs:{span:12}},[e("a-form-item",{attrs:{label:t.$t("dashboard.indicator.backtest.field.dcaAddEnabled")}},[e("a-switch",{directives:[{name:"decorator",rawName:"v-decorator",value:["dcaAddEnabled",{valuePropName:"checked",initialValue:!1}],expression:"['dcaAddEnabled', { valuePropName: 'checked', initialValue: false }]"}],on:{change:t.onDcaAddToggle}})],1)],1)],1),e("a-row",{attrs:{gutter:24}},[e("a-col",{attrs:{span:12}},[e("a-form-item",{attrs:{label:t.$t("dashboard.indicator.backtest.field.trendAddStepPct")}},[e("a-input-number",{directives:[{name:"decorator",rawName:"v-decorator",value:["trendAddStepPct",{initialValue:0}],expression:"['trendAddStepPct', { initialValue: 0 }]"}],staticStyle:{width:"220px"},attrs:{min:0,max:1e3,step:.01,precision:4},on:{change:t.onScaleParamsChange}})],1)],1),e("a-col",{attrs:{span:12}},[e("a-form-item",{attrs:{label:t.$t("dashboard.indicator.backtest.field.dcaAddStepPct")}},[e("a-input-number",{directives:[{name:"decorator",rawName:"v-decorator",value:["dcaAddStepPct",{initialValue:0}],expression:"['dcaAddStepPct', { initialValue: 0 }]"}],staticStyle:{width:"220px"},attrs:{min:0,max:1e3,step:.01,precision:4},on:{change:t.onScaleParamsChange}})],1)],1)],1),e("a-row",{attrs:{gutter:24}},[e("a-col",{attrs:{span:12}},[e("a-form-item",{attrs:{label:t.$t("dashboard.indicator.backtest.field.trendAddSizePct")}},[e("a-input-number",{directives:[{name:"decorator",rawName:"v-decorator",value:["trendAddSizePct",{initialValue:0}],expression:"['trendAddSizePct', { initialValue: 0 }]"}],staticStyle:{width:"220px"},attrs:{min:0,max:100,step:.1,precision:4},on:{change:t.onScaleParamsChange}})],1)],1),e("a-col",{attrs:{span:12}},[e("a-form-item",{attrs:{label:t.$t("dashboard.indicator.backtest.field.dcaAddSizePct")}},[e("a-input-number",{directives:[{name:"decorator",rawName:"v-decorator",value:["dcaAddSizePct",{initialValue:0}],expression:"['dcaAddSizePct', { initialValue: 0 }]"}],staticStyle:{width:"220px"},attrs:{min:0,max:100,step:.1,precision:4},on:{change:t.onScaleParamsChange}})],1)],1)],1),e("a-row",{attrs:{gutter:24}},[e("a-col",{attrs:{span:12}},[e("a-form-item",{attrs:{label:t.$t("dashboard.indicator.backtest.field.trendAddMaxTimes")}},[e("a-input-number",{directives:[{name:"decorator",rawName:"v-decorator",value:["trendAddMaxTimes",{initialValue:0}],expression:"['trendAddMaxTimes', { initialValue: 0 }]"}],staticStyle:{width:"220px"},attrs:{min:0,max:50,step:1,precision:0},on:{change:t.onScaleParamsChange}})],1)],1),e("a-col",{attrs:{span:12}},[e("a-form-item",{attrs:{label:t.$t("dashboard.indicator.backtest.field.dcaAddMaxTimes")}},[e("a-input-number",{directives:[{name:"decorator",rawName:"v-decorator",value:["dcaAddMaxTimes",{initialValue:0}],expression:"['dcaAddMaxTimes', { initialValue: 0 }]"}],staticStyle:{width:"220px"},attrs:{min:0,max:50,step:1,precision:0},on:{change:t.onScaleParamsChange}})],1)],1)],1)],1),e("a-collapse-panel",{key:"reduce",attrs:{header:t.$t("dashboard.indicator.backtest.panel.reduce")}},[e("a-row",{attrs:{gutter:24}},[e("a-col",{attrs:{span:12}},[e("a-form-item",{attrs:{label:t.$t("dashboard.indicator.backtest.field.trendReduceEnabled")}},[e("a-switch",{directives:[{name:"decorator",rawName:"v-decorator",value:["trendReduceEnabled",{valuePropName:"checked",initialValue:!1}],expression:"['trendReduceEnabled', { valuePropName: 'checked', initialValue: false }]"}]})],1)],1),e("a-col",{attrs:{span:12}},[e("a-form-item",{attrs:{label:t.$t("dashboard.indicator.backtest.field.adverseReduceEnabled")}},[e("a-switch",{directives:[{name:"decorator",rawName:"v-decorator",value:["adverseReduceEnabled",{valuePropName:"checked",initialValue:!1}],expression:"['adverseReduceEnabled', { valuePropName: 'checked', initialValue: false }]"}]})],1)],1)],1),e("a-row",{attrs:{gutter:24}},[e("a-col",{attrs:{span:12}},[e("a-form-item",{attrs:{label:t.$t("dashboard.indicator.backtest.field.trendReduceStepPct")}},[e("a-input-number",{directives:[{name:"decorator",rawName:"v-decorator",value:["trendReduceStepPct",{initialValue:0}],expression:"['trendReduceStepPct', { initialValue: 0 }]"}],staticStyle:{width:"220px"},attrs:{min:0,max:1e3,step:.01,precision:4}})],1)],1),e("a-col",{attrs:{span:12}},[e("a-form-item",{attrs:{label:t.$t("dashboard.indicator.backtest.field.adverseReduceStepPct")}},[e("a-input-number",{directives:[{name:"decorator",rawName:"v-decorator",value:["adverseReduceStepPct",{initialValue:0}],expression:"['adverseReduceStepPct', { initialValue: 0 }]"}],staticStyle:{width:"220px"},attrs:{min:0,max:1e3,step:.01,precision:4}})],1)],1)],1),e("a-row",{attrs:{gutter:24}},[e("a-col",{attrs:{span:12}},[e("a-form-item",{attrs:{label:t.$t("dashboard.indicator.backtest.field.trendReduceSizePct")}},[e("a-input-number",{directives:[{name:"decorator",rawName:"v-decorator",value:["trendReduceSizePct",{initialValue:0}],expression:"['trendReduceSizePct', { initialValue: 0 }]"}],staticStyle:{width:"220px"},attrs:{min:0,max:100,step:.1,precision:4}})],1)],1),e("a-col",{attrs:{span:12}},[e("a-form-item",{attrs:{label:t.$t("dashboard.indicator.backtest.field.adverseReduceSizePct")}},[e("a-input-number",{directives:[{name:"decorator",rawName:"v-decorator",value:["adverseReduceSizePct",{initialValue:0}],expression:"['adverseReduceSizePct', { initialValue: 0 }]"}],staticStyle:{width:"220px"},attrs:{min:0,max:100,step:.1,precision:4}})],1)],1)],1),e("a-row",{attrs:{gutter:24}},[e("a-col",{attrs:{span:12}},[e("a-form-item",{attrs:{label:t.$t("dashboard.indicator.backtest.field.trendReduceMaxTimes")}},[e("a-input-number",{directives:[{name:"decorator",rawName:"v-decorator",value:["trendReduceMaxTimes",{initialValue:0}],expression:"['trendReduceMaxTimes', { initialValue: 0 }]"}],staticStyle:{width:"100%"},attrs:{min:0,max:50,step:1,precision:0}})],1)],1),e("a-col",{attrs:{span:12}},[e("a-form-item",{attrs:{label:t.$t("dashboard.indicator.backtest.field.adverseReduceMaxTimes")}},[e("a-input-number",{directives:[{name:"decorator",rawName:"v-decorator",value:["adverseReduceMaxTimes",{initialValue:0}],expression:"['adverseReduceMaxTimes', { initialValue: 0 }]"}],staticStyle:{width:"100%"},attrs:{min:0,max:50,step:1,precision:0}})],1)],1)],1)],1),e("a-collapse-panel",{key:"position",attrs:{header:t.$t("dashboard.indicator.backtest.panel.position")}},[e("a-row",{attrs:{gutter:24}},[e("a-col",{attrs:{span:12}},[e("a-form-item",{attrs:{label:t.$t("dashboard.indicator.backtest.field.entryPct"),help:t.$t("dashboard.indicator.backtest.hint.entryPctMax",{maxPct:Number(t.entryPctMaxUi||0).toFixed(0)})}},[e("a-input-number",{directives:[{name:"decorator",rawName:"v-decorator",value:["entryPct",{initialValue:100}],expression:"['entryPct', { initialValue: 100 }]"}],staticStyle:{width:"220px"},attrs:{min:0,max:t.entryPctMaxUi,step:.1,precision:4},on:{change:t.onEntryPctChange}})],1)],1),e("a-col",{attrs:{span:12}})],1)],1)],1)],1),e("div",{directives:[{name:"show",rawName:"v-show",value:1===t.currentStep,expression:"currentStep === 1"}]},[e("a-alert",{staticStyle:{"margin-bottom":"12px"},attrs:{type:t.combinedAlertType,"show-icon":""}},[e("template",{slot:"message"},[e("div",{staticStyle:{display:"flex","align-items":"center","flex-wrap":"wrap",gap:"8px"}},[e("span",[e("strong",[t._v("Symbol:")]),t._v(" "+t._s(t.symbol||"-")+" "),e("span",{staticStyle:{color:"#999",margin:"0 6px"}},[t._v("|")]),e("strong",[t._v("Market:")]),t._v(" "+t._s(t.market||"-")+" "),e("span",{staticStyle:{color:"#999",margin:"0 6px"}},[t._v("|")]),e("strong",[t._v("Timeframe:")]),t._v(" "+t._s(t.selectedTimeframe||t.timeframe||"-")+" ")]),t.precisionInfo&&t.precisionInfo.enabled?e("span",{staticStyle:{"margin-left":"12px","border-left":"1px solid #d9d9d9","padding-left":"12px"}},[e("a-icon",{staticStyle:{"margin-right":"4px"},attrs:{type:"high"===t.precisionInfo.precision?"thunderbolt":"clock-circle"}}),t._v(" "+t._s(t.$t("dashboard.indicator.backtest.precisionMode"))+": "),e("a-tag",{staticStyle:{"margin-left":"4px"},attrs:{color:"high"===t.precisionInfo.precision?"green":"blue",size:"small"}},[t._v(" "+t._s(t.precisionInfo.timeframe)+" ")]),e("span",{staticStyle:{color:"#666","margin-left":"6px"}},[t._v(" ("+t._s(t.$t("dashboard.indicator.backtest.estimatedCandles",{count:t.precisionInfo.estimated_candles?t.precisionInfo.estimated_candles.toLocaleString():"-"}))+") ")])],1):t.precisionInfo&&!t.precisionInfo.enabled&&t.market&&"crypto"===t.market.toLowerCase()?e("span",{staticStyle:{"margin-left":"12px","border-left":"1px solid #d9d9d9","padding-left":"12px",color:"#faad14"}},[e("a-icon",{staticStyle:{"margin-right":"4px"},attrs:{type:"warning"}}),t._v(" "+t._s(t.$t("dashboard.indicator.backtest.standardModeWarning"))+" ")],1):t._e()])]),e("template",{slot:"description"},[t.precisionInfo&&t.precisionInfo.enabled?e("span",{staticStyle:{"font-size":"12px",color:"#888"}},[t._v(" "+t._s("high"===t.precisionInfo.precision?t.$t("dashboard.indicator.backtest.highPrecisionDesc"):t.$t("dashboard.indicator.backtest.mediumPrecisionDesc"))+" ")]):t.precisionInfo&&!t.precisionInfo.enabled&&t.market&&"crypto"===t.market.toLowerCase()?e("span",{staticStyle:{"font-size":"12px",color:"#888"}},[t._v(" "+t._s(t.precisionInfo.message||t.$t("dashboard.indicator.backtest.standardModeDesc"))+" ")]):t._e()])],2),e("div",{staticClass:"date-quick-select",staticStyle:{"margin-bottom":"12px"}},[e("span",{staticStyle:{"margin-right":"8px",color:"#666","font-size":"13px"}},[t._v(t._s(t.$t("dashboard.indicator.backtest.quickSelect")||"快速选择")+":")]),e("a-button-group",{attrs:{size:"small"}},t._l(t.datePresets,function(a){return e("a-button",{key:a.key,attrs:{type:t.selectedDatePreset===a.key?"primary":"default"},on:{click:function(e){return t.applyDatePreset(a)}}},[t._v(t._s(a.label))])}),1)],1),e("a-row",{attrs:{gutter:24}},[e("a-col",{attrs:{span:12}},[e("a-form-item",{attrs:{label:t.$t("dashboard.indicator.backtest.startDate")}},[e("a-date-picker",{directives:[{name:"decorator",rawName:"v-decorator",value:["startDate",{rules:[{required:!0,message:t.$t("dashboard.indicator.backtest.startDateRequired")}],initialValue:t.defaultStartDate}],expression:"['startDate', { rules: [{ required: true, message: $t('dashboard.indicator.backtest.startDateRequired') }], initialValue: defaultStartDate }]"}],staticStyle:{width:"100%"},attrs:{"disabled-date":t.disabledStartDate,placeholder:t.$t("dashboard.indicator.backtest.selectStartDate")},on:{change:t.onDateChange}})],1)],1),e("a-col",{attrs:{span:12}},[e("a-form-item",{attrs:{label:t.$t("dashboard.indicator.backtest.endDate")}},[e("a-date-picker",{directives:[{name:"decorator",rawName:"v-decorator",value:["endDate",{rules:[{required:!0,message:t.$t("dashboard.indicator.backtest.endDateRequired")}],initialValue:t.defaultEndDate}],expression:"['endDate', { rules: [{ required: true, message: $t('dashboard.indicator.backtest.endDateRequired') }], initialValue: defaultEndDate }]"}],staticStyle:{width:"100%"},attrs:{"disabled-date":t.disabledEndDate,placeholder:t.$t("dashboard.indicator.backtest.selectEndDate")},on:{change:t.onDateChange}})],1)],1)],1),e("a-row",{attrs:{gutter:24}},[e("a-col",{attrs:{span:12}},[e("a-form-item",{attrs:{label:t.$t("dashboard.indicator.backtest.initialCapital")}},[e("a-input-number",{directives:[{name:"decorator",rawName:"v-decorator",value:["initialCapital",{rules:[{required:!0,message:t.$t("dashboard.indicator.backtest.initialCapitalRequired")}],initialValue:1e4}],expression:"['initialCapital', { rules: [{ required: true, message: $t('dashboard.indicator.backtest.initialCapitalRequired') }], initialValue: 10000 }]"}],staticStyle:{width:"100%"},attrs:{min:1e3,step:1e4,precision:2,formatter:function(t){return"$ ".concat(t).replace(/\B(?=(\d{3})+(?!\d))/g,",")},parser:function(t){return t.replace(/\$\s?|(,*)/g,"")}}})],1)],1),e("a-col",{attrs:{span:12}},[e("a-form-item",{attrs:{label:t.$t("dashboard.indicator.backtest.commission")}},[e("a-input-number",{directives:[{name:"decorator",rawName:"v-decorator",value:["commission",{initialValue:.02}],expression:"['commission', { initialValue: 0.02 }]"}],staticStyle:{width:"100%"},attrs:{min:0,max:10,step:.01,precision:4}}),e("div",{staticClass:"field-hint"},[t._v(t._s(t.$t("dashboard.indicator.backtest.commissionHint")))])],1)],1)],1),e("a-row",{attrs:{gutter:24}},[e("a-col",{attrs:{span:12}},[e("a-form-item",{attrs:{label:t.$t("dashboard.indicator.backtest.field.slippage")}},[e("a-input-number",{directives:[{name:"decorator",rawName:"v-decorator",value:["slippage",{initialValue:0}],expression:"['slippage', { initialValue: 0 }]"}],staticStyle:{width:"100%"},attrs:{min:0,max:10,step:.01,precision:4}})],1)],1),e("a-col",{attrs:{span:12}},[e("a-form-item",{attrs:{label:t.$t("dashboard.indicator.backtest.leverage")}},[e("a-input-number",{directives:[{name:"decorator",rawName:"v-decorator",value:["leverage",{initialValue:1}],expression:"['leverage', { initialValue: 1 }]"}],staticStyle:{width:"100%"},attrs:{min:1,max:125,step:1,precision:0,formatter:function(t){return"".concat(t,"x")},parser:function(t){return t.replace("x","")}}})],1)],1)],1),e("a-row",{attrs:{gutter:24}},[e("a-col",{attrs:{span:12}},[e("a-form-item",{attrs:{label:t.$t("dashboard.indicator.backtest.tradeDirection")}},[e("a-select",{directives:[{name:"decorator",rawName:"v-decorator",value:["tradeDirection",{initialValue:"long"}],expression:"['tradeDirection', { initialValue: 'long' }]"}],staticStyle:{width:"100%"}},[e("a-select-option",{attrs:{value:"long"}},[t._v(" "+t._s(t.$t("dashboard.indicator.backtest.longOnly"))+" ")]),e("a-select-option",{attrs:{value:"short"}},[t._v(" "+t._s(t.$t("dashboard.indicator.backtest.shortOnly"))+" ")]),e("a-select-option",{attrs:{value:"both"}},[t._v(" "+t._s(t.$t("dashboard.indicator.backtest.both"))+" ")])],1)],1)],1),e("a-col",{attrs:{span:12}},[e("a-form-item",{attrs:{label:t.$t("dashboard.indicator.backtest.timeframe")}},[e("a-select",{staticStyle:{width:"100%"},on:{change:t.onTimeframeChange},model:{value:t.selectedTimeframe,callback:function(e){t.selectedTimeframe=e},expression:"selectedTimeframe"}},[e("a-select-option",{attrs:{value:"1m"}},[t._v("1m")]),e("a-select-option",{attrs:{value:"5m"}},[t._v("5m")]),e("a-select-option",{attrs:{value:"15m"}},[t._v("15m")]),e("a-select-option",{attrs:{value:"30m"}},[t._v("30m")]),e("a-select-option",{attrs:{value:"1H"}},[t._v("1H")]),e("a-select-option",{attrs:{value:"4H"}},[t._v("4H")]),e("a-select-option",{attrs:{value:"1D"}},[t._v("1D")]),e("a-select-option",{attrs:{value:"1W"}},[t._v("1W")])],1)],1)],1)],1)],1)])],1),e("div",{directives:[{name:"show",rawName:"v-show",value:2===t.currentStep&&t.hasResult,expression:"currentStep === 2 && hasResult"}],staticClass:"result-section"},[t.backtestRunId?e("a-alert",{staticStyle:{"margin-bottom":"12px"},attrs:{type:"success","show-icon":"",message:t.$t("dashboard.indicator.backtest.savedRunId",{id:t.backtestRunId})}}):t._e(),e("div",{staticClass:"metrics-cards"},[e("div",{staticClass:"metric-card",class:{positive:t.result.totalReturn>0,negative:t.result.totalReturn<0}},[e("div",{staticClass:"metric-label"},[t._v(t._s(t.$t("dashboard.indicator.backtest.totalReturn")))]),e("div",{staticClass:"metric-value"},[t._v(t._s(t.formatPercent(t.result.totalReturn)))]),e("div",{staticClass:"metric-amount"},[t._v(t._s(t.formatMoney(t.result.totalProfit)))])]),e("div",{staticClass:"metric-card",class:{positive:t.result.annualReturn>0,negative:t.result.annualReturn<0}},[e("div",{staticClass:"metric-label"},[t._v(t._s(t.$t("dashboard.indicator.backtest.annualReturn")))]),e("div",{staticClass:"metric-value"},[t._v(t._s(t.formatPercent(t.result.annualReturn)))])]),e("div",{staticClass:"metric-card negative"},[e("div",{staticClass:"metric-label"},[t._v(t._s(t.$t("dashboard.indicator.backtest.maxDrawdown")))]),e("div",{staticClass:"metric-value"},[t._v(t._s(t.formatPercent(t.result.maxDrawdown)))])]),e("div",{staticClass:"metric-card"},[e("div",{staticClass:"metric-label"},[t._v(t._s(t.$t("dashboard.indicator.backtest.sharpeRatio")))]),e("div",{staticClass:"metric-value"},[t._v(t._s(t.result.sharpeRatio.toFixed(2)))])]),e("div",{staticClass:"metric-card"},[e("div",{staticClass:"metric-label"},[t._v(t._s(t.$t("dashboard.indicator.backtest.winRate")))]),e("div",{staticClass:"metric-value"},[t._v(t._s(t.formatPercent(t.result.winRate)))])]),e("div",{staticClass:"metric-card",class:{positive:t.result.profitFactor>=1.5,negative:t.result.profitFactor<1}},[e("div",{staticClass:"metric-label"},[t._v(t._s(t.$t("dashboard.indicator.backtest.profitFactor")))]),e("div",{staticClass:"metric-value"},[t._v(t._s(t.result.profitFactor.toFixed(2)))])]),e("div",{staticClass:"metric-card"},[e("div",{staticClass:"metric-label"},[t._v(t._s(t.$t("dashboard.indicator.backtest.totalTrades")))]),e("div",{staticClass:"metric-value"},[t._v(t._s(t.result.totalTrades))])]),e("div",{staticClass:"metric-card negative"},[e("div",{staticClass:"metric-label"},[t._v(t._s(t.$t("dashboard.indicator.backtest.totalCommission")))]),e("div",{staticClass:"metric-value"},[t._v("-$"+t._s(t.result.totalCommission?t.result.totalCommission.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2}):"0.00"))])])]),e("div",{staticClass:"chart-section"},[e("div",{staticClass:"chart-title"},[t._v(t._s(t.$t("dashboard.indicator.backtest.equityCurve")))]),e("div",{ref:"equityChartRef",staticClass:"equity-chart"})]),e("div",{staticClass:"trades-section"},[e("div",{staticClass:"chart-title"},[t._v(t._s(t.$t("dashboard.indicator.backtest.tradeHistory")))]),e("a-table",{attrs:{columns:t.tradeColumns,"data-source":t.result.trades,pagination:{pageSize:5,size:"small"},size:"small",scroll:{x:600}},scopedSlots:t._u([{key:"type",fn:function(a){return[e("a-tag",{attrs:{color:t.getTradeTypeColor(a)}},[t._v(" "+t._s(t.getTradeTypeText(a))+" ")])]}},{key:"balance",fn:function(a){return[e("span",{staticStyle:{color:"#1890ff","font-weight":"500"}},[t._v(" $"+t._s(a?a.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2}):"--")+" ")])]}},{key:"profit",fn:function(a){return[e("span",{style:{color:a>0?"#52c41a":a<0?"#f5222d":"#666"}},[t._v(" "+t._s(t.formatMoney(a))+" ")])]}}])})],1)],1),t.loading?e("div",{staticClass:"loading-overlay"},[e("div",{staticClass:"loading-content"},[e("div",{staticClass:"loading-animation"},[e("div",{staticClass:"chart-bars"},[e("div",{staticClass:"bar bar1"}),e("div",{staticClass:"bar bar2"}),e("div",{staticClass:"bar bar3"}),e("div",{staticClass:"bar bar4"}),e("div",{staticClass:"bar bar5"})])]),e("div",{staticClass:"loading-text"},[t._v(t._s(t.$t("dashboard.indicator.backtest.running")))]),e("div",{staticClass:"loading-subtext"},[t._v(t._s(t.loadingTip))])])]):t._e()],1),e("template",{slot:"footer"},[e("div",{staticStyle:{display:"flex","justify-content":"space-between","align-items":"center",width:"100%"}},[e("div",[t.currentStep>0?e("a-button",{attrs:{disabled:t.loading},on:{click:t.handlePrev}},[t._v(t._s(t.$t("dashboard.indicator.backtest.prev")))]):t._e()],1),e("div",[e("a-button",{attrs:{disabled:t.loading},on:{click:t.handleCancel}},[t._v(t._s(t.$t("dashboard.indicator.backtest.close")))]),t.currentStep<1?e("a-button",{staticStyle:{"margin-left":"8px"},attrs:{type:"primary",disabled:t.loading},on:{click:t.handleNext}},[t._v(t._s(t.$t("dashboard.indicator.backtest.next")))]):1===t.currentStep?e("a-button",{staticStyle:{"margin-left":"8px"},attrs:{type:"primary",loading:t.loading},on:{click:t.handleRunBacktest}},[t._v(t._s(t.$t("dashboard.indicator.backtest.run")))]):e("a-button",{staticStyle:{"margin-left":"8px"},attrs:{type:"primary",disabled:t.loading},on:{click:t.handleRerun}},[t._v(t._s(t.$t("dashboard.indicator.backtest.rerun")))])],1)])])],2)},h=[],b=(a(74423),a(95093)),p=a.n(b),f=a(29362),v={name:"BacktestModal",props:{visible:{type:Boolean,default:!1},userId:{type:[Number,String],default:1},indicator:{type:Object,default:null},symbol:{type:String,default:""},market:{type:String,default:""},timeframe:{type:String,default:"1D"}},data:function(){return{form:this.$form.createForm(this),loading:!1,loadingTip:"",loadingTimer:null,currentStep:0,hasResult:!1,backtestRunId:null,step1CollapseKeys:["risk"],trailingEnabledUi:!1,entryPctMaxUi:100,precisionInfo:null,selectedDatePreset:null,selectedTimeframe:"1D",result:{totalReturn:0,annualReturn:0,maxDrawdown:0,sharpeRatio:0,winRate:0,profitFactor:0,totalTrades:0,totalProfit:0,totalCommission:0,trades:[],equityCurve:[]},equityChart:null,tradeColumns:[]}},computed:{maxBacktestRange:function(){var t=this.selectedTimeframe||this.timeframe||"1D";return"1m"===t?{days:30,label:"1个月"}:"5m"===t?{days:180,label:"6个月"}:["15m","30m"].includes(t)?{days:365,label:"1年"}:{days:1095,label:"3年"}},recommendedRange:function(){return{days:30,label:"30天",key:"30d"}},combinedAlertType:function(){return this.precisionInfo&&this.precisionInfo.enabled?"high"===this.precisionInfo.precision?"success":"info":this.precisionInfo&&!this.precisionInfo.enabled&&this.market&&"crypto"===this.market.toLowerCase()?"warning":"info"},datePresets:function(){var t=[],e=this.selectedTimeframe||this.timeframe||"1D";return"1m"===e?(t.push({key:"7d",days:7,label:"7D"}),t.push({key:"14d",days:14,label:"14D"}),t.push({key:"30d",days:30,label:"30D"})):"5m"===e?(t.push({key:"14d",days:14,label:"14D"}),t.push({key:"30d",days:30,label:"30D"}),t.push({key:"90d",days:90,label:"3M"}),t.push({key:"180d",days:180,label:"6M"})):(["15m","30m"].includes(e),t.push({key:"30d",days:30,label:"30D"}),t.push({key:"90d",days:90,label:"3M"}),t.push({key:"180d",days:180,label:"6M"}),t.push({key:"365d",days:365,label:"1Y"})),t},defaultStartDate:function(){return p()().subtract(this.recommendedRange.days,"days")},defaultEndDate:function(){return p()()},earliestDate:function(){return p()().subtract(this.maxBacktestRange.days,"days")},labelCol:function(){return 0===this.currentStep?{span:9}:{span:6}},wrapperCol:function(){return 0===this.currentStep?{span:15}:{span:18}}},watch:{visible:function(t){var e=this;t?(this.currentStep=0,this.hasResult=!1,this.backtestRunId=null,this.step1CollapseKeys=["risk"],this.trailingEnabledUi=!1,this.entryPctMaxUi=100,this.precisionInfo=null,this.selectedDatePreset=null,this.selectedTimeframe=this.timeframe||"1D",this.result={totalReturn:0,annualReturn:0,maxDrawdown:0,sharpeRatio:0,winRate:0,profitFactor:0,totalTrades:0,totalProfit:0,totalCommission:0,trades:[],equityCurve:[]},this.$nextTick(function(){e.form&&(e.form.resetFields(),e.trailingEnabledUi=!!e.form.getFieldValue("trailingEnabled"),e.recalcEntryPctMaxUi(),e.selectedDatePreset="30d",e.fetchPrecisionInfo())})):this.equityChart&&(this.equityChart.dispose(),this.equityChart=null)}},created:function(){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:120,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,customRender:function(t){return t?t.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:4}):"--"}},{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:130,scopedSlots:{customRender:"balance"}}]},methods:{recalcEntryPctMaxUi:function(){if(this.form){var t=!!this.form.getFieldValue("trendAddEnabled"),e=!!this.form.getFieldValue("dcaAddEnabled"),a=Number(this.form.getFieldValue("trendAddMaxTimes")||0),i=Number(this.form.getFieldValue("dcaAddMaxTimes")||0),s=Number(this.form.getFieldValue("trendAddSizePct")||0),r=Number(this.form.getFieldValue("dcaAddSizePct")||0),n=(t?a*s:0)+(e?i*r:0),o=Math.max(0,Math.min(100,100-n));this.entryPctMaxUi=o}else this.entryPctMaxUi=100},normalizeEntryPct:function(){if(this.form){var t=Number(this.form.getFieldValue("entryPct")||0),e=Number(this.entryPctMaxUi||100);t>e&&this.form.setFieldsValue({entryPct:e})}},onTrendAddToggle:function(t){var e=this;this.form&&(t&&this.form.setFieldsValue({dcaAddEnabled:!1}),this.$nextTick(function(){e.recalcEntryPctMaxUi(),e.normalizeEntryPct()}))},onDcaAddToggle:function(t){var e=this;this.form&&(t&&this.form.setFieldsValue({trendAddEnabled:!1}),this.$nextTick(function(){e.recalcEntryPctMaxUi(),e.normalizeEntryPct()}))},onScaleParamsChange:function(){var t=this;this.$nextTick(function(){t.recalcEntryPctMaxUi(),t.normalizeEntryPct()})},onEntryPctChange:function(){var t=this;this.$nextTick(function(){return t.normalizeEntryPct()})},onTrailingToggle:function(t){this.form&&(this.trailingEnabledUi=!!t,t||this.form.setFieldsValue({trailingStopPct:0,trailingActivationPct:0}))},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={buy:this.$t("dashboard.indicator.backtest.buy"),sell:this.$t("dashboard.indicator.backtest.sell"),liquidation:this.$t("dashboard.indicator.backtest.liquidation"),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")};return e[t]||t},disabledStartDate:function(t){return!!t&&(t>p()().endOf("day")||t<this.earliestDate.startOf("day"))},disabledEndDate:function(t){if(!t)return!1;if(t>p()().endOf("day"))return!0;if(t<this.earliestDate.startOf("day"))return!0;var e=this.form.getFieldValue("startDate");if(e){var a=this.maxBacktestRange.days||365,i=p()(e).add(a,"days");if(t>i.endOf("day"))return!0}return!1},applyDatePreset:function(t){this.selectedDatePreset=t.key;var e=p()(),a=p()().subtract(t.days,"days");this.form.setFieldsValue({startDate:a,endDate:e}),this.fetchPrecisionInfo(a,e)},fetchPrecisionInfo:function(t,e){var a=this;return(0,o.A)((0,n.A)().m(function i(){var s;return(0,n.A)().w(function(i){while(1)switch(i.p=i.n){case 0:if(t&&e||(t=a.form?a.form.getFieldValue("startDate"):null,e=a.form?a.form.getFieldValue("endDate"):null),t||(t=a.defaultStartDate),e||(e=a.defaultEndDate),a.market&&"crypto"===a.market.toLowerCase()){i.n=1;break}return a.precisionInfo={enabled:!1,reason:"only_crypto",message:a.$t("dashboard.indicator.backtest.onlyCryptoSupported")},i.a(2);case 1:return i.p=1,i.n=2,(0,d.Ay)({url:"/api/indicator/backtest/precision-info",method:"get",params:{market:a.market,startDate:t.format("YYYY-MM-DD"),endDate:e.format("YYYY-MM-DD")},timeout:3e4});case 2:s=i.v,1===s.code&&s.data&&(a.precisionInfo=s.data),i.n=4;break;case 3:i.p=3,i.v,a.precisionInfo=null;case 4:return i.a(2)}},i,null,[[1,3]])}))()},onTimeframeChange:function(){this.selectedDatePreset="30d";var t=p()(),e=p()().subtract(30,"days");this.form.setFieldsValue({startDate:e,endDate:t}),this.fetchPrecisionInfo(e,t)},onDateChange:function(){var t=this;this.selectedDatePreset=null,this.$nextTick(function(){t.fetchPrecisionInfo()})},validateDateRange:function(t,e){if(!t||!e)return!0;var a=e.diff(t,"days"),i=this.maxBacktestRange.days||365;return!(a>i)||(this.$message.error(this.$t("dashboard.indicator.backtest.dateRangeExceededDays",{timeframe:this.selectedTimeframe||this.timeframe,maxRange:this.maxBacktestRange.label,maxDays:i})),!1)},formatPercent:function(t){if(null===t||void 0===t)return"--";var e=t>=0?"+":"";return"".concat(e).concat(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}))},handleCancel:function(){this.$emit("cancel")},handlePrev:function(){this.loading||this.currentStep>0&&(this.currentStep-=1)},handleNext:function(){this.loading||(0!==this.currentStep?1===this.currentStep&&this.handleRunBacktest():this.currentStep=1)},handleRerun:function(){this.loading||(this.currentStep=1,this.hasResult=!1,this.backtestRunId=null)},startLoadingAnimation:function(){var t=this,e=[this.$t("dashboard.indicator.backtest.loadingTip1")||"正在获取历史K线数据...",this.$t("dashboard.indicator.backtest.loadingTip2")||"正在执行策略信号计算...",this.$t("dashboard.indicator.backtest.loadingTip3")||"正在模拟交易执行...",this.$t("dashboard.indicator.backtest.loadingTip4")||"正在计算回测指标...",this.$t("dashboard.indicator.backtest.loadingTip5")||"即将完成,请稍候..."],a=0;this.loadingTip=e[0],this.loadingTimer=setInterval(function(){a=(a+1)%e.length,t.loadingTip=e[a]},2e3)},stopLoadingAnimation:function(){this.loadingTimer&&(clearInterval(this.loadingTimer),this.loadingTimer=null),this.loadingTip=""},handleRunBacktest:function(){var t=this;return(0,o.A)((0,n.A)().m(function e(){var a;return(0,n.A)().w(function(e){while(1)switch(e.n){case 0:a=["startDate","endDate","initialCapital","commission","leverage","tradeDirection","slippage"],t.form.validateFields(a,function(){var e=(0,o.A)((0,n.A)().m(function e(a,i){var s,o,c,l,u,m,h,b,p;return(0,n.A)().w(function(e){while(1)switch(e.p=e.n){case 0:if(!a){e.n=1;break}return e.a(2);case 1:if(s=(0,r.A)((0,r.A)({},t.form.getFieldsValue()||{}),i||{}),o=Date.now(),t.indicator&&t.indicator.id){e.n=2;break}return t.$message.error(t.$t("dashboard.indicator.backtest.noIndicatorCode")),e.a(2);case 2:if(t.symbol){e.n=3;break}return t.$message.error(t.$t("dashboard.indicator.backtest.noSymbol")),e.a(2);case 3:if(t.validateDateRange(i.startDate,i.endDate)){e.n=4;break}return e.a(2);case 4:return t.loading=!0,t.hasResult=!1,t.startLoadingAnimation(),e.p=5,c=function(t){return Number(t||0)/100},l={risk:{stopLossPct:c(s.stopLossPct),takeProfitPct:c(s.takeProfitPct),trailing:{enabled:!!s.trailingEnabled,pct:c(s.trailingStopPct),activationPct:c(s.trailingActivationPct)}},position:{entryPct:c(s.entryPct||0)},scale:{trendAdd:{enabled:!!s.trendAddEnabled,stepPct:c(s.trendAddStepPct),sizePct:c(s.trendAddSizePct),maxTimes:s.trendAddMaxTimes||0},dcaAdd:{enabled:!!s.dcaAddEnabled,stepPct:c(s.dcaAddStepPct),sizePct:c(s.dcaAddSizePct),maxTimes:s.dcaAddMaxTimes||0},trendReduce:{enabled:!!s.trendReduceEnabled,stepPct:c(s.trendReduceStepPct),sizePct:c(s.trendReduceSizePct),maxTimes:s.trendReduceMaxTimes||0},adverseReduce:{enabled:!!s.adverseReduceEnabled,stepPct:c(s.adverseReduceStepPct),sizePct:c(s.adverseReduceSizePct),maxTimes:s.adverseReduceMaxTimes||0}}},u={userid:t.userId||1,indicatorId:t.indicator.id,symbol:t.symbol,market:t.market,timeframe:t.selectedTimeframe||t.timeframe,startDate:i.startDate.format("YYYY-MM-DD"),endDate:i.endDate.format("YYYY-MM-DD"),initialCapital:i.initialCapital,commission:c(i.commission||0),slippage:c(i.slippage||0),leverage:i.leverage||1,tradeDirection:i.tradeDirection||"long",strategyConfig:l,enableMtf:t.market&&"crypto"===t.market.toLowerCase()},e.n=6,(0,d.Ay)({url:"/api/indicator/backtest",method:"post",data:u,timeout:6e5});case 6:m=e.v,((Date.now()-o)/1e3).toFixed(1),1===m.code&&m.data?(m.data.runId&&(t.backtestRunId=m.data.runId),t.result=m.data.result||m.data,t.hasResult=!0,t.currentStep=2,t.$nextTick(function(){t.renderEquityChart()}),t.$message.success(t.$t("dashboard.indicator.backtest.success"))):t.$message.error(m.msg||t.$t("dashboard.indicator.backtest.failed")),e.n=8;break;case 7:e.p=7,p=e.v,h=t.$t("dashboard.indicator.backtest.failed"),"ECONNABORTED"===p.code||p.message&&p.message.includes("timeout")?h="回测超时,请减少回测时间范围或使用更大的时间周期":p.response?h=(null===(b=p.response.data)||void 0===b?void 0:b.msg)||p.response.statusText||h:p.message&&(h=p.message),t.$message.error(h);case 8:return e.p=8,t.stopLoadingAnimation(),t.loading=!1,e.f(8);case 9:return e.a(2)}},e,null,[[5,7,8,9]])}));return function(t,a){return e.apply(this,arguments)}}());case 1:return e.a(2)}},e)}))()},renderEquityChart:function(){var t=this;if(this.$refs.equityChartRef){this.equityChart&&this.equityChart.dispose(),this.equityChart=f.init(this.$refs.equityChartRef);var e=this.result.equityCurve||[],a=e.map(function(t){return t.time||t.date}),i=e.map(function(t){return void 0!==t.value?t.value:t.equity}),s=i[0]||1e5,r=i[i.length-1]||s,n=r>=s,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)"}],d={tooltip:{trigger:"axis",backgroundColor:"rgba(255, 255, 255, 0.96)",borderColor:"#e8e8e8",borderWidth:1,textStyle:{color:"#333"},formatter:function(t){var e='<div style="font-weight: 600; margin-bottom: 8px; color: #262626;">'.concat(t[0].axisValue,"</div>");return t.forEach(function(t){if(void 0!==t.value&&null!==t.value){var a=t.value.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2});e+='<div style="display: flex; justify-content: space-between; gap: 24px; margin: 4px 0;">\n <span>'.concat(t.marker," ").concat(t.seriesName,'</span>\n <span style="font-weight: 600; color: ').concat(o,';">$').concat(a,"</span>\n </div>")}}),e}},legend:{show:!1},grid:{left:"3%",right:"4%",bottom:"12%",top:"8%",containLabel:!0},xAxis:{type:"category",data:a,boundaryGap:!1,axisLine:{lineStyle:{color:"#e8e8e8"}},axisTick:{show:!1},axisLabel:{color:"#8c8c8c",fontSize:11,rotate:0,interval:Math.floor(a.length/6)}},yAxis:{type:"value",splitLine:{lineStyle:{color:"#f5f5f5",type:"dashed"}},axisLine:{show:!1},axisTick:{show:!1},axisLabel:{color:"#8c8c8c",fontSize:11,formatter:function(t){return t>=1e6?(t/1e6).toFixed(1)+"M":t>=1e3?(t/1e3).toFixed(0)+"K":t}}},series:[{name:this.$t("dashboard.indicator.backtest.strategy"),type:"line",data:i,smooth:.4,symbol:"none",sampling:"lttb",lineStyle:{width:2.5,color:o,cap:"round",join:"round"},areaStyle:{color:new f.graphic.LinearGradient(0,0,0,1,c)},emphasis:{lineStyle:{width:3}}}],animation:!0,animationDuration:800,animationEasing:"cubicOut"};this.equityChart.setOption(d),window.addEventListener("resize",function(){t.equityChart&&t.equityChart.resize()})}}},beforeDestroy:function(){this.equityChart&&(this.equityChart.dispose(),this.equityChart=null)}},g=v,y=a(845),k=(0,y.A)(g,m,h,!1,null,"473e449c",null),_=k.exports,w=function(){var t=this,e=t._self._c;return e("a-drawer",{attrs:{title:t.$t("dashboard.indicator.backtest.historyTitle"),visible:t.visible,width:t.isMobile?"100%":980,maskClosable:!0},on:{close:function(e){return t.$emit("cancel")}}},[e("div",{staticStyle:{display:"flex",gap:"12px","margin-bottom":"12px","align-items":"center","flex-wrap":"wrap"}},[e("a-switch",{model:{value:t.useCurrentFilters,callback:function(e){t.useCurrentFilters=e},expression:"useCurrentFilters"}}),e("span",{staticStyle:{color:"#8c8c8c"}},[t._v(" "+t._s(t.$t("dashboard.indicator.backtest.historyUseCurrent"))+" ")]),e("a-button",{attrs:{type:"primary",loading:t.loading},on:{click:t.loadRuns}},[t._v(" "+t._s(t.$t("dashboard.indicator.backtest.historyRefresh"))+" ")]),e("a-button",{attrs:{type:"primary",disabled:0===t.selectedRowKeys.length,loading:t.analyzing},on:{click:t.handleAIAnalyze}},[t._v(" "+t._s(t.$t("dashboard.indicator.backtest.historyAIAnalyze"))+" ")])],1),t.useCurrentFilters?t._e():e("div",{staticStyle:{display:"flex",gap:"12px","margin-bottom":"12px","align-items":"center","flex-wrap":"wrap"}},[e("a-input",{staticStyle:{width:"220px"},attrs:{placeholder:t.$t("dashboard.indicator.backtest.historyFilterSymbol")},model:{value:t.filterSymbol,callback:function(e){t.filterSymbol=e},expression:"filterSymbol"}}),e("a-select",{staticStyle:{width:"140px"},attrs:{placeholder:t.$t("dashboard.indicator.backtest.historyFilterTimeframe"),allowClear:""},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),e("a-button",{attrs:{loading:t.loading},on:{click:t.loadRuns}},[t._v(t._s(t.$t("dashboard.indicator.backtest.historyApply")))]),e("span",{staticStyle:{color:"#8c8c8c"}},[t._v(t._s(t.filterLabel))])],1),e("a-table",{attrs:{columns:t.columns,"data-source":t.runs,loading:t.loading,size:"small",pagination:{pageSize:10,size:"small"},rowKey:"id",scroll:{x:900},rowSelection:{selectedRowKeys:t.selectedRowKeys,onChange:t.onRowSelectionChange}},scopedSlots:t._u([{key:"range",fn:function(a,i){return[e("span",[t._v(t._s(i.start_date||"")+" ~ "+t._s(i.end_date||""))])]}},{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,i){return[e("a-button",{attrs:{type:"link",size:"small",loading:t.detailLoadingId===i.id},on:{click:function(e){return t.viewRun(i)}}},[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.historyAIAnalyzeTitle"),visible:t.showAIResult,footer:null,width:t.isMobile?"100%":900},on:{cancel:function(e){t.showAIResult=!1}}},[t.analyzing?e("div",{staticStyle:{padding:"12px 0"}},[e("a-spin")],1):e("div",{staticStyle:{"white-space":"pre-wrap","font-family":"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace"}},[t._v(" "+t._s(t.aiResult||t.$t("dashboard.indicator.backtest.historyNoAIResult"))+" ")])])],1)},x=[],S={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:"",useCurrentFilters:!0,filterSymbol:"",filterTimeframe:"",timeframes:["1m","5m","15m","30m","1H","4H","1D","1W"],runs:[],columns:[],selectedRowKeys:[]}},computed:{filterLabel:function(){var t=[];this.indicatorId&&t.push("indicatorId=".concat(this.indicatorId));var e=this.useCurrentFilters?this.market:this.market||"",a=this.useCurrentFilters?this.symbol:this.filterSymbol||"",i=this.useCurrentFilters?this.timeframe:this.filterTimeframe||"";return e&&t.push("market=".concat(e)),a&&t.push("symbol=".concat(a)),i&&t.push("timeframe=".concat(i)),t.length?t.join(" | "):""}},watch:{visible:function(t){t&&(this.initColumns(),this.useCurrentFilters=!0,this.filterSymbol=this.symbol||"",this.filterTimeframe=this.timeframe||"",this.selectedRowKeys=[],this.aiResult="",this.showAIResult=!1,this.loadRuns())}},methods:{onRowSelectionChange:function(t){this.selectedRowKeys=t||[]},initColumns:function(){this.columns.length||(this.columns=[{title:this.$t("dashboard.indicator.backtest.historyRunId"),dataIndex:"id",key:"id",width:90},{title:this.$t("dashboard.indicator.backtest.historyCreatedAt"),dataIndex:"created_at",key:"created_at",width:140},{title:this.$t("dashboard.indicator.backtest.tradeDirection"),dataIndex:"trade_direction",key:"trade_direction",width:90},{title:this.$t("dashboard.indicator.backtest.leverage"),dataIndex:"leverage",key:"leverage",width:90},{title:this.$t("dashboard.indicator.backtest.historyRange"),key:"range",width:220,scopedSlots:{customRender:"range"}},{title:this.$t("dashboard.indicator.backtest.historyStatus"),dataIndex:"status",key:"status",width:90,scopedSlots:{customRender:"status"}},{title:this.$t("dashboard.indicator.backtest.historyActions"),key:"actions",width:90,scopedSlots:{customRender:"actions"}}])},loadRuns:function(){var t=this;return(0,o.A)((0,n.A)().m(function e(){var a,i,s,r;return(0,n.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=t.useCurrentFilters?t.symbol:t.filterSymbol||"",i=t.useCurrentFilters?t.timeframe:t.filterTimeframe||"",s=t.market||"",e.n=3,(0,d.Ay)({url:"/api/indicator/backtest/history",method:"get",params:{userid:t.userId,limit:100,offset:0,indicatorId:t.indicatorId,symbol:a,market:s,timeframe:i}});case 3:r=e.v,r&&1===r.code&&Array.isArray(r.data)?t.runs=r.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,n.A)().m(function a(){var i;return(0,n.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,d.Ay)({url:"/api/indicator/backtest/get",method:"get",params:{userid:e.userId,runId:t.id}});case 3:i=a.v,i&&1===i.code&&i.data&&e.$emit("view",i.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,n.A)().m(function e(){var a,i;return(0,n.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,d.Ay)({url:"/api/indicator/backtest/aiAnalyze",method:"post",data:{userid:t.userId,runIds:t.selectedRowKeys,lang:a}});case 3:i=e.v,i&&1===i.code&&i.data&&i.data.analysis?t.aiResult=i.data.analysis:t.aiResult=i.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]])}))()}}},C=S,$=(0,y.A)(C,w,x,!1,null,null,null),R=$.exports,I=function(){var t,e,a,i=this,s=i._self._c;return s("a-modal",{staticClass:"backtest-run-viewer",attrs:{title:i.modalTitle,visible:i.visible,width:1100,maskClosable:!1},on:{cancel:function(t){return i.$emit("cancel")}}},[i.run&&i.run.result?s("div",[i.run.id?s("a-alert",{staticStyle:{"margin-bottom":"12px"},attrs:{type:"info","show-icon":"",message:i.$t("dashboard.indicator.backtest.savedRunId",{id:i.run.id})}}):i._e(),s("div",{staticClass:"metrics-cards"},[s("div",{staticClass:"metric-card",class:{positive:i.result.totalReturn>0,negative:i.result.totalReturn<0}},[s("div",{staticClass:"metric-label"},[i._v(i._s(i.$t("dashboard.indicator.backtest.totalReturn")))]),s("div",{staticClass:"metric-value"},[i._v(i._s(i.formatPercent(i.result.totalReturn)))]),s("div",{staticClass:"metric-amount"},[i._v(i._s(i.formatMoney(i.result.totalProfit)))])]),s("div",{staticClass:"metric-card",class:{positive:i.result.annualReturn>0,negative:i.result.annualReturn<0}},[s("div",{staticClass:"metric-label"},[i._v(i._s(i.$t("dashboard.indicator.backtest.annualReturn")))]),s("div",{staticClass:"metric-value"},[i._v(i._s(i.formatPercent(i.result.annualReturn)))])]),s("div",{staticClass:"metric-card negative"},[s("div",{staticClass:"metric-label"},[i._v(i._s(i.$t("dashboard.indicator.backtest.maxDrawdown")))]),s("div",{staticClass:"metric-value"},[i._v(i._s(i.formatPercent(i.result.maxDrawdown)))])]),s("div",{staticClass:"metric-card"},[s("div",{staticClass:"metric-label"},[i._v(i._s(i.$t("dashboard.indicator.backtest.sharpeRatio")))]),s("div",{staticClass:"metric-value"},[i._v(i._s((null!==(t=i.result.sharpeRatio)&&void 0!==t?t:0).toFixed(2)))])]),s("div",{staticClass:"metric-card"},[s("div",{staticClass:"metric-label"},[i._v(i._s(i.$t("dashboard.indicator.backtest.winRate")))]),s("div",{staticClass:"metric-value"},[i._v(i._s(i.formatPercent(i.result.winRate)))])]),s("div",{staticClass:"metric-card",class:{positive:i.result.profitFactor>=1.5,negative:i.result.profitFactor<1}},[s("div",{staticClass:"metric-label"},[i._v(i._s(i.$t("dashboard.indicator.backtest.profitFactor")))]),s("div",{staticClass:"metric-value"},[i._v(i._s((null!==(e=i.result.profitFactor)&&void 0!==e?e:0).toFixed(2)))])]),s("div",{staticClass:"metric-card"},[s("div",{staticClass:"metric-label"},[i._v(i._s(i.$t("dashboard.indicator.backtest.totalTrades")))]),s("div",{staticClass:"metric-value"},[i._v(i._s(null!==(a=i.result.totalTrades)&&void 0!==a?a:0))])]),s("div",{staticClass:"metric-card negative"},[s("div",{staticClass:"metric-label"},[i._v(i._s(i.$t("dashboard.indicator.backtest.totalCommission")))]),s("div",{staticClass:"metric-value"},[i._v("-$"+i._s(i.result.totalCommission?i.result.totalCommission.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2}):"0.00"))])])]),s("div",{staticClass:"chart-section"},[s("div",{staticClass:"chart-title"},[i._v(i._s(i.$t("dashboard.indicator.backtest.equityCurve")))]),s("div",{ref:"equityChartRef",staticClass:"equity-chart"})]),s("div",{staticClass:"trades-section"},[s("div",{staticClass:"chart-title"},[i._v(i._s(i.$t("dashboard.indicator.backtest.tradeHistory")))]),s("a-table",{attrs:{columns:i.tradeColumns,"data-source":i.result.trades||[],pagination:{pageSize:10,size:"small"},size:"small",scroll:{x:800},rowKey:i.rowKey},scopedSlots:i._u([{key:"type",fn:function(t){return[s("a-tag",{attrs:{color:i.getTradeTypeColor(t)}},[i._v(" "+i._s(i.getTradeTypeText(t))+" ")])]}},{key:"balance",fn:function(t){return[s("span",{staticStyle:{color:"#1890ff","font-weight":"500"}},[i._v(" $"+i._s(t?t.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2}):"--")+" ")])]}},{key:"profit",fn:function(t){return[s("span",{style:{color:t>0?"#52c41a":t<0?"#f5222d":"#666"}},[i._v(" "+i._s(i.formatMoney(t))+" ")])]}}])})],1)],1):s("div",{staticStyle:{padding:"12px 0"}},[s("a-empty",{attrs:{description:i.$t("dashboard.indicator.backtest.historyNoData")}})],1),s("template",{slot:"footer"},[s("a-button",{on:{click:function(t){return i.$emit("cancel")}}},[i._v(i._s(i.$t("dashboard.indicator.backtest.close")))])],1)],2)},P=[],T={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=f.init(this.$refs.equityChartRef);var e=this.result.equityCurve||[],a=e.map(function(t){return t.time||t.date}),i=e.map(function(t){return void 0!==t.value?t.value:t.equity}),s=i[0]||1e5,r=i[i.length-1]||s,n=r>=s,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)"}],d={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:i,smooth:.4,symbol:"none",sampling:"lttb",lineStyle:{width:2.5,color:o},areaStyle:{color:new f.graphic.LinearGradient(0,0,0,1,c)}}]};this.equityChart.setOption(d),window.addEventListener("resize",function(){return t.equityChart&&t.equityChart.resize()})}}}},A=T,D=(0,y.A)(A,I,P,!1,null,"a484239a",null),V=D.exports,M={name:"BacktestCenter",mixins:[c.t],components:{BacktestModal:_,BacktestHistoryDrawer:R,BacktestRunViewer:V},data:function(){return{activeTab:"indicator",userId:null,indicators:[],loadingIndicators:!1,selectedIndicatorId:void 0,strategies:[],loadingStrategies:!1,selectedStrategyId:void 0,strategyBacktestResult:null,showBacktestModal:!1,backtestIndicator:null,backtestSymbol:"",backtestMarket:"",backtestTimeframe:"1D",showBacktestHistoryDrawer:!1,historyIndicatorId:null,showBacktestRunViewer:!1,selectedBacktestRun: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}},created:function(){var t=this;return(0,o.A)((0,n.A)().m(function e(){return(0,n.A)().w(function(e){while(1)switch(e.n){case 0:return e.n=1,t.loadUserId();case 1:t.loadIndicators(),t.loadStrategies(),t.parseQueryParams();case 2:return e.a(2)}},e)}))()},methods:{loadUserId:function(){var t=this;return(0,o.A)((0,n.A)().m(function e(){var a;return(0,n.A)().w(function(e){while(1)switch(e.p=e.n){case 0:return e.p=0,e.n=1,(0,u.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,n.A)().m(function e(){var a;return(0,n.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,d.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,r.A)((0,r.A)({},t),{},{type:"python",source:1===t.is_buy||"1"===t.is_buy?"purchased":"custom"})})),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,n.A)().m(function e(){var a;return(0,n.A)().w(function(e){while(1)switch(e.p=e.n){case 0:return t.loadingStrategies=!0,e.p=1,e.n=2,(0,l.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]])}))()},parseQueryParams:function(){var t=this,e=this.$route.query;"strategy"===e.tab&&(this.activeTab="strategy"),e.indicator_id&&(this.selectedIndicatorId=Number(e.indicator_id)||e.indicator_id,"history"===e.view&&this.$nextTick(function(){return t.openIndicatorHistory()})),e.strategy_id&&(this.selectedStrategyId=Number(e.strategy_id)||e.strategy_id)},handleTabChange:function(){},openIndicatorBacktest:function(){var t=this.selectedIndicatorObj;t&&(this.backtestIndicator=(0,r.A)({},t),this.showBacktestModal=!0)},openIndicatorHistory:function(){var t=this.selectedIndicatorObj;t&&(this.historyIndicatorId=t.id,this.showBacktestHistoryDrawer=!0)},handleViewBacktestRun:function(t){this.selectedBacktestRun=t,this.showBacktestRunViewer=!0},openStrategyBacktest:function(){var t=this.selectedStrategyObj;if(t&&(this.$message.info(this.$t("backtest-center.strategy.running")),t.indicator_id)){var e=this.indicators.find(function(e){return e.id===t.indicator_id});e&&(this.backtestIndicator=(0,r.A)({},e),this.backtestSymbol=t.symbol||"",this.backtestMarket=t.market_type||"",this.showBacktestModal=!0)}}}},F=M,N=(0,y.A)(F,i,s,!1,null,"9ec1bad6",null),q=N.exports}}]); |