UNPKG

tlab-trading-toolkit

Version:

A trading toolkit for building advanced trading bots on the GDAX platform

140 lines (139 loc) 5.52 kB
"use strict"; 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;