2018-02-12 06:10:21 +00:00
|
|
|
"""
|
|
|
|
This module contains the argument manager class
|
|
|
|
"""
|
|
|
|
import argparse
|
2019-10-13 10:12:20 +00:00
|
|
|
from functools import partial
|
2019-09-03 04:48:51 +00:00
|
|
|
from pathlib import Path
|
2019-09-12 18:14:58 +00:00
|
|
|
from typing import Any, Dict, List, Optional
|
2019-07-11 18:23:23 +00:00
|
|
|
|
2019-07-25 18:42:08 +00:00
|
|
|
from freqtrade import constants
|
2019-09-12 18:14:58 +00:00
|
|
|
from freqtrade.configuration.cli_options import AVAILABLE_CLI_OPTIONS
|
2019-07-06 22:20:26 +00:00
|
|
|
|
2019-07-21 12:32:29 +00:00
|
|
|
ARGS_COMMON = ["verbosity", "logfile", "version", "config", "datadir", "user_data_dir"]
|
2019-07-06 22:20:26 +00:00
|
|
|
|
2019-06-22 18:10:35 +00:00
|
|
|
ARGS_STRATEGY = ["strategy", "strategy_path"]
|
|
|
|
|
2019-10-15 04:51:03 +00:00
|
|
|
ARGS_TRADE = ["db_url", "sd_notify", "dry_run"]
|
2019-06-22 18:10:35 +00:00
|
|
|
|
2019-07-06 21:51:01 +00:00
|
|
|
ARGS_COMMON_OPTIMIZE = ["ticker_interval", "timerange",
|
2019-10-05 13:29:00 +00:00
|
|
|
"max_open_trades", "stake_amount", "fee"]
|
2019-06-22 18:10:35 +00:00
|
|
|
|
|
|
|
ARGS_BACKTEST = ARGS_COMMON_OPTIMIZE + ["position_stacking", "use_max_market_positions",
|
2019-08-18 04:59:56 +00:00
|
|
|
"strategy_list", "export", "exportfilename"]
|
2019-06-22 18:10:35 +00:00
|
|
|
|
2019-07-22 16:37:34 +00:00
|
|
|
ARGS_HYPEROPT = ARGS_COMMON_OPTIMIZE + ["hyperopt", "hyperopt_path",
|
|
|
|
"position_stacking", "epochs", "spaces",
|
2019-08-03 16:09:42 +00:00
|
|
|
"use_max_market_positions", "print_all",
|
2019-08-15 18:39:04 +00:00
|
|
|
"print_colorized", "print_json", "hyperopt_jobs",
|
2019-07-15 18:17:15 +00:00
|
|
|
"hyperopt_random_state", "hyperopt_min_trades",
|
2019-07-16 04:27:23 +00:00
|
|
|
"hyperopt_continue", "hyperopt_loss"]
|
2019-06-22 18:10:35 +00:00
|
|
|
|
|
|
|
ARGS_EDGE = ARGS_COMMON_OPTIMIZE + ["stoploss_range"]
|
|
|
|
|
2019-09-30 21:33:33 +00:00
|
|
|
ARGS_LIST_EXCHANGES = ["print_one_column", "list_exchanges_all"]
|
2019-06-22 18:10:35 +00:00
|
|
|
|
2019-09-29 08:54:20 +00:00
|
|
|
ARGS_LIST_TIMEFRAMES = ["exchange", "print_one_column"]
|
2019-06-22 18:10:35 +00:00
|
|
|
|
2019-10-15 19:31:23 +00:00
|
|
|
ARGS_LIST_PAIRS = ["exchange", "print_list", "list_pairs_print_json", "print_one_column",
|
2019-10-16 23:42:07 +00:00
|
|
|
"print_csv", "base_currencies", "quote_currencies", "list_pairs_all"]
|
2019-10-13 10:12:20 +00:00
|
|
|
|
2019-11-30 18:53:22 +00:00
|
|
|
ARGS_TEST_PAIRLIST = ["config", "quote_currencies"]
|
|
|
|
|
2019-11-01 13:08:55 +00:00
|
|
|
ARGS_CREATE_USERDIR = ["user_data_dir", "reset"]
|
2019-07-21 12:13:38 +00:00
|
|
|
|
2019-11-21 06:21:19 +00:00
|
|
|
ARGS_BUILD_STRATEGY = ["user_data_dir", "strategy", "template"]
|
2019-11-01 15:04:44 +00:00
|
|
|
|
2019-11-21 06:21:19 +00:00
|
|
|
ARGS_BUILD_HYPEROPT = ["user_data_dir", "hyperopt", "template"]
|
2019-11-02 09:42:17 +00:00
|
|
|
|
2019-10-08 18:31:01 +00:00
|
|
|
ARGS_DOWNLOAD_DATA = ["pairs", "pairs_file", "days", "download_trades", "exchange",
|
|
|
|
"timeframes", "erase"]
|
2019-06-22 18:10:35 +00:00
|
|
|
|
2019-09-29 14:25:25 +00:00
|
|
|
ARGS_PLOT_DATAFRAME = ["pairs", "indicators1", "indicators2", "plot_limit",
|
|
|
|
"db_url", "trade_source", "export", "exportfilename",
|
|
|
|
"timerange", "ticker_interval"]
|
2019-06-22 18:10:35 +00:00
|
|
|
|
2019-08-22 18:32:06 +00:00
|
|
|
ARGS_PLOT_PROFIT = ["pairs", "timerange", "export", "exportfilename", "db_url",
|
|
|
|
"trade_source", "ticker_interval"]
|
2019-06-22 18:27:29 +00:00
|
|
|
|
2019-10-13 10:12:20 +00:00
|
|
|
NO_CONF_REQURIED = ["download-data", "list-timeframes", "list-markets", "list-pairs",
|
|
|
|
"plot-dataframe", "plot-profit"]
|
2019-09-30 05:28:49 +00:00
|
|
|
|
2019-11-12 12:33:37 +00:00
|
|
|
NO_CONF_ALLOWED = ["create-userdir", "list-exchanges", "new-hyperopt", "new-strategy"]
|
2019-08-16 12:42:44 +00:00
|
|
|
|
2019-06-22 18:10:35 +00:00
|
|
|
|
2019-09-12 01:39:52 +00:00
|
|
|
class Arguments:
|
2018-02-12 06:10:21 +00:00
|
|
|
"""
|
|
|
|
Arguments Class. Manage the arguments received by the cli
|
|
|
|
"""
|
2019-11-30 18:53:22 +00:00
|
|
|
|
2019-09-04 14:39:23 +00:00
|
|
|
def __init__(self, args: Optional[List[str]]) -> None:
|
2018-02-12 06:10:21 +00:00
|
|
|
self.args = args
|
2019-07-18 14:55:35 +00:00
|
|
|
self._parsed_arg: Optional[argparse.Namespace] = None
|
2018-02-12 06:10:21 +00:00
|
|
|
|
2019-09-12 18:14:58 +00:00
|
|
|
def get_parsed_arg(self) -> Dict[str, Any]:
|
2018-02-12 06:10:21 +00:00
|
|
|
"""
|
|
|
|
Return the list of arguments
|
|
|
|
:return: List[str] List of arguments
|
|
|
|
"""
|
2019-07-18 14:55:35 +00:00
|
|
|
if self._parsed_arg is None:
|
2019-09-04 15:14:04 +00:00
|
|
|
self._build_subcommands()
|
2019-07-18 14:55:35 +00:00
|
|
|
self._parsed_arg = self._parse_args()
|
2018-02-12 06:10:21 +00:00
|
|
|
|
2019-09-12 18:14:58 +00:00
|
|
|
return vars(self._parsed_arg)
|
2018-02-12 06:10:21 +00:00
|
|
|
|
2019-07-18 14:55:35 +00:00
|
|
|
def _parse_args(self) -> argparse.Namespace:
|
2018-02-12 06:10:21 +00:00
|
|
|
"""
|
|
|
|
Parses given arguments and returns an argparse Namespace instance.
|
|
|
|
"""
|
|
|
|
parsed_arg = self.parser.parse_args(self.args)
|
|
|
|
|
2019-02-19 12:14:47 +00:00
|
|
|
# Workaround issue in argparse with action='append' and default value
|
|
|
|
# (see https://bugs.python.org/issue16399)
|
2019-08-16 12:42:44 +00:00
|
|
|
# Allow no-config for certain commands (like downloading / plotting)
|
2019-09-16 04:35:37 +00:00
|
|
|
if ('config' in parsed_arg and parsed_arg.config is None and
|
|
|
|
((Path.cwd() / constants.DEFAULT_CONFIG).is_file() or
|
|
|
|
not ('command' in parsed_arg and parsed_arg.command in NO_CONF_REQURIED))):
|
2019-02-19 12:14:47 +00:00
|
|
|
parsed_arg.config = [constants.DEFAULT_CONFIG]
|
|
|
|
|
2018-02-12 06:10:21 +00:00
|
|
|
return parsed_arg
|
|
|
|
|
2019-09-14 09:15:51 +00:00
|
|
|
def _build_args(self, optionlist, parser):
|
2019-06-22 18:10:35 +00:00
|
|
|
|
|
|
|
for val in optionlist:
|
|
|
|
opt = AVAILABLE_CLI_OPTIONS[val]
|
2019-07-02 18:33:27 +00:00
|
|
|
parser.add_argument(*opt.cli, dest=val, **opt.kwargs)
|
2019-06-22 18:10:35 +00:00
|
|
|
|
2018-02-12 06:10:21 +00:00
|
|
|
def _build_subcommands(self) -> None:
|
|
|
|
"""
|
2019-06-18 22:53:38 +00:00
|
|
|
Builds and attaches all subcommands.
|
2018-02-12 06:10:21 +00:00
|
|
|
:return: None
|
|
|
|
"""
|
2019-09-04 15:14:04 +00:00
|
|
|
# Build shared arguments (as group Common Options)
|
|
|
|
_common_parser = argparse.ArgumentParser(add_help=False)
|
2019-09-29 14:25:25 +00:00
|
|
|
group = _common_parser.add_argument_group("Common arguments")
|
2019-09-04 15:14:04 +00:00
|
|
|
self._build_args(optionlist=ARGS_COMMON, parser=group)
|
|
|
|
|
2019-09-29 14:25:25 +00:00
|
|
|
_strategy_parser = argparse.ArgumentParser(add_help=False)
|
2019-09-29 14:28:14 +00:00
|
|
|
strategy_group = _strategy_parser.add_argument_group("Strategy arguments")
|
2019-09-29 14:25:25 +00:00
|
|
|
self._build_args(optionlist=ARGS_STRATEGY, parser=strategy_group)
|
|
|
|
|
2019-09-04 15:14:04 +00:00
|
|
|
# Build main command
|
2019-09-16 04:35:37 +00:00
|
|
|
self.parser = argparse.ArgumentParser(description='Free, open source crypto trading bot')
|
2019-09-16 04:44:39 +00:00
|
|
|
self._build_args(optionlist=['version'], parser=self.parser)
|
2019-09-04 15:14:04 +00:00
|
|
|
|
2019-05-28 17:25:01 +00:00
|
|
|
from freqtrade.optimize import start_backtesting, start_hyperopt, start_edge
|
2019-09-14 09:16:14 +00:00
|
|
|
from freqtrade.utils import (start_create_userdir, start_download_data,
|
2019-10-23 19:45:06 +00:00
|
|
|
start_list_exchanges, start_list_markets,
|
2019-11-02 09:42:17 +00:00
|
|
|
start_new_hyperopt, start_new_strategy,
|
2019-11-30 18:53:22 +00:00
|
|
|
start_list_timeframes, start_test_pairlist, start_trading)
|
2019-09-14 09:16:14 +00:00
|
|
|
from freqtrade.plot.plot_utils import start_plot_dataframe, start_plot_profit
|
|
|
|
|
2019-09-16 04:35:37 +00:00
|
|
|
subparsers = self.parser.add_subparsers(dest='command',
|
|
|
|
# Use custom message when no subhandler is added
|
|
|
|
# shown from `main.py`
|
|
|
|
# required=True
|
|
|
|
)
|
2018-02-12 06:10:21 +00:00
|
|
|
|
2019-09-14 09:16:14 +00:00
|
|
|
# Add trade subcommand
|
|
|
|
trade_cmd = subparsers.add_parser('trade', help='Trade module.',
|
2019-09-29 14:25:25 +00:00
|
|
|
parents=[_common_parser, _strategy_parser])
|
2019-09-14 09:16:14 +00:00
|
|
|
trade_cmd.set_defaults(func=start_trading)
|
2019-09-29 14:25:25 +00:00
|
|
|
self._build_args(optionlist=ARGS_TRADE, parser=trade_cmd)
|
2018-02-12 06:10:21 +00:00
|
|
|
|
|
|
|
# Add backtesting subcommand
|
2019-09-04 15:14:04 +00:00
|
|
|
backtesting_cmd = subparsers.add_parser('backtesting', help='Backtesting module.',
|
2019-09-29 14:25:25 +00:00
|
|
|
parents=[_common_parser, _strategy_parser])
|
2019-05-25 18:00:31 +00:00
|
|
|
backtesting_cmd.set_defaults(func=start_backtesting)
|
2019-07-18 14:55:35 +00:00
|
|
|
self._build_args(optionlist=ARGS_BACKTEST, parser=backtesting_cmd)
|
2018-02-12 06:10:21 +00:00
|
|
|
|
2018-11-14 11:37:15 +00:00
|
|
|
# Add edge subcommand
|
2019-09-14 11:19:21 +00:00
|
|
|
edge_cmd = subparsers.add_parser('edge', help='Edge module.',
|
2019-09-29 14:25:25 +00:00
|
|
|
parents=[_common_parser, _strategy_parser])
|
2019-05-28 17:25:01 +00:00
|
|
|
edge_cmd.set_defaults(func=start_edge)
|
2019-07-18 14:55:35 +00:00
|
|
|
self._build_args(optionlist=ARGS_EDGE, parser=edge_cmd)
|
2018-11-14 11:37:15 +00:00
|
|
|
|
2018-02-12 06:10:21 +00:00
|
|
|
# Add hyperopt subcommand
|
2019-09-04 15:14:04 +00:00
|
|
|
hyperopt_cmd = subparsers.add_parser('hyperopt', help='Hyperopt module.',
|
2019-09-29 14:25:25 +00:00
|
|
|
parents=[_common_parser, _strategy_parser],
|
2019-09-04 15:14:04 +00:00
|
|
|
)
|
2019-05-25 18:00:31 +00:00
|
|
|
hyperopt_cmd.set_defaults(func=start_hyperopt)
|
2019-07-18 14:55:35 +00:00
|
|
|
self._build_args(optionlist=ARGS_HYPEROPT, parser=hyperopt_cmd)
|
2018-02-12 06:10:21 +00:00
|
|
|
|
2019-08-30 18:42:14 +00:00
|
|
|
# add create-userdir subcommand
|
2019-07-21 12:13:38 +00:00
|
|
|
create_userdir_cmd = subparsers.add_parser('create-userdir',
|
2019-09-04 15:14:04 +00:00
|
|
|
help="Create user-data directory.",
|
|
|
|
)
|
2019-07-21 12:13:38 +00:00
|
|
|
create_userdir_cmd.set_defaults(func=start_create_userdir)
|
|
|
|
self._build_args(optionlist=ARGS_CREATE_USERDIR, parser=create_userdir_cmd)
|
|
|
|
|
2019-11-01 15:04:44 +00:00
|
|
|
# add new-strategy subcommand
|
|
|
|
build_strategy_cmd = subparsers.add_parser('new-strategy',
|
|
|
|
help="Create new strategy")
|
|
|
|
build_strategy_cmd.set_defaults(func=start_new_strategy)
|
|
|
|
self._build_args(optionlist=ARGS_BUILD_STRATEGY, parser=build_strategy_cmd)
|
|
|
|
|
2019-11-02 09:42:17 +00:00
|
|
|
# add new-hyperopt subcommand
|
|
|
|
build_hyperopt_cmd = subparsers.add_parser('new-hyperopt',
|
|
|
|
help="Create new hyperopt")
|
|
|
|
build_hyperopt_cmd.set_defaults(func=start_new_hyperopt)
|
|
|
|
self._build_args(optionlist=ARGS_BUILD_HYPEROPT, parser=build_hyperopt_cmd)
|
|
|
|
|
2019-06-12 09:33:20 +00:00
|
|
|
# Add list-exchanges subcommand
|
2019-10-20 17:54:38 +00:00
|
|
|
list_exchanges_cmd = subparsers.add_parser(
|
|
|
|
'list-exchanges',
|
|
|
|
help='Print available exchanges.',
|
|
|
|
parents=[_common_parser],
|
|
|
|
)
|
2019-06-12 09:33:20 +00:00
|
|
|
list_exchanges_cmd.set_defaults(func=start_list_exchanges)
|
2019-07-18 14:55:35 +00:00
|
|
|
self._build_args(optionlist=ARGS_LIST_EXCHANGES, parser=list_exchanges_cmd)
|
2019-08-16 12:42:44 +00:00
|
|
|
|
2019-09-29 08:54:20 +00:00
|
|
|
# Add list-timeframes subcommand
|
|
|
|
list_timeframes_cmd = subparsers.add_parser(
|
|
|
|
'list-timeframes',
|
2019-10-20 17:54:38 +00:00
|
|
|
help='Print available ticker intervals (timeframes) for the exchange.',
|
|
|
|
parents=[_common_parser],
|
2019-09-29 08:54:20 +00:00
|
|
|
)
|
|
|
|
list_timeframes_cmd.set_defaults(func=start_list_timeframes)
|
|
|
|
self._build_args(optionlist=ARGS_LIST_TIMEFRAMES, parser=list_timeframes_cmd)
|
|
|
|
|
2019-10-13 10:12:20 +00:00
|
|
|
# Add list-markets subcommand
|
|
|
|
list_markets_cmd = subparsers.add_parser(
|
|
|
|
'list-markets',
|
2019-10-24 04:22:05 +00:00
|
|
|
help='Print markets on exchange.',
|
|
|
|
parents=[_common_parser],
|
2019-10-13 10:12:20 +00:00
|
|
|
)
|
2019-10-17 22:26:05 +00:00
|
|
|
list_markets_cmd.set_defaults(func=partial(start_list_markets, pairs_only=False))
|
2019-10-13 10:12:20 +00:00
|
|
|
self._build_args(optionlist=ARGS_LIST_PAIRS, parser=list_markets_cmd)
|
|
|
|
|
|
|
|
# Add list-pairs subcommand
|
|
|
|
list_pairs_cmd = subparsers.add_parser(
|
|
|
|
'list-pairs',
|
2019-10-24 04:22:05 +00:00
|
|
|
help='Print pairs on exchange.',
|
|
|
|
parents=[_common_parser],
|
2019-10-13 10:12:20 +00:00
|
|
|
)
|
2019-10-17 22:26:05 +00:00
|
|
|
list_pairs_cmd.set_defaults(func=partial(start_list_markets, pairs_only=True))
|
2019-10-13 10:12:20 +00:00
|
|
|
self._build_args(optionlist=ARGS_LIST_PAIRS, parser=list_pairs_cmd)
|
|
|
|
|
2019-11-30 18:53:22 +00:00
|
|
|
# Add test-pairlist subcommand
|
|
|
|
test_pairlist_cmd = subparsers.add_parser(
|
|
|
|
'test-pairlist',
|
|
|
|
help='Test your pairlist configuration.',
|
|
|
|
)
|
|
|
|
test_pairlist_cmd.set_defaults(func=start_test_pairlist)
|
|
|
|
self._build_args(optionlist=ARGS_TEST_PAIRLIST, parser=test_pairlist_cmd)
|
|
|
|
|
2019-08-16 12:42:44 +00:00
|
|
|
# Add download-data subcommand
|
2019-10-20 17:54:38 +00:00
|
|
|
download_data_cmd = subparsers.add_parser(
|
|
|
|
'download-data',
|
|
|
|
help='Download backtesting data.',
|
|
|
|
parents=[_common_parser],
|
|
|
|
)
|
2019-08-16 12:42:44 +00:00
|
|
|
download_data_cmd.set_defaults(func=start_download_data)
|
2019-08-17 04:48:34 +00:00
|
|
|
self._build_args(optionlist=ARGS_DOWNLOAD_DATA, parser=download_data_cmd)
|
2019-08-22 14:02:03 +00:00
|
|
|
|
|
|
|
# Add Plotting subcommand
|
2019-10-20 17:54:38 +00:00
|
|
|
plot_dataframe_cmd = subparsers.add_parser(
|
|
|
|
'plot-dataframe',
|
|
|
|
help='Plot candles with indicators.',
|
|
|
|
parents=[_common_parser, _strategy_parser],
|
|
|
|
)
|
2019-08-22 14:02:03 +00:00
|
|
|
plot_dataframe_cmd.set_defaults(func=start_plot_dataframe)
|
|
|
|
self._build_args(optionlist=ARGS_PLOT_DATAFRAME, parser=plot_dataframe_cmd)
|
2019-08-22 14:51:00 +00:00
|
|
|
|
|
|
|
# Plot profit
|
2019-10-20 17:54:38 +00:00
|
|
|
plot_profit_cmd = subparsers.add_parser(
|
|
|
|
'plot-profit',
|
|
|
|
help='Generate plot showing profits.',
|
|
|
|
parents=[_common_parser],
|
|
|
|
)
|
2019-08-22 14:51:00 +00:00
|
|
|
plot_profit_cmd.set_defaults(func=start_plot_profit)
|
|
|
|
self._build_args(optionlist=ARGS_PLOT_PROFIT, parser=plot_profit_cmd)
|