Browse Source

可以显示综合利润,明天开始分析因子,做优化。

skyffire 1 năm trước cách đây
mục cha
commit
8dcaff67c1
2 tập tin đã thay đổi với 59 bổ sung5 xóa
  1. 35 0
      utils/num-kit.js
  2. 24 5
      十面埋伏分析.js

+ 35 - 0
utils/num-kit.js

@@ -0,0 +1,35 @@
+module.exports = class NumKit {
+  /**
+   * 截取小数位工具
+   * @param num 需要截取的小数
+   * @param n 截取位数
+   * @returns {number}
+   * @private
+   */
+  static getSubFloat(num, n) {
+    if (!num) {
+      return 0
+    }
+
+    let rst = num.toString()
+
+    if (rst.indexOf('e') !== -1) {
+      const e = parseInt(rst.split('e')[1])
+      rst = parseFloat(rst.substring(0, rst.indexOf('.') + n + 1)) * Math.pow(10, e)
+    } else if (rst.indexOf('.') !== -1) {
+      rst = rst.substring(0, rst.indexOf('.') + n + 1)
+    }
+
+    return parseFloat(rst)
+  }
+
+  /**
+   * 转成非科学计数法
+   * @param num
+   * @returns {string}
+   */
+  static toNonExponential(num) {
+    const m = num.toExponential().match(/\d(?:\.(\d*))?e([+-]\d+)/)
+    return num.toFixed(Math.max(0, (m[1] || '').length - m[2]))
+  }
+}

+ 24 - 5
十面埋伏分析.js

@@ -1,4 +1,5 @@
 const logger = require("./utils/logger");
+const NumKit = require('./utils/num-kit')
 const fs = require('fs').promises;
 
 async function readData() {
@@ -39,7 +40,7 @@ function getFakeDragonMap(kLinesMap, FIRST_FEW_DAYS, BUY_LIMIT_RATE) {
     let prevKline = kLines[index - 1]
 
     // 开盘第一天不计算
-    if (!kLine || !prevKline) continue
+    if (!kLine || (!prevKline)) continue
 
     let rate = 100 * (kLine.Close - kLine.Open) / kLine.Open
     let maxRate = 100 * (kLine.High - kLine.Open) / kLine.Open
@@ -58,9 +59,10 @@ async function main() {
   let kLinesMap = await readData()
 
   const FIRST_FEW_DAYS = 0            // 第几天的数据,0表示今天,1表示昨天,2表示前天,以此类推
-  const BUY_LIMIT_RATE = 10           // 从什么比例入场
+  const BUY_LIMIT_RATE = 5            // 从什么比例入场
 
-  for (let i = 0; i <= kLinesMap['BTC_USDT'].length - 1; i++) {
+  let totalProfit = 0
+  for (let i = FIRST_FEW_DAYS; i <= kLinesMap['BTC_USDT'].length - 2; i++) {
     // 真龙榜
     let realDragonProfit = 0
     let realDragonMap = getRealDragonMap(kLinesMap, i, BUY_LIMIT_RATE)
@@ -75,9 +77,26 @@ async function main() {
       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}`)
+
+    realDragonProfit = NumKit.getSubFloat(realDragonProfit, 2)
+    fakeDragonProfit = NumKit.getSubFloat(fakeDragonProfit, 2)
+    let realLength = Object.keys(realDragonMap).length
+    let fakeLength = Object.keys(fakeDragonMap).length
+    let realRate = NumKit.getSubFloat(realLength / (realLength + fakeLength), 2)
+    let fakeRate = NumKit.getSubFloat(1 - realRate, 2)
+    let expRealProfit = NumKit.getSubFloat(realRate * realDragonProfit, 2)
+    let expFakeProfit = NumKit.getSubFloat(fakeRate * fakeDragonProfit, 2)
+    let synProfit = NumKit.getSubFloat(expFakeProfit + expRealProfit, 2)
+
+    logger.info(`${i}日,真龙榜(${realLength}只)利润${realDragonProfit}%`
+      + `,假龙榜(${fakeLength}只)利润${fakeDragonProfit}%`
+      + `,真龙期望利润${expRealProfit}%,假龙期望利润${expFakeProfit}%,综合利润${synProfit}%`
+    )
+
+    totalProfit += synProfit
+    totalProfit = NumKit.getSubFloat(totalProfit, 2)
   }
+  logger.info(`利润期望值总和:${totalProfit}%。`)
 }
 
 main().catch((error) => {