support dicts as indicators

This commit is contained in:
Matthias 2020-01-03 13:27:22 +01:00
parent 3798f94d4c
commit 84ef588163

View File

@ -1,6 +1,6 @@
import logging import logging
from pathlib import Path from pathlib import Path
from typing import Any, Dict, List from typing import Any, Dict, List, Union
import pandas as pd import pandas as pd
from freqtrade.configuration import TimeRange from freqtrade.configuration import TimeRange
@ -13,6 +13,8 @@ from freqtrade.resolvers import StrategyResolver
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
IndicatorType = Union[List[str], Dict[str, Dict]]
try: try:
from plotly.subplots import make_subplots from plotly.subplots import make_subplots
from plotly.offline import plot from plotly.offline import plot
@ -54,9 +56,9 @@ def init_plotscript(config):
} }
def add_indicators(fig, row, indicators: List[str], data: pd.DataFrame) -> make_subplots: def _add_indicators_list(fig, row, indicators: List[str], data: pd.DataFrame) -> make_subplots:
""" """
Generator all the indicator selected by the user for a specific row Generate all the indicator selected by the user for a specific row
:param fig: Plot figure to append to :param fig: Plot figure to append to
:param row: row number for this plot :param row: row number for this plot
:param indicators: List of indicators present in the dataframe :param indicators: List of indicators present in the dataframe
@ -81,6 +83,51 @@ def add_indicators(fig, row, indicators: List[str], data: pd.DataFrame) -> make_
return fig return fig
def _add_indicators_dict(fig, row, indicators: Dict[str, Dict],
data: pd.DataFrame) -> make_subplots:
"""
Generate all the indicators selected by the user for a specific row, based on the configuration
:param fig: Plot figure to append to
:param row: row number for this plot
:param indicators: Dict of Indicators with configuration options.
Dict key must correspond to dataframe column.
:param data: candlestick DataFrame
"""
for indicator, conf in indicators.items():
print(conf)
if indicator in data:
scatter = go.Scatter(
x=data['date'],
y=data[indicator].values,
mode='lines',
name=indicator
)
fig.add_trace(scatter, row, 1)
else:
logger.info(
'Indicator "%s" ignored. Reason: This indicator is not found '
'in your strategy.',
indicator
)
return fig
def add_indicators(fig, row, indicators: IndicatorType, data: pd.DataFrame) -> make_subplots:
"""
Generate all the indicator selected by the user for a specific row
:param fig: Plot figure to append to
:param row: row number for this plot
:param indicators: List of indicators present in the dataframe, Or Dict of Indicators
with configuration options. Dict key must correspond to dataframe column.
:param data: candlestick DataFrame
"""
if isinstance(indicators, list):
_add_indicators_list(fig, row, indicators, data)
else:
_add_indicators_dict(fig, row, indicators, data)
def add_profit(fig, row, data: pd.DataFrame, column: str, name: str) -> make_subplots: def add_profit(fig, row, data: pd.DataFrame, column: str, name: str) -> make_subplots:
""" """
Add profit-plot Add profit-plot
@ -144,8 +191,8 @@ def plot_trades(fig, trades: pd.DataFrame) -> make_subplots:
def generate_candlestick_graph(pair: str, data: pd.DataFrame, trades: pd.DataFrame = None, def generate_candlestick_graph(pair: str, data: pd.DataFrame, trades: pd.DataFrame = None,
indicators1: List[str] = [], indicators1: IndicatorType = [],
indicators2: List[str] = [],) -> go.Figure: indicators2: IndicatorType = [],) -> go.Figure:
""" """
Generate the graph from the data generated by Backtesting or from DB Generate the graph from the data generated by Backtesting or from DB
Volume will always be ploted in row2, so Row 1 and 3 are to our disposal for custom indicators Volume will always be ploted in row2, so Row 1 and 3 are to our disposal for custom indicators
@ -254,7 +301,7 @@ def generate_candlestick_graph(pair: str, data: pd.DataFrame, trades: pd.DataFra
name='Volume', name='Volume',
marker_color='DarkSlateGrey', marker_color='DarkSlateGrey',
marker_line_color='DarkSlateGrey' marker_line_color='DarkSlateGrey'
) )
fig.add_trace(volume, 2, 1) fig.add_trace(volume, 2, 1)
# Add indicators to separate row # Add indicators to separate row
@ -355,12 +402,15 @@ def load_and_plot_trades(config: Dict[str, Any]):
trades_pair = trades.loc[trades['pair'] == pair] trades_pair = trades.loc[trades['pair'] == pair]
trades_pair = extract_trades_of_period(dataframe, trades_pair) trades_pair = extract_trades_of_period(dataframe, trades_pair)
indicators1 = config["indicators1"]
indicators2 = config["indicators2"]
fig = generate_candlestick_graph( fig = generate_candlestick_graph(
pair=pair, pair=pair,
data=dataframe, data=dataframe,
trades=trades_pair, trades=trades_pair,
indicators1=config["indicators1"], indicators1=indicators1,
indicators2=config["indicators2"], indicators2=indicators2,
) )
store_plot_file(fig, filename=generate_plot_filename(pair, config['ticker_interval']), store_plot_file(fig, filename=generate_plot_filename(pair, config['ticker_interval']),