|
|
@ -177,7 +177,7 @@ |
|
|
|
:dataSource="logData.filter(logShowCondition)" |
|
|
|
> |
|
|
|
<template slot="LogType" slot-scope="text"> |
|
|
|
{{ LogTypes.filter((item) => item.value == text)[0].title }} |
|
|
|
{{ LogTypes.filter(item => item.value == text)[0].title }} |
|
|
|
</template> |
|
|
|
</a-table> |
|
|
|
</a-tab-pane> |
|
|
@ -257,7 +257,7 @@ import { secToMin } from "../utils/TimeUtils"; |
|
|
|
import { |
|
|
|
RobotPolicyType, |
|
|
|
ResetMomentumWaveTest, |
|
|
|
LogTypes, |
|
|
|
LogTypes |
|
|
|
} from "./js/selectoptions"; |
|
|
|
import MomentumWavePolicy from "../components/MomentumWavePolicy"; |
|
|
|
import moment from "moment"; |
|
|
@ -289,12 +289,12 @@ export default { |
|
|
|
topTempDataList: [], |
|
|
|
buyPointCountList: [], |
|
|
|
salePointCountList: [], |
|
|
|
logShowCondition: (i) => true, |
|
|
|
logShowCondition: i => true |
|
|
|
}; |
|
|
|
}, |
|
|
|
methods: { |
|
|
|
onOk(value) { |
|
|
|
this.logShowCondition = (item) => |
|
|
|
this.logShowCondition = item => |
|
|
|
moment(item.CreateTime).isBetween(value[0], value[1]); |
|
|
|
}, |
|
|
|
changeFilter(value, type) { |
|
|
@ -314,9 +314,7 @@ export default { |
|
|
|
|
|
|
|
if (buyKey && JSON.stringify(buyKey) != "{}") { |
|
|
|
keyPoint.push(buyKey); |
|
|
|
if ( |
|
|
|
!this.buyPointCountList.some((item) => item.value == buyKey.value) |
|
|
|
) |
|
|
|
if (!this.buyPointCountList.some(item => item.value == buyKey.value)) |
|
|
|
this.buyPointCountList.push(buyKey); |
|
|
|
} |
|
|
|
|
|
|
@ -324,7 +322,7 @@ export default { |
|
|
|
if (saleKey && JSON.stringify(saleKey) != "{}") { |
|
|
|
keyPoint.push(saleKey); |
|
|
|
if ( |
|
|
|
!this.salePointCountList.some((item) => item.value == saleKey.value) |
|
|
|
!this.salePointCountList.some(item => item.value == saleKey.value) |
|
|
|
) |
|
|
|
this.salePointCountList.push(saleKey); |
|
|
|
} |
|
|
@ -334,12 +332,12 @@ export default { |
|
|
|
console.log({ |
|
|
|
categoryData, |
|
|
|
values, |
|
|
|
keyPoint, |
|
|
|
keyPoint |
|
|
|
}); |
|
|
|
return { |
|
|
|
categoryData, |
|
|
|
values, |
|
|
|
keyPoint, |
|
|
|
keyPoint |
|
|
|
}; |
|
|
|
}, |
|
|
|
//选择不同的excel表展示 |
|
|
@ -348,60 +346,59 @@ export default { |
|
|
|
if ( |
|
|
|
this.kLinesFromExcels && |
|
|
|
this.kLinesFromExcels.length > 0 && |
|
|
|
this.kLinesFromExcels.some((item) => item.name == model) |
|
|
|
this.kLinesFromExcels.some(item => item.name == model) |
|
|
|
) { |
|
|
|
let result = []; |
|
|
|
if (this.policyMode == 0) { |
|
|
|
let data = this.kLinesFromExcels.filter( |
|
|
|
(item) => item.name == model |
|
|
|
)[0].data; |
|
|
|
let temp = this.mutateData(data); //分别操作出接口需要的data和图标data |
|
|
|
result = this.splitData(temp.kLineData); //图表data处理 |
|
|
|
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; |
|
|
|
} |
|
|
|
// if (this.policyMode == 0 ) { |
|
|
|
let data = this.kLinesFromExcels.filter(item => item.name == model)[0] |
|
|
|
.data; |
|
|
|
let temp = this.mutateData(data); //分别操作出接口需要的data和图标data |
|
|
|
result = this.splitData(temp.kLineData); //图表data处理 |
|
|
|
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; |
|
|
|
Excel.importExcel((data) => { |
|
|
|
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; |
|
|
|
} |
|
|
|
// 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; |
|
|
|
// } |
|
|
|
} |
|
|
|
}); |
|
|
|
}, |
|
|
@ -495,6 +492,7 @@ export default { |
|
|
|
}, |
|
|
|
|
|
|
|
//动量回测数据处理 |
|
|
|
//5-小趋势 6-中趋势 7-大趋势 8-多交叉 9-空交叉 10-做多 12-做空 |
|
|
|
mutateData(data) { |
|
|
|
let result = []; |
|
|
|
let postResult = []; |
|
|
@ -543,12 +541,32 @@ export default { |
|
|
|
//close |
|
|
|
subArray[2] = data[i][j]; |
|
|
|
postObj.C = data[i][j]; |
|
|
|
} else if (j == 5) { |
|
|
|
postObj.STP = data[i][j]; |
|
|
|
} else if (j == 6) { |
|
|
|
postObj.MTP = data[i][j]; |
|
|
|
} else if (j == 7) { |
|
|
|
postObj.TP = data[i][j]; |
|
|
|
} else if (j == 13) { |
|
|
|
if (data[i][j] != 0) postObj.N = 3; |
|
|
|
} else if (j == 11) { |
|
|
|
postObj.BTP = data[i][j]; |
|
|
|
} else if (j == 8) { |
|
|
|
if ( |
|
|
|
data[i][j] != 0 && |
|
|
|
data[i][j] && |
|
|
|
data[i][j] != "NaN" && |
|
|
|
data[i][j] != NaN |
|
|
|
) |
|
|
|
postObj.N = 10; |
|
|
|
} else if (j == 9) { |
|
|
|
if ( |
|
|
|
data[i][j] != 0 && |
|
|
|
data[i][j] && |
|
|
|
data[i][j] != "NaN" && |
|
|
|
data[i][j] != NaN |
|
|
|
) |
|
|
|
postObj.N = 11; |
|
|
|
} else if (j == 10) { |
|
|
|
if (data[i][j] != 0) postObj.N = 2; |
|
|
|
} else if (j == 12) { |
|
|
|
if (data[i][j] != 0) postObj.N = 3; |
|
|
|
} else if (j == 15) { |
|
|
|
subArray[5] = {}; |
|
|
|
if (data[i][j] != 0) { |
|
|
@ -559,12 +577,12 @@ export default { |
|
|
|
`${moment(data[i][0] * 1000).format( |
|
|
|
"YYYY-MM-DD HH:mm:ss" |
|
|
|
)}`, |
|
|
|
data[i][2], |
|
|
|
data[i][2] |
|
|
|
], |
|
|
|
value: "1", |
|
|
|
itemStyle: { |
|
|
|
color: "rgb(23,160,93)", |
|
|
|
}, |
|
|
|
color: "rgb(23,160,93)" |
|
|
|
} |
|
|
|
}; |
|
|
|
} |
|
|
|
} else if (j == 14) { |
|
|
@ -580,12 +598,12 @@ export default { |
|
|
|
`${moment(data[i][0] * 1000).format( |
|
|
|
"YYYY-MM-DD HH:mm:ss" |
|
|
|
)}`, |
|
|
|
data[i][3], |
|
|
|
data[i][3] |
|
|
|
], |
|
|
|
value: "0", |
|
|
|
itemStyle: { |
|
|
|
color: "rgb(221,82,70)", |
|
|
|
}, |
|
|
|
color: "rgb(221,82,70)" |
|
|
|
} |
|
|
|
}; |
|
|
|
} |
|
|
|
} |
|
|
@ -598,105 +616,105 @@ export default { |
|
|
|
}, |
|
|
|
|
|
|
|
//订底回测数据处理 |
|
|
|
topMutateData(data) { |
|
|
|
let result = []; |
|
|
|
let postResult = []; |
|
|
|
if (data.length > 1) { |
|
|
|
for (let i = 0; i < data.length; i++) { |
|
|
|
if (i == 0) continue; |
|
|
|
let subArray = []; |
|
|
|
let postObj = { N: null }; |
|
|
|
for (let j = 0; j < data[i].length; j++) { |
|
|
|
if (j == 0) { |
|
|
|
if ( |
|
|
|
this.startTime && |
|
|
|
this.endTime && |
|
|
|
!moment(data[i][j] * 1000).isBetween( |
|
|
|
this.startTime.startOf("day"), |
|
|
|
this.endTime.endOf("day") |
|
|
|
) |
|
|
|
) { |
|
|
|
break; |
|
|
|
} else if ( |
|
|
|
this.startTime && |
|
|
|
!moment(data[i][j] * 1000).isAfter( |
|
|
|
this.startTime.startOf("day") |
|
|
|
) |
|
|
|
) { |
|
|
|
break; |
|
|
|
} |
|
|
|
// topMutateData(data) { |
|
|
|
// let result = []; |
|
|
|
// let postResult = []; |
|
|
|
// if (data.length > 1) { |
|
|
|
// for (let i = 0; i < data.length; i++) { |
|
|
|
// if (i == 0) continue; |
|
|
|
// let subArray = []; |
|
|
|
// let postObj = { N: null }; |
|
|
|
// for (let j = 0; j < data[i].length; j++) { |
|
|
|
// if (j == 0) { |
|
|
|
// if ( |
|
|
|
// this.startTime && |
|
|
|
// this.endTime && |
|
|
|
// !moment(data[i][j] * 1000).isBetween( |
|
|
|
// this.startTime.startOf("day"), |
|
|
|
// this.endTime.endOf("day") |
|
|
|
// ) |
|
|
|
// ) { |
|
|
|
// break; |
|
|
|
// } else if ( |
|
|
|
// this.startTime && |
|
|
|
// !moment(data[i][j] * 1000).isAfter( |
|
|
|
// this.startTime.startOf("day") |
|
|
|
// ) |
|
|
|
// ) { |
|
|
|
// break; |
|
|
|
// } |
|
|
|
|
|
|
|
subArray[0] = moment(data[i][j] * 1000).format( |
|
|
|
"YYYY-MM-DD HH:mm:ss" |
|
|
|
); |
|
|
|
postObj.T = data[i][j]; |
|
|
|
} else if (j == 1) { |
|
|
|
//open |
|
|
|
subArray[1] = data[i][j]; |
|
|
|
postObj.OpenPrice = data[i][j]; |
|
|
|
} else if (j == 2) { |
|
|
|
//highest |
|
|
|
subArray[4] = data[i][j]; |
|
|
|
postObj.H = data[i][j]; |
|
|
|
} else if (j == 3) { |
|
|
|
//lowest |
|
|
|
subArray[3] = data[i][j]; |
|
|
|
postObj.L = data[i][j]; |
|
|
|
} else if (j == 4) { |
|
|
|
//close |
|
|
|
subArray[2] = data[i][j]; |
|
|
|
postObj.C = data[i][j]; |
|
|
|
} else if (j == 5) { |
|
|
|
postObj.TP = data[i][j]; |
|
|
|
} else if (j == 6) { |
|
|
|
if (data[i][j] != 0) postObj.N = 3; |
|
|
|
} else if (j == 7) { |
|
|
|
subArray[5] = {}; |
|
|
|
if (data[i][j] && data[i][j] != 0) { |
|
|
|
postObj.N = 1; |
|
|
|
subArray[5] = { |
|
|
|
name: "买入Point", |
|
|
|
coord: [ |
|
|
|
`${moment(data[i][0] * 1000).format( |
|
|
|
"YYYY-MM-DD HH:mm:ss" |
|
|
|
)}`, |
|
|
|
data[i][3], |
|
|
|
], |
|
|
|
value: data[i][j], |
|
|
|
itemStyle: { |
|
|
|
color: "rgb(23,160,93)", |
|
|
|
}, |
|
|
|
}; |
|
|
|
} |
|
|
|
} else if (j == 8) { |
|
|
|
subArray[6] = {}; |
|
|
|
if (data[i][j] && data[i][j] != 0) { |
|
|
|
postObj.N = 0; |
|
|
|
subArray[6] = { |
|
|
|
name: "卖出Point", |
|
|
|
symbol: "diamond", |
|
|
|
symbolSize: [15, 25], |
|
|
|
symbolOffset: [0, 25], |
|
|
|
coord: [ |
|
|
|
`${moment(data[i][0] * 1000).format( |
|
|
|
"YYYY-MM-DD HH:mm:ss" |
|
|
|
)}`, |
|
|
|
data[i][2], |
|
|
|
], |
|
|
|
value: data[i][j], |
|
|
|
itemStyle: { |
|
|
|
color: "rgb(221,82,70)", |
|
|
|
}, |
|
|
|
}; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
if (subArray.length > 0) result.push(subArray); |
|
|
|
if (postObj.T != null) postResult.push(postObj); |
|
|
|
} |
|
|
|
} |
|
|
|
return { kLineData: result, postData: postResult }; |
|
|
|
}, |
|
|
|
// subArray[0] = moment(data[i][j] * 1000).format( |
|
|
|
// "YYYY-MM-DD HH:mm:ss" |
|
|
|
// ); |
|
|
|
// postObj.T = data[i][j]; |
|
|
|
// } else if (j == 1) { |
|
|
|
// //open |
|
|
|
// subArray[1] = data[i][j]; |
|
|
|
// postObj.OpenPrice = data[i][j]; |
|
|
|
// } else if (j == 2) { |
|
|
|
// //highest |
|
|
|
// subArray[4] = data[i][j]; |
|
|
|
// postObj.H = data[i][j]; |
|
|
|
// } else if (j == 3) { |
|
|
|
// //lowest |
|
|
|
// subArray[3] = data[i][j]; |
|
|
|
// postObj.L = data[i][j]; |
|
|
|
// } else if (j == 4) { |
|
|
|
// //close |
|
|
|
// subArray[2] = data[i][j]; |
|
|
|
// postObj.C = data[i][j]; |
|
|
|
// } else if (j == 5) { |
|
|
|
// postObj.TP = data[i][j]; |
|
|
|
// } else if (j == 6) { |
|
|
|
// if (data[i][j] != 0) postObj.N = 3; |
|
|
|
// } else if (j == 7) { |
|
|
|
// subArray[5] = {}; |
|
|
|
// if (data[i][j] && data[i][j] != 0) { |
|
|
|
// postObj.N = 1; |
|
|
|
// subArray[5] = { |
|
|
|
// name: "买入Point", |
|
|
|
// coord: [ |
|
|
|
// `${moment(data[i][0] * 1000).format( |
|
|
|
// "YYYY-MM-DD HH:mm:ss" |
|
|
|
// )}`, |
|
|
|
// data[i][3] |
|
|
|
// ], |
|
|
|
// value: data[i][j], |
|
|
|
// itemStyle: { |
|
|
|
// color: "rgb(23,160,93)" |
|
|
|
// } |
|
|
|
// }; |
|
|
|
// } |
|
|
|
// } else if (j == 8) { |
|
|
|
// subArray[6] = {}; |
|
|
|
// if (data[i][j] && data[i][j] != 0) { |
|
|
|
// postObj.N = 0; |
|
|
|
// subArray[6] = { |
|
|
|
// name: "卖出Point", |
|
|
|
// symbol: "diamond", |
|
|
|
// symbolSize: [15, 25], |
|
|
|
// symbolOffset: [0, 25], |
|
|
|
// coord: [ |
|
|
|
// `${moment(data[i][0] * 1000).format( |
|
|
|
// "YYYY-MM-DD HH:mm:ss" |
|
|
|
// )}`, |
|
|
|
// data[i][2] |
|
|
|
// ], |
|
|
|
// value: data[i][j], |
|
|
|
// itemStyle: { |
|
|
|
// color: "rgb(221,82,70)" |
|
|
|
// } |
|
|
|
// }; |
|
|
|
// } |
|
|
|
// } |
|
|
|
// } |
|
|
|
// if (subArray.length > 0) result.push(subArray); |
|
|
|
// if (postObj.T != null) postResult.push(postObj); |
|
|
|
// } |
|
|
|
// } |
|
|
|
// return { kLineData: result, postData: postResult }; |
|
|
|
// }, |
|
|
|
|
|
|
|
executeTest() { |
|
|
|
if (this.policyFormData && this.kLineDataList.length > 0) { |
|
|
@ -704,10 +722,10 @@ export default { |
|
|
|
this.$http |
|
|
|
.post("/Api/Simulation/MomentumWaveTest", { |
|
|
|
MomentumWavePolicy: this.policyFormData, |
|
|
|
kLineDataList: this.kLineDataList, |
|
|
|
kLineDataList: this.kLineDataList |
|
|
|
}) |
|
|
|
.then((res) => { |
|
|
|
this.logShowCondition = (i) => true; |
|
|
|
.then(res => { |
|
|
|
this.logShowCondition = i => true; |
|
|
|
this.spinning = false; |
|
|
|
if (res.Code == 200) { |
|
|
|
console.log("回测成功"); |
|
|
@ -741,8 +759,8 @@ export default { |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
}, |
|
|
|
}, |
|
|
|
} |
|
|
|
} |
|
|
|
}; |
|
|
|
</script> |
|
|
|
|
|
|
|