From 57e01329ce6854f55de706e6be4ca6edf5be4734 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Dec 2023 05:49:40 +0000 Subject: [PATCH 1/8] Bump ccxt from 4.1.84 to 4.1.91 Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.1.84 to 4.1.91. - [Release notes](https://github.com/ccxt/ccxt/releases) - [Changelog](https://github.com/ccxt/ccxt/blob/master/CHANGELOG.md) - [Commits](https://github.com/ccxt/ccxt/compare/4.1.84...4.1.91) --- updated-dependencies: - dependency-name: ccxt dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 6c41cf475..98930b1b5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ numpy==1.26.2 pandas==2.1.4 pandas-ta==0.3.14b -ccxt==4.1.84 +ccxt==4.1.91 cryptography==41.0.7 aiohttp==3.9.1 SQLAlchemy==2.0.23 From 0d3d1e6d9a76d897a93a7d3c0729348f24a16001 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 18 Dec 2023 06:43:36 +0100 Subject: [PATCH 2/8] Remove bittrex from more tests --- tests/exchange_online/test_ccxt_compat.py | 3 --- tests/test_freqtradebot.py | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/tests/exchange_online/test_ccxt_compat.py b/tests/exchange_online/test_ccxt_compat.py index b48d70de2..f95f4c000 100644 --- a/tests/exchange_online/test_ccxt_compat.py +++ b/tests/exchange_online/test_ccxt_compat.py @@ -218,9 +218,6 @@ class TestCCXTExchange: def test_ccxt__async_get_candle_history(self, exchange: EXCHANGE_FIXTURE_TYPE): exc, exchangename = exchange - if exchangename in ('bittrex'): - # For some weired reason, this test returns random lengths for bittrex. - pytest.skip("Exchange doesn't provide stable ohlcv history") if not exc._ft_has['ohlcv_has_history']: pytest.skip("Exchange does not support candle history") diff --git a/tests/test_freqtradebot.py b/tests/test_freqtradebot.py index 70c3fee3e..06d40dfb0 100644 --- a/tests/test_freqtradebot.py +++ b/tests/test_freqtradebot.py @@ -3486,7 +3486,7 @@ def test_handle_cancel_enter(mocker, caplog, default_conf_usdt, limit_order, is_ @pytest.mark.parametrize("is_short", [False, True]) -@pytest.mark.parametrize("limit_buy_order_canceled_empty", ['binance', 'kraken', 'bittrex'], +@pytest.mark.parametrize("limit_buy_order_canceled_empty", ['binance', 'kraken', 'bybit'], indirect=['limit_buy_order_canceled_empty']) def test_handle_cancel_enter_exchanges(mocker, caplog, default_conf_usdt, is_short, fee, limit_buy_order_canceled_empty) -> None: From fe4bf271b4c316e8e22dcf9fd67aa90ba32dbb8d Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 18 Dec 2023 06:45:15 +0100 Subject: [PATCH 3/8] Remove futher bittrex tests --- tests/exchange/test_exchange.py | 37 +++++++++++++++++---------------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 1d26b706f..416a6196b 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -13,7 +13,7 @@ from freqtrade.enums import CandleType, MarginMode, TradingMode from freqtrade.exceptions import (DDosProtection, DependencyException, ExchangeError, InsufficientFundsError, InvalidOrderException, OperationalException, PricingError, TemporaryError) -from freqtrade.exchange import (Binance, Bittrex, Exchange, Kraken, market_is_active, +from freqtrade.exchange import (Binance, Bybit, Exchange, Kraken, market_is_active, timeframe_to_prev_date) from freqtrade.exchange.common import (API_FETCH_ORDER_RETRY_COUNT, API_RETRY_COUNT, calculate_backoff, remove_exchange_credentials) @@ -228,10 +228,10 @@ def test_exchange_resolver(default_conf, mocker, caplog): assert log_has_re(r"No .* specific subclass found. Using the generic class instead.", caplog) caplog.clear() - default_conf['exchange']['name'] = 'Bittrex' + default_conf['exchange']['name'] = 'Bybit' exchange = ExchangeResolver.load_exchange(default_conf) assert isinstance(exchange, Exchange) - assert isinstance(exchange, Bittrex) + assert isinstance(exchange, Bybit) assert not log_has_re(r"No .* specific subclass found. Using the generic class instead.", caplog) caplog.clear() @@ -263,8 +263,8 @@ def test_exchange_resolver(default_conf, mocker, caplog): def test_validate_order_time_in_force(default_conf, mocker, caplog): caplog.set_level(logging.INFO) - # explicitly test bittrex, exchanges implementing other policies need separate tests - ex = get_patched_exchange(mocker, default_conf, id="bittrex") + # explicitly test bybit, exchanges implementing other policies need separate tests + ex = get_patched_exchange(mocker, default_conf, id="bybit") tif = { "buy": "gtc", "sell": "gtc", @@ -273,11 +273,14 @@ def test_validate_order_time_in_force(default_conf, mocker, caplog): ex.validate_order_time_in_force(tif) tif2 = { "buy": "fok", - "sell": "ioc", + "sell": "ioc22", } with pytest.raises(OperationalException, match=r"Time in force.*not supported for .*"): ex.validate_order_time_in_force(tif2) - + tif2 = { + "buy": "fok", + "sell": "ioc", + } # Patch to see if this will pass if the values are in the ft dict ex._ft_has.update({"order_time_in_force": ["GTC", "FOK", "IOC"]}) ex.validate_order_time_in_force(tif2) @@ -915,7 +918,6 @@ def test_validate_ordertypes(default_conf, mocker): mocker.patch(f'{EXMS}.validate_timeframes') mocker.patch(f'{EXMS}.validate_stakecurrency') mocker.patch(f'{EXMS}.validate_pricing') - mocker.patch(f'{EXMS}.name', 'Bittrex') default_conf['order_types'] = { 'entry': 'limit', @@ -2766,7 +2768,6 @@ async def test___async_get_candle_history_sort(default_conf, mocker, exchange_na assert res_ohlcv[9][4] == 0.07668 assert res_ohlcv[9][5] == 16.65244264 - # Bittrex use-case (real data from Bittrex) # This OHLCV data is ordered ASC (oldest first, newest last) ohlcv = [ [1527827700000, 0.07659999, 0.0766, 0.07627, 0.07657998, 1.85216924], @@ -3606,10 +3607,10 @@ def test_ohlcv_candle_limit(default_conf, mocker, exchange_name): timeframes = ('1m', '5m', '1h') expected = exchange._ft_has['ohlcv_candle_limit'] for timeframe in timeframes: - if 'ohlcv_candle_limit_per_timeframe' in exchange._ft_has: - expected = exchange._ft_has['ohlcv_candle_limit_per_timeframe'][timeframe] - # This should only run for bittrex - assert exchange_name == 'bittrex' + # if 'ohlcv_candle_limit_per_timeframe' in exchange._ft_has: + # expected = exchange._ft_has['ohlcv_candle_limit_per_timeframe'][timeframe] + # This should only run for bittrex + # assert exchange_name == 'bittrex' assert exchange.ohlcv_candle_limit(timeframe, CandleType.SPOT) == expected @@ -4522,10 +4523,10 @@ def test_amount_to_contract_precision( @pytest.mark.parametrize('exchange_name,open_rate,is_short,trading_mode,margin_mode', [ - # Bittrex - ('bittrex', 2.0, False, 'spot', None), - ('bittrex', 2.0, False, 'spot', 'cross'), - ('bittrex', 2.0, True, 'spot', 'isolated'), + # Bybit + ('bybit', 2.0, False, 'spot', None), + ('bybit', 2.0, False, 'spot', 'cross'), + ('bybit', 2.0, True, 'spot', 'isolated'), # Binance ('binance', 2.0, False, 'spot', None), ('binance', 2.0, False, 'spot', 'cross'), @@ -4947,7 +4948,7 @@ def test_get_max_leverage_futures(default_conf, mocker, leverage_tiers): exchange.get_max_leverage("BTC/USDT:USDT", 1000000000.01) -@pytest.mark.parametrize("exchange_name", ['bittrex', 'binance', 'kraken', 'gate', 'okx', 'bybit']) +@pytest.mark.parametrize("exchange_name", ['binance', 'kraken', 'gate', 'okx', 'bybit']) def test__get_params(mocker, default_conf, exchange_name): api_mock = MagicMock() mocker.patch(f'{EXMS}.exchange_has', return_value=True) From 5bbe6aacfdd36d421d70a44767ba76b9f6ac4f04 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 18 Dec 2023 06:47:24 +0100 Subject: [PATCH 4/8] Remove Bittrex subclass --- freqtrade/exchange/__init__.py | 1 - freqtrade/exchange/bittrex.py | 25 ------------------------- freqtrade/exchange/exchange.py | 1 + tests/exchange/test_exchange.py | 2 +- 4 files changed, 2 insertions(+), 27 deletions(-) delete mode 100644 freqtrade/exchange/bittrex.py diff --git a/freqtrade/exchange/__init__.py b/freqtrade/exchange/__init__.py index 8de9120dc..442dcfc89 100644 --- a/freqtrade/exchange/__init__.py +++ b/freqtrade/exchange/__init__.py @@ -6,7 +6,6 @@ from freqtrade.exchange.exchange import Exchange from freqtrade.exchange.binance import Binance from freqtrade.exchange.bitmart import Bitmart from freqtrade.exchange.bitpanda import Bitpanda -from freqtrade.exchange.bittrex import Bittrex from freqtrade.exchange.bitvavo import Bitvavo from freqtrade.exchange.bybit import Bybit from freqtrade.exchange.coinbasepro import Coinbasepro diff --git a/freqtrade/exchange/bittrex.py b/freqtrade/exchange/bittrex.py deleted file mode 100644 index 69e2f2b8d..000000000 --- a/freqtrade/exchange/bittrex.py +++ /dev/null @@ -1,25 +0,0 @@ -""" Bittrex exchange subclass """ -import logging -from typing import Dict - -from freqtrade.exchange import Exchange - - -logger = logging.getLogger(__name__) - - -class Bittrex(Exchange): - """ - Bittrex exchange class. Contains adjustments needed for Freqtrade to work - with this exchange. - """ - - _ft_has: Dict = { - "ohlcv_candle_limit_per_timeframe": { - '1m': 1440, - '5m': 288, - '1h': 744, - '1d': 365, - }, - "l2_limit_range": [1, 25, 500], - } diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 5d0bc704f..34d5e007b 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -330,6 +330,7 @@ class Exchange: Exchange ohlcv candle limit Uses ohlcv_candle_limit_per_timeframe if the exchange has different limits per timeframe (e.g. bittrex), otherwise falls back to ohlcv_candle_limit + TODO: this is most likely no longer needed since only bittrex needed this. :param timeframe: Timeframe to check :param candle_type: Candle-type :param since_ms: Starting timestamp diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 416a6196b..8d2d52219 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -3411,7 +3411,7 @@ def test_get_fee(default_conf, mocker, exchange_name): def test_stoploss_order_unsupported_exchange(default_conf, mocker): - exchange = get_patched_exchange(mocker, default_conf, id='bittrex') + exchange = get_patched_exchange(mocker, default_conf, id='bitpanda') with pytest.raises(OperationalException, match=r"stoploss is not implemented .*"): exchange.create_stoploss( pair='ETH/BTC', From 3096cddbcf5c5f5e07ad8a6ab801875e36e06573 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 18 Dec 2023 06:48:54 +0100 Subject: [PATCH 5/8] further remove bittrex from docs --- docs/exchanges.md | 42 ------------------------- docs/faq.md | 2 +- docs/includes/pairlists.md | 4 +-- docs/utils.md | 2 -- freqtrade/templates/base_config.json.j2 | 2 +- 5 files changed, 4 insertions(+), 48 deletions(-) diff --git a/docs/exchanges.md b/docs/exchanges.md index ac3957b07..457033a3e 100644 --- a/docs/exchanges.md +++ b/docs/exchanges.md @@ -181,48 +181,6 @@ freqtrade download-data --exchange kraken --dl-trades -p BTC/EUR BCH/EUR Please pay attention that rateLimit configuration entry holds delay in milliseconds between requests, NOT requests\sec rate. So, in order to mitigate Kraken API "Rate limit exceeded" exception, this configuration should be increased, NOT decreased. -## Bittrex - -### Order types - -Bittrex does not support market orders. If you have a message at the bot startup about this, you should change order type values set in your configuration and/or in the strategy from `"market"` to `"limit"`. See some more details on this [here in the FAQ](faq.md#im-getting-the-exchange-bittrex-does-not-support-market-orders-message-and-cannot-run-my-strategy). - -Bittrex also does not support `VolumePairlist` due to limited / split API constellation at the moment. -Please use `StaticPairlist`. Other pairlists (other than `VolumePairlist`) should not be affected. - -### Volume pairlist - -Bittrex does not support the direct usage of VolumePairList. This can however be worked around by using the advanced mode with `lookback_days: 1` (or more), which will emulate 24h volume. - -Read more in the [pairlist documentation](plugins.md#volumepairlist-advanced-mode). - -### Restricted markets - -Bittrex split its exchange into US and International versions. -The International version has more pairs available, however the API always returns all pairs, so there is currently no automated way to detect if you're affected by the restriction. - -If you have restricted pairs in your whitelist, you'll get a warning message in the log on Freqtrade startup for each restricted pair. - -The warning message will look similar to the following: - -``` output -[...] Message: bittrex {"success":false,"message":"RESTRICTED_MARKET","result":null,"explanation":null}" -``` - -If you're an "International" customer on the Bittrex exchange, then this warning will probably not impact you. -If you're a US customer, the bot will fail to create orders for these pairs, and you should remove them from your whitelist. - -You can get a list of restricted markets by using the following snippet: - -``` python -import ccxt -ct = ccxt.bittrex() -lm = ct.load_markets() - -res = [p for p, x in lm.items() if 'US' in x['info']['prohibitedIn']] -print(res) -``` - ## Kucoin Kucoin requires a passphrase for each api key, you will therefore need to add this key into the configuration so your exchange section looks as follows: diff --git a/docs/faq.md b/docs/faq.md index 196bd4308..95a9924f9 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -130,7 +130,7 @@ This warning can point to one of the below problems: ### I'm getting the "Exchange XXX does not support market orders." message and cannot run my strategy -As the message says, your exchange does not support market orders and you have one of the [order types](configuration.md/#understand-order_types) set to "market". Your strategy was probably written with other exchanges in mind and sets "market" orders for "stoploss" orders, which is correct and preferable for most of the exchanges supporting market orders (but not for Bittrex and Gate.io). +As the message says, your exchange does not support market orders and you have one of the [order types](configuration.md/#understand-order_types) set to "market". Your strategy was probably written with other exchanges in mind and sets "market" orders for "stoploss" orders, which is correct and preferable for most of the exchanges supporting market orders (but not for Gate.io). To fix this, redefine order types in the strategy to use "limit" instead of "market": diff --git a/docs/includes/pairlists.md b/docs/includes/pairlists.md index b3b23d6ff..8e4b43178 100644 --- a/docs/includes/pairlists.md +++ b/docs/includes/pairlists.md @@ -112,8 +112,8 @@ For convenience `lookback_days` can be specified, which will imply that 1d candl !!! Warning "Performance implications when using lookback range" If used in first position in combination with lookback, the computation of the range based volume can be time and resource consuming, as it downloads candles for all tradable pairs. Hence it's highly advised to use the standard approach with `VolumeFilter` to narrow the pairlist down for further range volume calculation. -??? Tip "Unsupported exchanges (Bittrex, Gemini)" - On some exchanges (like Bittrex and Gemini), regular VolumePairList does not work as the api does not natively provide 24h volume. This can be worked around by using candle data to build the volume. +??? Tip "Unsupported exchanges" + On some exchanges (like Gemini), regular VolumePairList does not work as the api does not natively provide 24h volume. This can be worked around by using candle data to build the volume. To roughly simulate 24h volume, you can use the following configuration. Please note that These pairlists will only refresh once per day. diff --git a/docs/utils.md b/docs/utils.md index ac0d341bd..b4432833d 100644 --- a/docs/utils.md +++ b/docs/utils.md @@ -242,7 +242,6 @@ bitkk True missing opt: fetchMyTrades bitmart True bitmax True missing opt: fetchMyTrades bitpanda True -bittrex True bitvavo True bitz True missing opt: fetchMyTrades btcalpha True missing opt: fetchTicker, fetchTickers @@ -324,7 +323,6 @@ bitpanda True bitso False missing: fetchOHLCV bitstamp True missing opt: fetchTickers bitstamp1 False missing: fetchOrder, fetchOHLCV -bittrex True bitvavo True bitz True missing opt: fetchMyTrades bl3p False missing: fetchOrder, fetchOHLCV diff --git a/freqtrade/templates/base_config.json.j2 b/freqtrade/templates/base_config.json.j2 index 1a4552c11..caa27a69e 100644 --- a/freqtrade/templates/base_config.json.j2 +++ b/freqtrade/templates/base_config.json.j2 @@ -39,7 +39,7 @@ }, {{ exchange | indent(4) }}, "pairlists": [ - {{ '{"method": "StaticPairList"}' if exchange_name == 'bittrex' else volume_pairlist }} + {{ volume_pairlist }} ], "telegram": { "enabled": {{ telegram | lower }}, From b371593084e188ef0fc34848a225a81ba9cb47f1 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 18 Dec 2023 07:08:05 +0100 Subject: [PATCH 6/8] Move previous test config to tests --- .gitignore | 1 - .../testdata/testconfigs/main_test_config.json | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) rename config_examples/config_bittrex.example.json => tests/testdata/testconfigs/main_test_config.json (98%) diff --git a/.gitignore b/.gitignore index 400a082f3..c818981ee 100644 --- a/.gitignore +++ b/.gitignore @@ -111,7 +111,6 @@ target/ #exceptions !*.gitkeep !config_examples/config_binance.example.json -!config_examples/config_bittrex.example.json !config_examples/config_full.example.json !config_examples/config_kraken.example.json !config_examples/config_freqai.example.json diff --git a/config_examples/config_bittrex.example.json b/tests/testdata/testconfigs/main_test_config.json similarity index 98% rename from config_examples/config_bittrex.example.json rename to tests/testdata/testconfigs/main_test_config.json index 882b92edc..0af5816dc 100644 --- a/config_examples/config_bittrex.example.json +++ b/tests/testdata/testconfigs/main_test_config.json @@ -29,7 +29,7 @@ "order_book_top": 1 }, "exchange": { - "name": "bittrex", + "name": "binance", "key": "your_exchange_key", "secret": "your_exchange_secret", "ccxt_config": {}, From 651d2c06b93e7e9c71a35982444fa53b2e11071c Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 18 Dec 2023 07:08:19 +0100 Subject: [PATCH 7/8] Update tests to use new file --- tests/commands/test_commands.py | 106 ++++++++++++++++---------------- tests/test_plotting.py | 4 +- 2 files changed, 55 insertions(+), 55 deletions(-) diff --git a/tests/commands/test_commands.py b/tests/commands/test_commands.py index 7698740a5..d6d2b5794 100644 --- a/tests/commands/test_commands.py +++ b/tests/commands/test_commands.py @@ -32,7 +32,7 @@ from tests.conftest_trades import MOCK_TRADE_COUNT def test_setup_utils_configuration(): args = [ - 'list-exchanges', '--config', 'config_examples/config_bittrex.example.json', + 'list-exchanges', '--config', 'tests/testdata/testconfigs/main_test_config.json', ] config = setup_utils_configuration(get_args(args), RunMode.OTHER) @@ -49,7 +49,7 @@ def test_start_trading_fail(mocker, caplog): exitmock = mocker.patch("freqtrade.worker.Worker.exit", MagicMock()) args = [ 'trade', - '-c', 'config_examples/config_bittrex.example.json' + '-c', 'tests/testdata/testconfigs/main_test_config.json' ] start_trading(get_args(args)) assert exitmock.call_count == 1 @@ -68,7 +68,7 @@ def test_start_webserver(mocker, caplog): args = [ 'webserver', - '-c', 'config_examples/config_bittrex.example.json' + '-c', 'tests/testdata/testconfigs/main_test_config.json' ] start_webserver(get_args(args)) assert api_server_mock.call_count == 1 @@ -84,7 +84,7 @@ def test_list_exchanges(capsys): captured = capsys.readouterr() assert re.match(r"Exchanges available for Freqtrade.*", captured.out) assert re.search(r".*binance.*", captured.out) - assert re.search(r".*bittrex.*", captured.out) + assert re.search(r".*bybit.*", captured.out) # Test with --one-column args = [ @@ -95,7 +95,7 @@ def test_list_exchanges(capsys): start_list_exchanges(get_args(args)) captured = capsys.readouterr() assert re.search(r"^binance$", captured.out, re.MULTILINE) - assert re.search(r"^bittrex$", captured.out, re.MULTILINE) + assert re.search(r"^bybit$", captured.out, re.MULTILINE) # Test with --all args = [ @@ -107,7 +107,7 @@ def test_list_exchanges(capsys): captured = capsys.readouterr() assert re.match(r"All exchanges supported by the ccxt library.*", captured.out) assert re.search(r".*binance.*", captured.out) - assert re.search(r".*bittrex.*", captured.out) + assert re.search(r".*bingx.*", captured.out) assert re.search(r".*bitmex.*", captured.out) # Test with --one-column --all @@ -120,7 +120,7 @@ def test_list_exchanges(capsys): start_list_exchanges(get_args(args)) captured = capsys.readouterr() assert re.search(r"^binance$", captured.out, re.MULTILINE) - assert re.search(r"^bittrex$", captured.out, re.MULTILINE) + assert re.search(r"^bingx$", captured.out, re.MULTILINE) assert re.search(r"^bitmex$", captured.out, re.MULTILINE) @@ -133,7 +133,7 @@ def test_list_timeframes(mocker, capsys): '1h': 'hour', '1d': 'day', } - patch_exchange(mocker, api_mock=api_mock, id='bittrex') + patch_exchange(mocker, api_mock=api_mock, id='bybit') args = [ "list-timeframes", ] @@ -143,25 +143,25 @@ def test_list_timeframes(mocker, capsys): match=r"This command requires a configured exchange.*"): start_list_timeframes(pargs) - # Test with --config config_examples/config_bittrex.example.json + # Test with --config tests/testdata/testconfigs/main_test_config.json args = [ "list-timeframes", - '--config', 'config_examples/config_bittrex.example.json', + '--config', 'tests/testdata/testconfigs/main_test_config.json', ] start_list_timeframes(get_args(args)) captured = capsys.readouterr() - assert re.match("Timeframes available for the exchange `Bittrex`: " + assert re.match("Timeframes available for the exchange `Bybit`: " "1m, 5m, 30m, 1h, 1d", captured.out) - # Test with --exchange bittrex + # Test with --exchange bybit args = [ "list-timeframes", - "--exchange", "bittrex", + "--exchange", "bybit", ] start_list_timeframes(get_args(args)) captured = capsys.readouterr() - assert re.match("Timeframes available for the exchange `Bittrex`: " + assert re.match("Timeframes available for the exchange `Bybit`: " "1m, 5m, 30m, 1h, 1d", captured.out) @@ -190,7 +190,7 @@ def test_list_timeframes(mocker, capsys): # Test with --one-column args = [ "list-timeframes", - '--config', 'config_examples/config_bittrex.example.json', + '--config', 'tests/testdata/testconfigs/main_test_config.json', "--one-column", ] start_list_timeframes(get_args(args)) @@ -217,7 +217,7 @@ def test_list_timeframes(mocker, capsys): def test_list_markets(mocker, markets_static, capsys): api_mock = MagicMock() - patch_exchange(mocker, api_mock=api_mock, id='bittrex', mock_markets=markets_static) + patch_exchange(mocker, api_mock=api_mock, id='binance', mock_markets=markets_static) # Test with no --config args = [ @@ -229,15 +229,15 @@ def test_list_markets(mocker, markets_static, capsys): match=r"This command requires a configured exchange.*"): start_list_markets(pargs, False) - # Test with --config config_examples/config_bittrex.example.json + # Test with --config tests/testdata/testconfigs/main_test_config.json args = [ "list-markets", - '--config', 'config_examples/config_bittrex.example.json', + '--config', 'tests/testdata/testconfigs/main_test_config.json', "--print-list", ] start_list_markets(get_args(args), False) captured = capsys.readouterr() - assert ("Exchange Bittrex has 12 active markets: " + assert ("Exchange Binance has 12 active markets: " "ADA/USDT:USDT, BLK/BTC, ETH/BTC, ETH/USDT, ETH/USDT:USDT, LTC/BTC, " "LTC/ETH, LTC/USD, NEO/BTC, TKN/BTC, XLTCUSDT, XRP/BTC.\n" in captured.out) @@ -255,16 +255,16 @@ def test_list_markets(mocker, markets_static, capsys): assert re.match("\nExchange Binance has 12 active markets:\n", captured.out) - patch_exchange(mocker, api_mock=api_mock, id="bittrex", mock_markets=markets_static) + patch_exchange(mocker, api_mock=api_mock, id="binance", mock_markets=markets_static) # Test with --all: all markets args = [ "list-markets", "--all", - '--config', 'config_examples/config_bittrex.example.json', + '--config', 'tests/testdata/testconfigs/main_test_config.json', "--print-list", ] start_list_markets(get_args(args), False) captured = capsys.readouterr() - assert ("Exchange Bittrex has 14 markets: " + assert ("Exchange Binance has 14 markets: " "ADA/USDT:USDT, BLK/BTC, BTT/BTC, ETH/BTC, ETH/USDT, ETH/USDT:USDT, " "LTC/BTC, LTC/ETH, LTC/USD, LTC/USDT, NEO/BTC, TKN/BTC, XLTCUSDT, XRP/BTC.\n" in captured.out) @@ -272,24 +272,24 @@ def test_list_markets(mocker, markets_static, capsys): # Test list-pairs subcommand: active pairs args = [ "list-pairs", - '--config', 'config_examples/config_bittrex.example.json', + '--config', 'tests/testdata/testconfigs/main_test_config.json', "--print-list", ] start_list_markets(get_args(args), True) captured = capsys.readouterr() - assert ("Exchange Bittrex has 9 active pairs: " + assert ("Exchange Binance has 9 active pairs: " "BLK/BTC, ETH/BTC, ETH/USDT, LTC/BTC, LTC/ETH, LTC/USD, NEO/BTC, TKN/BTC, XRP/BTC.\n" in captured.out) # Test list-pairs subcommand with --all: all pairs args = [ "list-pairs", "--all", - '--config', 'config_examples/config_bittrex.example.json', + '--config', 'tests/testdata/testconfigs/main_test_config.json', "--print-list", ] start_list_markets(get_args(args), True) captured = capsys.readouterr() - assert ("Exchange Bittrex has 11 pairs: " + assert ("Exchange Binance has 11 pairs: " "BLK/BTC, BTT/BTC, ETH/BTC, ETH/USDT, LTC/BTC, LTC/ETH, LTC/USD, LTC/USDT, NEO/BTC, " "TKN/BTC, XRP/BTC.\n" in captured.out) @@ -297,133 +297,133 @@ def test_list_markets(mocker, markets_static, capsys): # active markets, base=ETH, LTC args = [ "list-markets", - '--config', 'config_examples/config_bittrex.example.json', + '--config', 'tests/testdata/testconfigs/main_test_config.json', "--base", "ETH", "LTC", "--print-list", ] start_list_markets(get_args(args), False) captured = capsys.readouterr() - assert ("Exchange Bittrex has 7 active markets with ETH, LTC as base currencies: " + assert ("Exchange Binance has 7 active markets with ETH, LTC as base currencies: " "ETH/BTC, ETH/USDT, ETH/USDT:USDT, LTC/BTC, LTC/ETH, LTC/USD, XLTCUSDT.\n" in captured.out) # active markets, base=LTC args = [ "list-markets", - '--config', 'config_examples/config_bittrex.example.json', + '--config', 'tests/testdata/testconfigs/main_test_config.json', "--base", "LTC", "--print-list", ] start_list_markets(get_args(args), False) captured = capsys.readouterr() - assert ("Exchange Bittrex has 4 active markets with LTC as base currency: " + assert ("Exchange Binance has 4 active markets with LTC as base currency: " "LTC/BTC, LTC/ETH, LTC/USD, XLTCUSDT.\n" in captured.out) # active markets, quote=USDT, USD args = [ "list-markets", - '--config', 'config_examples/config_bittrex.example.json', + '--config', 'tests/testdata/testconfigs/main_test_config.json', "--quote", "USDT", "USD", "--print-list", ] start_list_markets(get_args(args), False) captured = capsys.readouterr() - assert ("Exchange Bittrex has 5 active markets with USDT, USD as quote currencies: " + assert ("Exchange Binance has 5 active markets with USDT, USD as quote currencies: " "ADA/USDT:USDT, ETH/USDT, ETH/USDT:USDT, LTC/USD, XLTCUSDT.\n" in captured.out) # active markets, quote=USDT args = [ "list-markets", - '--config', 'config_examples/config_bittrex.example.json', + '--config', 'tests/testdata/testconfigs/main_test_config.json', "--quote", "USDT", "--print-list", ] start_list_markets(get_args(args), False) captured = capsys.readouterr() - assert ("Exchange Bittrex has 4 active markets with USDT as quote currency: " + assert ("Exchange Binance has 4 active markets with USDT as quote currency: " "ADA/USDT:USDT, ETH/USDT, ETH/USDT:USDT, XLTCUSDT.\n" in captured.out) # active markets, base=LTC, quote=USDT args = [ "list-markets", - '--config', 'config_examples/config_bittrex.example.json', + '--config', 'tests/testdata/testconfigs/main_test_config.json', "--base", "LTC", "--quote", "USDT", "--print-list", ] start_list_markets(get_args(args), False) captured = capsys.readouterr() - assert ("Exchange Bittrex has 1 active market with LTC as base currency and " + assert ("Exchange Binance has 1 active market with LTC as base currency and " "with USDT as quote currency: XLTCUSDT.\n" in captured.out) # active pairs, base=LTC, quote=USDT args = [ "list-pairs", - '--config', 'config_examples/config_bittrex.example.json', + '--config', 'tests/testdata/testconfigs/main_test_config.json', "--base", "LTC", "--quote", "USD", "--print-list", ] start_list_markets(get_args(args), True) captured = capsys.readouterr() - assert ("Exchange Bittrex has 1 active pair with LTC as base currency and " + assert ("Exchange Binance has 1 active pair with LTC as base currency and " "with USD as quote currency: LTC/USD.\n" in captured.out) # active markets, base=LTC, quote=USDT, NONEXISTENT args = [ "list-markets", - '--config', 'config_examples/config_bittrex.example.json', + '--config', 'tests/testdata/testconfigs/main_test_config.json', "--base", "LTC", "--quote", "USDT", "NONEXISTENT", "--print-list", ] start_list_markets(get_args(args), False) captured = capsys.readouterr() - assert ("Exchange Bittrex has 1 active market with LTC as base currency and " + assert ("Exchange Binance has 1 active market with LTC as base currency and " "with USDT, NONEXISTENT as quote currencies: XLTCUSDT.\n" in captured.out) # active markets, base=LTC, quote=NONEXISTENT args = [ "list-markets", - '--config', 'config_examples/config_bittrex.example.json', + '--config', 'tests/testdata/testconfigs/main_test_config.json', "--base", "LTC", "--quote", "NONEXISTENT", "--print-list", ] start_list_markets(get_args(args), False) captured = capsys.readouterr() - assert ("Exchange Bittrex has 0 active markets with LTC as base currency and " + assert ("Exchange Binance has 0 active markets with LTC as base currency and " "with NONEXISTENT as quote currency.\n" in captured.out) # Test tabular output args = [ "list-markets", - '--config', 'config_examples/config_bittrex.example.json', + '--config', 'tests/testdata/testconfigs/main_test_config.json', ] start_list_markets(get_args(args), False) captured = capsys.readouterr() - assert ("Exchange Bittrex has 12 active markets:\n" + assert ("Exchange Binance has 12 active markets:\n" in captured.out) # Test tabular output, no markets found args = [ "list-markets", - '--config', 'config_examples/config_bittrex.example.json', + '--config', 'tests/testdata/testconfigs/main_test_config.json', "--base", "LTC", "--quote", "NONEXISTENT", ] start_list_markets(get_args(args), False) captured = capsys.readouterr() - assert ("Exchange Bittrex has 0 active markets with LTC as base currency and " + assert ("Exchange Binance has 0 active markets with LTC as base currency and " "with NONEXISTENT as quote currency.\n" in captured.out) # Test --print-json args = [ "list-markets", - '--config', 'config_examples/config_bittrex.example.json', + '--config', 'tests/testdata/testconfigs/main_test_config.json', "--print-json" ] start_list_markets(get_args(args), False) @@ -435,7 +435,7 @@ def test_list_markets(mocker, markets_static, capsys): # Test --print-csv args = [ "list-markets", - '--config', 'config_examples/config_bittrex.example.json', + '--config', 'tests/testdata/testconfigs/main_test_config.json', "--print-csv" ] start_list_markets(get_args(args), False) @@ -447,7 +447,7 @@ def test_list_markets(mocker, markets_static, capsys): # Test --one-column args = [ "list-markets", - '--config', 'config_examples/config_bittrex.example.json', + '--config', 'tests/testdata/testconfigs/main_test_config.json', "--one-column" ] start_list_markets(get_args(args), False) @@ -459,7 +459,7 @@ def test_list_markets(mocker, markets_static, capsys): # Test --one-column args = [ "list-markets", - '--config', 'config_examples/config_bittrex.example.json', + '--config', 'tests/testdata/testconfigs/main_test_config.json', "--one-column" ] with pytest.raises(OperationalException, match=r"Cannot get markets.*"): @@ -971,7 +971,7 @@ def test_start_test_pairlist(mocker, caplog, tickers, default_conf, capsys): patched_configuration_load_config_file(mocker, default_conf) args = [ 'test-pairlist', - '-c', 'config_examples/config_bittrex.example.json' + '-c', 'tests/testdata/testconfigs/main_test_config.json' ] start_test_pairlist(get_args(args)) @@ -985,7 +985,7 @@ def test_start_test_pairlist(mocker, caplog, tickers, default_conf, capsys): args = [ 'test-pairlist', - '-c', 'config_examples/config_bittrex.example.json', + '-c', 'tests/testdata/testconfigs/main_test_config.json', '--one-column', ] start_test_pairlist(get_args(args)) @@ -994,7 +994,7 @@ def test_start_test_pairlist(mocker, caplog, tickers, default_conf, capsys): args = [ 'test-pairlist', - '-c', 'config_examples/config_bittrex.example.json', + '-c', 'tests/testdata/testconfigs/main_test_config.json', '--print-json', ] start_test_pairlist(get_args(args)) diff --git a/tests/test_plotting.py b/tests/test_plotting.py index 377caf59c..7f80a8588 100644 --- a/tests/test_plotting.py +++ b/tests/test_plotting.py @@ -377,7 +377,7 @@ def test_start_plot_dataframe(mocker): aup = mocker.patch("freqtrade.plot.plotting.load_and_plot_trades", MagicMock()) args = [ "plot-dataframe", - "--config", "config_examples/config_bittrex.example.json", + "--config", "tests/testdata/testconfigs/main_test_config.json", "--pairs", "ETH/BTC" ] start_plot_dataframe(get_args(args)) @@ -420,7 +420,7 @@ def test_start_plot_profit(mocker): aup = mocker.patch("freqtrade.plot.plotting.plot_profit", MagicMock()) args = [ "plot-profit", - "--config", "config_examples/config_bittrex.example.json", + "--config", "tests/testdata/testconfigs/main_test_config.json", "--pairs", "ETH/BTC" ] start_plot_profit(get_args(args)) From 5e3da30ab904249dc8f148e01c29948bcaa624bd Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 18 Dec 2023 07:15:19 +0100 Subject: [PATCH 8/8] Fix remaining bittrex instances --- tests/commands/test_build_config.py | 2 +- tests/test_arguments.py | 2 +- tests/test_main.py | 20 ++++++++++---------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/tests/commands/test_build_config.py b/tests/commands/test_build_config.py index 7bf374ae0..f799be3ba 100644 --- a/tests/commands/test_build_config.py +++ b/tests/commands/test_build_config.py @@ -30,7 +30,7 @@ def test_validate_is_int(): assert not validate_is_int('-ee') -@pytest.mark.parametrize('exchange', ['bittrex', 'binance', 'kraken']) +@pytest.mark.parametrize('exchange', ['bybit', 'binance', 'kraken']) def test_start_new_config(mocker, caplog, exchange): wt_mock = mocker.patch.object(Path, "write_text", MagicMock()) mocker.patch.object(Path, "exists", MagicMock(return_value=True)) diff --git a/tests/test_arguments.py b/tests/test_arguments.py index b4f6e7279..e14b09719 100644 --- a/tests/test_arguments.py +++ b/tests/test_arguments.py @@ -173,7 +173,7 @@ def test_download_data_options() -> None: def test_plot_dataframe_options() -> None: args = [ 'plot-dataframe', - '-c', 'config_examples/config_bittrex.example.json', + '-c', 'tests/testdata/testconfigs/main_test_config.json', '--indicators1', 'sma10', 'sma100', '--indicators2', 'macd', 'fastd', 'fastk', '--plot-limit', '30', diff --git a/tests/test_main.py b/tests/test_main.py index bdb3c2bba..442e6e1d7 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -67,12 +67,12 @@ def test_main_fatal_exception(mocker, default_conf, caplog) -> None: mocker.patch('freqtrade.freqtradebot.RPCManager', MagicMock()) mocker.patch('freqtrade.freqtradebot.init_db', MagicMock()) - args = ['trade', '-c', 'config_examples/config_bittrex.example.json'] + args = ['trade', '-c', 'tests/testdata/testconfigs/main_test_config.json'] # Test Main + the KeyboardInterrupt exception with pytest.raises(SystemExit): main(args) - assert log_has('Using config: config_examples/config_bittrex.example.json ...', caplog) + assert log_has('Using config: tests/testdata/testconfigs/main_test_config.json ...', caplog) assert log_has('Fatal exception!', caplog) @@ -85,12 +85,12 @@ def test_main_keyboard_interrupt(mocker, default_conf, caplog) -> None: mocker.patch('freqtrade.wallets.Wallets.update', MagicMock()) mocker.patch('freqtrade.freqtradebot.init_db', MagicMock()) - args = ['trade', '-c', 'config_examples/config_bittrex.example.json'] + args = ['trade', '-c', 'tests/testdata/testconfigs/main_test_config.json'] # Test Main + the KeyboardInterrupt exception with pytest.raises(SystemExit): main(args) - assert log_has('Using config: config_examples/config_bittrex.example.json ...', caplog) + assert log_has('Using config: tests/testdata/testconfigs/main_test_config.json ...', caplog) assert log_has('SIGINT received, aborting ...', caplog) @@ -106,12 +106,12 @@ def test_main_operational_exception(mocker, default_conf, caplog) -> None: mocker.patch('freqtrade.freqtradebot.RPCManager', MagicMock()) mocker.patch('freqtrade.freqtradebot.init_db', MagicMock()) - args = ['trade', '-c', 'config_examples/config_bittrex.example.json'] + args = ['trade', '-c', 'tests/testdata/testconfigs/main_test_config.json'] # Test Main + the KeyboardInterrupt exception with pytest.raises(SystemExit): main(args) - assert log_has('Using config: config_examples/config_bittrex.example.json ...', caplog) + assert log_has('Using config: tests/testdata/testconfigs/main_test_config.json ...', caplog) assert log_has('Oh snap!', caplog) @@ -160,13 +160,13 @@ def test_main_reload_config(mocker, default_conf, caplog) -> None: args = Arguments([ 'trade', '-c', - 'config_examples/config_bittrex.example.json' + 'tests/testdata/testconfigs/main_test_config.json' ]).get_parsed_arg() worker = Worker(args=args, config=default_conf) with pytest.raises(SystemExit): - main(['trade', '-c', 'config_examples/config_bittrex.example.json']) + main(['trade', '-c', 'tests/testdata/testconfigs/main_test_config.json']) - assert log_has('Using config: config_examples/config_bittrex.example.json ...', caplog) + assert log_has('Using config: tests/testdata/testconfigs/main_test_config.json ...', caplog) assert worker_mock.call_count == 4 assert reconfigure_mock.call_count == 1 assert isinstance(worker.freqtrade, FreqtradeBot) @@ -187,7 +187,7 @@ def test_reconfigure(mocker, default_conf) -> None: args = Arguments([ 'trade', '-c', - 'config_examples/config_bittrex.example.json' + 'tests/testdata/testconfigs/main_test_config.json' ]).get_parsed_arg() worker = Worker(args=args, config=default_conf) freqtrade = worker.freqtrade