diff --git a/freqtrade/fiat_convert.py b/freqtrade/fiat_convert.py index 6f9d3d3d5..4874247db 100644 --- a/freqtrade/fiat_convert.py +++ b/freqtrade/fiat_convert.py @@ -5,7 +5,7 @@ e.g BTC to USD import logging import time -from pymarketcap import Pymarketcap +from coinmarketcap import Market logger = logging.getLogger(__name__) @@ -72,11 +72,17 @@ class CryptoToFiatConverter(object): "RUB", "SEK", "SGD", "THB", "TRY", "TWD", "ZAR", "USD" ] + CRYPTOMAP = { + 'BTC': 'bitcoin', + 'ETH': 'ethereum', + 'USDT': 'thether' + } + def __new__(cls): if CryptoToFiatConverter.__instance is None: CryptoToFiatConverter.__instance = object.__new__(cls) try: - CryptoToFiatConverter._coinmarketcap = Pymarketcap() + CryptoToFiatConverter._coinmarketcap = Market() except BaseException: CryptoToFiatConverter._coinmarketcap = None return CryptoToFiatConverter.__instance @@ -171,12 +177,16 @@ class CryptoToFiatConverter(object): # Check if the fiat convertion you want is supported if not self._is_supported_fiat(fiat=fiat_symbol): raise ValueError('The fiat {} is not supported.'.format(fiat_symbol)) + + if crypto_symbol not in self.CRYPTOMAP: + raise ValueError( + 'The crypto symbol {} is not supported.'.format(crypto_symbol)) try: return float( self._coinmarketcap.ticker( - currency=crypto_symbol, + currency=self.CRYPTOMAP[crypto_symbol], convert=fiat_symbol - )['price_' + fiat_symbol.lower()] + )[0]['price_' + fiat_symbol.lower()] ) except BaseException: return 0.0 diff --git a/freqtrade/tests/rpc/test_rpc.py b/freqtrade/tests/rpc/test_rpc.py index 06994ce8e..8102e8885 100644 --- a/freqtrade/tests/rpc/test_rpc.py +++ b/freqtrade/tests/rpc/test_rpc.py @@ -189,9 +189,8 @@ def test_rpc_daily_profit(default_conf, update, ticker, limit_buy_order, limit_s mocker.patch.multiple('freqtrade.main.exchange', validate_pairs=MagicMock(), get_ticker=ticker) - mocker.patch.multiple('freqtrade.fiat_convert.Pymarketcap', - ticker=MagicMock(return_value={'price_usd': 15000.0}), - _cache_symbols=MagicMock(return_value={'BTC': 1})) + mocker.patch.multiple('freqtrade.fiat_convert.Market', + ticker=MagicMock(return_value={'price_usd': 15000.0})) mocker.patch('freqtrade.fiat_convert.CryptoToFiatConverter._find_price', return_value=15000.0) main.init(default_conf, create_engine('sqlite://')) stake_currency = default_conf['stake_currency'] @@ -242,9 +241,8 @@ def test_rpc_trade_statistics( mocker.patch.multiple('freqtrade.main.exchange', validate_pairs=MagicMock(), get_ticker=ticker) - mocker.patch.multiple('freqtrade.fiat_convert.Pymarketcap', - ticker=MagicMock(return_value={'price_usd': 15000.0}), - _cache_symbols=MagicMock(return_value={'BTC': 1})) + mocker.patch.multiple('freqtrade.fiat_convert.Market', + ticker=MagicMock(return_value={'price_usd': 15000.0})) mocker.patch('freqtrade.fiat_convert.CryptoToFiatConverter._find_price', return_value=15000.0) main.init(default_conf, create_engine('sqlite://')) stake_currency = default_conf['stake_currency'] @@ -298,9 +296,8 @@ def test_rpc_trade_statistics_closed( mocker.patch.multiple('freqtrade.main.exchange', validate_pairs=MagicMock(), get_ticker=ticker) - mocker.patch.multiple('freqtrade.fiat_convert.Pymarketcap', - ticker=MagicMock(return_value={'price_usd': 15000.0}), - _cache_symbols=MagicMock(return_value={'BTC': 1})) + mocker.patch.multiple('freqtrade.fiat_convert.Market', + ticker=MagicMock(return_value={'price_usd': 15000.0})) mocker.patch('freqtrade.fiat_convert.CryptoToFiatConverter._find_price', return_value=15000.0) main.init(default_conf, create_engine('sqlite://')) stake_currency = default_conf['stake_currency'] @@ -356,9 +353,8 @@ def test_rpc_balance_handle(default_conf, update, mocker): mocker.patch.dict('freqtrade.main._CONF', default_conf) mocker.patch.multiple('freqtrade.main.exchange', get_balances=MagicMock(return_value=mock_balance)) - mocker.patch.multiple('freqtrade.fiat_convert.Pymarketcap', - ticker=MagicMock(return_value={'price_usd': 15000.0}), - _cache_symbols=MagicMock(return_value={'BTC': 1})) + mocker.patch.multiple('freqtrade.fiat_convert.Market', + ticker=MagicMock(return_value={'price_usd': 15000.0})) (error, res) = rpc.rpc_balance(default_conf['fiat_display_currency']) assert not error diff --git a/freqtrade/tests/rpc/test_rpc_telegram.py b/freqtrade/tests/rpc/test_rpc_telegram.py index 9a1dbcc69..82d6dd865 100644 --- a/freqtrade/tests/rpc/test_rpc_telegram.py +++ b/freqtrade/tests/rpc/test_rpc_telegram.py @@ -166,9 +166,8 @@ def test_profit_handle( mocker.patch.multiple('freqtrade.main.exchange', validate_pairs=MagicMock(), get_ticker=ticker) - mocker.patch.multiple('freqtrade.fiat_convert.Pymarketcap', - ticker=MagicMock(return_value={'price_usd': 15000.0}), - _cache_symbols=MagicMock(return_value={'BTC': 1})) + mocker.patch.multiple('freqtrade.fiat_convert.Market', + ticker=MagicMock(return_value={'price_usd': 15000.0})) mocker.patch('freqtrade.fiat_convert.CryptoToFiatConverter._find_price', return_value=15000.0) init(default_conf, create_engine('sqlite://')) @@ -395,9 +394,8 @@ def test_daily_handle(default_conf, update, ticker, limit_buy_order, limit_sell_ mocker.patch.multiple('freqtrade.main.exchange', validate_pairs=MagicMock(), get_ticker=ticker) - mocker.patch.multiple('freqtrade.fiat_convert.Pymarketcap', - ticker=MagicMock(return_value={'price_usd': 15000.0}), - _cache_symbols=MagicMock(return_value={'BTC': 1})) + mocker.patch.multiple('freqtrade.fiat_convert.Market', + ticker=MagicMock(return_value={'price_usd': 15000.0})) mocker.patch('freqtrade.fiat_convert.CryptoToFiatConverter._find_price', return_value=15000.0) init(default_conf, create_engine('sqlite://')) @@ -459,9 +457,8 @@ def test_daily_wrong_input(default_conf, update, ticker, mocker): mocker.patch.multiple('freqtrade.main.exchange', validate_pairs=MagicMock(), get_ticker=ticker) - mocker.patch.multiple('freqtrade.fiat_convert.Pymarketcap', - ticker=MagicMock(return_value={'price_usd': 15000.0}), - _cache_symbols=MagicMock(return_value={'BTC': 1})) + mocker.patch.multiple('freqtrade.fiat_convert.Market', + ticker=MagicMock(return_value={'price_usd': 15000.0})) mocker.patch('freqtrade.fiat_convert.CryptoToFiatConverter._find_price', return_value=15000.0) init(default_conf, create_engine('sqlite://')) @@ -656,9 +653,8 @@ def test_telegram_balance_handle(default_conf, update, mocker): send_msg=msg_mock) mocker.patch.multiple('freqtrade.main.exchange', get_balances=MagicMock(return_value=mock_balance)) - mocker.patch.multiple('freqtrade.fiat_convert.Pymarketcap', - ticker=MagicMock(return_value={'price_usd': 15000.0}), - _cache_symbols=MagicMock(return_value={'BTC': 1})) + mocker.patch.multiple('freqtrade.fiat_convert.Market', + ticker=MagicMock(return_value={'price_usd': 15000.0})) mocker.patch('freqtrade.main.exchange.get_ticker', side_effect=mock_ticker) _balance(bot=MagicMock(), update=update) diff --git a/freqtrade/tests/test_fiat_convert.py b/freqtrade/tests/test_fiat_convert.py index 7d0acfc91..49a2adc05 100644 --- a/freqtrade/tests/test_fiat_convert.py +++ b/freqtrade/tests/test_fiat_convert.py @@ -71,12 +71,15 @@ def test_fiat_convert_find_price(mocker): 'price_usd': 12345.0, 'price_eur': 13000.2 }) - mocker.patch('freqtrade.fiat_convert.Pymarketcap.ticker', api_mock) + mocker.patch('freqtrade.fiat_convert.Market.ticker', api_mock) fiat_convert = CryptoToFiatConverter() with pytest.raises(ValueError, match=r'The fiat ABC is not supported.'): fiat_convert._find_price(crypto_symbol='BTC', fiat_symbol='ABC') + with pytest.raises(ValueError, match=r'The crypto symbol XRP is not supported.'): + fiat_convert.get_price(crypto_symbol='XRP', fiat_symbol='USD') + mocker.patch('freqtrade.fiat_convert.CryptoToFiatConverter._find_price', return_value=12345.0) assert fiat_convert.get_price(crypto_symbol='BTC', fiat_symbol='USD') == 12345.0 assert fiat_convert.get_price(crypto_symbol='btc', fiat_symbol='usd') == 12345.0 @@ -90,7 +93,7 @@ def test_fiat_convert_get_price(mocker): 'price_usd': 28000.0, 'price_eur': 15000.0 }) - mocker.patch('freqtrade.fiat_convert.Pymarketcap.ticker', api_mock) + mocker.patch('freqtrade.fiat_convert.Market.ticker', api_mock) mocker.patch('freqtrade.fiat_convert.CryptoToFiatConverter._find_price', return_value=28000.0) fiat_convert = CryptoToFiatConverter() diff --git a/freqtrade/tests/test_main.py b/freqtrade/tests/test_main.py index 00b551642..5f490a183 100644 --- a/freqtrade/tests/test_main.py +++ b/freqtrade/tests/test_main.py @@ -284,9 +284,8 @@ def test_handle_trade(default_conf, limit_buy_order, limit_sell_order, mocker): }), buy=MagicMock(return_value='mocked_limit_buy'), sell=MagicMock(return_value='mocked_limit_sell')) - mocker.patch.multiple('freqtrade.fiat_convert.Pymarketcap', - ticker=MagicMock(return_value={'price_usd': 15000.0}), - _cache_symbols=MagicMock(return_value={'BTC': 1})) + mocker.patch.multiple('freqtrade.fiat_convert.Market', + ticker=MagicMock(return_value={'price_usd': 15000.0})) init(default_conf, create_engine('sqlite://')) create_trade(0.001, int(default_conf['ticker_interval'])) diff --git a/requirements.txt b/requirements.txt index b2a2429c7..29361ecdb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -19,7 +19,7 @@ hyperopt==0.1 # do not upgrade networkx before this is fixed https://github.com/hyperopt/hyperopt/issues/325 networkx==1.11 tabulate==0.8.2 -pymarketcap==3.3.158 +coinmarketcap==4.2.1 # Required for plotting data #plotly==2.3.0 diff --git a/setup.py b/setup.py index e53606dea..4b0635efa 100644 --- a/setup.py +++ b/setup.py @@ -35,7 +35,7 @@ setup(name='freqtrade', 'TA-Lib', 'tabulate', 'cachetools', - 'pymarketcap', + 'coinmarketcap', ], include_package_data=True, zip_safe=False,