-
-
Save klovanone/0d7cef7cfc426d9804d57284fa1804c2 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]) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment