From 6e66763e5f041478e9b4a1196d9fbea0dc28893f Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 27 Sep 2018 19:23:55 +0200 Subject: [PATCH 01/52] Only load strategy once during backtesting --- freqtrade/optimize/backtesting.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/freqtrade/optimize/backtesting.py b/freqtrade/optimize/backtesting.py index 0983ec677..cd822023f 100644 --- a/freqtrade/optimize/backtesting.py +++ b/freqtrade/optimize/backtesting.py @@ -75,8 +75,6 @@ class Backtesting(object): else: # only one strategy - strat = StrategyResolver(self.config).strategy - self.strategylist.append(StrategyResolver(self.config).strategy) # Load one strategy self._set_strategy(self.strategylist[0]) From f4585a2745b11fb239d98b47939095a31f9bfd2f Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 29 Sep 2018 13:35:48 +0200 Subject: [PATCH 02/52] Patch exchange to not cause network delays during tests --- freqtrade/tests/test_freqtradebot.py | 1 + 1 file changed, 1 insertion(+) diff --git a/freqtrade/tests/test_freqtradebot.py b/freqtrade/tests/test_freqtradebot.py index e047cd5d1..cad2f654d 100644 --- a/freqtrade/tests/test_freqtradebot.py +++ b/freqtrade/tests/test_freqtradebot.py @@ -997,6 +997,7 @@ def test_check_handle_timedout_buy_exception(default_conf, ticker, limit_buy_ord fee, mocker) -> None: rpc_mock = patch_RPCManager(mocker) cancel_order_mock = MagicMock() + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', validate_pairs=MagicMock(), From 334e7553e1afbb664575f14c3cf3fd23a12f597d Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 29 Sep 2018 13:46:38 +0200 Subject: [PATCH 03/52] Fix hyperopt not working after update of scikit-learn to 0.20.0 --- freqtrade/strategy/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/freqtrade/strategy/__init__.py b/freqtrade/strategy/__init__.py index 38a110bd7..b29e26ef9 100644 --- a/freqtrade/strategy/__init__.py +++ b/freqtrade/strategy/__init__.py @@ -3,7 +3,8 @@ import sys from copy import deepcopy from freqtrade.strategy.interface import IStrategy - +# Import Default-Strategy to have hyperopt correctly resolve +from freqtrade.strategy.default_strategy import DefaultStrategy # noqa: F401 logger = logging.getLogger(__name__) From 1b290ffb5d70b1ef6c8e0a70610245d92d880122 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 29 Sep 2018 13:49:38 +0200 Subject: [PATCH 04/52] Update hyperopt to show errors if non-supported variables are used --- freqtrade/optimize/hyperopt.py | 10 ++++++++- freqtrade/tests/optimize/test_hyperopt.py | 25 +++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/freqtrade/optimize/hyperopt.py b/freqtrade/optimize/hyperopt.py index 086cad5aa..9dfaa8ef3 100644 --- a/freqtrade/optimize/hyperopt.py +++ b/freqtrade/optimize/hyperopt.py @@ -41,6 +41,14 @@ class Hyperopt(Backtesting): hyperopt.start() """ def __init__(self, config: Dict[str, Any]) -> None: + if config.get('strategy') and config.get('strategy') != 'DefaultStrategy': + logger.error("Please don't use --strategy for hyperopt.") + logger.error( + "Read the documentation at " + "https://github.com/freqtrade/freqtrade/blob/develop/docs/hyperopt.md " + "to understand how to configure hyperopt.") + raise ValueError("--strategy configured but not supported for hyperopt") + super().__init__(config) # set TARGET_TRADES to suit your number concurrent trades so its realistic # to the number of days @@ -152,7 +160,7 @@ class Hyperopt(Backtesting): @staticmethod def generate_roi_table(params: Dict) -> Dict[int, float]: """ - Generate the ROI table thqt will be used by Hyperopt + Generate the ROI table that will be used by Hyperopt """ roi_table = {} roi_table[0] = params['roi_p1'] + params['roi_p2'] + params['roi_p3'] diff --git a/freqtrade/tests/optimize/test_hyperopt.py b/freqtrade/tests/optimize/test_hyperopt.py index 65a3c2fdb..2035e23df 100644 --- a/freqtrade/tests/optimize/test_hyperopt.py +++ b/freqtrade/tests/optimize/test_hyperopt.py @@ -65,6 +65,31 @@ def test_start(mocker, default_conf, caplog) -> None: assert start_mock.call_count == 1 +def test_start_failure(mocker, default_conf, caplog) -> None: + start_mock = MagicMock() + mocker.patch( + 'freqtrade.configuration.Configuration._load_config_file', + lambda *args, **kwargs: default_conf + ) + mocker.patch('freqtrade.optimize.hyperopt.Hyperopt.start', start_mock) + patch_exchange(mocker) + + args = [ + '--config', 'config.json', + '--strategy', 'TestStrategy', + 'hyperopt', + '--epochs', '5' + ] + args = get_args(args) + StrategyResolver({'strategy': 'DefaultStrategy'}) + with pytest.raises(ValueError): + start(args) + assert log_has( + "Please don't use --strategy for hyperopt.", + caplog.record_tuples + ) + + def test_loss_calculation_prefer_correct_trade_count(hyperopt) -> None: StrategyResolver({'strategy': 'DefaultStrategy'}) From 36e9abc8410f67608f38dac850b9d15755cc5437 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 29 Sep 2018 13:50:02 +0200 Subject: [PATCH 05/52] Manually update scikit-learn to 0.20.0 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 59d06aca1..4150dc5bd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,7 +7,7 @@ requests==2.19.1 urllib3==1.22 wrapt==1.10.11 pandas==0.23.4 -scikit-learn==0.19.2 +scikit-learn==0.20.0 scipy==1.1.0 jsonschema==2.6.0 numpy==1.15.2 From 84622dc84b0368bfb1420f87ffcddad7a6807feb Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 29 Sep 2018 14:23:53 +0200 Subject: [PATCH 06/52] Move test for strategy out of constructor --- freqtrade/optimize/hyperopt.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/freqtrade/optimize/hyperopt.py b/freqtrade/optimize/hyperopt.py index 9dfaa8ef3..4a239ab28 100644 --- a/freqtrade/optimize/hyperopt.py +++ b/freqtrade/optimize/hyperopt.py @@ -41,14 +41,6 @@ class Hyperopt(Backtesting): hyperopt.start() """ def __init__(self, config: Dict[str, Any]) -> None: - if config.get('strategy') and config.get('strategy') != 'DefaultStrategy': - logger.error("Please don't use --strategy for hyperopt.") - logger.error( - "Read the documentation at " - "https://github.com/freqtrade/freqtrade/blob/develop/docs/hyperopt.md " - "to understand how to configure hyperopt.") - raise ValueError("--strategy configured but not supported for hyperopt") - super().__init__(config) # set TARGET_TRADES to suit your number concurrent trades so its realistic # to the number of days @@ -410,6 +402,13 @@ def start(args: Namespace) -> None: config['exchange']['key'] = '' config['exchange']['secret'] = '' + if config.get('strategy') and config.get('strategy') != 'DefaultStrategy': + logger.error("Please don't use --strategy for hyperopt.") + logger.error( + "Read the documentation at " + "https://github.com/freqtrade/freqtrade/blob/develop/docs/hyperopt.md " + "to understand how to configure hyperopt.") + raise ValueError("--strategy configured but not supported for hyperopt") # Initialize backtesting object hyperopt = Hyperopt(config) hyperopt.start() From 05adebb5362062a33aae9e546ce0e46e0a6c29c2 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sun, 30 Sep 2018 14:28:06 +0200 Subject: [PATCH 07/52] Update ccxt from 1.17.351 to 1.17.360 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 59d06aca1..5b4a60fac 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -ccxt==1.17.351 +ccxt==1.17.360 SQLAlchemy==1.2.12 python-telegram-bot==11.1.0 arrow==0.12.1 From 9d70d25064dcfb2e44b9e178ef892364e3acc983 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sun, 30 Sep 2018 14:28:07 +0200 Subject: [PATCH 08/52] Update scikit-learn from 0.19.2 to 0.20.0 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 5b4a60fac..0045e7458 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,7 +7,7 @@ requests==2.19.1 urllib3==1.22 wrapt==1.10.11 pandas==0.23.4 -scikit-learn==0.19.2 +scikit-learn==0.20.0 scipy==1.1.0 jsonschema==2.6.0 numpy==1.15.2 From d0c7b7c5821f29e324d7365cc60bfc5718e555a3 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 1 Oct 2018 14:29:06 +0200 Subject: [PATCH 09/52] Update ccxt from 1.17.360 to 1.17.363 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 0045e7458..fc5d936b7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -ccxt==1.17.360 +ccxt==1.17.363 SQLAlchemy==1.2.12 python-telegram-bot==11.1.0 arrow==0.12.1 From 4a9ed02b9b1b5c92f9438d078a72b1091ebc4f89 Mon Sep 17 00:00:00 2001 From: Samuel Husso Date: Tue, 2 Oct 2018 09:18:54 +0300 Subject: [PATCH 10/52] develop to version 0.17.3 --- freqtrade/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freqtrade/__init__.py b/freqtrade/__init__.py index 46825f548..89145d9e2 100644 --- a/freqtrade/__init__.py +++ b/freqtrade/__init__.py @@ -1,5 +1,5 @@ """ FreqTrade bot """ -__version__ = '0.17.2' +__version__ = '0.17.3' class DependencyException(BaseException): From 1e669c72289d680e245c6e381c30284326d600c6 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Wed, 3 Oct 2018 14:29:06 +0200 Subject: [PATCH 11/52] Update ccxt from 1.17.363 to 1.17.365 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index fc5d936b7..dec89be51 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -ccxt==1.17.363 +ccxt==1.17.365 SQLAlchemy==1.2.12 python-telegram-bot==11.1.0 arrow==0.12.1 From fa38772942bd03072e0d4fd22dfb3f4ef56dbd35 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Wed, 3 Oct 2018 14:29:07 +0200 Subject: [PATCH 12/52] Update pytest from 3.8.1 to 3.8.2 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index dec89be51..272892e99 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,7 +12,7 @@ scipy==1.1.0 jsonschema==2.6.0 numpy==1.15.2 TA-Lib==0.4.17 -pytest==3.8.1 +pytest==3.8.2 pytest-mock==1.10.0 pytest-asyncio==0.9.0 pytest-cov==2.6.0 From 3ed486f3a0c1995a551c18a00d2674340eb5ce40 Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 3 Oct 2018 19:32:14 +0200 Subject: [PATCH 13/52] update documentation for raspberry to match as shown in #1236 --- docs/installation.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/installation.md b/docs/installation.md index 1ceda6b1c..1000600e6 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -245,8 +245,8 @@ conda install python=3.6 conda create -n freqtrade python=3.6 conda install scipy pandas -pip install -r requirements.txt -pip install -e . +python3 -m pip install -r requirements.txt +python3 -m pip install -e . ``` ### MacOS From 9723300a0758e089de88e1532b388876cbe5e9e8 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Thu, 4 Oct 2018 14:29:06 +0200 Subject: [PATCH 14/52] Update ccxt from 1.17.365 to 1.17.368 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 272892e99..1ec5bdf26 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -ccxt==1.17.365 +ccxt==1.17.368 SQLAlchemy==1.2.12 python-telegram-bot==11.1.0 arrow==0.12.1 From e7d5cf9d9dde6bce0bbf643538c4873e53fb568b Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 4 Oct 2018 20:11:02 +0200 Subject: [PATCH 15/52] Allow loading of any additional configuration to ccxt seperated by async and non-async --- freqtrade/exchange/__init__.py | 20 ++++++++++++----- freqtrade/tests/exchange/test_exchange.py | 27 +++++++++++++++++++++++ 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/freqtrade/exchange/__init__.py b/freqtrade/exchange/__init__.py index d3c60c256..7fd0e5f43 100644 --- a/freqtrade/exchange/__init__.py +++ b/freqtrade/exchange/__init__.py @@ -93,8 +93,9 @@ class Exchange(object): logger.info('Instance is running with dry_run enabled') exchange_config = config['exchange'] - self._api = self._init_ccxt(exchange_config) - self._api_async = self._init_ccxt(exchange_config, ccxt_async) + self._api = self._init_ccxt(exchange_config, ccxt_kwargs=exchange_config.get('ccxt_config')) + self._api_async = self._init_ccxt(exchange_config, ccxt_async, + ccxt_kwargs=exchange_config.get('ccxt_async_config')) logger.info('Using Exchange "%s"', self.name) @@ -114,7 +115,8 @@ class Exchange(object): if self._api_async and inspect.iscoroutinefunction(self._api_async.close): asyncio.get_event_loop().run_until_complete(self._api_async.close()) - def _init_ccxt(self, exchange_config: dict, ccxt_module=ccxt) -> ccxt.Exchange: + def _init_ccxt(self, exchange_config: dict, ccxt_module=ccxt, + ccxt_kwargs: dict = None) -> ccxt.Exchange: """ Initialize ccxt with given config and return valid ccxt instance. @@ -124,14 +126,20 @@ class Exchange(object): if name not in ccxt_module.exchanges: raise OperationalException(f'Exchange {name} is not supported') - try: - api = getattr(ccxt_module, name.lower())({ + + ex_config = { 'apiKey': exchange_config.get('key'), 'secret': exchange_config.get('secret'), 'password': exchange_config.get('password'), 'uid': exchange_config.get('uid', ''), 'enableRateLimit': exchange_config.get('ccxt_rate_limit', True) - }) + } + if ccxt_kwargs: + logger.info('Applying additional ccxt config: %s', ccxt_kwargs) + ex_config.update(ccxt_kwargs) + try: + + api = getattr(ccxt_module, name.lower())(ex_config) except (KeyError, AttributeError): raise OperationalException(f'Exchange {name} is not supported') diff --git a/freqtrade/tests/exchange/test_exchange.py b/freqtrade/tests/exchange/test_exchange.py index d9d68c3b8..93cd1e546 100644 --- a/freqtrade/tests/exchange/test_exchange.py +++ b/freqtrade/tests/exchange/test_exchange.py @@ -1,5 +1,6 @@ # pragma pylint: disable=missing-docstring, C0103, bad-continuation, global-statement # pragma pylint: disable=protected-access +import copy import logging from datetime import datetime from random import randint @@ -56,6 +57,32 @@ def test_init(default_conf, mocker, caplog): assert log_has('Instance is running with dry_run enabled', caplog.record_tuples) +def test_init_ccxt_kwargs(default_conf, mocker, caplog): + mocker.patch('freqtrade.exchange.Exchange._load_markets', MagicMock(return_value={})) + caplog.set_level(logging.INFO) + conf = copy.deepcopy(default_conf) + conf['exchange']['ccxt_async_config'] = {'aiohttp_trust_env': True} + ex = Exchange(conf) + assert log_has("Applying additional ccxt config: {'aiohttp_trust_env': True}", + caplog.record_tuples) + assert ex._api_async.aiohttp_trust_env + assert not ex._api.aiohttp_trust_env + + # Reset logging and config + caplog.clear() + conf = copy.deepcopy(default_conf) + conf['exchange']['ccxt_config'] = {'TestKWARG': 11} + ex = Exchange(conf) + assert not log_has("Applying additional ccxt config: {'aiohttp_trust_env': True}", + caplog.record_tuples) + assert not ex._api_async.aiohttp_trust_env + assert hasattr(ex._api, 'TestKWARG') + assert ex._api.TestKWARG == 11 + assert not hasattr(ex._api_async, 'TestKWARG') + assert log_has("Applying additional ccxt config: {'TestKWARG': 11}", + caplog.record_tuples) + + def test_destroy(default_conf, mocker, caplog): caplog.set_level(logging.DEBUG) get_patched_exchange(mocker, default_conf) From d1edcf9dcd990c4b9ab0be0f65777b7eae419bfd Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 4 Oct 2018 20:17:19 +0200 Subject: [PATCH 16/52] Add documentation for ccxt_config --- config_full.json.example | 6 +++++- docs/configuration.md | 25 ++++++++++++++++++++++++- docs/telegram-usage.md | 6 ------ 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/config_full.json.example b/config_full.json.example index 7083bada6..71b119fb5 100644 --- a/config_full.json.example +++ b/config_full.json.example @@ -53,7 +53,11 @@ "pair_blacklist": [ "DOGE/BTC" ], - "outdated_offset": 5 + "outdated_offset": 5, + "ccxt_config": {}, + "ccxt_async_config": { + "aiohttp_trust_env": false + } }, "experimental": { "use_sell_signal": false, diff --git a/docs/configuration.md b/docs/configuration.md index 010e693d4..7c380e992 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -45,6 +45,8 @@ The table below will list all configuration parameters. | `exchange.pair_whitelist` | [] | No | List of currency to use by the bot. Can be overrided with `--dynamic-whitelist` param. | `exchange.pair_blacklist` | [] | No | List of currency the bot must avoid. Useful when using `--dynamic-whitelist` param. | `exchange.ccxt_rate_limit` | True | No | Have CCXT handle Exchange rate limits. Depending on the exchange, having this to false can lead to temporary bans from the exchange. +| `exchange.ccxt_config` | None | No | Additional CCXT parameters passed to the regular ccxt instance. Parameters may differ from exchange to exchange and are documented in the [ccxt documentation](https://ccxt.readthedocs.io/en/latest/manual.html#instantiation) +| `exchange.ccxt_async_config` | None | No | Additional CCXT parameters passed to the async ccxt instance. Parameters may differ from exchange to exchange and are documented in the [ccxt documentation](https://ccxt.readthedocs.io/en/latest/manual.html#instantiation) | `experimental.use_sell_signal` | false | No | Use your sell strategy in addition of the `minimal_roi`. | `experimental.sell_profit_only` | false | No | waits until you have made a positive profit before taking a sell decision. | `experimental.ignore_roi_if_buy_signal` | false | No | Does not sell if the buy-signal is still active. Takes preference over `minimal_roi` and `use_sell_signal` @@ -204,8 +206,29 @@ you run it in production mode. } ``` + If you have not your Bittrex API key yet, [see our tutorial](https://github.com/freqtrade/freqtrade/blob/develop/docs/pre-requisite.md). +### Using proxy with FreqTrade + +To use a proxy with freqtrade, add the kwarg `"aiohttp_trust_env"=true` to the `"ccxt_async_kwargs"` dict in the exchange section of the configuration. + +An example for this can be found in `config_full.json.example` + +``` json +"ccxt_async_config": { + "aiohttp_trust_env": true +} +``` + +Then, export your proxy settings using the variables `"HTTP_PROXY"` and `"HTTPS_PROXY"` set to the appropriate values + +``` bash +export HTTP_PROXY="http://addr:port" +export HTTPS_PROXY="http://addr:port" +freqtrade +``` + ### Embedding Strategies @@ -213,7 +236,7 @@ FreqTrade provides you with with an easy way to embed the strategy into your con This is done by utilizing BASE64 encoding and providing this string at the strategy configuration field, in your chosen config file. -##### Encoding a string as BASE64 +#### Encoding a string as BASE64 This is a quick example, how to generate the BASE64 string in python diff --git a/docs/telegram-usage.md b/docs/telegram-usage.md index ca764c9b4..945e31f9c 100644 --- a/docs/telegram-usage.md +++ b/docs/telegram-usage.md @@ -129,9 +129,3 @@ Day Profit BTC Profit USD ## /version > **Version:** `0.14.3` -### using proxy with telegram -``` -$ export HTTP_PROXY="http://addr:port" -$ export HTTPS_PROXY="http://addr:port" -$ freqtrade -``` From ddc15132866681063873d2c6dc0fe307cc0ca66d Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 4 Oct 2018 20:34:33 +0200 Subject: [PATCH 17/52] Add ccxt_config to both config_samples --- config.json.example | 5 ++++- config_full.json.example | 12 ++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/config.json.example b/config.json.example index 7a0bb6b9b..5198b9d81 100644 --- a/config.json.example +++ b/config.json.example @@ -28,7 +28,10 @@ "name": "bittrex", "key": "your_exchange_key", "secret": "your_exchange_secret", - "ccxt_rate_limit": true, + "ccxt_config": {"enableRateLimit": true}, + "ccxt_async_config": { + "enableRateLimit": false + }, "pair_whitelist": [ "ETH/BTC", "LTC/BTC", diff --git a/config_full.json.example b/config_full.json.example index 71b119fb5..bdc6361d2 100644 --- a/config_full.json.example +++ b/config_full.json.example @@ -37,7 +37,11 @@ "name": "bittrex", "key": "your_exchange_key", "secret": "your_exchange_secret", - "ccxt_rate_limit": true, + "ccxt_config": {"enableRateLimit": true}, + "ccxt_async_config": { + "enableRateLimit": false, + "aiohttp_trust_env": false + }, "pair_whitelist": [ "ETH/BTC", "LTC/BTC", @@ -53,11 +57,7 @@ "pair_blacklist": [ "DOGE/BTC" ], - "outdated_offset": 5, - "ccxt_config": {}, - "ccxt_async_config": { - "aiohttp_trust_env": false - } + "outdated_offset": 5 }, "experimental": { "use_sell_signal": false, From 37088cfb393d225c856bc9102aa44d9e7530f5bb Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 4 Oct 2018 20:34:48 +0200 Subject: [PATCH 18/52] add to constants --- freqtrade/constants.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/freqtrade/constants.py b/freqtrade/constants.py index eadfa6eba..12f10d3b9 100644 --- a/freqtrade/constants.py +++ b/freqtrade/constants.py @@ -164,7 +164,9 @@ CONF_SCHEMA = { }, 'uniqueItems': True }, - 'outdated_offset': {'type': 'integer', 'minimum': 1} + 'outdated_offset': {'type': 'integer', 'minimum': 1}, + 'ccxt_config': {'type': 'object'}, + 'ccxt_async_config': {'type': 'object'} }, 'required': ['name', 'key', 'secret', 'pair_whitelist'] } From 3973d3697c7f964435af545bda25f2106988de2d Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 4 Oct 2018 20:35:28 +0200 Subject: [PATCH 19/52] deprecate ccxt_rate_limt --- docs/configuration.md | 2 +- freqtrade/configuration.py | 5 +++++ freqtrade/tests/test_configuration.py | 11 ++++++++++- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/docs/configuration.md b/docs/configuration.md index 7c380e992..3512f891b 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -44,7 +44,7 @@ The table below will list all configuration parameters. | `exchange.secret` | secret | No | API secret to use for the exchange. Only required when you are in production mode. | `exchange.pair_whitelist` | [] | No | List of currency to use by the bot. Can be overrided with `--dynamic-whitelist` param. | `exchange.pair_blacklist` | [] | No | List of currency the bot must avoid. Useful when using `--dynamic-whitelist` param. -| `exchange.ccxt_rate_limit` | True | No | Have CCXT handle Exchange rate limits. Depending on the exchange, having this to false can lead to temporary bans from the exchange. +| `exchange.ccxt_rate_limit` | True | No | DEPRECATED!! Have CCXT handle Exchange rate limits. Depending on the exchange, having this to false can lead to temporary bans from the exchange. | `exchange.ccxt_config` | None | No | Additional CCXT parameters passed to the regular ccxt instance. Parameters may differ from exchange to exchange and are documented in the [ccxt documentation](https://ccxt.readthedocs.io/en/latest/manual.html#instantiation) | `exchange.ccxt_async_config` | None | No | Additional CCXT parameters passed to the async ccxt instance. Parameters may differ from exchange to exchange and are documented in the [ccxt documentation](https://ccxt.readthedocs.io/en/latest/manual.html#instantiation) | `experimental.use_sell_signal` | false | No | Use your sell strategy in addition of the `minimal_roi`. diff --git a/freqtrade/configuration.py b/freqtrade/configuration.py index 4e1137f33..93ae3deab 100644 --- a/freqtrade/configuration.py +++ b/freqtrade/configuration.py @@ -271,6 +271,11 @@ class Configuration(object): raise OperationalException( exception_msg ) + # Depreciation warning + if 'ccxt_rate_limit' in config.get('exchange', {}): + logger.warning("`ccxt_rate_limit` has been deprecated in favor of " + "`ccxt_config` and `ccxt_async_config` and will be removed " + "in future a future version.") logger.debug('Exchange "%s" supported', exchange) return True diff --git a/freqtrade/tests/test_configuration.py b/freqtrade/tests/test_configuration.py index bf41aab83..2c487c165 100644 --- a/freqtrade/tests/test_configuration.py +++ b/freqtrade/tests/test_configuration.py @@ -371,7 +371,7 @@ def test_hyperopt_with_arguments(mocker, default_conf, caplog) -> None: assert log_has('Parameter -s/--spaces detected: [\'all\']', caplog.record_tuples) -def test_check_exchange(default_conf) -> None: +def test_check_exchange(default_conf, caplog) -> None: configuration = Configuration(Namespace()) # Test a valid exchange @@ -392,6 +392,15 @@ def test_check_exchange(default_conf) -> None: ): configuration.check_exchange(default_conf) + # Test ccxt_rate_limit depreciation + default_conf.get('exchange').update({'name': 'binance'}) + default_conf['exchange']['ccxt_rate_limit'] = True + configuration.check_exchange(default_conf) + assert log_has("`ccxt_rate_limit` has been deprecated in favor of " + "`ccxt_config` and `ccxt_async_config` and will be removed " + "in future a future version.", + caplog.record_tuples) + def test_cli_verbose_with_params(default_conf, mocker, caplog) -> None: mocker.patch('freqtrade.configuration.open', mocker.mock_open( From ce4f0696e1b46a9e1337095d5242da0d590e4344 Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 4 Oct 2018 20:38:30 +0200 Subject: [PATCH 20/52] Add logging to download script and enable ccxt_async_config --- scripts/download_backtest_data.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/scripts/download_backtest_data.py b/scripts/download_backtest_data.py index 27c4c1e1c..b83eb2c4b 100755 --- a/scripts/download_backtest_data.py +++ b/scripts/download_backtest_data.py @@ -10,7 +10,14 @@ from freqtrade import arguments from freqtrade.arguments import TimeRange from freqtrade.exchange import Exchange from freqtrade.optimize import download_backtesting_testdata +from freqtrade.configuration import set_loggers +import logging +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', +) +set_loggers(0) DEFAULT_DL_PATH = 'user_data/data' @@ -54,7 +61,9 @@ exchange = Exchange({'key': '', 'exchange': { 'name': args.exchange, 'pair_whitelist': [], - 'ccxt_rate_limit': False + 'ccxt_async_config': { + "enableRateLimit": False + } } }) pairs_not_available = [] From 18c04ab4e21c33a2a32004ce43a2ee49a405a180 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Fri, 5 Oct 2018 14:29:06 +0200 Subject: [PATCH 21/52] Update ccxt from 1.17.368 to 1.17.369 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 1ec5bdf26..60dcf6c6d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -ccxt==1.17.368 +ccxt==1.17.369 SQLAlchemy==1.2.12 python-telegram-bot==11.1.0 arrow==0.12.1 From 1d38c35e6a6f7db5d2e69f94f02f76fed6c897d3 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 6 Oct 2018 09:23:40 +0200 Subject: [PATCH 22/52] Fix typo / word repetition --- freqtrade/configuration.py | 2 +- freqtrade/tests/test_configuration.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/freqtrade/configuration.py b/freqtrade/configuration.py index 93ae3deab..d61ff4dd7 100644 --- a/freqtrade/configuration.py +++ b/freqtrade/configuration.py @@ -275,7 +275,7 @@ class Configuration(object): if 'ccxt_rate_limit' in config.get('exchange', {}): logger.warning("`ccxt_rate_limit` has been deprecated in favor of " "`ccxt_config` and `ccxt_async_config` and will be removed " - "in future a future version.") + "in a future version.") logger.debug('Exchange "%s" supported', exchange) return True diff --git a/freqtrade/tests/test_configuration.py b/freqtrade/tests/test_configuration.py index 2c487c165..547c38de9 100644 --- a/freqtrade/tests/test_configuration.py +++ b/freqtrade/tests/test_configuration.py @@ -398,7 +398,7 @@ def test_check_exchange(default_conf, caplog) -> None: configuration.check_exchange(default_conf) assert log_has("`ccxt_rate_limit` has been deprecated in favor of " "`ccxt_config` and `ccxt_async_config` and will be removed " - "in future a future version.", + "in a future version.", caplog.record_tuples) From d5409287e099b6707210dcdc6d8fb805410fb948 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sat, 6 Oct 2018 14:29:05 +0200 Subject: [PATCH 23/52] Update ccxt from 1.17.369 to 1.17.371 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 60dcf6c6d..f914f819f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -ccxt==1.17.369 +ccxt==1.17.371 SQLAlchemy==1.2.12 python-telegram-bot==11.1.0 arrow==0.12.1 From 3af655d1702c16c94045fc28e66a66850d9a6c4f Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 8 Oct 2018 14:29:07 +0200 Subject: [PATCH 24/52] Update ccxt from 1.17.371 to 1.17.373 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index f914f819f..28e47b9e9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -ccxt==1.17.371 +ccxt==1.17.373 SQLAlchemy==1.2.12 python-telegram-bot==11.1.0 arrow==0.12.1 From 2cd7b40b3805a8df58217c059dbec24cbe2a79fb Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 8 Oct 2018 15:39:21 +0200 Subject: [PATCH 25/52] Fix spelling in stoploss.md --- docs/stoploss.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/stoploss.md b/docs/stoploss.md index 9740672cd..014de32f2 100644 --- a/docs/stoploss.md +++ b/docs/stoploss.md @@ -48,4 +48,4 @@ Both values can be configured in the main configuration file and requires `"trai The 0.01 would translate to a 1% stop loss, once you hit 1.1% profit. -You should also make sure to have this value higher than your minimal ROI, otherwise minimal ROI will apply first and sell your trade. +You should also make sure to have this value lower than your minimal ROI, otherwise minimal ROI will apply first and sell your trade. From 21480d4219b6d8a81f37a486a77a358e46b658b5 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 8 Oct 2018 15:41:07 +0200 Subject: [PATCH 26/52] be more expressive on what "this value" is --- docs/stoploss.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/stoploss.md b/docs/stoploss.md index 014de32f2..f34050a85 100644 --- a/docs/stoploss.md +++ b/docs/stoploss.md @@ -48,4 +48,4 @@ Both values can be configured in the main configuration file and requires `"trai The 0.01 would translate to a 1% stop loss, once you hit 1.1% profit. -You should also make sure to have this value lower than your minimal ROI, otherwise minimal ROI will apply first and sell your trade. +You should also make sure to have this value (`trailing_stop_positive_offset`) lower than your minimal ROI, otherwise minimal ROI will apply first and sell your trade. From a20ceb9e31912fb64fbd05652d7a09eda6def191 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 8 Oct 2018 19:43:37 +0200 Subject: [PATCH 27/52] Add reload_conf to telegram help --- freqtrade/rpc/telegram.py | 1 + 1 file changed, 1 insertion(+) diff --git a/freqtrade/rpc/telegram.py b/freqtrade/rpc/telegram.py index 64708ef74..b6ad047b5 100644 --- a/freqtrade/rpc/telegram.py +++ b/freqtrade/rpc/telegram.py @@ -437,6 +437,7 @@ class Telegram(RPC): "*/count:* `Show number of trades running compared to allowed number of trades`" \ "\n" \ "*/balance:* `Show account balance per currency`\n" \ + "*/reload_conf:* `Reload configuration file` \n" \ "*/help:* `This help message`\n" \ "*/version:* `Show version`" From b1f016b9c035f784ee3d51df1886fc8989d809ab Mon Sep 17 00:00:00 2001 From: fapaydin Date: Tue, 9 Oct 2018 11:49:25 +0300 Subject: [PATCH 28/52] Update hyperopt.md Invalid argument in description. Replace --timeperiod with --timerange correct format. --- docs/hyperopt.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/hyperopt.md b/docs/hyperopt.md index 3f568d82e..7444d32b7 100644 --- a/docs/hyperopt.md +++ b/docs/hyperopt.md @@ -131,12 +131,12 @@ you have on-disk, use the `--datadir PATH` option. Default hyperopt will use data from directory `user_data/data`. ### Running Hyperopt with Smaller Testset -Use the `--timeperiod` argument to change how much of the testset +Use the `--timerange` argument to change how much of the testset you want to use. The last N ticks/timeframes will be used. Example: ```bash -python3 ./freqtrade/main.py hyperopt --timeperiod -200 +python3 ./freqtrade/main.py hyperopt --timerange -200 ``` ### Running Hyperopt with Smaller Search Space From 98c1706cdd64c48b59970c3604a222ed35eca725 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Tue, 9 Oct 2018 14:29:07 +0200 Subject: [PATCH 29/52] Update ccxt from 1.17.373 to 1.17.375 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 28e47b9e9..807d042db 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -ccxt==1.17.373 +ccxt==1.17.375 SQLAlchemy==1.2.12 python-telegram-bot==11.1.0 arrow==0.12.1 From 44c275c8015dbe66ded193221db8275a100b5531 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 9 Oct 2018 21:08:56 +0200 Subject: [PATCH 30/52] flush session for /forcesell all --- freqtrade/rpc/rpc.py | 1 + 1 file changed, 1 insertion(+) diff --git a/freqtrade/rpc/rpc.py b/freqtrade/rpc/rpc.py index dc3d9bd65..7031086d8 100644 --- a/freqtrade/rpc/rpc.py +++ b/freqtrade/rpc/rpc.py @@ -363,6 +363,7 @@ class RPC(object): # Execute sell for all open orders for trade in Trade.query.filter(Trade.is_open.is_(True)).all(): _exec_forcesell(trade) + Trade.session.flush() return # Query for trade From a541d0a9319813c9962c02d3d3c4048f06ea9053 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 9 Oct 2018 21:13:30 +0200 Subject: [PATCH 31/52] convert tests to packages source: https://docs.pytest.org/en/latest/goodpractices.html If you need to have test modules with the same name, you might add __init__.py files to your tests folder and subfolders, changing them to packages: --- freqtrade/tests/exchange/__init__.py | 0 freqtrade/tests/optimize/__init__.py | 0 freqtrade/tests/rpc/__init__.py | 0 freqtrade/tests/strategy/__init__.py | 0 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 freqtrade/tests/exchange/__init__.py create mode 100644 freqtrade/tests/optimize/__init__.py create mode 100644 freqtrade/tests/rpc/__init__.py create mode 100644 freqtrade/tests/strategy/__init__.py diff --git a/freqtrade/tests/exchange/__init__.py b/freqtrade/tests/exchange/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/freqtrade/tests/optimize/__init__.py b/freqtrade/tests/optimize/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/freqtrade/tests/rpc/__init__.py b/freqtrade/tests/rpc/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/freqtrade/tests/strategy/__init__.py b/freqtrade/tests/strategy/__init__.py new file mode 100644 index 000000000..e69de29bb From 03fb188555863f8054c7cdd066975c1b9c4cba0d Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Wed, 10 Oct 2018 14:29:06 +0200 Subject: [PATCH 32/52] Update urllib3 from 1.22 to 1.23 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 807d042db..a5f22fec2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,7 +4,7 @@ python-telegram-bot==11.1.0 arrow==0.12.1 cachetools==2.1.0 requests==2.19.1 -urllib3==1.22 +urllib3==1.23 wrapt==1.10.11 pandas==0.23.4 scikit-learn==0.20.0 From 3e8e8a55faae7f42765c38593de933cc01496c89 Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 10 Oct 2018 20:58:21 +0200 Subject: [PATCH 33/52] Enable analytical telegram commands when stopped --- freqtrade/rpc/rpc.py | 10 ++------- freqtrade/tests/rpc/test_rpc.py | 8 -------- freqtrade/tests/rpc/test_rpc_telegram.py | 26 ++++-------------------- 3 files changed, 6 insertions(+), 38 deletions(-) diff --git a/freqtrade/rpc/rpc.py b/freqtrade/rpc/rpc.py index 7031086d8..d653ea176 100644 --- a/freqtrade/rpc/rpc.py +++ b/freqtrade/rpc/rpc.py @@ -84,9 +84,7 @@ class RPC(object): """ # Fetch open trade trades = Trade.query.filter(Trade.is_open.is_(True)).all() - if self._freqtrade.state != State.RUNNING: - raise RPCException('trader is not running') - elif not trades: + if not trades: raise RPCException('no active trade') else: results = [] @@ -118,9 +116,7 @@ class RPC(object): def _rpc_status_table(self) -> DataFrame: trades = Trade.query.filter(Trade.is_open.is_(True)).all() - if self._freqtrade.state != State.RUNNING: - raise RPCException('trader is not running') - elif not trades: + if not trades: raise RPCException('no active order') else: trades_list = [] @@ -385,8 +381,6 @@ class RPC(object): Handler for performance. Shows a performance statistic from finished trades """ - if self._freqtrade.state != State.RUNNING: - raise RPCException('trader is not running') pair_rates = Trade.session.query(Trade.pair, sql.func.sum(Trade.close_profit).label('profit_sum'), diff --git a/freqtrade/tests/rpc/test_rpc.py b/freqtrade/tests/rpc/test_rpc.py index efc136777..88bf5e9ad 100644 --- a/freqtrade/tests/rpc/test_rpc.py +++ b/freqtrade/tests/rpc/test_rpc.py @@ -40,10 +40,6 @@ def test_rpc_trade_status(default_conf, ticker, fee, markets, mocker) -> None: patch_get_signal(freqtradebot, (True, False)) rpc = RPC(freqtradebot) - freqtradebot.state = State.STOPPED - with pytest.raises(RPCException, match=r'.*trader is not running*'): - rpc._rpc_trade_status() - freqtradebot.state = State.RUNNING with pytest.raises(RPCException, match=r'.*no active trade*'): rpc._rpc_trade_status() @@ -81,10 +77,6 @@ def test_rpc_status_table(default_conf, ticker, fee, markets, mocker) -> None: patch_get_signal(freqtradebot, (True, False)) rpc = RPC(freqtradebot) - freqtradebot.state = State.STOPPED - with pytest.raises(RPCException, match=r'.*trader is not running*'): - rpc._rpc_status_table() - freqtradebot.state = State.RUNNING with pytest.raises(RPCException, match=r'.*no active order*'): rpc._rpc_status_table() diff --git a/freqtrade/tests/rpc/test_rpc_telegram.py b/freqtrade/tests/rpc/test_rpc_telegram.py index 182c1d2e7..3072d1cfe 100644 --- a/freqtrade/tests/rpc/test_rpc_telegram.py +++ b/freqtrade/tests/rpc/test_rpc_telegram.py @@ -250,9 +250,10 @@ def test_status_handle(default_conf, update, ticker, fee, markets, mocker) -> No telegram = Telegram(freqtradebot) freqtradebot.state = State.STOPPED + # Status is also enabled when stopped telegram._status(bot=MagicMock(), update=update) assert msg_mock.call_count == 1 - assert 'trader is not running' in msg_mock.call_args_list[0][0][0] + assert 'no active trade' in msg_mock.call_args_list[0][0][0] msg_mock.reset_mock() freqtradebot.state = State.RUNNING @@ -295,9 +296,10 @@ def test_status_table_handle(default_conf, update, ticker, fee, markets, mocker) telegram = Telegram(freqtradebot) freqtradebot.state = State.STOPPED + # Status table is also enabled when stopped telegram._status_table(bot=MagicMock(), update=update) assert msg_mock.call_count == 1 - assert 'trader is not running' in msg_mock.call_args_list[0][0][0] + assert 'no active order' in msg_mock.call_args_list[0][0][0] msg_mock.reset_mock() freqtradebot.state = State.RUNNING @@ -895,26 +897,6 @@ def test_performance_handle(default_conf, update, ticker, fee, assert 'ETH/BTC\t6.20% (1)' in msg_mock.call_args_list[0][0][0] -def test_performance_handle_invalid(default_conf, update, mocker) -> None: - patch_coinmarketcap(mocker) - patch_exchange(mocker) - msg_mock = MagicMock() - mocker.patch.multiple( - 'freqtrade.rpc.telegram.Telegram', - _init=MagicMock(), - _send_msg=msg_mock - ) - freqtradebot = FreqtradeBot(default_conf) - patch_get_signal(freqtradebot, (True, False)) - telegram = Telegram(freqtradebot) - - # Trader is not running - freqtradebot.state = State.STOPPED - telegram._performance(bot=MagicMock(), update=update) - assert msg_mock.call_count == 1 - assert 'not running' in msg_mock.call_args_list[0][0][0] - - def test_count_handle(default_conf, update, ticker, fee, markets, mocker) -> None: patch_coinmarketcap(mocker) patch_exchange(mocker) From 792d2dbe3222e388f15088cfc6301fb0b0d408de Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 10 Oct 2018 21:29:40 +0200 Subject: [PATCH 34/52] Hide "dust" from /balance --- freqtrade/rpc/telegram.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/freqtrade/rpc/telegram.py b/freqtrade/rpc/telegram.py index b6ad047b5..996137728 100644 --- a/freqtrade/rpc/telegram.py +++ b/freqtrade/rpc/telegram.py @@ -307,11 +307,14 @@ class Telegram(RPC): result = self._rpc_balance(self._config.get('fiat_display_currency', '')) output = '' for currency in result['currencies']: - output += "*{currency}:*\n" \ - "\t`Available: {available: .8f}`\n" \ - "\t`Balance: {balance: .8f}`\n" \ - "\t`Pending: {pending: .8f}`\n" \ - "\t`Est. BTC: {est_btc: .8f}`\n".format(**currency) + if currency['est_btc'] > 0.0001: + output += "*{currency}:*\n" \ + "\t`Available: {available: .8f}`\n" \ + "\t`Balance: {balance: .8f}`\n" \ + "\t`Pending: {pending: .8f}`\n" \ + "\t`Est. BTC: {est_btc: .8f}`\n".format(**currency) + else: + output += "*{currency}*: not showing <1$ amount \n".format(**currency) output += "\n*Estimated Value*:\n" \ "\t`BTC: {total: .8f}`\n" \ From 701978a4b1e8ee2238ded16d7a5276957cb05403 Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 10 Oct 2018 22:01:22 +0200 Subject: [PATCH 35/52] Add test for dust hiding --- freqtrade/rpc/telegram.py | 2 +- freqtrade/tests/rpc/test_rpc_telegram.py | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/freqtrade/rpc/telegram.py b/freqtrade/rpc/telegram.py index 996137728..040f053f1 100644 --- a/freqtrade/rpc/telegram.py +++ b/freqtrade/rpc/telegram.py @@ -314,7 +314,7 @@ class Telegram(RPC): "\t`Pending: {pending: .8f}`\n" \ "\t`Est. BTC: {est_btc: .8f}`\n".format(**currency) else: - output += "*{currency}*: not showing <1$ amount \n".format(**currency) + output += "*{currency}:* not showing <1$ amount \n".format(**currency) output += "\n*Estimated Value*:\n" \ "\t`BTC: {total: .8f}`\n" \ diff --git a/freqtrade/tests/rpc/test_rpc_telegram.py b/freqtrade/tests/rpc/test_rpc_telegram.py index 182c1d2e7..892c851bd 100644 --- a/freqtrade/tests/rpc/test_rpc_telegram.py +++ b/freqtrade/tests/rpc/test_rpc_telegram.py @@ -507,7 +507,12 @@ def test_telegram_balance_handle(default_conf, update, mocker) -> None: 'total': 10.0, 'free': 10.0, 'used': 0.0 - } + }, + 'XRP': { + 'total': 1.0, + 'free': 1.0, + 'used': 0.0 + } } def mock_ticker(symbol, refresh): @@ -517,7 +522,12 @@ def test_telegram_balance_handle(default_conf, update, mocker) -> None: 'ask': 10000.00, 'last': 10000.00, } - + elif symbol == 'XRP/BTC': + return { + 'bid': 0.00001, + 'ask': 0.00001, + 'last': 0.00001, + } return { 'bid': 0.1, 'ask': 0.1, @@ -548,7 +558,8 @@ def test_telegram_balance_handle(default_conf, update, mocker) -> None: assert '*USDT:*' in result assert 'Balance:' in result assert 'Est. BTC:' in result - assert 'BTC: 14.00000000' in result + assert 'BTC: 12.00000000' in result + assert '*XRP:* not showing <1$ amount' in result def test_balance_handle_empty_response(default_conf, update, mocker) -> None: From 93503d60517a8bf74ea1e9483051cc2dc22c2167 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sat, 13 Oct 2018 14:33:06 +0200 Subject: [PATCH 36/52] Update ccxt from 1.17.375 to 1.17.376 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index a5f22fec2..0ce7f65cb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -ccxt==1.17.375 +ccxt==1.17.376 SQLAlchemy==1.2.12 python-telegram-bot==11.1.0 arrow==0.12.1 From 4b9d04a2ca33c15c7f8dd492c48e8df775234d06 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sun, 14 Oct 2018 14:33:06 +0200 Subject: [PATCH 37/52] Update ccxt from 1.17.376 to 1.17.381 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 0ce7f65cb..81c508014 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -ccxt==1.17.376 +ccxt==1.17.381 SQLAlchemy==1.2.12 python-telegram-bot==11.1.0 arrow==0.12.1 From b278dcd6db22cd749341603945c7686f04a4f0e7 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 15 Oct 2018 14:33:06 +0200 Subject: [PATCH 38/52] Update ccxt from 1.17.381 to 1.17.383 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 81c508014..4b2d474ca 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -ccxt==1.17.381 +ccxt==1.17.383 SQLAlchemy==1.2.12 python-telegram-bot==11.1.0 arrow==0.12.1 From b546f0302e549db70d129db0a3caa4877a83f678 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Tue, 16 Oct 2018 14:33:06 +0200 Subject: [PATCH 39/52] Update ccxt from 1.17.383 to 1.17.388 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 4b2d474ca..918a56891 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -ccxt==1.17.383 +ccxt==1.17.388 SQLAlchemy==1.2.12 python-telegram-bot==11.1.0 arrow==0.12.1 From 5134736c61a08bc0d5b5048ee154e543acb14c0a Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Wed, 17 Oct 2018 14:34:07 +0200 Subject: [PATCH 40/52] Update ccxt from 1.17.388 to 1.17.392 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 918a56891..202d41abe 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -ccxt==1.17.388 +ccxt==1.17.392 SQLAlchemy==1.2.12 python-telegram-bot==11.1.0 arrow==0.12.1 From 14e58169750a510d668a5e44d20d3272258a1e3c Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Wed, 17 Oct 2018 14:34:09 +0200 Subject: [PATCH 41/52] Update urllib3 from 1.23 to 1.24 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 202d41abe..b47c02865 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,7 +4,7 @@ python-telegram-bot==11.1.0 arrow==0.12.1 cachetools==2.1.0 requests==2.19.1 -urllib3==1.23 +urllib3==1.24 wrapt==1.10.11 pandas==0.23.4 scikit-learn==0.20.0 From d953190ca5e73fd249f18ecb65e027d305bcff71 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Wed, 17 Oct 2018 14:34:10 +0200 Subject: [PATCH 42/52] Update pytest from 3.8.2 to 3.9.1 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index b47c02865..86a654ffb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,7 +12,7 @@ scipy==1.1.0 jsonschema==2.6.0 numpy==1.15.2 TA-Lib==0.4.17 -pytest==3.8.2 +pytest==3.9.1 pytest-mock==1.10.0 pytest-asyncio==0.9.0 pytest-cov==2.6.0 From c69b87914d6666797353c0d48f1fd2c7ec386c82 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Fri, 19 Oct 2018 14:35:07 +0200 Subject: [PATCH 43/52] Update ccxt from 1.17.392 to 1.17.393 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 86a654ffb..9359dc1a7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -ccxt==1.17.392 +ccxt==1.17.393 SQLAlchemy==1.2.12 python-telegram-bot==11.1.0 arrow==0.12.1 From 71814ae2d6806c2afefe09f8745dc656168cfd95 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Fri, 19 Oct 2018 14:35:09 +0200 Subject: [PATCH 44/52] Update requests from 2.19.1 to 2.20.0 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 9359dc1a7..e750cf893 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,7 +3,7 @@ SQLAlchemy==1.2.12 python-telegram-bot==11.1.0 arrow==0.12.1 cachetools==2.1.0 -requests==2.19.1 +requests==2.20.0 urllib3==1.24 wrapt==1.10.11 pandas==0.23.4 From 202b1d1f0bef02ad6f373babb9d995d774a1ab98 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 21 Oct 2018 09:21:32 +0200 Subject: [PATCH 45/52] fix #1289 - we should not modify decimal context --- freqtrade/persistence.py | 6 +---- freqtrade/tests/optimize/test_backtesting.py | 2 +- freqtrade/tests/rpc/test_rpc_telegram.py | 6 ++--- freqtrade/tests/test_freqtradebot.py | 10 ++++---- freqtrade/tests/test_persistence.py | 26 ++++++++++---------- 5 files changed, 23 insertions(+), 27 deletions(-) diff --git a/freqtrade/persistence.py b/freqtrade/persistence.py index c26d74015..02267ac21 100644 --- a/freqtrade/persistence.py +++ b/freqtrade/persistence.py @@ -4,7 +4,7 @@ This module contains the class to persist trades into SQLite import logging from datetime import datetime -from decimal import Decimal, getcontext +from decimal import Decimal from typing import Any, Dict, Optional import arrow @@ -241,7 +241,6 @@ class Trade(_DECL_BASE): logger.info('Updating trade (id=%d) ...', self.id) - getcontext().prec = 8 # Bittrex do not go above 8 decimal if order_type == 'limit' and order['side'] == 'buy': # Update open rate and actual amount self.open_rate = Decimal(order['price']) @@ -278,7 +277,6 @@ class Trade(_DECL_BASE): If rate is not set self.fee will be used :return: Price in BTC of the open trade """ - getcontext().prec = 8 buy_trade = (Decimal(self.amount) * Decimal(self.open_rate)) fees = buy_trade * Decimal(fee or self.fee_open) @@ -296,7 +294,6 @@ class Trade(_DECL_BASE): If rate is not set self.close_rate will be used :return: Price in BTC of the open trade """ - getcontext().prec = 8 if rate is None and not self.close_rate: return 0.0 @@ -336,7 +333,6 @@ class Trade(_DECL_BASE): :param fee: fee to use on the close rate (optional). :return: profit in percentage as float """ - getcontext().prec = 8 open_trade_price = self.calc_open_trade_price() close_trade_price = self.calc_close_trade_price( diff --git a/freqtrade/tests/optimize/test_backtesting.py b/freqtrade/tests/optimize/test_backtesting.py index a17867b3a..3ea0f240c 100644 --- a/freqtrade/tests/optimize/test_backtesting.py +++ b/freqtrade/tests/optimize/test_backtesting.py @@ -534,7 +534,7 @@ def test_backtest(default_conf, fee, mocker) -> None: expected = pd.DataFrame( {'pair': [pair, pair], - 'profit_percent': [0.00029975, 0.00056708], + 'profit_percent': [0.00029977, 0.00056716], 'profit_abs': [1.49e-06, 7.6e-07], 'open_time': [Arrow(2018, 1, 29, 18, 40, 0).datetime, Arrow(2018, 1, 30, 3, 30, 0).datetime], diff --git a/freqtrade/tests/rpc/test_rpc_telegram.py b/freqtrade/tests/rpc/test_rpc_telegram.py index 708ed4478..45e01aa57 100644 --- a/freqtrade/tests/rpc/test_rpc_telegram.py +++ b/freqtrade/tests/rpc/test_rpc_telegram.py @@ -725,7 +725,7 @@ def test_forcesell_handle(default_conf, update, ticker, fee, 'open_rate': 1.099e-05, 'current_rate': 1.172e-05, 'profit_amount': 6.126e-05, - 'profit_percent': 0.06110514, + 'profit_percent': 0.0611052, 'stake_currency': 'BTC', 'fiat_currency': 'USD', } == last_msg @@ -778,7 +778,7 @@ def test_forcesell_down_handle(default_conf, update, ticker, fee, 'open_rate': 1.099e-05, 'current_rate': 1.044e-05, 'profit_amount': -5.492e-05, - 'profit_percent': -0.05478343, + 'profit_percent': -0.05478342, 'stake_currency': 'BTC', 'fiat_currency': 'USD', } == last_msg @@ -823,7 +823,7 @@ def test_forcesell_all_handle(default_conf, update, ticker, fee, markets, mocker 'open_rate': 1.099e-05, 'current_rate': 1.098e-05, 'profit_amount': -5.91e-06, - 'profit_percent': -0.00589292, + 'profit_percent': -0.00589291, 'stake_currency': 'BTC', 'fiat_currency': 'USD', } == msg diff --git a/freqtrade/tests/test_freqtradebot.py b/freqtrade/tests/test_freqtradebot.py index cad2f654d..383b07864 100644 --- a/freqtrade/tests/test_freqtradebot.py +++ b/freqtrade/tests/test_freqtradebot.py @@ -804,7 +804,7 @@ def test_handle_trade(default_conf, limit_buy_order, limit_sell_order, trade.update(limit_sell_order) assert trade.close_rate == 0.00001173 - assert trade.close_profit == 0.06201057 + assert trade.close_profit == 0.06201058 assert trade.calc_profit() == 0.00006217 assert trade.close_date is not None @@ -1231,7 +1231,7 @@ def test_execute_sell_up(default_conf, ticker, fee, ticker_sell_up, markets, moc 'open_rate': 1.099e-05, 'current_rate': 1.172e-05, 'profit_amount': 6.126e-05, - 'profit_percent': 0.06110514, + 'profit_percent': 0.0611052, 'stake_currency': 'BTC', 'fiat_currency': 'USD', } == last_msg @@ -1277,7 +1277,7 @@ def test_execute_sell_down(default_conf, ticker, fee, ticker_sell_down, markets, 'open_rate': 1.099e-05, 'current_rate': 1.044e-05, 'profit_amount': -5.492e-05, - 'profit_percent': -0.05478343, + 'profit_percent': -0.05478342, 'stake_currency': 'BTC', 'fiat_currency': 'USD', } == last_msg @@ -1324,7 +1324,7 @@ def test_execute_sell_without_conf_sell_up(default_conf, ticker, fee, 'open_rate': 1.099e-05, 'current_rate': 1.172e-05, 'profit_amount': 6.126e-05, - 'profit_percent': 0.06110514, + 'profit_percent': 0.0611052, } == last_msg @@ -1370,7 +1370,7 @@ def test_execute_sell_without_conf_sell_down(default_conf, ticker, fee, 'open_rate': 1.099e-05, 'current_rate': 1.044e-05, 'profit_amount': -5.492e-05, - 'profit_percent': -0.05478343, + 'profit_percent': -0.05478342, } == last_msg diff --git a/freqtrade/tests/test_persistence.py b/freqtrade/tests/test_persistence.py index 7584537e2..5e0647dff 100644 --- a/freqtrade/tests/test_persistence.py +++ b/freqtrade/tests/test_persistence.py @@ -113,7 +113,7 @@ def test_update_with_bittrex(limit_buy_order, limit_sell_order, fee): trade.update(limit_sell_order) assert trade.open_order_id is None assert trade.close_rate == 0.00001173 - assert trade.close_profit == 0.06201057 + assert trade.close_profit == 0.06201058 assert trade.close_date is not None @@ -129,16 +129,16 @@ def test_calc_open_close_trade_price(limit_buy_order, limit_sell_order, fee): trade.open_order_id = 'something' trade.update(limit_buy_order) - assert trade.calc_open_trade_price() == 0.001002500 + assert trade.calc_open_trade_price() == 0.0010024999999225068 trade.update(limit_sell_order) - assert trade.calc_close_trade_price() == 0.0010646656 + assert trade.calc_close_trade_price() == 0.0010646656050132426 # Profit in BTC assert trade.calc_profit() == 0.00006217 # Profit in percent - assert trade.calc_profit_percent() == 0.06201057 + assert trade.calc_profit_percent() == 0.06201058 @pytest.mark.usefixtures("init_persistence") @@ -207,10 +207,10 @@ def test_calc_open_trade_price(limit_buy_order, fee): trade.update(limit_buy_order) # Buy @ 0.00001099 # Get the open rate price with the standard fee rate - assert trade.calc_open_trade_price() == 0.001002500 + assert trade.calc_open_trade_price() == 0.0010024999999225068 # Get the open rate price with a custom fee rate - assert trade.calc_open_trade_price(fee=0.003) == 0.001003000 + assert trade.calc_open_trade_price(fee=0.003) == 0.001002999999922468 @pytest.mark.usefixtures("init_persistence") @@ -226,14 +226,14 @@ def test_calc_close_trade_price(limit_buy_order, limit_sell_order, fee): trade.update(limit_buy_order) # Buy @ 0.00001099 # Get the close rate price with a custom close rate and a regular fee rate - assert trade.calc_close_trade_price(rate=0.00001234) == 0.0011200318 + assert trade.calc_close_trade_price(rate=0.00001234) == 0.0011200318470471794 # Get the close rate price with a custom close rate and a custom fee rate - assert trade.calc_close_trade_price(rate=0.00001234, fee=0.003) == 0.0011194704 + assert trade.calc_close_trade_price(rate=0.00001234, fee=0.003) == 0.0011194704275749754 # Test when we apply a Sell order, and ask price with a custom fee rate trade.update(limit_sell_order) - assert trade.calc_close_trade_price(fee=0.005) == 0.0010619972 + assert trade.calc_close_trade_price(fee=0.005) == 0.0010619972701635854 @pytest.mark.usefixtures("init_persistence") @@ -281,17 +281,17 @@ def test_calc_profit_percent(limit_buy_order, limit_sell_order, fee): trade.update(limit_buy_order) # Buy @ 0.00001099 # Get percent of profit with a custom rate (Higher than open rate) - assert trade.calc_profit_percent(rate=0.00001234) == 0.1172387 + assert trade.calc_profit_percent(rate=0.00001234) == 0.11723875 # Get percent of profit with a custom rate (Lower than open rate) - assert trade.calc_profit_percent(rate=0.00000123) == -0.88863827 + assert trade.calc_profit_percent(rate=0.00000123) == -0.88863828 # Test when we apply a Sell order. Sell higher than open rate @ 0.00001173 trade.update(limit_sell_order) - assert trade.calc_profit_percent() == 0.06201057 + assert trade.calc_profit_percent() == 0.06201058 # Test with a custom fee rate on the close trade - assert trade.calc_profit_percent(fee=0.003) == 0.0614782 + assert trade.calc_profit_percent(fee=0.003) == 0.06147824 def test_clean_dry_run_db(default_conf, fee): From 677a9e56afd83141f7e2a3a6cc5acc2737fdffaa Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 21 Oct 2018 09:23:07 +0200 Subject: [PATCH 46/52] remove skipped test (refresh_whitelist is tested in test_acl_pair) --- freqtrade/tests/test_freqtradebot.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/freqtrade/tests/test_freqtradebot.py b/freqtrade/tests/test_freqtradebot.py index 383b07864..6b13da35f 100644 --- a/freqtrade/tests/test_freqtradebot.py +++ b/freqtrade/tests/test_freqtradebot.py @@ -167,11 +167,6 @@ def test_gen_pair_whitelist_not_supported(mocker, default_conf, tickers) -> None freqtrade._gen_pair_whitelist(base_currency='BTC') -@pytest.mark.skip(reason="Test not implemented") -def test_refresh_whitelist() -> None: - pass - - def test_get_trade_stake_amount(default_conf, ticker, limit_buy_order, fee, mocker) -> None: patch_RPCManager(mocker) patch_exchange(mocker) From ee697d609cce6a81f55b5b02cdf10eebdf39d43a Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sun, 21 Oct 2018 14:34:06 +0200 Subject: [PATCH 47/52] Update ccxt from 1.17.393 to 1.17.395 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index e750cf893..70759fc6f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -ccxt==1.17.393 +ccxt==1.17.395 SQLAlchemy==1.2.12 python-telegram-bot==11.1.0 arrow==0.12.1 From 91dc8644bfb99f2eedd83c5563149f11ab610aa0 Mon Sep 17 00:00:00 2001 From: wingsgb Date: Mon, 22 Oct 2018 14:30:01 +1300 Subject: [PATCH 48/52] Update hyperopt.md --- docs/hyperopt.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/hyperopt.md b/docs/hyperopt.md index 7444d32b7..d1f363733 100644 --- a/docs/hyperopt.md +++ b/docs/hyperopt.md @@ -20,8 +20,8 @@ We recommend you start by taking a look at `hyperopt.py` file located in [freqtr ### Configure your Guards and Triggers There are two places you need to change to add a new buy strategy for testing: -- Inside [populate_buy_trend()](https://github.com/freqtrade/freqtrade/blob/develop/freqtrade/optimize/hyperopt.py#L278-L294). -- Inside [hyperopt_space()](https://github.com/freqtrade/freqtrade/blob/develop/freqtrade/optimize/hyperopt.py#L218-L229) +- Inside [populate_buy_trend()](https://github.com/freqtrade/freqtrade/blob/develop/freqtrade/optimize/hyperopt.py#L231-L264). +- Inside [hyperopt_space()](https://github.com/freqtrade/freqtrade/blob/develop/freqtrade/optimize/hyperopt.py#L213-L224) and the associated methods `indicator_space`, `roi_space`, `stoploss_space`. There you have two different type of indicators: 1. `guards` and 2. `triggers`. From 764aed2c37dee6b1676c9b96c9b8bd27fe8e7487 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 22 Oct 2018 14:34:08 +0200 Subject: [PATCH 49/52] Update ccxt from 1.17.395 to 1.17.399 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 70759fc6f..a33a388d2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -ccxt==1.17.395 +ccxt==1.17.399 SQLAlchemy==1.2.12 python-telegram-bot==11.1.0 arrow==0.12.1 From 49d1687229627d820c5ee999bd8644ca43df6c23 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Tue, 23 Oct 2018 14:33:09 +0200 Subject: [PATCH 50/52] Update ccxt from 1.17.399 to 1.17.402 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index a33a388d2..69868ab27 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -ccxt==1.17.399 +ccxt==1.17.402 SQLAlchemy==1.2.12 python-telegram-bot==11.1.0 arrow==0.12.1 From 59545013c1150a2e27a0bfd14c745d270cc4b7cd Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Tue, 23 Oct 2018 14:33:10 +0200 Subject: [PATCH 51/52] Update numpy from 1.15.2 to 1.15.3 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 69868ab27..15929c089 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,7 +10,7 @@ pandas==0.23.4 scikit-learn==0.20.0 scipy==1.1.0 jsonschema==2.6.0 -numpy==1.15.2 +numpy==1.15.3 TA-Lib==0.4.17 pytest==3.9.1 pytest-mock==1.10.0 From b90392f9be285c823b90ed9ab473ba0348986f70 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Tue, 23 Oct 2018 14:33:12 +0200 Subject: [PATCH 52/52] Update pytest from 3.9.1 to 3.9.2 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 15929c089..461125418 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,7 +12,7 @@ scipy==1.1.0 jsonschema==2.6.0 numpy==1.15.3 TA-Lib==0.4.17 -pytest==3.9.1 +pytest==3.9.2 pytest-mock==1.10.0 pytest-asyncio==0.9.0 pytest-cov==2.6.0