tlab-trading-toolkit
Version:
A trading toolkit for building advanced trading bots on the GDAX platform
189 lines (188 loc) • 6.88 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const program = require("commander");
const GDAXExchangeAPI_1 = require("../exchanges/gdax/GDAXExchangeAPI");
const printers_1 = require("../utils/printers");
program
.option('--api [value]', 'API url')
.option('-p --product [value]', 'The GDAX product to query')
.option('-t --ticker', 'Fetch ticker')
.option('-N --newMarketOrder [side,size]', 'Place a new market order')
.option('-L --newLimitOrder [side,size,price]', 'Place a new limit order')
.option('-B --balances', 'Retrieve all account balances')
.option('-O --orders', 'Retrieve all my open orders (if product is provided, limited to that book)')
.option('-x --cancelAllOrders', 'Cancel all open orders (if product is provided, limited to that book)')
.option('-W --crypto_withdraw [amount,cur,address]', 'Withdraw to a crypto address')
.option('--transfer [type,amount,cur,coinbase_id]', 'deposit or withdraw from/to coinbase')
.option('-X --method [method]', 'method for general request')
.option('-U --url [url]', 'request url')
.option('-P --body [body]', 'request body')
.parse(process.argv);
const auth = {
key: process.env.GDAX_KEY,
secret: process.env.GDAX_SECRET,
passphrase: process.env.GDAX_PASSPHRASE
};
const gdaxConfig = {
logger: null,
apiUrl: program.api || process.env.API_URL || 'https://api.gdax.com',
};
if (auth.key && auth.secret && auth.passphrase) {
gdaxConfig.auth = auth;
}
const gdaxApi = new GDAXExchangeAPI_1.GDAXExchangeAPI(gdaxConfig);
if (program.url) {
const method = program.method || 'GET';
const body = program.body || '';
makeGenericRequest(method, program.url, body).then((json) => {
console.log(json);
process.exit(0);
});
}
function hasAuth() {
if (gdaxConfig.auth) {
return true;
}
console.log('No authentication credentials were supplied, so cannot fulfil request');
return false;
}
function logError(err) {
console.error(printers_1.printSeparator());
console.error('Error: ' + err.message);
if (err && (err.response && err.response.error)) {
console.error(err.response.error.message);
}
console.error(printers_1.printSeparator());
}
function requiredOptions(options) {
let valid = true;
options.forEach((opt) => {
if (!program[opt]) {
console.log(`${opt} is a required option`);
valid = false;
}
});
return valid;
}
function makeGenericRequest(method, url, body) {
const opts = {
body: body,
qs: null,
headers: null
};
return gdaxApi.authCall(method, url, opts).then((res) => {
return res.body;
}).catch((res) => {
const err = res.response.error || res.response.body;
return { error: err.text || err.json || err };
});
}
if (program.ticker) {
if (!requiredOptions(['product'])) {
process.exit(1);
}
gdaxApi.loadTicker(program.product).then((ticker) => {
console.log(printers_1.printSeparator());
console.log(`Ticker for ${program.product} on GDAX`);
console.log(printers_1.printTicker(ticker));
console.log(printers_1.printSeparator());
}).catch(logError);
}
if (program.transfer) {
if (!requiredOptions(['product'])) {
process.exit(1);
}
let { type, amount, cur, coinbase_id } = program.transfer.split(',');
type = type.lowerCase().startsWith('dep') ? 'deposits' : 'withdrawals';
const options = {
amount: String(+amount),
currency: cur,
coinbase_account_id: coinbase_id
};
makeGenericRequest('POST', `${type}/coinbase-account`, JSON.stringify(options)).then((res) => {
console.log(printers_1.printSeparator());
console.log(res);
}).catch(logError);
}
if (program.newMarketOrder && hasAuth()) {
if (!requiredOptions(['product'])) {
process.exit(1);
}
const vals = program.newMarketOrder.split(',');
const params = {
time: new Date(),
clientId: null,
side: vals[0],
size: vals[1],
type: 'market',
productId: program.product,
price: null,
orderType: 'market'
};
const msg = `Market ${params.side} order for ${params.size}`;
gdaxApi.placeOrder(params).then((result) => {
console.log(printers_1.printSeparator());
console.log(msg);
console.log(result);
}).catch(logError);
}
if (program.newLimitOrder && hasAuth()) {
if (!requiredOptions(['product'])) {
process.exit(1);
}
const [side, size, price] = program.newLimitOrder.split(',');
const params = {
time: new Date(),
clientId: null,
side: side,
size: size,
type: 'market',
productId: program.product,
price: price,
orderType: 'limit'
};
const msg = `Limit ${params.side} order for ${params.size} at ${params.price}`;
gdaxApi.placeOrder(params).then((result) => {
console.log(printers_1.printSeparator());
console.log(msg);
console.log(result);
}).catch(logError);
}
if (program.balances && hasAuth()) {
console.log('Retrieving account balances..');
gdaxApi.loadBalances().then((balances) => {
console.log(printers_1.printSeparator());
for (const profile in balances) {
const account = balances[profile];
for (const cur in account) {
const bal = account[cur];
console.log(`Balances for ${cur} in ${profile}:`);
console.log(`Available: ${printers_1.padfloat(bal.available, 8, 4)} ${cur}`);
console.log(`Total: ${printers_1.padfloat(bal.balance, 8, 4)} ${cur}\n`);
}
}
console.log(printers_1.printSeparator());
}).catch(logError);
}
if (program.orders && hasAuth()) {
console.log('Retrieving open orders..');
console.log(printers_1.printSeparator());
gdaxApi.loadAllOrders(program.product).then((orders) => {
console.log('Product-ID\tStatus \tSide\tPrice \tSize \tTime of order \tOrder-ID');
orders.forEach((order) => {
console.log(`${order.productId}\t${order.status}\t${order.side}\t${printers_1.padfloat(order.price, 8, 4)}\t${printers_1.padfloat(order.size, 8, 4)}\t${order.time.toString()}\t${order.id}`);
});
console.log(printers_1.printSeparator());
}).catch(logError);
}
if (program.cancelAllOrders && hasAuth()) {
console.log('Cancelling open orders..');
console.log(printers_1.printSeparator());
gdaxApi.cancelAllOrders(program.product).then((orders) => {
orders.forEach((order) => {
console.log(order);
});
console.log(printers_1.printSeparator());
}).catch(logError);
}