binance-spot.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. const BinanceKit = require('./binance-kit')
  2. const HttpKit = require('../../kit/http-kit')
  3. const TimeKit = require("../../kit/time-kit");
  4. const HTTPRequest = require('request')
  5. const isDev = process.env.USER === 'skyfffire'
  6. const proxy = 'http://localhost:9080'
  7. class BinanceSpot {
  8. static BASE_URL = 'https://api.binance.com'
  9. static TRADE_TYPE = {
  10. MARKET: 'MARKET'
  11. }
  12. static TRADE_SIDE = {
  13. BUY: 'buy',
  14. SELL: 'sell'
  15. }
  16. static PRICE = {
  17. MARKET: -1
  18. }
  19. static NETWORK = {
  20. BSC: 'BSC'
  21. }
  22. static BASE_TOKEN = {
  23. BUSD: 'BUSD'
  24. }
  25. constructor(apiKey, secretKey) {
  26. this.apiKey = apiKey
  27. this.secretKey = secretKey
  28. }
  29. static async realPrice(symbol='BNBBUSD', side=BinanceSpot.TRADE_SIDE.BUY) {
  30. const url = `${BinanceSpot.BASE_URL}/api/v3/depth?symbol=${symbol}&limit=${5}`
  31. const { data: rst } = await HttpKit.get(url)
  32. if (!rst || !rst.bids || !rst.asks || !rst.bids[0] || !rst.asks[0]) {
  33. return 0
  34. }
  35. if (side === BinanceSpot.TRADE_SIDE.SELL) {
  36. return parseFloat(rst.bids[0][0])
  37. } else {
  38. return parseFloat(rst.asks[0][0])
  39. }
  40. }
  41. static async exchangeInfo(symbols=['BNBBUSD', 'BTCBUSD']) {
  42. const url = `${BinanceSpot.BASE_URL}/api/v3/exchangeInfo?symbols=${BinanceKit.buildExchangeInfoSymbols(symbols)}`
  43. const { data: rst } = await HttpKit.get(url)
  44. return rst
  45. }
  46. async accountInfo() {
  47. const url = `${BinanceSpot.BASE_URL}/api/v3/account`
  48. let timestamp = new Date().getTime()
  49. let data = {
  50. timestamp: timestamp
  51. }
  52. let signature = BinanceKit.createSignature(this.secretKey, data)
  53. let finalQueryURL = BinanceKit.toFinalQueryURL(url, data, signature)
  54. let headers = {
  55. 'X-MBX-APIKEY': this.apiKey
  56. }
  57. const { data: rst } = await HttpKit.get(finalQueryURL, headers)
  58. return rst
  59. }
  60. async withdraw(amount, coin=BinanceSpot.BASE_TOKEN.BUSD,
  61. address='0xCfB3Cb29EeAE464ABD44E35d53e12c555705e824', network=BinanceSpot.NETWORK.BSC) {
  62. const url = `${BinanceSpot.BASE_URL}/sapi/v1/capital/withdraw/apply`
  63. let timestamp = new Date().getTime()
  64. let data = {
  65. timestamp: timestamp,
  66. coin: coin,
  67. address: address,
  68. amount: amount,
  69. network: network
  70. }
  71. let signature = BinanceKit.createSignature(this.secretKey, data)
  72. let finalQueryURL = BinanceKit.toFinalQueryURL(url, data, signature)
  73. let headers = {
  74. 'X-MBX-APIKEY': this.apiKey
  75. }
  76. const { data: rst } = await HttpKit.post(finalQueryURL, data, headers)
  77. return rst
  78. }
  79. async takeOrder(symbol='BTCUSDT', price, side, quantity, quoteOrderQty, type=BinanceSpot.TRADE_TYPE.MARKET) {
  80. const url = `${BinanceSpot.BASE_URL}/api/v3/order`
  81. let timestamp = new Date().getTime()
  82. let data = {
  83. timestamp: timestamp,
  84. symbol: symbol,
  85. side: side,
  86. type: type,
  87. recvWindow: 60 * 1000
  88. }
  89. // 区分买卖情况应该分别传入什么数量
  90. if (side === 'BUY') data['quoteOrderQty'] = quoteOrderQty
  91. else if (side === 'SELL') data['quantity'] = quantity
  92. // MARKET状态不传入price
  93. if (type !== 'MARKET') data['price'] = price
  94. let signature = BinanceKit.createSignature(this.secretKey, data)
  95. let finalQueryURL = BinanceKit.toFinalQueryURL(url, data, signature)
  96. let headers = {
  97. 'X-MBX-APIKEY': this.apiKey
  98. }
  99. const params = {
  100. url: finalQueryURL,
  101. method: 'POST',
  102. headers: headers,
  103. proxy: isDev ? proxy : undefined
  104. }
  105. let finish = false
  106. let rst = undefined
  107. HTTPRequest(params, function (error, response) {
  108. // 请求成功的处理逻辑
  109. if (!error) {
  110. rst = JSON.parse(response.body)
  111. } else {
  112. rst = error
  113. }
  114. finish = true
  115. })
  116. while (!finish) {
  117. await TimeKit.sleep(10)
  118. }
  119. return rst
  120. }
  121. async buy(symbol, price, amount, type=BinanceSpot.TRADE_TYPE.MARKET) {
  122. return await this.takeOrder(
  123. symbol,
  124. price,
  125. BinanceSpot.TRADE_SIDE.BUY,
  126. amount,
  127. 0,
  128. type)
  129. }
  130. async sell(symbol, price, amount, type=BinanceSpot.TRADE_TYPE.MARKET) {
  131. return await this.takeOrder(
  132. symbol,
  133. price,
  134. BinanceSpot.TRADE_SIDE.SELL,
  135. amount,
  136. 0,
  137. type)
  138. }
  139. }
  140. module.exports = BinanceSpot