From fb88953be330d3e7bbb0d8f15de39087e4737096 Mon Sep 17 00:00:00 2001 From: hroff-1902 Date: Wed, 29 May 2019 21:57:14 +0300 Subject: [PATCH 01/12] refactoring download_backtest_data.py --- freqtrade/arguments.py | 47 +++++++----- freqtrade/configuration.py | 31 +++++--- freqtrade/tests/test_arguments.py | 8 +-- scripts/download_backtest_data.py | 116 +++++++++++++++++------------- 4 files changed, 119 insertions(+), 83 deletions(-) diff --git a/freqtrade/arguments.py b/freqtrade/arguments.py index ddc0dc489..c94c02a8b 100644 --- a/freqtrade/arguments.py +++ b/freqtrade/arguments.py @@ -47,7 +47,7 @@ class Arguments(object): return self.parsed_arg - def parse_args(self) -> argparse.Namespace: + def parse_args(self, no_default_config: bool = False) -> argparse.Namespace: """ Parses given arguments and returns an argparse Namespace instance. """ @@ -55,7 +55,7 @@ class Arguments(object): # Workaround issue in argparse with action='append' and default value # (see https://bugs.python.org/issue16399) - if parsed_arg.config is None: + if parsed_arg.config is None and not no_default_config: parsed_arg.config = [constants.DEFAULT_CONFIG] return parsed_arg @@ -427,26 +427,24 @@ class Arguments(object): default=None ) - def testdata_dl_options(self) -> None: + def download_data_options(self) -> None: """ Parses given arguments for testdata download """ self.parser.add_argument( - '--pairs-file', - help='File containing a list of pairs to download.', - dest='pairs_file', - default=None, - metavar='PATH', + '-v', '--verbose', + help='Verbose mode (-vv for more, -vvv to get all messages).', + action='count', + dest='loglevel', + default=0, ) - self.parser.add_argument( - '--export', - help='Export files to given dir.', - dest='export', - default=None, - metavar='PATH', + '--logfile', + help='Log to the file specified', + dest='logfile', + type=str, + metavar='FILE' ) - self.parser.add_argument( '-c', '--config', help='Specify configuration file (default: %(default)s). ' @@ -456,7 +454,21 @@ class Arguments(object): type=str, metavar='PATH', ) - + self.parser.add_argument( + '-d', '--datadir', + help='Path to backtest data.', + dest='datadir', + default=None, + type=str, + metavar='PATH', + ) + self.parser.add_argument( + '--pairs-file', + help='File containing a list of pairs to download.', + dest='pairs_file', + default=None, + metavar='PATH', + ) self.parser.add_argument( '--days', help='Download data for given number of days.', @@ -465,7 +477,6 @@ class Arguments(object): metavar='INT', default=None ) - self.parser.add_argument( '--exchange', help='Exchange name (default: %(default)s). Only valid if no config is provided.', @@ -473,7 +484,6 @@ class Arguments(object): type=str, default='bittrex' ) - self.parser.add_argument( '-t', '--timeframes', help='Specify which tickers to download. Space separated list. \ @@ -484,7 +494,6 @@ class Arguments(object): nargs='+', dest='timeframes', ) - self.parser.add_argument( '--erase', help='Clean all existing data for the selected exchange/pairs/timeframes.', diff --git a/freqtrade/configuration.py b/freqtrade/configuration.py index c19580c36..58fd1d6d9 100644 --- a/freqtrade/configuration.py +++ b/freqtrade/configuration.py @@ -122,12 +122,11 @@ class Configuration(object): return conf - def _load_common_config(self, config: Dict[str, Any]) -> Dict[str, Any]: + def _load_logging_config(self, config: Dict[str, Any]) -> None: """ - Extract information for sys.argv and load common configuration - :return: configuration as dictionary + Extract information for sys.argv and load logging configuration: + the --loglevel, --logfile options """ - # Log level if 'loglevel' in self.args and self.args.loglevel: config.update({'verbosity': self.args.loglevel}) @@ -153,6 +152,13 @@ class Configuration(object): set_loggers(config['verbosity']) logger.info('Verbosity set to %s', config['verbosity']) + def _load_common_config(self, config: Dict[str, Any]) -> Dict[str, Any]: + """ + Extract information for sys.argv and load common configuration + :return: configuration as dictionary + """ + self._load_logging_config(config) + # Support for sd_notify if self.args.sd_notify: config['internals'].update({'sd_notify': True}) @@ -228,6 +234,17 @@ class Configuration(object): else: logger.info(logstring.format(config[argname])) + def _load_datadir_config(self, config: Dict[str, Any]) -> None: + """ + Extract information for sys.argv and load datadir configuration: + the --datadir option + """ + if 'datadir' in self.args and self.args.datadir: + config.update({'datadir': self._create_datadir(config, self.args.datadir)}) + else: + config.update({'datadir': self._create_datadir(config, None)}) + logger.info('Using data folder: %s ...', config.get('datadir')) + def _load_optimize_config(self, config: Dict[str, Any]) -> Dict[str, Any]: """ Extract information for sys.argv and load Optimize configuration @@ -263,11 +280,7 @@ class Configuration(object): self._args_to_config(config, argname='timerange', logstring='Parameter --timerange detected: {} ...') - if 'datadir' in self.args and self.args.datadir: - config.update({'datadir': self._create_datadir(config, self.args.datadir)}) - else: - config.update({'datadir': self._create_datadir(config, None)}) - logger.info('Using data folder: %s ...', config.get('datadir')) + self._load_datadir_config(config) self._args_to_config(config, argname='refresh_pairs', logstring='Parameter -r/--refresh-pairs-cached detected ...') diff --git a/freqtrade/tests/test_arguments.py b/freqtrade/tests/test_arguments.py index ecd108b5e..afa42f287 100644 --- a/freqtrade/tests/test_arguments.py +++ b/freqtrade/tests/test_arguments.py @@ -170,18 +170,18 @@ def test_parse_args_hyperopt_custom() -> None: assert call_args.func is not None -def test_testdata_dl_options() -> None: +def test_download_data_options() -> None: args = [ '--pairs-file', 'file_with_pairs', - '--export', 'export/folder', + '--datadir', 'datadir/folder', '--days', '30', '--exchange', 'binance' ] arguments = Arguments(args, '') - arguments.testdata_dl_options() + arguments.download_data_options() args = arguments.parse_args() assert args.pairs_file == 'file_with_pairs' - assert args.export == 'export/folder' + assert args.datadir == 'datadir/folder' assert args.days == 30 assert args.exchange == 'binance' diff --git a/scripts/download_backtest_data.py b/scripts/download_backtest_data.py index 42b305778..acf86d0d8 100755 --- a/scripts/download_backtest_data.py +++ b/scripts/download_backtest_data.py @@ -1,39 +1,39 @@ #!/usr/bin/env python3 """ -This script generates json data +This script generates json files with pairs history data """ +import arrow import json import sys from pathlib import Path -import arrow -from typing import Any, Dict +from typing import Any, Dict, List -from freqtrade.arguments import Arguments -from freqtrade.arguments import TimeRange -from freqtrade.exchange import Exchange +from freqtrade.arguments import Arguments, TimeRange +from freqtrade.configuration import Configuration from freqtrade.data.history import download_pair_history -from freqtrade.configuration import Configuration, set_loggers +from freqtrade.exchange import Exchange from freqtrade.misc import deep_merge_dicts import logging -logging.basicConfig( - level=logging.INFO, - format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', -) -set_loggers(0) + +logger = logging.getLogger('download_backtest_data') DEFAULT_DL_PATH = 'user_data/data' arguments = Arguments(sys.argv[1:], 'download utility') -arguments.testdata_dl_options() -args = arguments.parse_args() +arguments.download_data_options() + +# Do not read the default config if config is not specified +# in the command line options explicitely +args = arguments.parse_args(no_default_config=True) timeframes = args.timeframes +pairs: List = [] + +configuration = Configuration(args) +config: Dict[str, Any] = {} if args.config: - configuration = Configuration(args) - - config: Dict[str, Any] = {} # Now expecting a list of config filenames here, not a string for path in args.config: print(f"Using config: {path}...") @@ -42,9 +42,19 @@ if args.config: config['stake_currency'] = '' # Ensure we do not use Exchange credentials + config['exchange']['dry_run'] = True config['exchange']['key'] = '' config['exchange']['secret'] = '' + + if args.exchange: + config['exchange']['name'] = args.exchange + + pairs = config['exchange']['pair_whitelist'] + timeframes = [config['ticker_interval']] + else: + if not args.exchange: + sys.exit("No exchange specified.") config = { 'stake_currency': '', 'dry_run': True, @@ -60,55 +70,59 @@ else: } } +configuration._load_logging_config(config) +configuration._load_datadir_config(config) -dl_path = Path(DEFAULT_DL_PATH).joinpath(config['exchange']['name']) -if args.export: - dl_path = Path(args.export) - -if not dl_path.is_dir(): - sys.exit(f'Directory {dl_path} does not exist.') +dl_path = Path(config['datadir']) pairs_file = Path(args.pairs_file) if args.pairs_file else dl_path.joinpath('pairs.json') -if not pairs_file.exists(): - sys.exit(f'No pairs file found with path {pairs_file}.') -with pairs_file.open() as file: - PAIRS = list(set(json.load(file))) +if not pairs or args.pairs_file: + print(f'Reading pairs file "{pairs_file}".') + # Download pairs from the pairs file if no config is specified + # or if pairs file is specified explicitely + if not pairs_file.exists(): + sys.exit(f'No pairs file found with path "{pairs_file}".') -PAIRS.sort() + with pairs_file.open() as file: + pairs = list(set(json.load(file))) + pairs.sort() timerange = TimeRange() if args.days: time_since = arrow.utcnow().shift(days=-args.days).strftime("%Y%m%d") timerange = arguments.parse_timerange(f'{time_since}-') +print(f'About to download pairs: {pairs}, intervals: {timeframes} to {dl_path}') -print(f'About to download pairs: {PAIRS} to {dl_path}') - -# Init exchange -exchange = Exchange(config) pairs_not_available = [] -for pair in PAIRS: - if pair not in exchange._api.markets: - pairs_not_available.append(pair) - print(f"skipping pair {pair}") - continue - for ticker_interval in timeframes: - pair_print = pair.replace('/', '_') - filename = f'{pair_print}-{ticker_interval}.json' - dl_file = dl_path.joinpath(filename) - if args.erase and dl_file.exists(): - print(f'Deleting existing data for pair {pair}, interval {ticker_interval}') - dl_file.unlink() +try: + # Init exchange + exchange = Exchange(config) - print(f'downloading pair {pair}, interval {ticker_interval}') - download_pair_history(datadir=dl_path, exchange=exchange, - pair=pair, - ticker_interval=ticker_interval, - timerange=timerange) + for pair in pairs: + if pair not in exchange._api.markets: + pairs_not_available.append(pair) + print(f"skipping pair {pair}") + continue + for ticker_interval in timeframes: + pair_print = pair.replace('/', '_') + filename = f'{pair_print}-{ticker_interval}.json' + dl_file = dl_path.joinpath(filename) + if args.erase and dl_file.exists(): + print(f'Deleting existing data for pair {pair}, interval {ticker_interval}') + dl_file.unlink() + print(f'downloading pair {pair}, interval {ticker_interval}') + download_pair_history(datadir=dl_path, exchange=exchange, + pair=pair, ticker_interval=ticker_interval, + timerange=timerange) -if pairs_not_available: - print(f"Pairs [{','.join(pairs_not_available)}] not availble.") +except KeyboardInterrupt: + sys.exit("SIGINT received, aborting ...") + +finally: + if pairs_not_available: + print(f"Pairs [{','.join(pairs_not_available)}] not availble.") From f463817c883a8510054bbc486c5c18bfe8da9eab Mon Sep 17 00:00:00 2001 From: hroff-1902 Date: Thu, 30 May 2019 09:51:32 +0300 Subject: [PATCH 02/12] change metavar for --pairs-file --- freqtrade/arguments.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freqtrade/arguments.py b/freqtrade/arguments.py index c94c02a8b..711975fd0 100644 --- a/freqtrade/arguments.py +++ b/freqtrade/arguments.py @@ -467,7 +467,7 @@ class Arguments(object): help='File containing a list of pairs to download.', dest='pairs_file', default=None, - metavar='PATH', + metavar='FILE', ) self.parser.add_argument( '--days', From 11f535e79f74d0fd41632768c65773595356c75d Mon Sep 17 00:00:00 2001 From: hroff-1902 Date: Thu, 30 May 2019 09:54:58 +0300 Subject: [PATCH 03/12] change prints to logging --- scripts/download_backtest_data.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/scripts/download_backtest_data.py b/scripts/download_backtest_data.py index acf86d0d8..acdfb25ac 100755 --- a/scripts/download_backtest_data.py +++ b/scripts/download_backtest_data.py @@ -36,7 +36,7 @@ config: Dict[str, Any] = {} if args.config: # Now expecting a list of config filenames here, not a string for path in args.config: - print(f"Using config: {path}...") + logger.info(f"Using config: {path}...") # Merge config options, overwriting old values config = deep_merge_dicts(configuration._load_config_file(path), config) @@ -78,7 +78,7 @@ dl_path = Path(config['datadir']) pairs_file = Path(args.pairs_file) if args.pairs_file else dl_path.joinpath('pairs.json') if not pairs or args.pairs_file: - print(f'Reading pairs file "{pairs_file}".') + logger.info(f'Reading pairs file "{pairs_file}".') # Download pairs from the pairs file if no config is specified # or if pairs file is specified explicitely if not pairs_file.exists(): @@ -94,7 +94,7 @@ if args.days: time_since = arrow.utcnow().shift(days=-args.days).strftime("%Y%m%d") timerange = arguments.parse_timerange(f'{time_since}-') -print(f'About to download pairs: {pairs}, intervals: {timeframes} to {dl_path}') +logger.info(f'About to download pairs: {pairs}, intervals: {timeframes} to {dl_path}') pairs_not_available = [] @@ -105,17 +105,17 @@ try: for pair in pairs: if pair not in exchange._api.markets: pairs_not_available.append(pair) - print(f"skipping pair {pair}") + logger.info(f"skipping pair {pair}") continue for ticker_interval in timeframes: pair_print = pair.replace('/', '_') filename = f'{pair_print}-{ticker_interval}.json' dl_file = dl_path.joinpath(filename) if args.erase and dl_file.exists(): - print(f'Deleting existing data for pair {pair}, interval {ticker_interval}') + logger.info(f'Deleting existing data for pair {pair}, interval {ticker_interval}') dl_file.unlink() - print(f'downloading pair {pair}, interval {ticker_interval}') + logger.info(f'downloading pair {pair}, interval {ticker_interval}') download_pair_history(datadir=dl_path, exchange=exchange, pair=pair, ticker_interval=ticker_interval, timerange=timerange) @@ -125,4 +125,4 @@ except KeyboardInterrupt: finally: if pairs_not_available: - print(f"Pairs [{','.join(pairs_not_available)}] not availble.") + logger.info(f"Pairs [{','.join(pairs_not_available)}] not availble.") From 39932627bd25d5fde92242a6e307574846e372c4 Mon Sep 17 00:00:00 2001 From: hroff-1902 Date: Thu, 30 May 2019 11:03:17 +0300 Subject: [PATCH 04/12] typo in log message fixed --- scripts/download_backtest_data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/download_backtest_data.py b/scripts/download_backtest_data.py index acdfb25ac..b7c302437 100755 --- a/scripts/download_backtest_data.py +++ b/scripts/download_backtest_data.py @@ -125,4 +125,4 @@ except KeyboardInterrupt: finally: if pairs_not_available: - logger.info(f"Pairs [{','.join(pairs_not_available)}] not availble.") + logger.info(f"Pairs [{','.join(pairs_not_available)}] not available.") From ef15f2bdc67c65ec2d05f730006502f536a8cde4 Mon Sep 17 00:00:00 2001 From: hroff-1902 Date: Thu, 30 May 2019 11:07:31 +0300 Subject: [PATCH 05/12] log messages slightly improved --- scripts/download_backtest_data.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/scripts/download_backtest_data.py b/scripts/download_backtest_data.py index b7c302437..196af5bed 100755 --- a/scripts/download_backtest_data.py +++ b/scripts/download_backtest_data.py @@ -105,17 +105,18 @@ try: for pair in pairs: if pair not in exchange._api.markets: pairs_not_available.append(pair) - logger.info(f"skipping pair {pair}") + logger.info(f"Skipping pair {pair}...") continue for ticker_interval in timeframes: pair_print = pair.replace('/', '_') filename = f'{pair_print}-{ticker_interval}.json' dl_file = dl_path.joinpath(filename) if args.erase and dl_file.exists(): - logger.info(f'Deleting existing data for pair {pair}, interval {ticker_interval}') + logger.info( + f'Deleting existing data for pair {pair}, interval {ticker_interval}.') dl_file.unlink() - logger.info(f'downloading pair {pair}, interval {ticker_interval}') + logger.info(f'Downloading pair {pair}, interval {ticker_interval}.') download_pair_history(datadir=dl_path, exchange=exchange, pair=pair, ticker_interval=ticker_interval, timerange=timerange) @@ -125,4 +126,6 @@ except KeyboardInterrupt: finally: if pairs_not_available: - logger.info(f"Pairs [{','.join(pairs_not_available)}] not available.") + logger.info( + f"Pairs [{','.join(pairs_not_available)}] not available " + f"on exchange {config['exchange']['name']}.") From 1add432673aa76c378bed6030ce0f53939353443 Mon Sep 17 00:00:00 2001 From: hroff-1902 Date: Thu, 30 May 2019 23:00:19 +0300 Subject: [PATCH 06/12] docs adjusted --- docs/backtesting.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/backtesting.md b/docs/backtesting.md index a25d3c1d5..5a25bc255 100644 --- a/docs/backtesting.md +++ b/docs/backtesting.md @@ -123,11 +123,12 @@ python scripts/download_backtest_data.py --exchange binance This will download ticker data for all the currency pairs you defined in `pairs.json`. -- To use a different folder than the exchange specific default, use `--export user_data/data/some_directory`. +- To use a different folder than the exchange specific default, use `--datadir user_data/data/some_directory`. - To change the exchange used to download the tickers, use `--exchange`. Default is `bittrex`. - To use `pairs.json` from some other folder, use `--pairs-file some_other_dir/pairs.json`. - To download ticker data for only 10 days, use `--days 10`. - Use `--timeframes` to specify which tickers to download. Default is `--timeframes 1m 5m` which will download 1-minute and 5-minute tickers. +- To use exchange, timeframe and list of pairs as defined in your configuration file, use the `-c/--config` option. With this, the script uses the whitelist defined in the config as the list of currency pairs to download data for and does not require the pairs.json file. You can combine `-c/--config` with other options. For help about backtesting usage, please refer to [Backtesting commands](#backtesting-commands). From dc0326db2737ba1bc213bab7f76bbffcc922c810 Mon Sep 17 00:00:00 2001 From: hroff-1902 Date: Tue, 11 Jun 2019 10:09:30 +0300 Subject: [PATCH 07/12] fix handling --exchange --- freqtrade/arguments.py | 8 +------- scripts/download_backtest_data.py | 17 +++++++++++------ 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/freqtrade/arguments.py b/freqtrade/arguments.py index 711975fd0..0d4288ef3 100644 --- a/freqtrade/arguments.py +++ b/freqtrade/arguments.py @@ -443,7 +443,7 @@ class Arguments(object): help='Log to the file specified', dest='logfile', type=str, - metavar='FILE' + metavar='FILE', ) self.parser.add_argument( '-c', '--config', @@ -458,15 +458,12 @@ class Arguments(object): '-d', '--datadir', help='Path to backtest data.', dest='datadir', - default=None, - type=str, metavar='PATH', ) self.parser.add_argument( '--pairs-file', help='File containing a list of pairs to download.', dest='pairs_file', - default=None, metavar='FILE', ) self.parser.add_argument( @@ -475,14 +472,11 @@ class Arguments(object): dest='days', type=int, metavar='INT', - default=None ) self.parser.add_argument( '--exchange', help='Exchange name (default: %(default)s). Only valid if no config is provided.', dest='exchange', - type=str, - default='bittrex' ) self.parser.add_argument( '-t', '--timeframes', diff --git a/scripts/download_backtest_data.py b/scripts/download_backtest_data.py index 196af5bed..278879fb0 100755 --- a/scripts/download_backtest_data.py +++ b/scripts/download_backtest_data.py @@ -27,6 +27,9 @@ arguments.download_data_options() # in the command line options explicitely args = arguments.parse_args(no_default_config=True) +# Use bittrex as default exchange +exchange_name = args.exchange or 'bittrex' + timeframes = args.timeframes pairs: List = [] @@ -46,20 +49,15 @@ if args.config: config['exchange']['key'] = '' config['exchange']['secret'] = '' - if args.exchange: - config['exchange']['name'] = args.exchange - pairs = config['exchange']['pair_whitelist'] timeframes = [config['ticker_interval']] else: - if not args.exchange: - sys.exit("No exchange specified.") config = { 'stake_currency': '', 'dry_run': True, 'exchange': { - 'name': args.exchange, + 'name': exchange_name, 'key': '', 'secret': '', 'pair_whitelist': [], @@ -71,6 +69,13 @@ else: } configuration._load_logging_config(config) + +if args.config and args.exchange: + logger.warning("The --exchange option is ignored, using exchange settings from the configuration file.") + +# Check if the exchange set by the user is supported +configuration.check_exchange(config) + configuration._load_datadir_config(config) dl_path = Path(config['datadir']) From cd60d6d99adc61ca030f418d3a60de9bfbd43fd1 Mon Sep 17 00:00:00 2001 From: hroff-1902 Date: Tue, 11 Jun 2019 10:10:21 +0300 Subject: [PATCH 08/12] make --days positive int only --- freqtrade/arguments.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freqtrade/arguments.py b/freqtrade/arguments.py index 0d4288ef3..09fea5e63 100644 --- a/freqtrade/arguments.py +++ b/freqtrade/arguments.py @@ -470,7 +470,7 @@ class Arguments(object): '--days', help='Download data for given number of days.', dest='days', - type=int, + type=Arguments.check_int_positive, metavar='INT', ) self.parser.add_argument( From d55f2be942b5f9a58cd085e815c5a11311f802c0 Mon Sep 17 00:00:00 2001 From: hroff-1902 Date: Tue, 11 Jun 2019 10:21:59 +0300 Subject: [PATCH 09/12] make flake happy --- scripts/download_backtest_data.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/download_backtest_data.py b/scripts/download_backtest_data.py index 278879fb0..76b2c415b 100755 --- a/scripts/download_backtest_data.py +++ b/scripts/download_backtest_data.py @@ -71,7 +71,8 @@ else: configuration._load_logging_config(config) if args.config and args.exchange: - logger.warning("The --exchange option is ignored, using exchange settings from the configuration file.") + logger.warning("The --exchange option is ignored, " + "using exchange settings from the configuration file.") # Check if the exchange set by the user is supported configuration.check_exchange(config) From e08fda074ad2ea504b830c8760ad1a5e198e9b0e Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 13 Jun 2019 20:26:47 +0200 Subject: [PATCH 10/12] Fix bug with timeframe handling --- scripts/download_backtest_data.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/scripts/download_backtest_data.py b/scripts/download_backtest_data.py index 76b2c415b..8493c0872 100755 --- a/scripts/download_backtest_data.py +++ b/scripts/download_backtest_data.py @@ -30,7 +30,6 @@ args = arguments.parse_args(no_default_config=True) # Use bittrex as default exchange exchange_name = args.exchange or 'bittrex' -timeframes = args.timeframes pairs: List = [] configuration = Configuration(args) @@ -50,7 +49,9 @@ if args.config: config['exchange']['secret'] = '' pairs = config['exchange']['pair_whitelist'] - timeframes = [config['ticker_interval']] + + # Don't fail if ticker_interval is not in the configuration + timeframes = [config.get('ticker_interval')] else: config = { @@ -68,6 +69,8 @@ else: } } +timeframes = args.timeframes + configuration._load_logging_config(config) if args.config and args.exchange: From 9657b1a17f454fcd81f66f91c2c8949c7495acfd Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 13 Jun 2019 20:37:17 +0200 Subject: [PATCH 11/12] explict parse to string for ticker-interval --- scripts/download_backtest_data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/download_backtest_data.py b/scripts/download_backtest_data.py index 8493c0872..a39500d0e 100755 --- a/scripts/download_backtest_data.py +++ b/scripts/download_backtest_data.py @@ -127,7 +127,7 @@ try: logger.info(f'Downloading pair {pair}, interval {ticker_interval}.') download_pair_history(datadir=dl_path, exchange=exchange, - pair=pair, ticker_interval=ticker_interval, + pair=pair, ticker_interval=str(ticker_interval), timerange=timerange) except KeyboardInterrupt: From 04ea66c97722901caeae519fd0b38feb886bae1e Mon Sep 17 00:00:00 2001 From: hroff-1902 Date: Fri, 14 Jun 2019 02:58:34 +0300 Subject: [PATCH 12/12] fix handling timeframes --- freqtrade/arguments.py | 1 - scripts/download_backtest_data.py | 9 +++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/freqtrade/arguments.py b/freqtrade/arguments.py index 09fea5e63..46fb9e7b3 100644 --- a/freqtrade/arguments.py +++ b/freqtrade/arguments.py @@ -484,7 +484,6 @@ class Arguments(object): Default: %(default)s.', choices=['1m', '3m', '5m', '15m', '30m', '1h', '2h', '4h', '6h', '8h', '12h', '1d', '3d', '1w'], - default=['1m', '5m'], nargs='+', dest='timeframes', ) diff --git a/scripts/download_backtest_data.py b/scripts/download_backtest_data.py index a39500d0e..6263d0e2f 100755 --- a/scripts/download_backtest_data.py +++ b/scripts/download_backtest_data.py @@ -50,8 +50,10 @@ if args.config: pairs = config['exchange']['pair_whitelist'] - # Don't fail if ticker_interval is not in the configuration - timeframes = [config.get('ticker_interval')] + if config.get('ticker_interval'): + timeframes = args.timeframes or [config.get('ticker_interval')] + else: + timeframes = args.timeframes or ['1m', '5m'] else: config = { @@ -68,8 +70,7 @@ else: } } } - -timeframes = args.timeframes + timeframes = args.timeframes or ['1m', '5m'] configuration._load_logging_config(config)