Bladeren bron

基本结构整理6

龚成明 2 jaren geleden
bovenliggende
commit
53066114e2

+ 0 - 0
config/Config.js → config/config.js


+ 0 - 0
config/ListenConfig.js → config/listen-config.js


File diff suppressed because it is too large
+ 4298 - 1
package-lock.json


+ 1 - 0
package.json

@@ -19,6 +19,7 @@
     "bignumber": "^1.1.0",
     "crypto": "^1.0.1",
     "ethereumjs-tx": "1.3.7",
+    "log4js": "^6.7.1",
     "node-metamask": "^1.1.2",
     "request": "^2.88.2",
     "web3": "^1.3.6"

+ 1 - 1
src/1.index.js

@@ -4,7 +4,7 @@ const EthService = require('./services/eth-service.js')
 const BaseTokenService = require('./services/base-token-service.js')
 
 const BinanceSpot = require('./libs/binance/binance-spot.js')
-const Config = require('../config/Config.js')
+const Config = require('../config/config.js')
 const MyKit = require('./kit/MyKit.js')
 
 const bs = new BinanceSpot('-', '-')

+ 2 - 2
src/2.transfer-to-exchange.js

@@ -1,7 +1,7 @@
 const MyKit = require('./kit/MyKit.js')
 const Wallet = require('../simple-web3.js')
-const Config = require('../config/Config.js')
-const ListenConfig = require('../config/ListenConfig.js')
+const Config = require('../config/config.js')
+const ListenConfig = require('../config/listen-config.js')
 const PrivateConfig = require('./PrivateConfig.js')
 const wallet = new Wallet()
 let isTransfer = false

+ 2 - 2
src/3.secondary-sell.js

@@ -1,6 +1,6 @@
 const BinanceSpot = require('./libs/BinanceSpot.js')
-const Config = require('../config/Config.js')
-const ListenConfig = require('../config/ListenConfig.js')
+const Config = require('../config/config.js')
+const ListenConfig = require('../config/listen-config.js')
 const PrivateConfig = require('./PrivateConfig.js')
 const MyKit = require('./kit/MyKit.js')
 

+ 1 - 1
src/4.withdraw.js

@@ -1,5 +1,5 @@
 const BinanceSpot = require('./libs/BinanceSpot.js')
-const Config = require('../config/Config.js')
+const Config = require('../config/config.js')
 const PrivateConfig = require('./PrivateConfig.js')
 const MyKit = require('./kit/MyKit.js')
 

+ 0 - 202
src/kit/MyKit.js

@@ -1,202 +0,0 @@
-class MyKit {}
-
-/**
- * 条件处理器
- *
- * @param rst
- * @param condition
- * @returns {*}
- */
-MyKit.conditionHandler = function (rst, condition) {
-  return rst && condition
-}
-
-/**
- * 豪秒级时间戳转换
- *
- * @param timestamp
- * @returns {*}
- */
-MyKit.getTimeByMillisecond = function (timestamp) {
-  // 组织日期格式并返回
-  return MyKit.dateFormat('YYYY-mm-dd HH:MM:SS', new Date(timestamp))
-}
-
-/**
- * 秒级时间戳转换
- *
- * @param timestamp
- * @returns {*}
- */
-MyKit.getTimeBySecond = function (timestamp) {
-  // 组织日期格式并返回
-  return MyKit.dateFormat('YYYY-mm-dd HH:MM:SS', new Date(timestamp * 1000))
-}
-
-/**
- * 格式化日期
- *
- * @param fmt 日期格式
- * @param date 日期对象
- * @returns {*}
- */
-MyKit.dateFormat = function (fmt, date) {
-  let ret
-  const opt = {
-    "Y+": date.getFullYear().toString(),        // 年
-    "m+": (date.getMonth() + 1).toString(),     // 月
-    "d+": date.getDate().toString(),            // 日
-    "H+": date.getHours().toString(),           // 时
-    "M+": date.getMinutes().toString(),         // 分
-    "S+": date.getSeconds().toString(),         // 秒
-    "s+": date.getMilliseconds().toString()     // 毫秒
-    // 有其他格式化字符需求可以继续添加,必须转化成字符串
-  }
-
-  for (let k in opt) {
-    ret = new RegExp("(" + k + ")").exec(fmt)
-    if (ret) {
-      fmt = fmt.replace(ret[1], (ret[1].length === 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
-    }
-  }
-
-  return fmt
-}
-
-/**
- * 截取小数位工具
- * @param num 需要截取的小数
- * @param n 截取位数
- * @returns {number}
- * @private
- */
-MyKit._N = function (num, n) {
-  if (!num) {
-    return 0
-  }
-
-  let rst = num.toString()
-
-  if (rst.indexOf('e') !== -1) {
-    return 0
-  }
-
-  if (rst.indexOf('.') !== -1) {
-    rst = rst.substring(0, rst.indexOf('.') + n + 1)
-  }
-
-  return parseFloat(rst)
-}
-
-/**
- * 转成非科学计数法
- * @param num
- * @returns {string}
- */
-MyKit.toNonExponential = function (num) {
-  const m = num.toExponential().match(/\d(?:\.(\d*))?e([+-]\d+)/)
-  return num.toFixed(Math.max(0, (m[1] || '').length - m[2]))
-}
-
-/**
- * 睡眠工具
- * @param time 单位:毫秒
- * @returns {Promise<unknown>}
- */
-MyKit.sleep = function (time) {
-  return new Promise(function (resolve) {
-    setTimeout(function () {
-      resolve(true)
-    }, time)
-  })
-}
-
-/**
- * EMA计算器
- * @param lastEma 上一个EMA
- * @param closePrice 收盘价
- * @param units 数据条数
- * @returns {number}
- */
-MyKit.EMA = function (lastEma, closePrice, units) {
-  return (lastEma * (units - 1) + closePrice * 2) / (units + 1)
-}
-
-/**
- *
- * 计算移动平均线指标, ma的周期为days
- *
- * @method MA
- * @param {Array} ticks 一维数组类型,每个元素为当前Tick的收盘价格
- * @param {Integer} day
- * @return {Array} mas
- */
-MyKit.MA = function (ticks, day) {
-  const mas = []
-  for (let i = 0; i < ticks.length; i++) {
-    if (i < day - 1) {
-      mas.push(ticks[i])
-    } else {
-      let valueSum = 0
-      for (let j = i; j > i - day; j--) {
-        valueSum += ticks[j]
-
-        if (i === ticks.length - 1) {
-          // console.log(day, ticks[j])
-        }
-      }
-      if (i === ticks.length - 1) {
-        // console.log(day, valueSum)
-      }
-      mas.push(valueSum / day)
-    }
-  }
-  return mas
-}
-
-/**
- *
- * 计算macd指标,快速和慢速移动平均线的周期分别取12和26
- *
- * @method MACD
- * @param {Array} ticks
- * 一维数组类型,每个元素为tick的收盘价格
- * @param {Integer} N1
- * 整数类型,是为快线
- * @param {Integer} N2
- * 整数类型,是为慢线
- * @param {Integer} N3
- * 整数类型,是为信号长度
- * @return {Object} 返回一个包含diffs deas bars属性的对象,每个属性对应的类型为{Array[Number]}
- */
-MyKit.MACD = function (ticks, N1, N2, N3) {
-  const emaN1 = []
-  const emaN2 = []
-  const diffs = []
-  const deas = []
-  const bars = []
-
-  for (let i = 0; i < ticks.length; i++) {
-    const c = ticks[i]
-    if (i === 0) {
-      emaN1.push(c)
-      emaN2.push(c)
-      deas.push(0)
-    } else {
-      emaN1.push(MyKit.EMA(emaN1[i - 1], c, N1))
-      emaN2.push(MyKit.EMA(emaN2[i - 1], c, N2))
-    }
-    // 计算离差值
-    diffs.push(emaN1[i] - emaN2[i])
-
-    if (i !== 0) {
-      deas.push(MyKit.EMA(deas[i - 1], diffs[i], N3))
-    }
-    // bars.push((diffs[i]-deas[i]) * 2);
-    bars.push(diffs[i] - deas[i])
-  }
-
-  return { diffs: diffs, deas: deas, bars: bars }
-}
-
-module.exports = MyKit

+ 3 - 3
src/kit/HttpKit.js → src/kit/http-kit.js

@@ -1,5 +1,5 @@
 const axios = require('axios-https-proxy-fix')
-const MyKit = require('./MyKit.js')
+const TimeKit = require('./time-kit')
 
 class HttpKit {}
 
@@ -40,7 +40,7 @@ HttpKit.post = async function(url, data, headers) {
     && msg.indexOf('timeout') === -1 
     && msg.indexOf('{}') === -1
     && msg.indexOf('server error') === -1) {
-      let time = MyKit.getTimeByMillisecond(new Date().getTime())
+      let time = TimeKit.getTimeByMillisecond(new Date().getTime())
       console.error(time, msg)
     }
 
@@ -57,7 +57,7 @@ HttpKit.get = async function(url, headers) {
     && msg.indexOf('timeout') === -1 
     && msg.indexOf('{}') === -1
     && msg.indexOf('server error') === -1) {
-      let time = MyKit.getTimeByMillisecond(new Date().getTime())
+      let time = TimeKit.getTimeByMillisecond(new Date().getTime())
       console.error(time, msg)
     }
 

+ 6 - 0
src/kit/logger.js

@@ -0,0 +1,6 @@
+const log4js = require('log4js')
+const logger = log4js.getLogger()
+
+logger.level = "debug";
+
+module.exports = logger

+ 32 - 0
src/kit/num-kit.js

@@ -0,0 +1,32 @@
+export default class NumKit {
+  /**
+   * 截取小数位工具
+   * @param num 需要截取的小数
+   * @param n 截取位数
+   * @returns {number}
+   * @private
+   */
+  static getSubFloat(num, n) {
+    if (!num) {
+      return 0
+    }
+
+    let rst = num.toString()
+
+    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]))
+  }
+}

+ 91 - 0
src/kit/tick-kit.js

@@ -0,0 +1,91 @@
+class TickKit {}
+
+/**
+ * EMA计算器
+ * @param lastEma 上一个EMA
+ * @param closePrice 收盘价
+ * @param units 数据条数
+ * @returns {number}
+ */
+TickKit.EMA = function (lastEma, closePrice, units) {
+  return (lastEma * (units - 1) + closePrice * 2) / (units + 1)
+}
+
+/**
+ *
+ * 计算移动平均线指标, ma的周期为days
+ *
+ * @method MA
+ * @param {Array} ticks 一维数组类型,每个元素为当前Tick的收盘价格
+ * @param {Integer} day
+ * @return {Array} mas
+ */
+TickKit.MA = function (ticks, day) {
+  const mas = []
+  for (let i = 0; i < ticks.length; i++) {
+    if (i < day - 1) {
+      mas.push(ticks[i])
+    } else {
+      let valueSum = 0
+      for (let j = i; j > i - day; j--) {
+        valueSum += ticks[j]
+
+        if (i === ticks.length - 1) {
+          // console.log(day, ticks[j])
+        }
+      }
+      if (i === ticks.length - 1) {
+        // console.log(day, valueSum)
+      }
+      mas.push(valueSum / day)
+    }
+  }
+  return mas
+}
+
+/**
+ *
+ * 计算macd指标,快速和慢速移动平均线的周期分别取12和26
+ *
+ * @method MACD
+ * @param {Array} ticks
+ * 一维数组类型,每个元素为tick的收盘价格
+ * @param {Integer} N1
+ * 整数类型,是为快线
+ * @param {Integer} N2
+ * 整数类型,是为慢线
+ * @param {Integer} N3
+ * 整数类型,是为信号长度
+ * @return {Object} 返回一个包含diffs deas bars属性的对象,每个属性对应的类型为{Array[Number]}
+ */
+TickKit.MACD = function (ticks, N1, N2, N3) {
+  const emaN1 = []
+  const emaN2 = []
+  const diffs = []
+  const deas = []
+  const bars = []
+
+  for (let i = 0; i < ticks.length; i++) {
+    const c = ticks[i]
+    if (i === 0) {
+      emaN1.push(c)
+      emaN2.push(c)
+      deas.push(0)
+    } else {
+      emaN1.push(TickKit.EMA(emaN1[i - 1], c, N1))
+      emaN2.push(TickKit.EMA(emaN2[i - 1], c, N2))
+    }
+    // 计算离差值
+    diffs.push(emaN1[i] - emaN2[i])
+
+    if (i !== 0) {
+      deas.push(TickKit.EMA(deas[i - 1], diffs[i], N3))
+    }
+    // bars.push((diffs[i]-deas[i]) * 2);
+    bars.push(diffs[i] - deas[i])
+  }
+
+  return { diffs: diffs, deas: deas, bars: bars }
+}
+
+export default TickKit

+ 66 - 0
src/kit/time-kit.js

@@ -0,0 +1,66 @@
+module.exports = class TimeKit {
+  static dateToTimestamp (str) {
+    let [a, b] = str.split(' ')
+    let [year, month, day] = a.split('/')
+    let [hour, minute, second] = b.split(':')
+
+    return new Date(year, month - 1, day, hour, minute, second).getTime() / 1000
+  }
+
+  // 时间戳转换chart时间
+  static getTime (timestamp) {
+    // 组织日期格式并返回
+    return this.dateFormat('YYYY-mm-dd HH:MM:SS:sss', new Date(timestamp * 1000))
+  }
+
+  static dateFormat(fmt, date) {
+    let ret;
+    const opt = {
+      "Y+": date.getFullYear().toString(),        // 年
+      "m+": (date.getMonth() + 1).toString(),     // 月
+      "d+": date.getDate().toString(),            // 日
+      "H+": date.getHours().toString(),           // 时
+      "M+": date.getMinutes().toString(),         // 分
+      "S+": date.getSeconds().toString(),         // 秒
+      "s+": date.getMilliseconds().toString()     // 毫秒
+      // 有其他格式化字符需求可以继续添加,必须转化成字符串
+    };
+    for (let k in opt) {
+      ret = new RegExp("(" + k + ")").exec(fmt);
+      if (ret) {
+        fmt = fmt.replace(ret[1], (ret[1].length === 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
+      }
+    }
+    return fmt;
+  }
+
+  /**
+   * 豪秒级时间戳转换
+   *
+   * @param timestamp
+   * @returns {*}
+   */
+  static getTimeByMillisecond = function (timestamp) {
+    // 组织日期格式并返回
+    return TimeKit.dateFormat('YYYY-mm-dd HH:MM:SS', new Date(timestamp))
+  }
+
+  /**
+   * 秒级时间戳转换
+   *
+   * @param timestamp
+   * @returns {*}
+   */
+  static getTimeBySecond = function (timestamp) {
+    // 组织日期格式并返回
+    return TimeKit.dateFormat('YYYY-mm-dd HH:MM:SS', new Date(timestamp * 1000))
+  }
+
+  static sleep = function (time) {
+    return new Promise(function (resolve) {
+      setTimeout(function () {
+        resolve(true)
+      }, time)
+    })
+  }
+}

+ 2 - 2
src/libs/1inch.js

@@ -1,5 +1,5 @@
-const HttpKit = require('./../kit/HttpKit.js')
-const Config = require('../../config/Config.js')
+const HttpKit = require('../kit/http-kit.js')
+const Config = require('../../config/config.js')
 const PrivateConfig = require('../../PrivateConfig.js')
 const SimpleWeb3 = require("./web3/simple-web3");
 

+ 7 - 5
src/kit/BinanceTik.js → src/libs/binance/binance-kit.js

@@ -2,22 +2,24 @@ const CryptoJS = require('crypto')
 
 class Tik {
   // 创建签名
-  createSignature (secretKey, data) {
+  static createSignature(secretKey, data) {
     const hmac = CryptoJS.createHmac('sha256', secretKey)
-    hmac.update(this.toQueryString(data))
+    hmac.update(Tik.toQueryString(data))
     return hmac.digest('hex')
   }
+
   // 将map转换为queryString
-  toQueryString (data) {
+  static toQueryString(data) {
     let queryString = ''
     for (let key in data) {
       queryString = queryString + `${key}=${data[key]}&`
     }
     return queryString.substring(0, queryString.length - 1)
   }
+
   // 获取最终QueryURL
-  toFinalQueryURL (url, data, signature) {
-    return url + '?' + this.toQueryString(data) + '&signature=' + signature
+  static toFinalQueryURL(url, data, signature) {
+    return `${url}?${Tik.toQueryString(data)}&signature=${signature}`
   }
 }
 

+ 12 - 13
src/libs/binance/binance-spot.js

@@ -1,6 +1,6 @@
-const Tik = require('../../kit/BinanceTik')
-const HttpKit = require('../../kit/HttpKit')
-const MyKit = require('../../kit/MyKit.js')
+const BinanceKit = require('./binance-kit')
+const HttpKit = require('../../kit/http-kit')
+const TimeKit = require("../../kit/time-kit");
 const HTTPRequest = require('request')
 
 const isDev = process.env.USER === 'skyfffire'
@@ -28,10 +28,9 @@ class BinanceSpot {
   constructor(apiKey, secretKey) {
     this.apiKey = apiKey
     this.secretKey = secretKey
-    this.tik = new Tik()
   }
 
-  async static realPrice(symbol='BNB_USDT', side=BinanceSpot.TRADE_SIDE.BUY) {
+  static async realPrice(symbol='BNB_USDT', side=BinanceSpot.TRADE_SIDE.BUY) {
     const url = `${BinanceSpot.BASE_URL}/api/v3/depth?symbol=${symbol}&limit=${5}`
 
     const { data: rst } = await HttpKit.get(url)
@@ -47,7 +46,7 @@ class BinanceSpot {
     }
   }
 
-  async exchangeInfo() {
+  static async exchangeInfo() {
     const url = `${BinanceSpot.BASE_URL}/api/v3/exchangeInfo`
 
     const { data: rst } = await HttpKit.get(url)
@@ -60,8 +59,8 @@ class BinanceSpot {
     let data = {
       timestamp: timestamp
     }
-    let signature = this.tik.createSignature(this.secretKey, data)
-    let finalQueryURL = this.tik.toFinalQueryURL(url, data, signature)
+    let signature = BinanceKit.createSignature(this.secretKey, data)
+    let finalQueryURL = BinanceKit.toFinalQueryURL(url, data, signature)
     let headers = {
       'X-MBX-APIKEY': this.apiKey
     }
@@ -82,8 +81,8 @@ class BinanceSpot {
       network: network
     }
 
-    let signature = this.tik.createSignature(this.secretKey, data)
-    let finalQueryURL = this.tik.toFinalQueryURL(url, data, signature)
+    let signature = BinanceKit.createSignature(this.secretKey, data)
+    let finalQueryURL = BinanceKit.toFinalQueryURL(url, data, signature)
     let headers = {
       'X-MBX-APIKEY': this.apiKey
     }
@@ -110,8 +109,8 @@ class BinanceSpot {
     // MARKET状态不传入price
     if (type !== 'MARKET') data['price'] = price
 
-    let signature = this.tik.createSignature(this.secretKey, data)
-    let finalQueryURL = this.tik.toFinalQueryURL(url, data, signature)
+    let signature = BinanceKit.createSignature(this.secretKey, data)
+    let finalQueryURL = BinanceKit.toFinalQueryURL(url, data, signature)
     let headers = {
       'X-MBX-APIKEY': this.apiKey
     }
@@ -138,7 +137,7 @@ class BinanceSpot {
     })
 
     while (!finish) {
-      await MyKit.sleep(10)
+      await TimeKit.sleep(10)
     }
 
     return rst

+ 8 - 0
src/libs/binance/test/binance-spot-test.js

@@ -0,0 +1,8 @@
+const BinanceSpot = require('../binance-spot')
+const logger = require('../../../kit/logger')
+
+async function realPriceTest() {
+  logger.info(await BinanceSpot.realPrice())
+}
+
+realPriceTest()

+ 2 - 2
src/libs/dodo.js

@@ -1,5 +1,5 @@
-const HttpKit = require('./../kit/HttpKit.js')
-const Config = require('../../config/Config.js')
+const HttpKit = require('../kit/http-kit.js')
+const Config = require('../../config/config.js')
 const PrivateConfig = require('../../PrivateConfig.js')
 const SimpleWeb3 = require("./web3/simple-web3");
 

+ 0 - 0
src/libs/pancakeswap.js → src/libs/pancake-swap.js


+ 2 - 2
src/libs/web3/simple-web3.js

@@ -1,5 +1,5 @@
-const Config = require('./../Config.js')
-const ListenConfig = require('./config/ListenConfig.js')
+const Config = require('./../config.js')
+const ListenConfig = require('./config/listen-config.js')
 const PrivateConfig = require('../../.')
 const Web3 = require('web3')
 const Tx = require('ethereumjs-tx')

+ 1 - 1
src/services/base-token-service.js

@@ -1,5 +1,5 @@
 const MyKit = require("../kit/MyKit");
-const Config = require("../../config/Config");
+const Config = require("../../config/config");
 
 class BaseTokenService {}
 

+ 1 - 1
src/services/eth-service.js

@@ -1,5 +1,5 @@
 const MyKit = require("../kit/MyKit");
-const Config = require("../../config/Config");
+const Config = require("../../config/config");
 
 class EthService {}
 

File diff suppressed because it is too large
+ 0 - 20
test/test.js


Some files were not shown because too many files changed in this diff