diff --git a/libcryptomarket/api/__init__.py b/libcryptomarket/api/__init__.py index f6d1768..76a7b4c 100644 --- a/libcryptomarket/api/__init__.py +++ b/libcryptomarket/api/__init__.py @@ -2,6 +2,7 @@ # flake8: noqa from libcryptomarket.api.bitfinex_api import BitfinexApi from libcryptomarket.api.bitmex_api import BitmexApi +from libcryptomarket.api.bittrex_api import BittrexApi from libcryptomarket.api.coinmarketcap_api import CoinMarketCapApi from libcryptomarket.api.gdax_api import GdaxApi from libcryptomarket.api.poloniex_api import PoloniexApi diff --git a/libcryptomarket/api/bittrex_api.py b/libcryptomarket/api/bittrex_api.py new file mode 100644 index 0000000..35bc32a --- /dev/null +++ b/libcryptomarket/api/bittrex_api.py @@ -0,0 +1,83 @@ +#!/bin/python +from libcryptomarket.api.exchange_api import ExchangeApi + + +class BittrexApi(ExchangeApi): + """Bittrex API. + """ + + def __init__(self, public_key=None, private_key=None, logger=None): + """Constructor. + + :param public_key: Public key. + :param private_key: Private key. + :param logger: Logger. + """ + ExchangeApi.__init__(self, public_key, private_key, logger) + + @classmethod + def get_url(cls): + """Get API url. + """ + return "https://bittrex.com/api" + + @classmethod + def get_public_calls(cls): + """Get public API calls. + """ + return { + 'getmarkets': 'GET', + 'getcurrencies': 'GET', + 'getticker': 'GET', + 'getmarketsummaries': 'GET', + 'getmarketsummary': 'GET', + 'getorderbook': 'GET', + 'getmarkethistory': 'GET', + 'getticks': 'GET', + } + + @classmethod + def get_private_calls(cls): + """Get public API calls. + """ + return {} + + @classmethod + def translate_call_name(cls, name): + """Translate API call name. + + The class method name is always underscored (aligned with Python + standard.) This method is to translate underscored name to exchange + API call name. + + :param name: Method name (underscored). + """ + return name.replace("_", "") + + def _request_public(self, name, http_method, **kwargs): + """Request public API call. + + :param name: Method name. + :param http_method: HTTP method (POST, GET, DELETE). + """ + self.log_info("Public request:\n" + + "name: {}\n".format(name) + + "http_method: {}\n".format(http_method) + + "kwargs: {}".format(kwargs)) + + if name == 'getticks': + return self._send_request( + command="/v2/public/" + name, http_method=http_method, + public_method=True, params=kwargs) + + return self._send_request( + command="/v1.1/public/" + name, http_method=http_method, + public_method=True, params=kwargs) + + def _request_private(self, name, http_method, **kwargs): + """Request private API call. + + :param name: Method name. + :param http_method: HTTP method (POST, GET, DELETE). + """ + raise NotImplementedError("Not support private api at this moment.") diff --git a/libcryptomarket/core/order_book.py b/libcryptomarket/core/order_book.py index 0b985bd..df85237 100644 --- a/libcryptomarket/core/order_book.py +++ b/libcryptomarket/core/order_book.py @@ -12,6 +12,8 @@ def order_book(source, symbol, depth=5): if source_name == "poloniex": return _order_book_poloniex(source, symbol, depth) + elif source_name == "bittrex": + return _order_book_bittrex(source, symbol, depth) else: raise ValueError("Source (%s [%s]) does not support order book" % (source, source_name)) @@ -38,3 +40,21 @@ def _order_book_poloniex(source, symbol, depth=5): data = pd.concat(data, axis=1).astype('float64') return data + + +def _order_book_bittrex(source, symbol, depth=5): + """Return the order book from Poloniex + + :param source: Source, an Exchange API object. + :param symbol: Symbol. + :param depth: Depth of the order book. + """ + response = source.get_order_book(market=symbol, type="both") + response.raise_for_status() + data = response.json()['result'] + data = pd.concat([pd.DataFrame(data['buy']), pd.DataFrame(data['sell'])], + axis=1, + keys=['bids', 'asks']) + data.index = data.index + 1 + + return data