|
|
@ -68,11 +68,11 @@ |
|
|
|
@change="onKlineExcelChange" |
|
|
|
> |
|
|
|
<el-option |
|
|
|
v-for="item in kLinesFromExcels" |
|
|
|
v-for="item in excelTabsData" |
|
|
|
class="select-danger" |
|
|
|
:label="item.name" |
|
|
|
:key="item.name" |
|
|
|
:value="item.name" |
|
|
|
:label="item.Symbol" |
|
|
|
:key="item.Symbol" |
|
|
|
:value="item.Symbol" |
|
|
|
> |
|
|
|
</el-option> |
|
|
|
</el-select> |
|
|
@ -135,19 +135,23 @@ |
|
|
|
</el-tabs> |
|
|
|
</div> |
|
|
|
<div> |
|
|
|
<el-tabs value="1"> |
|
|
|
<!-- 交易清单 --> |
|
|
|
<el-tab-pane name="1" label="交易清单"> |
|
|
|
<order-table |
|
|
|
v-model="tradeData" |
|
|
|
:positionFund="PositionFund" |
|
|
|
></order-table> |
|
|
|
</el-tab-pane> |
|
|
|
<el-tabs> |
|
|
|
<el-tab-pane |
|
|
|
v-for="(item, index) in excelTabsData" |
|
|
|
:key="item.Symbol + '' + index" |
|
|
|
:label="item.Symbol" |
|
|
|
> |
|
|
|
<card |
|
|
|
><el-tabs value="1"> |
|
|
|
<!-- 交易清单 --> |
|
|
|
<el-tab-pane name="1" label="交易清单"> |
|
|
|
<order-table v-model="item.tradeData"></order-table> |
|
|
|
</el-tab-pane> |
|
|
|
|
|
|
|
<!-- 信号记录 --> |
|
|
|
<el-tab-pane name="2" label="信号记录"> |
|
|
|
根据时间范围筛选信号记录: |
|
|
|
<!-- <a-range-picker |
|
|
|
<!-- 信号记录 --> |
|
|
|
<el-tab-pane name="2" label="信号记录"> |
|
|
|
根据时间范围筛选信号记录: |
|
|
|
<!-- <a-range-picker |
|
|
|
style="margin: 10px 0" |
|
|
|
v-model="dateRange" |
|
|
|
:show-time="{ format: 'HH:mm' }" |
|
|
@ -155,33 +159,43 @@ |
|
|
|
:placeholder="['开始时间', '结束时间']" |
|
|
|
@change="onOk" |
|
|
|
/> --> |
|
|
|
<el-date-picker |
|
|
|
v-model="dateRange" |
|
|
|
type="datetimerange" |
|
|
|
range-separator="~" |
|
|
|
start-placeholder="开始日期" |
|
|
|
end-placeholder="结束日期" |
|
|
|
@change="onOk" |
|
|
|
> |
|
|
|
</el-date-picker> |
|
|
|
<div class="table-full-width table-responsive" style="height:500px"> |
|
|
|
<custom-base-table |
|
|
|
size="small" |
|
|
|
:columns="logColumns" |
|
|
|
:data="logData.filter(logShowCondition)" |
|
|
|
tbodyClasses="cTable" |
|
|
|
> |
|
|
|
<template slot="LogType" slot-scope="item"> |
|
|
|
{{ |
|
|
|
LogTypes.filter(i => i.value == item.row.item.LogType)[0] |
|
|
|
.title |
|
|
|
}} |
|
|
|
</template> |
|
|
|
</custom-base-table> |
|
|
|
</div> |
|
|
|
<el-date-picker |
|
|
|
v-model="dateRange" |
|
|
|
type="datetimerange" |
|
|
|
range-separator="~" |
|
|
|
start-placeholder="开始日期" |
|
|
|
end-placeholder="结束日期" |
|
|
|
@change="onOk" |
|
|
|
> |
|
|
|
</el-date-picker> |
|
|
|
<div |
|
|
|
class="table-full-width table-responsive" |
|
|
|
style="height:500px" |
|
|
|
> |
|
|
|
<custom-base-table |
|
|
|
v-if="item.logData" |
|
|
|
size="small" |
|
|
|
:columns="logColumns" |
|
|
|
:data="item.logData.filter(logShowCondition)" |
|
|
|
tbodyClasses="cTable" |
|
|
|
> |
|
|
|
<template slot="LogType" slot-scope="item"> |
|
|
|
{{ |
|
|
|
LogTypes.filter( |
|
|
|
i => i.value == item.row.item.LogType |
|
|
|
)[0].title |
|
|
|
}} |
|
|
|
</template> |
|
|
|
</custom-base-table> |
|
|
|
</div> |
|
|
|
</el-tab-pane> |
|
|
|
<el-tab-pane name="3" :label="`${item.Symbol}绩效总结`"> |
|
|
|
<account-info v-model="item.accountInfo" /> |
|
|
|
</el-tab-pane> </el-tabs |
|
|
|
></card> |
|
|
|
</el-tab-pane> |
|
|
|
<!-- 绩效总结 --> |
|
|
|
<el-tab-pane name="3" label="绩效总结"> |
|
|
|
<el-tab-pane name="3" label="总绩效总结"> |
|
|
|
<account-info v-model="accountInfo" /> |
|
|
|
</el-tab-pane> |
|
|
|
</el-tabs> |
|
|
@ -207,6 +221,7 @@ import OrderTable from "./OrderTable"; |
|
|
|
import CustomBaseTable from "../../components/CustomBaseTable.vue"; |
|
|
|
import MoveTrend from "./MoveTrend"; |
|
|
|
import { deepClone } from "../../utils/util"; |
|
|
|
import Card from "../../components/Cards/Card.vue"; |
|
|
|
// import TopEndPolicy from "../components/TopEndPolicy.vue"; |
|
|
|
export default { |
|
|
|
components: { |
|
|
@ -215,7 +230,8 @@ export default { |
|
|
|
MovementPolicyForm, |
|
|
|
OrderTable, |
|
|
|
CustomBaseTable, |
|
|
|
MoveTrend |
|
|
|
MoveTrend, |
|
|
|
Card |
|
|
|
// HQKline |
|
|
|
|
|
|
|
// TopEndPolicy |
|
|
@ -227,7 +243,6 @@ export default { |
|
|
|
LogTypes, |
|
|
|
spinning: false, |
|
|
|
lineSelect: "", |
|
|
|
kLinesFromExcels: [], |
|
|
|
tradeColumns, |
|
|
|
logColumns, |
|
|
|
logData: [], |
|
|
@ -238,7 +253,8 @@ export default { |
|
|
|
trendForm: { |
|
|
|
NowCapital: 10000, |
|
|
|
FrozenProfit: 12, |
|
|
|
TradeAmountRatio: 50 |
|
|
|
TradeAmountRatio: 50, |
|
|
|
IsEnabledLimit: false |
|
|
|
}, |
|
|
|
excuting: false, |
|
|
|
startTime: null, |
|
|
@ -252,6 +268,7 @@ export default { |
|
|
|
topTempDataList: [], |
|
|
|
buyPointCountList: [], |
|
|
|
salePointCountList: [], |
|
|
|
excelTabsData: [], |
|
|
|
logShowCondition: i => true |
|
|
|
}; |
|
|
|
}, |
|
|
@ -320,61 +337,46 @@ export default { |
|
|
|
onKlineExcelChange(model) { |
|
|
|
console.log(model); |
|
|
|
if ( |
|
|
|
this.kLinesFromExcels && |
|
|
|
this.kLinesFromExcels.length > 0 && |
|
|
|
this.kLinesFromExcels.some(item => item.name == model) |
|
|
|
this.excelTabsData && |
|
|
|
this.excelTabsData.length > 0 && |
|
|
|
this.excelTabsData.some(item => item.Symbol == model) |
|
|
|
) { |
|
|
|
let result = []; |
|
|
|
// if (this.policyMode == 0) { |
|
|
|
let data = this.kLinesFromExcels.filter(item => item.name == model)[0] |
|
|
|
let data = this.excelTabsData.filter(item => item.Symbol == model)[0] |
|
|
|
.data; |
|
|
|
let temp = this.mutateData(data); //分别操作出接口需要的data和图标data |
|
|
|
result = this.splitData(temp.kLineData); //图表data处理 |
|
|
|
this.kLineDataList = temp.postData; |
|
|
|
// this.kLineDataList = temp.postData; |
|
|
|
this.kLineData = result; |
|
|
|
// } else { |
|
|
|
// let index = 0; |
|
|
|
// for (let i = 0; i < this.kLinesFromExcels.length; i++) { |
|
|
|
// if (this.kLinesFromExcels[i].name == model) { |
|
|
|
// index = i; |
|
|
|
// break; |
|
|
|
// } |
|
|
|
// } |
|
|
|
// let temp = this.topMutateData(this.topTempDataList[index]); |
|
|
|
// result = this.splitData(temp.kLineData); //图表data处理 |
|
|
|
// this.kLineData = result; |
|
|
|
// } |
|
|
|
} |
|
|
|
}, |
|
|
|
excelImport() { |
|
|
|
let that = this; |
|
|
|
let result = []; |
|
|
|
|
|
|
|
this.spinning = true; |
|
|
|
this.excelTabsData = []; |
|
|
|
Excel.importExcel(data => { |
|
|
|
that.spinning = false; |
|
|
|
if (data && data[0]) { |
|
|
|
// if (this.policyMode == 1) { |
|
|
|
// this.kLinesFromExcels = data; |
|
|
|
// this.lineSelect = data[0].name; |
|
|
|
// let _data = []; |
|
|
|
// data.forEach(element => { |
|
|
|
// _data.push(element.data); |
|
|
|
// }); |
|
|
|
// this.topEndMutateData(_data); |
|
|
|
// console.log("final", _data); |
|
|
|
// this.topTempDataList = _data; |
|
|
|
// let temp = that.topMutateData(_data[0]); |
|
|
|
// result = this.splitData(temp.kLineData); //图表data处理 |
|
|
|
// this.kLineData = result; |
|
|
|
// } else { |
|
|
|
this.kLinesFromExcels = data; |
|
|
|
this.lineSelect = data[0].name; |
|
|
|
let temp = that.mutateData(data[0].data); //分别操作出接口需要的data和图标data |
|
|
|
result = this.splitData(temp.kLineData); //图表data处理 |
|
|
|
console.log("what i got", result); |
|
|
|
this.kLineDataList = temp.postData; |
|
|
|
this.kLineData = result; |
|
|
|
// } |
|
|
|
this.lineSelect = data[0].name; //文件列表modelName |
|
|
|
data.forEach(element => { |
|
|
|
let result = []; |
|
|
|
let sIndex = element.name.indexOf("_") + 1; |
|
|
|
let eIndex = element.name.indexOf("USDT") + 4; |
|
|
|
let cutName = element.name.substring(sIndex, eIndex); |
|
|
|
let temp = that.mutateData(element.data); //分别操作出接口需要的data和图标data |
|
|
|
this.kLineDataList = temp.postData; |
|
|
|
this.excelTabsData.push({ |
|
|
|
Symbol: cutName, |
|
|
|
KLineDataList: temp.postData, |
|
|
|
accountInfo: {} |
|
|
|
}); |
|
|
|
//如果是选中的第一份就展示它的K线 |
|
|
|
if (element.name == data[0].name) { |
|
|
|
result = this.splitData(temp.kLineData); //图表data处理 |
|
|
|
this.kLineData = result; |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
}); |
|
|
|
}, |
|
|
@ -719,26 +721,7 @@ export default { |
|
|
|
].CreateTime; |
|
|
|
this.dateRange[1] = this.logData[0].CreateTime; |
|
|
|
} |
|
|
|
// res.Data.OrderList.sort( |
|
|
|
// (a, b) => b.PurchaseKLineId - a.PurchaseKLineId |
|
|
|
// ); |
|
|
|
this.tradeData = res.Data.OrderList; |
|
|
|
// //accountInfo |
|
|
|
// this.accountInfo.MaxOrderTotalPurchasePricePerRound = |
|
|
|
// res.Data.MaxOrderTotalPurchasePricePerRound; |
|
|
|
// this.accountInfo.MaxTotalPurchasePricePerDay = |
|
|
|
// res.Data.MaxTotalPurchasePricePerDay; |
|
|
|
// this.accountInfo.MaxOrderHoldTime = res.Data.MaxOrderHoldTime; |
|
|
|
// this.accountInfo.MinOrderHoldTime = res.Data.MinOrderHoldTime; |
|
|
|
// this.accountInfo.MaxOrderLossRatio = res.Data.MaxOrderLossRatio; |
|
|
|
// this.accountInfo.MaxAccountLossRatio = |
|
|
|
// res.Data.MaxAccountLossRatio; |
|
|
|
// this.accountInfo.MaxOrderProfit = res.Data.MaxOrderProfit; |
|
|
|
// this.accountInfo.MaxOrderProfitRatio = |
|
|
|
// res.Data.MaxOrderProfitRatio; |
|
|
|
// this.accountInfo.MinOrderProfit = res.Data.MinOrderProfit; |
|
|
|
// this.accountInfo.MinOrderProfitRatio = |
|
|
|
// res.Data.MinOrderProfitRatio; |
|
|
|
this.accountInfo = { ...res.Data }; |
|
|
|
} |
|
|
|
}); |
|
|
@ -749,26 +732,42 @@ export default { |
|
|
|
this.excuting = true; |
|
|
|
this.$http |
|
|
|
.post("/Api/Simulation/MomentumTrendTest", { |
|
|
|
Capital: { |
|
|
|
...this.trendForm, |
|
|
|
FrozenProfit: this.trendForm.FrozenProfit, |
|
|
|
TradeAmountRatio: this.trendForm.TradeAmountRatio |
|
|
|
}, |
|
|
|
kLineDataList: this.kLineDataList |
|
|
|
Capital: this.trendForm, |
|
|
|
IsEnabledLimit: this.trendForm.IsEnabledLimit, |
|
|
|
SymbolList: this.excelTabsData |
|
|
|
}) |
|
|
|
.then(res => { |
|
|
|
this.excuting = false; |
|
|
|
if (res.Code == 200) { |
|
|
|
this.sMessage("success", "回测完成"); |
|
|
|
} |
|
|
|
this.logData = res.Data.ExecutionLogList; |
|
|
|
// res.Data.OrderList.sort( |
|
|
|
// (a, b) => b.PurchaseKLineId - a.PurchaseKLineId |
|
|
|
// ); |
|
|
|
this.tradeData = res.Data.OrderList; |
|
|
|
res.Data.SimulationResultList.forEach(element => { |
|
|
|
let index = this.getIndex(element.Symbol); |
|
|
|
if (index != -1) { |
|
|
|
this.excelTabsData[index] = { |
|
|
|
...this.excelTabsData[index], |
|
|
|
tradeData: element.OrderList, |
|
|
|
logData: element.ExecutionLogList, |
|
|
|
accountInfo: { ...element } |
|
|
|
}; |
|
|
|
} |
|
|
|
}); |
|
|
|
this.accountInfo = { ...res.Data }; |
|
|
|
}); |
|
|
|
} |
|
|
|
}, |
|
|
|
|
|
|
|
getIndex(symbol) { |
|
|
|
let index = -1; |
|
|
|
for (let i = 0; i < this.excelTabsData.length; i++) { |
|
|
|
if (this.excelTabsData[i].Symbol == symbol) { |
|
|
|
index = i; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
return index; |
|
|
|
}, |
|
|
|
|
|
|
|
// 封装showNotification |
|
|
|
sMessage(type, message) { |
|
|
|
this.$notify({ |
|
|
|