|
|
@@ -10,68 +10,6 @@ async function readData() {
|
|
|
return JSON.parse(data)
|
|
|
}
|
|
|
|
|
|
-let realCountMap = {}
|
|
|
-function getRealDragonMap(kLinesMap, dayCount, BUY_LIMIT_RATE) {
|
|
|
- let realDragonMap = {}
|
|
|
- for (let symbol in kLinesMap) {
|
|
|
- let kLines = kLinesMap[symbol]
|
|
|
-
|
|
|
- let index = kLines.length - (dayCount + 1)
|
|
|
- let kLine = kLines[index]
|
|
|
- let prevKline = kLines[index - 1]
|
|
|
-
|
|
|
- // 开盘第一天不计算
|
|
|
- if (!kLine || !prevKline) continue
|
|
|
-
|
|
|
- let rate = 100 * (kLine.Close - kLine.Open) / kLine.Open
|
|
|
- if (rate > BUY_LIMIT_RATE) {
|
|
|
- kLine.Rate = rate
|
|
|
- kLine.Profit = NumKit.getSubFloat(rate - BUY_LIMIT_RATE, 2)
|
|
|
- realDragonMap[symbol] = kLine
|
|
|
-
|
|
|
- if (!realCountMap[symbol]) {
|
|
|
- realCountMap[symbol] = kLine.Profit
|
|
|
- } else {
|
|
|
- realCountMap[symbol] += kLine.Profit
|
|
|
- }
|
|
|
- realCountMap[symbol] = NumKit.getSubFloat(realCountMap[symbol], 2)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return realDragonMap
|
|
|
-}
|
|
|
-
|
|
|
-let fakeCountMap = {}
|
|
|
-function getFakeDragonMap(kLinesMap, dayCount, BUY_LIMIT_RATE) {
|
|
|
- let fakeDragonMap = {}
|
|
|
- for (let symbol in kLinesMap) {
|
|
|
- let kLines = kLinesMap[symbol]
|
|
|
- let index = kLines.length - (dayCount + 1)
|
|
|
- let kLine = kLines[index]
|
|
|
- let prevKline = kLines[index - 1]
|
|
|
-
|
|
|
- // 开盘第一天不计算
|
|
|
- if (!kLine || (!prevKline)) continue
|
|
|
-
|
|
|
- let rate = 100 * (kLine.Close - kLine.Open) / kLine.Open
|
|
|
- if (rate < BUY_LIMIT_RATE) {
|
|
|
- kLine.Rate = rate
|
|
|
- // kLine.Profit = NumKit.getSubFloat(rate > 0 ? rate - BUY_LIMIT_RATE : -BUY_LIMIT_RATE, 2)
|
|
|
- kLine.Profit = NumKit.getSubFloat(rate - BUY_LIMIT_RATE, 2)
|
|
|
- fakeDragonMap[symbol] = kLine
|
|
|
-
|
|
|
- if (!fakeCountMap[symbol]) {
|
|
|
- fakeCountMap[symbol] = kLine.Profit
|
|
|
- } else {
|
|
|
- fakeCountMap[symbol] += kLine.Profit
|
|
|
- }
|
|
|
- fakeCountMap[symbol] = NumKit.getSubFloat(fakeCountMap[symbol], 2)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return fakeDragonMap
|
|
|
-}
|
|
|
-
|
|
|
// 统计过去N日累计涨幅,跟这个无关
|
|
|
function statisticA(kLines, index) {
|
|
|
let startK = kLines[index - 2]
|
|
|
@@ -281,10 +219,10 @@ function statisticK(kLines, index) {
|
|
|
return count
|
|
|
}
|
|
|
|
|
|
-// 返回过去一共N天涨幅超过M%
|
|
|
+// 返回过去一共N天涨幅超过M%,这个有关的
|
|
|
function statisticL(kLines, index) {
|
|
|
let count = 0
|
|
|
- for (let i = index - 1; i >= index - 10; i--) {
|
|
|
+ for (let i = index - 1; i >= index - 3; i--) {
|
|
|
let kLine = kLines[i]
|
|
|
|
|
|
if (!kLines[i - 1]) break
|
|
|
@@ -297,6 +235,74 @@ function statisticL(kLines, index) {
|
|
|
return count
|
|
|
}
|
|
|
|
|
|
+let realCountMap = {}
|
|
|
+function getRealDragonMap(kLinesMap, dayCount, BUY_LIMIT_RATE) {
|
|
|
+ let realDragonMap = {}
|
|
|
+ for (let symbol in kLinesMap) {
|
|
|
+ let kLines = kLinesMap[symbol]
|
|
|
+
|
|
|
+ let index = kLines.length - (dayCount + 1)
|
|
|
+ let kLine = kLines[index]
|
|
|
+ let prevKline = kLines[index - 1]
|
|
|
+
|
|
|
+ // 开盘第一天不计算
|
|
|
+ if (!kLine || !prevKline) continue
|
|
|
+
|
|
|
+ // 指标过滤
|
|
|
+ // if (statisticL(kLines, index) !== 0) continue
|
|
|
+
|
|
|
+ let rate = 100 * (kLine.Close - kLine.Open) / kLine.Open
|
|
|
+ if (rate > BUY_LIMIT_RATE) {
|
|
|
+ kLine.Rate = rate
|
|
|
+ kLine.Profit = NumKit.getSubFloat(rate - BUY_LIMIT_RATE, 2)
|
|
|
+ realDragonMap[symbol] = kLine
|
|
|
+
|
|
|
+ if (!realCountMap[symbol]) {
|
|
|
+ realCountMap[symbol] = kLine.Profit
|
|
|
+ } else {
|
|
|
+ realCountMap[symbol] += kLine.Profit
|
|
|
+ }
|
|
|
+ realCountMap[symbol] = NumKit.getSubFloat(realCountMap[symbol], 2)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return realDragonMap
|
|
|
+}
|
|
|
+
|
|
|
+let fakeCountMap = {}
|
|
|
+function getFakeDragonMap(kLinesMap, dayCount, BUY_LIMIT_RATE) {
|
|
|
+ let fakeDragonMap = {}
|
|
|
+ for (let symbol in kLinesMap) {
|
|
|
+ let kLines = kLinesMap[symbol]
|
|
|
+ let index = kLines.length - (dayCount + 1)
|
|
|
+ let kLine = kLines[index]
|
|
|
+ let prevKline = kLines[index - 1]
|
|
|
+
|
|
|
+ // 开盘第一天不计算
|
|
|
+ if (!kLine || (!prevKline)) continue
|
|
|
+
|
|
|
+ // 指标过滤
|
|
|
+ // if (statisticL(kLines, index) !== 0) continue
|
|
|
+
|
|
|
+ let rate = 100 * (kLine.Close - kLine.Open) / kLine.Open
|
|
|
+ if (rate < BUY_LIMIT_RATE) {
|
|
|
+ kLine.Rate = rate
|
|
|
+ // kLine.Profit = NumKit.getSubFloat(rate > 0 ? rate - BUY_LIMIT_RATE : -BUY_LIMIT_RATE, 2)
|
|
|
+ kLine.Profit = NumKit.getSubFloat(rate - BUY_LIMIT_RATE, 2)
|
|
|
+ fakeDragonMap[symbol] = kLine
|
|
|
+
|
|
|
+ if (!fakeCountMap[symbol]) {
|
|
|
+ fakeCountMap[symbol] = kLine.Profit
|
|
|
+ } else {
|
|
|
+ fakeCountMap[symbol] += kLine.Profit
|
|
|
+ }
|
|
|
+ fakeCountMap[symbol] = NumKit.getSubFloat(fakeCountMap[symbol], 2)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return fakeDragonMap
|
|
|
+}
|
|
|
+
|
|
|
let dataLeft = []
|
|
|
let dataRight = []
|
|
|
let tempLeft = []
|
|
|
@@ -316,6 +322,8 @@ function dragonAnalysis(btcKLines, kLinesMap, dragonMap, dayCount) {
|
|
|
// // + `前30日平均振幅${statisticB(kLines, index)}%。`
|
|
|
// + `前30日平均(High - Close)${x}%。`
|
|
|
// )
|
|
|
+
|
|
|
+ // 打印实际的量
|
|
|
// if (y > 0) {
|
|
|
// if (dataRight[x]) {
|
|
|
// dataRight[x] += y
|
|
|
@@ -329,6 +337,8 @@ function dragonAnalysis(btcKLines, kLinesMap, dragonMap, dayCount) {
|
|
|
// dataLeft[x] = y
|
|
|
// }
|
|
|
// }
|
|
|
+
|
|
|
+ // 打印倍数
|
|
|
if (y > 0) {
|
|
|
if (tempRight[x]) {
|
|
|
tempRight[x] += y
|
|
|
@@ -353,29 +363,30 @@ async function main() {
|
|
|
|
|
|
const FIRST_FEW_DAYS = 1 // 第几天的数据,0表示今天,1表示昨天,2表示前天,以此类推
|
|
|
const BUY_LIMIT_RATE = 0 // 从什么比例入场
|
|
|
- const BAKE_TEST_DAYS = 150 // 一共回测多少天
|
|
|
+ const BAKE_TEST_DAYS = 60 // 一共回测多少天, 150天是熊市最没有交易量的时候
|
|
|
|
|
|
|
|
|
let btcKLines = kLinesMap['BTC_USDT']
|
|
|
let totalProfit = 0
|
|
|
for (let day_count = FIRST_FEW_DAYS; day_count < FIRST_FEW_DAYS + BAKE_TEST_DAYS; day_count++) {
|
|
|
// 赚钱榜
|
|
|
+ // logger.info("----------------赚钱榜数据分析----------------")
|
|
|
let realDragonProfit = 0
|
|
|
let realDragonMap = getRealDragonMap(kLinesMap, day_count, BUY_LIMIT_RATE)
|
|
|
for (let symbol in realDragonMap) {
|
|
|
realDragonProfit += realDragonMap[symbol].Profit
|
|
|
- // logger.info(realDragonMap[symbol].Symbol, realDragonMap[symbol].Profit, realDragonMap[symbol].Rate)
|
|
|
+ // logger.info(`${realDragonMap[symbol].Symbol}, ${realDragonMap[symbol].Profit}%`)
|
|
|
}
|
|
|
- logger.info("----------------赚钱榜数据分析----------------")
|
|
|
dragonAnalysis(btcKLines, kLinesMap, realDragonMap, day_count)
|
|
|
+
|
|
|
+ // logger.info("----------------亏钱榜数据分析----------------")
|
|
|
// 亏钱榜
|
|
|
let fakeDragonProfit = 0
|
|
|
let fakeDragonMap = getFakeDragonMap(kLinesMap, day_count, BUY_LIMIT_RATE)
|
|
|
for (let symbol in fakeDragonMap) {
|
|
|
fakeDragonProfit += fakeDragonMap[symbol].Profit
|
|
|
- // logger.info(fakeDragonMap[symbol].Symbol, fakeDragonMap[symbol].Profit, fakeDragonMap[symbol].Rate)
|
|
|
+ // logger.info(`${fakeDragonMap[symbol].Symbol}, ${fakeDragonMap[symbol].Profit}%`)
|
|
|
}
|
|
|
- logger.info("----------------亏钱榜数据分析----------------")
|
|
|
dragonAnalysis(btcKLines, kLinesMap, fakeDragonMap, day_count)
|
|
|
|
|
|
realDragonProfit = NumKit.getSubFloat(realDragonProfit, 2)
|