diff --git a/freqtrade/fiat_convert.py b/freqtrade/fiat_convert.py index 0132e531d..6c5383860 100644 --- a/freqtrade/fiat_convert.py +++ b/freqtrade/fiat_convert.py @@ -87,7 +87,7 @@ class CryptoToFiatConverter(): fiat_symbol = fiat_symbol.upper() # Check if the fiat convertion you want is supported - if not self._is_supported_fiat(fiat=fiat_symbol): + if not CryptoToFiatConverter.is_supported_fiat(fiat=fiat_symbol): raise ValueError('The fiat {} is not supported.'.format(fiat_symbol)) # Get the pair that interest us and return the price in fiat @@ -131,7 +131,7 @@ class CryptoToFiatConverter(): return price - def _is_supported_fiat(self, fiat: str) -> bool: + def is_supported_fiat(fiat: str) -> bool: """ Check if the FIAT your want to convert to is supported :param fiat: FIAT to check (e.g USD) @@ -140,7 +140,7 @@ class CryptoToFiatConverter(): fiat = fiat.upper() - return fiat in self.SUPPORTED_FIAT + return fiat in CryptoToFiatConverter.SUPPORTED_FIAT def _find_price(self, crypto_symbol: str, fiat_symbol: str) -> float: """ @@ -150,7 +150,7 @@ class CryptoToFiatConverter(): :return: float, price of the crypto-currency in Fiat """ # Check if the fiat convertion you want is supported - if not self._is_supported_fiat(fiat=fiat_symbol): + if not CryptoToFiatConverter.is_supported_fiat(fiat=fiat_symbol): raise ValueError('The fiat {} is not supported.'.format(fiat_symbol)) try: return float( diff --git a/freqtrade/main.py b/freqtrade/main.py index 27f3dfd9a..bcc0d33df 100755 --- a/freqtrade/main.py +++ b/freqtrade/main.py @@ -328,13 +328,26 @@ def create_trade(stake_amount: float, interval: int) -> bool: break else: return False - # Calculate amount buy_limit = get_target_bid(exchange.get_ticker(pair)) amount = stake_amount / buy_limit order_id = exchange.buy(pair, buy_limit, amount) + # Fee is applied twice because we make a LIMIT_BUY and LIMIT_SELL + trade = Trade( + pair=pair, + stake_amount=stake_amount, + amount=amount, + fee=exchange.get_fee(), + open_rate=buy_limit, + open_date=datetime.utcnow(), + exchange=exchange.get_name().upper(), + open_order_id=order_id + ) + Trade.session.add(trade) + Trade.session.flush() + fiat_converter = CryptoToFiatConverter() stake_amount_fiat = fiat_converter.convert_amount( stake_amount, @@ -350,19 +363,7 @@ def create_trade(stake_amount: float, interval: int) -> bool: buy_limit, stake_amount, _CONF['stake_currency'], stake_amount_fiat, _CONF['fiat_display_currency'] )) - # Fee is applied twice because we make a LIMIT_BUY and LIMIT_SELL - trade = Trade( - pair=pair, - stake_amount=stake_amount, - amount=amount, - fee=exchange.get_fee(), - open_rate=buy_limit, - open_date=datetime.utcnow(), - exchange=exchange.get_name().upper(), - open_order_id=order_id - ) - Trade.session.add(trade) - Trade.session.flush() + return True diff --git a/freqtrade/tests/rpc/test_rpc_telegram.py b/freqtrade/tests/rpc/test_rpc_telegram.py index 9c99be342..065a038ec 100644 --- a/freqtrade/tests/rpc/test_rpc_telegram.py +++ b/freqtrade/tests/rpc/test_rpc_telegram.py @@ -87,6 +87,7 @@ def test_status_handle(default_conf, update, ticker, mocker): mocker.patch.multiple('freqtrade.main.exchange', validate_pairs=MagicMock(), get_ticker=ticker) + mocker.patch('freqtrade.fiat_convert.Pymarketcap', MagicMock()) init(default_conf, create_engine('sqlite://')) update_state(State.STOPPED) @@ -124,6 +125,7 @@ def test_status_table_handle(default_conf, update, ticker, mocker): validate_pairs=MagicMock(), get_ticker=ticker, buy=MagicMock(return_value='mocked_order_id')) + mocker.patch('freqtrade.fiat_convert.Pymarketcap', MagicMock()) init(default_conf, create_engine('sqlite://')) update_state(State.STOPPED) _status_table(bot=MagicMock(), update=update) @@ -386,6 +388,7 @@ def test_performance_handle( mocker.patch.multiple('freqtrade.main.exchange', validate_pairs=MagicMock(), get_ticker=ticker) + mocker.patch('freqtrade.fiat_convert.Pymarketcap', MagicMock()) init(default_conf, create_engine('sqlite://')) # Create some test data @@ -493,6 +496,7 @@ def test_count_handle(default_conf, update, ticker, mocker): validate_pairs=MagicMock(), get_ticker=ticker, buy=MagicMock(return_value='mocked_order_id')) + mocker.patch('freqtrade.fiat_convert.Pymarketcap', MagicMock()) init(default_conf, create_engine('sqlite://')) update_state(State.STOPPED) _count(bot=MagicMock(), update=update) diff --git a/freqtrade/tests/test_fiat_convert.py b/freqtrade/tests/test_fiat_convert.py index ddc1c8e29..9de624964 100644 --- a/freqtrade/tests/test_fiat_convert.py +++ b/freqtrade/tests/test_fiat_convert.py @@ -36,15 +36,16 @@ def test_pair_convertion_object(): assert pair_convertion.price == 30000.123 -def test_fiat_convert_is_supported(): - fiat_convert = CryptoToFiatConverter() - assert fiat_convert._is_supported_fiat(fiat='USD') is True - assert fiat_convert._is_supported_fiat(fiat='usd') is True - assert fiat_convert._is_supported_fiat(fiat='abc') is False - assert fiat_convert._is_supported_fiat(fiat='ABC') is False +def test_fiat_convert_is_supported(mocker): + assert CryptoToFiatConverter.is_supported_fiat(fiat='USD') is True + assert CryptoToFiatConverter.is_supported_fiat(fiat='usd') is True + assert CryptoToFiatConverter.is_supported_fiat(fiat='abc') is False + assert CryptoToFiatConverter.is_supported_fiat(fiat='ABC') is False -def test_fiat_convert_add_pair(): +def test_fiat_convert_add_pair(mocker): + api_mock = MagicMock(return_value={}) + mocker.patch('freqtrade.fiat_convert.Pymarketcap', api_mock) fiat_convert = CryptoToFiatConverter() assert len(fiat_convert._pairs) == 0 @@ -64,10 +65,12 @@ def test_fiat_convert_add_pair(): def test_fiat_convert_find_price(mocker): api_mock = MagicMock(return_value={ - 'price_usd': 12345.0, - 'price_eur': 13000.2 + 'ticker': MagicMock(return_value={ + 'price_usd': 12345.0, + 'price_eur': 13000.2 + }) }) - mocker.patch('freqtrade.fiat_convert.Pymarketcap.ticker', api_mock) + mocker.patch('freqtrade.fiat_convert.Pymarketcap', api_mock) fiat_convert = CryptoToFiatConverter() with pytest.raises(ValueError, match=r'The fiat ABC is not supported.'): @@ -83,10 +86,12 @@ def test_fiat_convert_find_price(mocker): def test_fiat_convert_get_price(mocker): api_mock = MagicMock(return_value={ - 'price_usd': 28000.0, - 'price_eur': 15000.0 + 'ticker': MagicMock(return_value={ + 'price_usd': 28000.0, + 'price_eur': 15000.0 + }) }) - mocker.patch('freqtrade.fiat_convert.Pymarketcap.ticker', api_mock) + mocker.patch('freqtrade.fiat_convert.Pymarketcap', 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 a61342480..2bd8da075 100644 --- a/freqtrade/tests/test_main.py +++ b/freqtrade/tests/test_main.py @@ -58,6 +58,7 @@ def test_process_trade_creation(default_conf, ticker, limit_buy_order, health, m get_wallet_health=health, buy=MagicMock(return_value='mocked_limit_buy'), get_order=MagicMock(return_value=limit_buy_order)) + mocker.patch('freqtrade.fiat_convert.Pymarketcap', MagicMock()) init(default_conf, create_engine('sqlite://')) trades = Trade.query.filter(Trade.is_open.is_(True)).all() @@ -123,6 +124,7 @@ def test_process_trade_handling(default_conf, ticker, limit_buy_order, health, m get_wallet_health=health, buy=MagicMock(return_value='mocked_limit_buy'), get_order=MagicMock(return_value=limit_buy_order)) + mocker.patch('freqtrade.fiat_convert.Pymarketcap', MagicMock()) init(default_conf, create_engine('sqlite://')) trades = Trade.query.filter(Trade.is_open.is_(True)).all() @@ -144,6 +146,8 @@ def test_create_trade(default_conf, ticker, limit_buy_order, mocker): validate_pairs=MagicMock(), get_ticker=ticker, buy=MagicMock(return_value='mocked_limit_buy')) + mocker.patch('freqtrade.fiat_convert.Pymarketcap', MagicMock()) + # Save state of current whitelist whitelist = copy.deepcopy(default_conf['exchange']['pair_whitelist']) @@ -176,6 +180,7 @@ def test_create_trade_minimal_amount(default_conf, ticker, mocker): mocker.patch.multiple('freqtrade.main.exchange', validate_pairs=MagicMock(), get_ticker=ticker) + mocker.patch('freqtrade.fiat_convert.Pymarketcap', MagicMock()) init(default_conf, create_engine('sqlite://')) min_stake_amount = 0.0005 create_trade(min_stake_amount, int(default_conf['ticker_interval'])) @@ -278,6 +283,7 @@ def test_handle_overlpapping_signals(default_conf, ticker, mocker, caplog): get_ticker=ticker, buy=MagicMock(return_value='mocked_limit_buy')) mocker.patch('freqtrade.main.min_roi_reached', return_value=False) + mocker.patch('freqtrade.fiat_convert.Pymarketcap', MagicMock()) init(default_conf, create_engine('sqlite://')) create_trade(0.001, int(default_conf['ticker_interval'])) @@ -324,6 +330,7 @@ def test_handle_trade_roi(default_conf, ticker, mocker, caplog): get_ticker=ticker, buy=MagicMock(return_value='mocked_limit_buy')) mocker.patch('freqtrade.main.min_roi_reached', return_value=True) + mocker.patch('freqtrade.fiat_convert.Pymarketcap', MagicMock()) init(default_conf, create_engine('sqlite://')) create_trade(0.001, int(default_conf['ticker_interval'])) @@ -356,6 +363,7 @@ def test_handle_trade_experimental(default_conf, ticker, mocker, caplog): get_ticker=ticker, buy=MagicMock(return_value='mocked_limit_buy')) mocker.patch('freqtrade.main.min_roi_reached', return_value=False) + mocker.patch('freqtrade.fiat_convert.Pymarketcap', MagicMock()) init(default_conf, create_engine('sqlite://')) create_trade(0.001, int(default_conf['ticker_interval'])) @@ -380,6 +388,7 @@ def test_close_trade(default_conf, ticker, limit_buy_order, limit_sell_order, mo validate_pairs=MagicMock(), get_ticker=ticker, buy=MagicMock(return_value='mocked_limit_buy')) + mocker.patch('freqtrade.fiat_convert.Pymarketcap', MagicMock()) # Create trade and sell it init(default_conf, create_engine('sqlite://')) @@ -595,6 +604,7 @@ def test_execute_sell_without_conf_sell_down(default_conf, ticker, ticker_sell_d mocker.patch.multiple('freqtrade.main.exchange', validate_pairs=MagicMock(), get_ticker=ticker) + mocker.patch('freqtrade.fiat_convert.Pymarketcap', MagicMock()) init(default_conf, create_engine('sqlite://')) # Create some test data @@ -627,6 +637,7 @@ def test_execute_sell_without_conf_sell_up(default_conf, ticker, ticker_sell_up, mocker.patch.multiple('freqtrade.main.exchange', validate_pairs=MagicMock(), get_ticker=ticker) + mocker.patch('freqtrade.fiat_convert.Pymarketcap', MagicMock()) init(default_conf, create_engine('sqlite://')) # Create some test data @@ -668,6 +679,7 @@ def test_sell_profit_only_enable_profit(default_conf, limit_buy_order, mocker): 'last': 0.00002172 }), buy=MagicMock(return_value='mocked_limit_buy')) + mocker.patch('freqtrade.fiat_convert.Pymarketcap', MagicMock()) init(default_conf, create_engine('sqlite://')) create_trade(0.001, int(default_conf['ticker_interval'])) @@ -696,6 +708,7 @@ def test_sell_profit_only_disable_profit(default_conf, limit_buy_order, mocker): 'last': 0.00002172 }), buy=MagicMock(return_value='mocked_limit_buy')) + mocker.patch('freqtrade.fiat_convert.Pymarketcap', MagicMock()) init(default_conf, create_engine('sqlite://')) create_trade(0.001, int(default_conf['ticker_interval'])) @@ -724,6 +737,7 @@ def test_sell_profit_only_enable_loss(default_conf, limit_buy_order, mocker): 'last': 0.00000172 }), buy=MagicMock(return_value='mocked_limit_buy')) + mocker.patch('freqtrade.fiat_convert.Pymarketcap', MagicMock()) init(default_conf, create_engine('sqlite://')) create_trade(0.001, int(default_conf['ticker_interval'])) @@ -752,6 +766,7 @@ def test_sell_profit_only_disable_loss(default_conf, limit_buy_order, mocker): 'last': 0.00000172 }), buy=MagicMock(return_value='mocked_limit_buy')) + mocker.patch('freqtrade.fiat_convert.Pymarketcap', MagicMock()) init(default_conf, create_engine('sqlite://')) create_trade(0.001, int(default_conf['ticker_interval']))