Skip to content

Instantly share code, notes, and snippets.

@anticlergygang
Last active December 17, 2018 23:57
Show Gist options
  • Save anticlergygang/14b438ccdf1244fdd16a334bb6cac2f9 to your computer and use it in GitHub Desktop.
Save anticlergygang/14b438ccdf1244fdd16a334bb6cac2f9 to your computer and use it in GitHub Desktop.
If you want to get it to work, you need to npm install all of the modules required at the top and change all occurances of process.env. BINANCEAPIKEY and process.env.BINANCESECRET with your apikey and secret. After this just run 'node scalpBot.js "SYMBOL" "PERCENT_TRAIL"'
const fs = require('fs')
const https = require('https')
const colors = require('colors')
const moment = require('moment-timezone')
const querystring = require('querystring')
const util = require('util')
const crypto = require('crypto')
const percentOf = (per, num) => {
return (num / 100) * per
}
const percentChange = (v1, v2) => {
return (((v2 - v1) / Math.abs(v1)) * 100).toFixed(2)
}
const binanceAPI = options => {
return new Promise((resolve, reject) => {
try {
let requestObject = {
host: 'api.binance.com',
port: 443,
method: options.method
}
switch (`${options.method} ${options.endpoint}`) {
case 'GET /api/v1/ping':
{
requestObject.path = options.endpoint
let req = https.request(requestObject, res => {
let data = ''
res.on('data', (chunk) => {
data = data.concat(chunk)
})
res.on('end', () => {
try {
let jsonRes = JSON.parse(data)
resolve(jsonRes)
} catch (err) {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
}
})
}).on('error', (err) => {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
})
req.end()
}
break
case 'GET /api/v1/time':
{
requestObject.path = options.endpoint
let req = https.request(requestObject, res => {
let data = ''
res.on('data', (chunk) => {
data = data.concat(chunk)
})
res.on('end', () => {
try {
let jsonRes = JSON.parse(data)
resolve(jsonRes)
} catch (err) {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
}
})
}).on('error', (err) => {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
})
req.end()
}
break
case 'GET /api/v1/exchangeInfo':
{
requestObject.path = options.endpoint
let req = https.request(requestObject, res => {
let data = ''
res.on('data', (chunk) => {
data = data.concat(chunk)
})
res.on('end', () => {
try {
let jsonRes = JSON.parse(data)
resolve(jsonRes)
} catch (err) {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
}
})
}).on('error', (err) => {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
})
req.end()
}
break
case 'GET /api/v1/depth':
{
let query = querystring.stringify(options.parameters)
requestObject.path = `${options.endpoint}?${query}`
requestObject.headers = {
'X-MBX-APIKEY': process.env.BINANCEAPIKEY
}
let req = https.request(requestObject, res => {
let data = ''
res.on('data', (chunk) => {
data = data.concat(chunk)
})
res.on('end', () => {
try {
let jsonRes = JSON.parse(data)
resolve(jsonRes)
} catch (err) {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
}
})
}).on('error', (err) => {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
})
req.end()
}
break
case 'GET /api/v1/trades':
{
let query = querystring.stringify(options.parameters)
requestObject.path = `${options.endpoint}?${query}`
requestObject.headers = {
'X-MBX-APIKEY': process.env.BINANCEAPIKEY
}
let req = https.request(requestObject, res => {
let data = ''
res.on('data', (chunk) => {
data = data.concat(chunk)
})
res.on('end', () => {
try {
let jsonRes = JSON.parse(data)
resolve(jsonRes)
} catch (err) {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
}
})
}).on('error', (err) => {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
})
req.end()
}
break
case 'GET /api/v1/historicalTrades':
{
let query = querystring.stringify(options.parameters)
requestObject.path = `${options.endpoint}?${query}`
requestObject.headers = {
'X-MBX-APIKEY': process.env.BINANCEAPIKEY
}
let req = https.request(requestObject, res => {
let data = ''
res.on('data', (chunk) => {
data = data.concat(chunk)
})
res.on('end', () => {
try {
let jsonRes = JSON.parse(data)
resolve(jsonRes)
} catch (err) {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
}
})
}).on('error', (err) => {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
})
req.end()
}
break
case 'GET /api/v1/aggTrades':
{
let query = querystring.stringify(options.parameters)
requestObject.path = `${options.endpoint}?${query}`
requestObject.headers = {
'X-MBX-APIKEY': process.env.BINANCEAPIKEY
}
let req = https.request(requestObject, res => {
let data = ''
res.on('data', (chunk) => {
data = data.concat(chunk)
})
res.on('end', () => {
try {
let jsonRes = JSON.parse(data)
resolve(jsonRes)
} catch (err) {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
}
})
}).on('error', (err) => {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
})
req.end()
}
break
case 'GET /api/v1/klines':
{
let query = querystring.stringify(options.parameters)
requestObject.path = `${options.endpoint}?${query}`
requestObject.headers = {
'X-MBX-APIKEY': process.env.BINANCEAPIKEY
}
let req = https.request(requestObject, res => {
let data = ''
res.on('data', (chunk) => {
data = data.concat(chunk)
})
res.on('end', () => {
try {
let jsonRes = JSON.parse(data)
resolve(jsonRes)
} catch (err) {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
}
})
}).on('error', (err) => {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
})
req.end()
}
break
case 'GET /api/v1/ticker/24hr':
{
let query = querystring.stringify(options.parameters)
requestObject.path = `${options.endpoint}?${query}`
requestObject.headers = {
'X-MBX-APIKEY': process.env.BINANCEAPIKEY
}
let req = https.request(requestObject, res => {
let data = ''
res.on('data', (chunk) => {
data = data.concat(chunk)
})
res.on('end', () => {
try {
let jsonRes = JSON.parse(data)
resolve(jsonRes)
} catch (err) {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
}
})
}).on('error', (err) => {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
})
req.end()
}
break
case 'GET /api/v1/ticker/price':
{
let query = querystring.stringify(options.parameters)
requestObject.path = `${options.endpoint}?${query}`
requestObject.headers = {
'X-MBX-APIKEY': process.env.BINANCEAPIKEY
}
let req = https.request(requestObject, res => {
let data = ''
res.on('data', (chunk) => {
data = data.concat(chunk)
})
res.on('end', () => {
try {
let jsonRes = JSON.parse(data)
resolve(jsonRes)
} catch (err) {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
}
})
}).on('error', (err) => {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
})
req.end()
}
break
case 'GET /api/v1/ticker/bookTicker':
{
let query = querystring.stringify(options.parameters)
requestObject.path = `${options.endpoint}?${query}`
requestObject.headers = {
'X-MBX-APIKEY': process.env.BINANCEAPIKEY
}
let req = https.request(requestObject, res => {
let data = ''
res.on('data', (chunk) => {
data = data.concat(chunk)
})
res.on('end', () => {
try {
let jsonRes = JSON.parse(data)
resolve(jsonRes)
} catch (err) {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
}
})
}).on('error', (err) => {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
})
req.end()
}
break
case 'GET /api/v3/order':
{
let query = querystring.stringify(options.parameters)
requestObject.path = `${options.endpoint}?${query}&signature=${crypto.createHmac('sha256', process.env.BINANCESECRET).update(query).digest('hex')}`
requestObject.headers = {
'X-MBX-APIKEY': process.env.BINANCEAPIKEY
}
let req = https.request(requestObject, res => {
let data = ''
res.on('data', (chunk) => {
data = data.concat(chunk)
})
res.on('end', () => {
try {
let jsonRes = JSON.parse(data)
resolve(jsonRes)
} catch (err) {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
}
})
}).on('error', (err) => {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
})
req.end()
}
break
case 'POST /api/v3/order':
{
let query = querystring.stringify(options.parameters)
requestObject.path = `${options.endpoint}?${query}&signature=${crypto.createHmac('sha256', process.env.BINANCESECRET).update(query).digest('hex')}`
requestObject.headers = {
'X-MBX-APIKEY': process.env.BINANCEAPIKEY
}
let req = https.request(requestObject, res => {
let data = ''
res.on('data', (chunk) => {
data = data.concat(chunk)
})
res.on('end', () => {
try {
let jsonRes = JSON.parse(data)
resolve(jsonRes)
} catch (err) {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
}
})
}).on('error', (err) => {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
})
req.end()
}
break
case 'GET /api/v3/openOrders':
{
let query = querystring.stringify(options.parameters)
requestObject.path = `${options.endpoint}?${query}&signature=${crypto.createHmac('sha256', process.env.BINANCESECRET).update(query).digest('hex')}`
requestObject.headers = {
'X-MBX-APIKEY': process.env.BINANCEAPIKEY
}
let req = https.request(requestObject, res => {
let data = ''
res.on('data', (chunk) => {
data = data.concat(chunk)
})
res.on('end', () => {
try {
let jsonRes = JSON.parse(data)
resolve(jsonRes)
} catch (err) {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
}
})
}).on('error', (err) => {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
})
req.end()
}
break
case 'GET /api/v3/allOrders':
{
let query = querystring.stringify(options.parameters)
requestObject.path = `${options.endpoint}?${query}&signature=${crypto.createHmac('sha256', process.env.BINANCESECRET).update(query).digest('hex')}`
requestObject.headers = {
'X-MBX-APIKEY': process.env.BINANCEAPIKEY
}
let req = https.request(requestObject, res => {
let data = ''
res.on('data', (chunk) => {
data = data.concat(chunk)
})
res.on('end', () => {
try {
let jsonRes = JSON.parse(data)
resolve(jsonRes)
} catch (err) {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
}
})
}).on('error', (err) => {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
})
req.end()
}
break
case 'GET /api/v3/account':
{
let query = querystring.stringify(options.parameters)
requestObject.path = `${options.endpoint}?${query}&signature=${crypto.createHmac('sha256', process.env.BINANCESECRET).update(query).digest('hex')}`
requestObject.headers = {
'X-MBX-APIKEY': process.env.BINANCEAPIKEY
}
let req = https.request(requestObject, res => {
let data = ''
res.on('data', (chunk) => {
data = data.concat(chunk)
})
res.on('end', () => {
try {
let jsonRes = JSON.parse(data)
resolve(jsonRes)
} catch (err) {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
}
})
}).on('error', (err) => {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
})
req.end()
}
break
case 'GET /api/v3/myTrades':
{
let query = querystring.stringify(options.parameters)
requestObject.path = `${options.endpoint}?${query}&signature=${crypto.createHmac('sha256', process.env.BINANCESECRET).update(query).digest('hex')}`
requestObject.headers = {
'X-MBX-APIKEY': process.env.BINANCEAPIKEY
}
let req = https.request(requestObject, res => {
let data = ''
res.on('data', (chunk) => {
data = data.concat(chunk)
})
res.on('end', () => {
try {
let jsonRes = JSON.parse(data)
resolve(jsonRes)
} catch (err) {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
}
})
}).on('error', (err) => {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
})
req.end()
}
break
case 'POST /api/v3/order/test':
{
let query = querystring.stringify(options.parameters)
requestObject.path = `${options.endpoint}?${query}&signature=${crypto.createHmac('sha256', process.env.BINANCESECRET).update(query).digest('hex')}`
requestObject.headers = {
'X-MBX-APIKEY': process.env.BINANCEAPIKEY
}
let req = https.request(requestObject, res => {
let data = ''
res.on('data', (chunk) => {
data = data.concat(chunk)
})
res.on('end', () => {
try {
let jsonRes = JSON.parse(data)
resolve(jsonRes)
} catch (err) {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
}
})
}).on('error', (err) => {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
})
req.end()
}
break
case 'DELETE /api/v3/order':
{
let query = querystring.stringify(options.parameters)
requestObject.path = `${options.endpoint}?${query}&signature=${crypto.createHmac('sha256', process.env.BINANCESECRET).update(query).digest('hex')}`
requestObject.headers = {
'X-MBX-APIKEY': process.env.BINANCEAPIKEY
}
let req = https.request(requestObject, res => {
let data = ''
res.on('data', (chunk) => {
data = data.concat(chunk)
})
res.on('end', () => {
try {
let jsonRes = JSON.parse(data)
resolve(jsonRes)
} catch (err) {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
}
})
}).on('error', (err) => {
reject(`binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}`)
})
req.end()
}
break
default:
{
console.log(`${options.method} ${options.endpoint}`)
}
}
} catch (error) {
reject(error)
}
})
}
let buyLimitTrailSell = (market, traillingProfitPercent) => {
try {
binanceAPI({ method: 'GET', endpoint: '/api/v1/ticker/price', parameters: { symbol: market } }).then(priceInfo => {
let inPrice = priceInfo.price
let highestPriceSoFar = inPrice
let traillingSellAtProfit = +highestPriceSoFar - percentOf(traillingProfitPercent, highestPriceSoFar)
let sellTime = new Date().getTime()
console.log(`\n${moment(sellTime).format('MM/DD/YYYY hh:mm:ss a')}\n${market} bought at ${inPrice}`.black.yellowBG)
let done = false
let priceCheckInterval = setInterval(() => {
binanceAPI({ method: 'GET', endpoint: '/api/v1/ticker/price', parameters: { symbol: market } }).then(priceInfo => {
if (priceInfo.price > highestPriceSoFar) {
highestPriceSoFar = priceInfo.price
traillingSellAtProfit = +highestPriceSoFar - percentOf(traillingProfitPercent, highestPriceSoFar)
console.log(`${percentChange(inPrice,traillingSellAtProfit)}`)
}
if (priceInfo.price <= traillingSellAtProfit && percentChange(inPrice, priceInfo.price) >= 0.02 && done === false) {
done = true
clearInterval(priceCheckInterval)
console.log(`\n${moment().format('MM/DD/YYYY hh:mm:ss a')}\n${market} sold at ${priceInfo.price} for ${percentChange(inPrice, priceInfo.price)}% `.greenBG + 'profit'.rainbow.whiteBG)
sellLimitTrailBuy(market, traillingProfitPercent)
}
}).catch(err => {
console.log(err)
})
}, 500)
}).catch(err => {
console.log(err)
})
} catch (err) {
console.log(err)
}
}
let sellLimitTrailBuy = (market, traillingProfitPercent) => {
try {
binanceAPI({ method: 'GET', endpoint: '/api/v1/ticker/price', parameters: { symbol: market } }).then(priceInfo => {
let inPrice = priceInfo.price
let lowestPriceSoFar = inPrice
let traillingBuyAtProfit = +lowestPriceSoFar + percentOf(traillingProfitPercent, lowestPriceSoFar)
let sellTime = new Date().getTime()
console.log(`\n${moment(sellTime).format('MM/DD/YYYY hh:mm:ss a')}\n${market} sold at ${inPrice}`.black.yellowBG)
let done = false
let priceCheckInterval = setInterval(() => {
binanceAPI({ method: 'GET', endpoint: '/api/v1/ticker/price', parameters: { symbol: market } }).then(priceInfo => {
if (priceInfo.price < lowestPriceSoFar) {
lowestPriceSoFar = priceInfo.price
traillingBuyAtProfit = +lowestPriceSoFar + percentOf(traillingProfitPercent, lowestPriceSoFar)
console.log(`${percentChange(inPrice,traillingBuyAtProfit)}`)
}
if (priceInfo.price >= traillingBuyAtProfit && percentChange(priceInfo.price, inPrice) >= 0.02 && done === false) {
done = true
clearInterval(priceCheckInterval)
console.log(`\n${moment().format('MM/DD/YYYY hh:mm:ss a')}\n${market} bought at ${priceInfo.price} for ${percentChange(priceInfo.price,inPrice)}% `.greenBG + 'profit'.rainbow.whiteBG)
buyLimitTrailSell(market, traillingProfitPercent)
}
}).catch(err => {
console.log(err)
})
}, 500)
}).catch(err => {
console.log(err)
})
} catch (err) {
console.log(err)
}
}
console.clear()
buyLimitTrailSell(process.argv[2], process.argv[3])
@onthetunnel
Copy link

hello dear , can i know how to set the api key and secret and run it please ? Thanks You!

@onthetunnel
Copy link

after i run it ,i got error
reject(binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data})
^

@anticlergygang
Copy link
Author

@onthetunnel

hello dear , can i know how to set the api key and secret and run it please ? Thanks You!

Hello, you can either add them into your operating systems environment variables as BINANCEAPIKEY and BINANCESECRET, or just replace all occurrences of 'process.env.BINANCEAPIKEY' and 'process.env.BINANCESECRET' to your KEY and SECRET.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment