From 9391c27b801f1d53e5105a547546725116cb94a5 Mon Sep 17 00:00:00 2001 From: Jonathan Raviotta Date: Mon, 23 Sep 2019 20:00:07 -0400 Subject: [PATCH 1/3] Enhancements to BB plotting --- freqtrade/plot/plotting.py | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/freqtrade/plot/plotting.py b/freqtrade/plot/plotting.py index 1627959f9..99d3d8088 100644 --- a/freqtrade/plot/plotting.py +++ b/freqtrade/plot/plotting.py @@ -64,14 +64,14 @@ def add_indicators(fig, row, indicators: List[str], data: pd.DataFrame) -> make_ """ for indicator in indicators: if indicator in data: - # TODO: Figure out why scattergl causes problems - scattergl = go.Scatter( + # TODO: Figure out why scattergl causes problems plotly/plotly.js#2284 + scatter = go.Scatter( x=data['date'], y=data[indicator].values, mode='lines', name=indicator ) - fig.add_trace(scattergl, row, 1) + fig.add_trace(scatter, row, 1) else: logger.info( 'Indicator "%s" ignored. Reason: This indicator is not found ' @@ -92,7 +92,7 @@ def add_profit(fig, row, data: pd.DataFrame, column: str, name: str) -> make_sub :param name: Name to use :return: fig with added profit plot """ - profit = go.Scattergl( + profit = go.Scatter( x=data.index, y=data[column], name=name, @@ -222,23 +222,26 @@ def generate_candlestick_graph(pair: str, data: pd.DataFrame, trades: pd.DataFra logger.warning("No sell-signals found.") if 'bb_lowerband' in data and 'bb_upperband' in data: - bb_lower = go.Scattergl( + bb_lower = go.Scatter( x=data.date, y=data.bb_lowerband, - name='BB lower', + showlegend=False, line={'color': 'rgba(255,255,255,0)'}, ) - bb_upper = go.Scattergl( + bb_upper = go.Scatter( x=data.date, y=data.bb_upperband, - name='BB upper', + name='Bollinger Band', fill="tonexty", fillcolor="rgba(0,176,246,0.2)", line={'color': 'rgba(255,255,255,0)'}, ) fig.add_trace(bb_lower, 1, 1) fig.add_trace(bb_upper, 1, 1) - + if 'bb_upperband' in indicators1 and 'bb_lowerband' in indicators1: + indicators1.remove('bb_upperband') + indicators1.remove('bb_lowerband') + # Add indicators to main plot fig = add_indicators(fig=fig, row=1, indicators=indicators1, data=data) @@ -252,7 +255,7 @@ def generate_candlestick_graph(pair: str, data: pd.DataFrame, trades: pd.DataFra ) fig.add_trace(volume, 2, 1) - # Add indicators to seperate row + # Add indicators to separate row fig = add_indicators(fig=fig, row=3, indicators=indicators2, data=data) return fig @@ -267,7 +270,7 @@ def generate_profit_graph(pairs: str, tickers: Dict[str, pd.DataFrame], df_comb = create_cum_profit(df_comb, trades, 'cum_profit') # Plot the pairs average close prices, and total profit growth - avgclose = go.Scattergl( + avgclose = go.Scatter( x=df_comb.index, y=df_comb['mean'], name='Avg close price', From 83e596c06f7edb4038d0c657d3ebc858dcb6197f Mon Sep 17 00:00:00 2001 From: Jonathan Raviotta Date: Wed, 25 Sep 2019 23:09:50 -0400 Subject: [PATCH 2/3] chart styling --- freqtrade/plot/plotting.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/freqtrade/plot/plotting.py b/freqtrade/plot/plotting.py index 99d3d8088..d59509d5c 100644 --- a/freqtrade/plot/plotting.py +++ b/freqtrade/plot/plotting.py @@ -64,7 +64,6 @@ def add_indicators(fig, row, indicators: List[str], data: pd.DataFrame) -> make_ """ for indicator in indicators: if indicator in data: - # TODO: Figure out why scattergl causes problems plotly/plotly.js#2284 scatter = go.Scatter( x=data['date'], y=data[indicator].values, @@ -92,7 +91,7 @@ def add_profit(fig, row, data: pd.DataFrame, column: str, name: str) -> make_sub :param name: Name to use :return: fig with added profit plot """ - profit = go.Scatter( + profit = go.Scattergl( x=data.index, y=data[column], name=name, @@ -221,6 +220,7 @@ def generate_candlestick_graph(pair: str, data: pd.DataFrame, trades: pd.DataFra else: logger.warning("No sell-signals found.") + # TODO: Figure out why scattergl causes problems plotly/plotly.js#2284 if 'bb_lowerband' in data and 'bb_upperband' in data: bb_lower = go.Scatter( x=data.date, @@ -251,8 +251,10 @@ def generate_candlestick_graph(pair: str, data: pd.DataFrame, trades: pd.DataFra volume = go.Bar( x=data['date'], y=data['volume'], - name='Volume' - ) + name='Volume', + marker_color='DarkSlateGrey', + marker_line_color='DarkSlateGrey' + ) fig.add_trace(volume, 2, 1) # Add indicators to separate row @@ -270,7 +272,7 @@ def generate_profit_graph(pairs: str, tickers: Dict[str, pd.DataFrame], df_comb = create_cum_profit(df_comb, trades, 'cum_profit') # Plot the pairs average close prices, and total profit growth - avgclose = go.Scatter( + avgclose = go.Scattergl( x=df_comb.index, y=df_comb['mean'], name='Avg close price', From 764a35d0351613e09919fee7b62f6368e7f24143 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 5 Oct 2019 10:32:42 +0200 Subject: [PATCH 3/3] Remove scattergl and fix tests --- freqtrade/plot/plotting.py | 6 +++--- tests/test_plotting.py | 11 +++++------ 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/freqtrade/plot/plotting.py b/freqtrade/plot/plotting.py index d59509d5c..6bd5993b6 100644 --- a/freqtrade/plot/plotting.py +++ b/freqtrade/plot/plotting.py @@ -91,7 +91,7 @@ def add_profit(fig, row, data: pd.DataFrame, column: str, name: str) -> make_sub :param name: Name to use :return: fig with added profit plot """ - profit = go.Scattergl( + profit = go.Scatter( x=data.index, y=data[column], name=name, @@ -241,7 +241,7 @@ def generate_candlestick_graph(pair: str, data: pd.DataFrame, trades: pd.DataFra if 'bb_upperband' in indicators1 and 'bb_lowerband' in indicators1: indicators1.remove('bb_upperband') indicators1.remove('bb_lowerband') - + # Add indicators to main plot fig = add_indicators(fig=fig, row=1, indicators=indicators1, data=data) @@ -272,7 +272,7 @@ def generate_profit_graph(pairs: str, tickers: Dict[str, pd.DataFrame], df_comb = create_cum_profit(df_comb, trades, 'cum_profit') # Plot the pairs average close prices, and total profit growth - avgclose = go.Scattergl( + avgclose = go.Scatter( x=df_comb.index, y=df_comb['mean'], name='Avg close price', diff --git a/tests/test_plotting.py b/tests/test_plotting.py index 9028ab961..4c576a775 100644 --- a/tests/test_plotting.py +++ b/tests/test_plotting.py @@ -197,8 +197,7 @@ def test_generate_candlestick_graph_no_trades(default_conf, mocker, testdatadir) # All buy-signals should be plotted assert int(data.sell.sum()) == len(sell.x) - assert find_trace_in_fig_data(figure.data, "BB lower") - assert find_trace_in_fig_data(figure.data, "BB upper") + assert find_trace_in_fig_data(figure.data, "Bollinger Band") assert row_mock.call_count == 2 assert trades_mock.call_count == 1 @@ -239,7 +238,7 @@ def test_add_profit(testdatadir): fig1 = add_profit(fig, row=2, data=cum_profits, column='cum_profits', name='Profits') figure = fig1.layout.figure profits = find_trace_in_fig_data(figure.data, "Profits") - assert isinstance(profits, go.Scattergl) + assert isinstance(profits, go.Scatter) assert profits.yaxis == "y2" @@ -268,14 +267,14 @@ def test_generate_profit_graph(testdatadir): assert len(figure.data) == 4 avgclose = find_trace_in_fig_data(figure.data, "Avg close price") - assert isinstance(avgclose, go.Scattergl) + assert isinstance(avgclose, go.Scatter) profit = find_trace_in_fig_data(figure.data, "Profit") - assert isinstance(profit, go.Scattergl) + assert isinstance(profit, go.Scatter) for pair in pairs: profit_pair = find_trace_in_fig_data(figure.data, f"Profit {pair}") - assert isinstance(profit_pair, go.Scattergl) + assert isinstance(profit_pair, go.Scatter) def test_start_plot_dataframe(mocker):