diff --git a/freqtrade/exchange/__init__.py b/freqtrade/exchange/__init__.py index b29cd82c9..34a3bbab3 100644 --- a/freqtrade/exchange/__init__.py +++ b/freqtrade/exchange/__init__.py @@ -21,6 +21,12 @@ API_RETRY_COUNT = 4 # Holds all open sell orders for dry_run _DRY_RUN_OPEN_ORDERS: Dict[str, Any] = {} +# Urls to exchange markets, insert quote and base with .format() +_EXCHANGE_URLS = { + ccxt.bittrex().id: '/Market/Index?MarketName={quote}-{base}', + ccxt.binance().id: '/tradeDetail.html?symbol={base}_{quote}' +} + def retrier(f): def wrapper(*args, **kwargs): @@ -295,9 +301,15 @@ def get_order(order_id: str, pair: str) -> Dict: raise OperationalException(e) -# TODO: reimplement, not part of ccxt def get_pair_detail_url(pair: str) -> str: - return "" + try: + url_base = _API.urls.get('www') + base, quote = pair.split('/') + + return url_base + _EXCHANGE_URLS[_API.id].format(base=base, quote=quote) + except KeyError: + logger.warning('Could not get exchange url for %s', get_name()) + return "" def get_markets() -> List[dict]: @@ -312,7 +324,11 @@ def get_markets() -> List[dict]: def get_name() -> str: - return _API.__class__.__name__.capitalize() + return _API.name + + +def get_id() -> str: + return _API.id def get_fee_maker() -> float: diff --git a/freqtrade/tests/exchange/test_exchange.py b/freqtrade/tests/exchange/test_exchange.py index 31332ddbe..1d53b33e5 100644 --- a/freqtrade/tests/exchange/test_exchange.py +++ b/freqtrade/tests/exchange/test_exchange.py @@ -9,7 +9,7 @@ import pytest from freqtrade import OperationalException, DependencyException, NetworkException from freqtrade.exchange import init, validate_pairs, buy, sell, get_balance, get_balances, \ - get_ticker, get_ticker_history, cancel_order, get_name, get_fee + get_ticker, get_ticker_history, cancel_order, get_name, get_fee, get_id, get_pair_detail_url import freqtrade.exchange as exchange from freqtrade.tests.conftest import log_has @@ -429,6 +429,41 @@ def test_get_name(default_conf, mocker): assert get_name() == 'Binance' +def test_get_id(default_conf, mocker): + mocker.patch('freqtrade.exchange.validate_pairs', + side_effect=lambda s: True) + default_conf['exchange']['name'] = 'binance' + init(default_conf) + + assert get_id() == 'binance' + + +def test_get_pair_detail_url(default_conf, mocker): + mocker.patch('freqtrade.exchange.validate_pairs', + side_effect=lambda s: True) + default_conf['exchange']['name'] = 'binance' + init(default_conf) + + url = get_pair_detail_url('TKN/ETH') + assert 'TKN' in url + assert 'ETH' in url + + url = get_pair_detail_url('LOOONG/BTC') + assert 'LOOONG' in url + assert 'BTC' in url + + default_conf['exchange']['name'] = 'bittrex' + init(default_conf) + + url = get_pair_detail_url('TKN/ETH') + assert 'TKN' in url + assert 'ETH' in url + + url = get_pair_detail_url('LOOONG/BTC') + assert 'LOOONG' in url + assert 'BTC' in url + + def test_get_fee(default_conf, mocker): api_mock = MagicMock() api_mock.calculate_fee = MagicMock(return_value={