diff --git a/freqtrade/exchange/common.py b/freqtrade/exchange/common.py index 0046ba458..5765dc459 100644 --- a/freqtrade/exchange/common.py +++ b/freqtrade/exchange/common.py @@ -73,7 +73,7 @@ EXCHANGE_HAS_REQUIRED = [ EXCHANGE_HAS_OPTIONAL = [ # Private 'fetchMyTrades', # Trades for order - fee detection - # 'createLimitOrder', 'createMarketOrder', # Either OR for orders + 'createLimitOrder', 'createMarketOrder', # Either OR for orders # 'setLeverage', # Margin/Futures trading # 'setMarginMode', # Margin/Futures trading # 'fetchFundingHistory', # Futures trading diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 58d5ebb07..cd13964c4 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -586,13 +586,10 @@ class Exchange: """ Checks if order-types configured in strategy/config are supported """ - # TODO: Reenable once ccxt fixes createMarketOrder assignment - as well as - # Revert the change in test_validate_ordertypes. - - # if any(v == 'market' for k, v in order_types.items()): - # if not self.exchange_has('createMarketOrder'): - # raise OperationalException( - # f'Exchange {self.name} does not support market orders.') + if any(v == 'market' for k, v in order_types.items()): + if not self.exchange_has('createMarketOrder'): + raise OperationalException( + f'Exchange {self.name} does not support market orders.') if (order_types.get("stoploss_on_exchange") and not self._ft_has.get("stoploss_on_exchange", False)): diff --git a/requirements.txt b/requirements.txt index 115ae734e..2bb3b4b75 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ numpy==1.23.1 pandas==1.4.3 pandas-ta==0.3.14b -ccxt==1.90.41 +ccxt==1.90.47 # Pin cryptography for now due to rust build errors with piwheels cryptography==37.0.4 aiohttp==3.8.1 diff --git a/tests/exchange/test_ccxt_compat.py b/tests/exchange/test_ccxt_compat.py index 50154bcaf..74106f28b 100644 --- a/tests/exchange/test_ccxt_compat.py +++ b/tests/exchange/test_ccxt_compat.py @@ -153,6 +153,25 @@ class TestCCXTExchange(): assert isinstance(markets[pair], dict) assert exchange.market_is_spot(markets[pair]) + def test_has_validations(self, exchange): + + exchange, exchangename = exchange + + exchange.validate_ordertypes({ + 'entry': 'limit', + 'exit': 'limit', + 'stoploss': 'limit', + }) + + if exchangename == 'gateio': + # gateio doesn't have market orders on spot + return + exchange.validate_ordertypes({ + 'entry': 'market', + 'exit': 'market', + 'stoploss': 'market', + }) + def test_load_markets_futures(self, exchange_futures): exchange, exchangename = exchange_futures if not exchange: diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index f09d647ce..acd48b3fd 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -1027,10 +1027,9 @@ def test_validate_ordertypes(default_conf, mocker): 'stoploss': 'market', 'stoploss_on_exchange': False } - # TODO: Revert once createMarketOrder is available again. - # with pytest.raises(OperationalException, - # match=r'Exchange .* does not support market orders.'): - # Exchange(default_conf) + with pytest.raises(OperationalException, + match=r'Exchange .* does not support market orders.'): + Exchange(default_conf) default_conf['order_types'] = { 'entry': 'limit',