Last active
December 17, 2018 23:57
-
-
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"'
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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]) |
after i run it ,i got error
reject(binanceRequest err: ${util.inspect(err)}\nbinanceRequest data recieved b4 error: ${data}
)
^
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
hello dear , can i know how to set the api key and secret and run it please ? Thanks You!