|
|
@@ -0,0 +1,86 @@
|
|
|
+const logger = require("./utils/logger");
|
|
|
+const fs = require('fs').promises;
|
|
|
+
|
|
|
+async function readData() {
|
|
|
+ let data = await fs.readFile('./data/k_lines.json', 'utf8')
|
|
|
+
|
|
|
+ return JSON.parse(data)
|
|
|
+}
|
|
|
+
|
|
|
+function getRealDragonMap(kLinesMap, FIRST_FEW_DAYS, BUY_LIMIT_RATE) {
|
|
|
+ let realDragonMap = {}
|
|
|
+ for (let symbol in kLinesMap) {
|
|
|
+ let kLines = kLinesMap[symbol]
|
|
|
+
|
|
|
+ let index = kLines.length - (FIRST_FEW_DAYS + 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 = rate - BUY_LIMIT_RATE
|
|
|
+ realDragonMap[symbol] = kLine
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return realDragonMap
|
|
|
+}
|
|
|
+
|
|
|
+function getFakeDragonMap(kLinesMap, FIRST_FEW_DAYS, BUY_LIMIT_RATE) {
|
|
|
+ let fakeDragonMap = {}
|
|
|
+ for (let symbol in kLinesMap) {
|
|
|
+ let kLines = kLinesMap[symbol]
|
|
|
+ let index = kLines.length - (FIRST_FEW_DAYS + 1)
|
|
|
+ let kLine = kLines[index]
|
|
|
+ let prevKline = kLines[index - 1]
|
|
|
+
|
|
|
+ // 开盘第一天不计算
|
|
|
+ if (!kLine || !prevKline) continue
|
|
|
+
|
|
|
+ let rate = 100 * (kLine.Close - kLine.Open) / kLine.Open
|
|
|
+ let maxRate = 100 * (kLine.High - kLine.Open) / kLine.Open
|
|
|
+ if (maxRate > BUY_LIMIT_RATE && rate < BUY_LIMIT_RATE) {
|
|
|
+ kLine.Rate = rate
|
|
|
+ kLine.MaxRate = maxRate
|
|
|
+ kLine.Profit = rate > 0 ? rate - BUY_LIMIT_RATE : -BUY_LIMIT_RATE
|
|
|
+ fakeDragonMap[symbol] = kLine
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return fakeDragonMap
|
|
|
+}
|
|
|
+
|
|
|
+async function main() {
|
|
|
+ let kLinesMap = await readData()
|
|
|
+
|
|
|
+ const FIRST_FEW_DAYS = 0 // 第几天的数据,0表示今天,1表示昨天,2表示前天,以此类推
|
|
|
+ const BUY_LIMIT_RATE = 10 // 从什么比例入场
|
|
|
+
|
|
|
+ for (let i = 0; i <= kLinesMap['BTC_USDT'].length - 1; i++) {
|
|
|
+ // 真龙榜
|
|
|
+ let realDragonProfit = 0
|
|
|
+ let realDragonMap = getRealDragonMap(kLinesMap, i, BUY_LIMIT_RATE)
|
|
|
+ for (let symbol in realDragonMap) {
|
|
|
+ realDragonProfit += realDragonMap[symbol].Profit
|
|
|
+ // logger.info(realDragonMap[symbol].Symbol, realDragonMap[symbol].Profit, realDragonMap[symbol].Rate)
|
|
|
+ }
|
|
|
+ // 假龙榜
|
|
|
+ let fakeDragonProfit = 0
|
|
|
+ let fakeDragonMap = getFakeDragonMap(kLinesMap, i, BUY_LIMIT_RATE)
|
|
|
+ for (let symbol in fakeDragonMap) {
|
|
|
+ fakeDragonProfit += fakeDragonMap[symbol].Profit
|
|
|
+ // logger.info(fakeDragonMap[symbol].Symbol, fakeDragonMap[symbol].Profit, fakeDragonMap[symbol].MaxRate, fakeDragonMap[symbol].Rate)
|
|
|
+ }
|
|
|
+ logger.info(`${i}日,真龙榜利润${realDragonProfit}%/${Object.keys(realDragonMap).length}`
|
|
|
+ + `,假龙榜利润${fakeDragonProfit}%/${Object.keys(fakeDragonMap).length}`)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+main().catch((error) => {
|
|
|
+ logger.error(error.stack);
|
|
|
+ process.exitCode = 1;
|
|
|
+})
|