tlab-trading-toolkit
Version:
A trading toolkit for building advanced trading bots on the GDAX platform
140 lines (139 loc) • 5.52 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const Bittrex = require("node-bittrex-api");
const types_1 = require("../../lib/types");
const BookBuilder_1 = require("../../lib/BookBuilder");
const ProductMap_1 = require("../ProductMap");
class BittrexAPI {
static product(genericProduct) {
return ProductMap_1.ProductMap.ExchangeMap.get('Bittrex').getExchangeProduct(genericProduct) || genericProduct;
}
static genericProduct(exchangeProduct) {
return ProductMap_1.ProductMap.ExchangeMap.get('Bittrex').getGenericProduct(exchangeProduct) || exchangeProduct;
}
static getMarket(genericProduct) {
return ProductMap_1.ProductMap.ExchangeMap.get('Bittrex').getMarket(genericProduct);
}
static getMarketForExchangeProduct(exchangeProduct) {
return ProductMap_1.ProductMap.ExchangeMap.get('Bittrex').getMarket(BittrexAPI.genericProduct(exchangeProduct));
}
constructor(auth, logger) {
this.owner = 'Bittrex';
this.logger = logger;
Bittrex.options({
apikey: auth.key || 'APIKEY',
apisecret: auth.secret || 'APISECRET',
inverse_callback_arguments: true,
stream: false,
cleartext: false,
verbose: false
});
}
loadProducts() {
return new Promise((resolve, reject) => {
Bittrex.getmarkets((err, data) => {
if (err) {
return reject(err);
}
if (!data.success || !data.result) {
return reject(new Error('Unexpected response from Bittrex: ' + JSON.stringify(data)));
}
const result = data.result.map((market) => {
let genericProduct = ProductMap_1.ProductMap.ExchangeMap.get('Bittrex').getGenericProduct(market.MarketName);
let genericProductMeta = ProductMap_1.ProductMap.ExchangeMap.get('Bittrex').getMarket(genericProduct);
return {
id: genericProduct,
baseCurrency: genericProductMeta.base,
quoteCurrency: genericProductMeta.quote,
baseMinSize: types_1.Big(market.MinTradeSize),
baseMaxSize: types_1.Big('1e18'),
quoteIncrement: types_1.Big(market.MinTradeSize)
};
});
return resolve(result);
});
});
}
loadMidMarketPrice(genericProduct) {
return this.loadTicker(genericProduct).then((ticker) => {
return ticker.bid.plus(ticker.ask).times(0.5);
});
}
loadOrderbook(genericProduct) {
const product = BittrexAPI.product(genericProduct);
return new Promise((resolve, reject) => {
Bittrex.getorderbook({
market: product,
type: 'both',
depth: 5000
}, (err, data) => {
if (err) {
return reject(err);
}
if (!data.success || !data.result) {
return reject(new Error('Unexpected response from Bittrex: ' + JSON.stringify(data)));
}
const bids = data.result.buy;
const asks = data.result.sell;
const book = new BookBuilder_1.BookBuilder(this.logger);
bids.forEach((order) => {
book.add({
id: order.Rate,
price: types_1.Big(order.Rate),
size: types_1.Big(order.Quantity),
side: 'buy'
});
});
asks.forEach((order) => {
book.add({
id: order.Rate,
price: types_1.Big(order.Rate),
size: types_1.Big(order.Quantity),
side: 'sell'
});
});
return resolve(book);
});
});
}
loadTicker(genericProduct) {
const product = BittrexAPI.product(genericProduct);
return new Promise((resolve, reject) => {
Bittrex.getticker({ market: product }, (err, data) => {
if (err) {
return reject(err);
}
if (!data.success || !data.result) {
return reject(new Error('Unexpected response from Bittrex: ' + JSON.stringify(data)));
}
const result = {
productId: genericProduct,
ask: types_1.Big(data.result.Ask),
bid: types_1.Big(data.result.Bid),
price: types_1.Big(data.result.Last),
time: new Date()
};
return resolve(result);
});
});
}
placeOrder(order) {
throw new Error('Method not implemented.');
}
cancelOrder(id) {
throw new Error('Method not implemented.');
}
cancelAllOrders(product) {
throw new Error('Method not implemented.');
}
loadOrder(id) {
throw new Error('Method not implemented.');
}
loadAllOrders(genericProduct) {
throw new Error('Method not implemented.');
}
loadBalances() {
throw new Error('Method not implemented.');
}
}
exports.BittrexAPI = BittrexAPI;