十面埋伏分析.js 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. const logger = require("./utils/logger");
  2. const fs = require('fs').promises;
  3. async function readData() {
  4. let data = await fs.readFile('./data/k_lines.json', 'utf8')
  5. return JSON.parse(data)
  6. }
  7. function getRealDragonMap(kLinesMap, FIRST_FEW_DAYS, BUY_LIMIT_RATE) {
  8. let realDragonMap = {}
  9. for (let symbol in kLinesMap) {
  10. let kLines = kLinesMap[symbol]
  11. let index = kLines.length - (FIRST_FEW_DAYS + 1)
  12. let kLine = kLines[index]
  13. let prevKline = kLines[index - 1]
  14. // 开盘第一天不计算
  15. if (!kLine || !prevKline) continue
  16. let rate = 100 * (kLine.Close - kLine.Open) / kLine.Open
  17. if (rate > BUY_LIMIT_RATE) {
  18. kLine.Rate = rate
  19. kLine.Profit = rate - BUY_LIMIT_RATE
  20. realDragonMap[symbol] = kLine
  21. }
  22. }
  23. return realDragonMap
  24. }
  25. function getFakeDragonMap(kLinesMap, FIRST_FEW_DAYS, BUY_LIMIT_RATE) {
  26. let fakeDragonMap = {}
  27. for (let symbol in kLinesMap) {
  28. let kLines = kLinesMap[symbol]
  29. let index = kLines.length - (FIRST_FEW_DAYS + 1)
  30. let kLine = kLines[index]
  31. let prevKline = kLines[index - 1]
  32. // 开盘第一天不计算
  33. if (!kLine || !prevKline) continue
  34. let rate = 100 * (kLine.Close - kLine.Open) / kLine.Open
  35. let maxRate = 100 * (kLine.High - kLine.Open) / kLine.Open
  36. if (maxRate > BUY_LIMIT_RATE && rate < BUY_LIMIT_RATE) {
  37. kLine.Rate = rate
  38. kLine.MaxRate = maxRate
  39. kLine.Profit = rate > 0 ? rate - BUY_LIMIT_RATE : -BUY_LIMIT_RATE
  40. fakeDragonMap[symbol] = kLine
  41. }
  42. }
  43. return fakeDragonMap
  44. }
  45. async function main() {
  46. let kLinesMap = await readData()
  47. const FIRST_FEW_DAYS = 0 // 第几天的数据,0表示今天,1表示昨天,2表示前天,以此类推
  48. const BUY_LIMIT_RATE = 10 // 从什么比例入场
  49. for (let i = 0; i <= kLinesMap['BTC_USDT'].length - 1; i++) {
  50. // 真龙榜
  51. let realDragonProfit = 0
  52. let realDragonMap = getRealDragonMap(kLinesMap, i, BUY_LIMIT_RATE)
  53. for (let symbol in realDragonMap) {
  54. realDragonProfit += realDragonMap[symbol].Profit
  55. // logger.info(realDragonMap[symbol].Symbol, realDragonMap[symbol].Profit, realDragonMap[symbol].Rate)
  56. }
  57. // 假龙榜
  58. let fakeDragonProfit = 0
  59. let fakeDragonMap = getFakeDragonMap(kLinesMap, i, BUY_LIMIT_RATE)
  60. for (let symbol in fakeDragonMap) {
  61. fakeDragonProfit += fakeDragonMap[symbol].Profit
  62. // logger.info(fakeDragonMap[symbol].Symbol, fakeDragonMap[symbol].Profit, fakeDragonMap[symbol].MaxRate, fakeDragonMap[symbol].Rate)
  63. }
  64. logger.info(`${i}日,真龙榜利润${realDragonProfit}%/${Object.keys(realDragonMap).length}`
  65. + `,假龙榜利润${fakeDragonProfit}%/${Object.keys(fakeDragonMap).length}`)
  66. }
  67. }
  68. main().catch((error) => {
  69. logger.error(error.stack);
  70. process.exitCode = 1;
  71. })