stable/freqtrade/optimize/edge_cli.py

110 lines
3.4 KiB
Python
Raw Normal View History

2018-11-14 11:37:15 +00:00
# pragma pylint: disable=missing-docstring, W0212, too-many-arguments
"""
This module contains the edge backtesting interface
2018-11-14 11:37:15 +00:00
"""
import logging
from argparse import Namespace
from typing import Dict, Any
2018-11-14 12:25:44 +00:00
from tabulate import tabulate
from freqtrade.edge import Edge
2018-11-14 11:37:15 +00:00
2018-11-14 16:14:37 +00:00
from freqtrade.arguments import Arguments
from freqtrade.configuration import Configuration
2018-11-14 11:37:15 +00:00
from freqtrade.exchange import Exchange
from freqtrade.resolvers import StrategyResolver
from freqtrade.state import RunMode
2018-11-14 11:37:15 +00:00
logger = logging.getLogger(__name__)
class EdgeCli(object):
"""
EdgeCli class, this class contains all the logic to run edge backtesting
2018-11-14 11:37:15 +00:00
To run a edge backtest:
edge = EdgeCli(config)
edge.start()
2018-11-14 11:37:15 +00:00
"""
def __init__(self, config: Dict[str, Any]) -> None:
self.config = config
# Reset keys for edge
self.config['exchange']['key'] = ''
self.config['exchange']['secret'] = ''
self.config['exchange']['password'] = ''
self.config['exchange']['uid'] = ''
self.config['dry_run'] = True
self.exchange = Exchange(self.config)
self.strategy = StrategyResolver(self.config).strategy
self.edge = Edge(config, self.exchange, self.strategy)
2018-11-14 11:53:20 +00:00
self.edge._refresh_pairs = self.config.get('refresh_pairs', False)
2018-11-14 11:37:15 +00:00
2018-11-14 16:14:37 +00:00
self.timerange = Arguments.parse_timerange(None if self.config.get(
'timerange') is None else str(self.config.get('timerange')))
self.edge._timerange = self.timerange
2018-11-14 12:25:44 +00:00
def _generate_edge_table(self, results: dict) -> str:
2018-11-14 15:31:23 +00:00
floatfmt = ('s', '.10g', '.2f', '.2f', '.2f', '.2f', 'd', '.d')
2018-11-14 12:25:44 +00:00
tabular_data = []
headers = ['pair', 'stoploss', 'win rate', 'risk reward ratio',
'required risk reward', 'expectancy', 'total number of trades',
'average duration (min)']
2018-11-14 12:25:44 +00:00
for result in results.items():
if result[1].nb_trades > 0:
tabular_data.append([
result[0],
result[1].stoploss,
result[1].winrate,
result[1].risk_reward_ratio,
result[1].required_risk_reward,
result[1].expectancy,
result[1].nb_trades,
round(result[1].avg_trade_duration)
])
2018-11-14 12:25:44 +00:00
# Ignore type as floatfmt does allow tuples but mypy does not know that
return tabulate(tabular_data, headers=headers, # type: ignore
floatfmt=floatfmt, tablefmt="pipe")
2018-11-14 12:25:44 +00:00
2018-11-14 11:37:15 +00:00
def start(self) -> None:
self.edge.calculate()
2018-11-14 15:37:26 +00:00
print('') # blank like for readability
2018-11-14 12:25:44 +00:00
print(self._generate_edge_table(self.edge._cached_pairs))
2018-11-14 11:37:15 +00:00
def setup_configuration(args: Namespace) -> Dict[str, Any]:
"""
Prepare the configuration for edge backtesting
2018-11-14 11:37:15 +00:00
:param args: Cli args from Arguments()
:return: Configuration
"""
configuration = Configuration(args, RunMode.EDGECLI)
2018-11-14 11:37:15 +00:00
config = configuration.get_config()
# Ensure we do not use Exchange credentials
config['exchange']['key'] = ''
config['exchange']['secret'] = ''
return config
def start(args: Namespace) -> None:
"""
Start Edge script
:param args: Cli args from Arguments()
:return: None
"""
# Initialize configuration
config = setup_configuration(args)
logger.info('Starting freqtrade in Edge mode')
2018-11-14 11:53:20 +00:00
2018-11-14 11:37:15 +00:00
# Initialize Edge object
edge_cli = EdgeCli(config)
edge_cli.start()