From 6d2afdb1466eb097968280928b0e05dccf8784d1 Mon Sep 17 00:00:00 2001 From: Gert Wohlgemuth Date: Thu, 3 May 2018 02:18:35 -0700 Subject: [PATCH 01/12] added support for showing the exposed real value on the count table (#634) --- freqtrade/rpc/telegram.py | 5 +++-- freqtrade/tests/rpc/test_rpc_telegram.py | 9 ++++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/freqtrade/rpc/telegram.py b/freqtrade/rpc/telegram.py index 81749d778..086c408ac 100644 --- a/freqtrade/rpc/telegram.py +++ b/freqtrade/rpc/telegram.py @@ -357,8 +357,9 @@ class Telegram(RPC): message = tabulate({ 'current': [len(trades)], - 'max': [self._config['max_open_trades']] - }, headers=['current', 'max'], tablefmt='simple') + 'max': [self._config['max_open_trades']], + 'total stake': [sum((trade.open_rate * trade.amount) for trade in trades)] + }, headers=['current', 'max', 'total stake'], tablefmt='simple') message = "
{}
".format(message) logger.debug(message) self.send_msg(message, parse_mode=ParseMode.HTML) diff --git a/freqtrade/tests/rpc/test_rpc_telegram.py b/freqtrade/tests/rpc/test_rpc_telegram.py index 86dfd6f41..72408c908 100644 --- a/freqtrade/tests/rpc/test_rpc_telegram.py +++ b/freqtrade/tests/rpc/test_rpc_telegram.py @@ -1001,9 +1001,12 @@ def test_count_handle(default_conf, update, ticker, mocker) -> None: msg_mock.reset_mock() telegram._count(bot=MagicMock(), update=update) - msg = '
  current    max\n---------  -----\n        1      {}
'.format( - default_conf['max_open_trades'] - ) + msg = '
  current    max    total stake\n---------  -----  -------------\n' \
+          '        1      {}          {}
'\ + .format( + default_conf['max_open_trades'], + default_conf['stake_amount'] + ) assert msg in msg_mock.call_args_list[0][0][0] From 3d4019d8b7c963d9da30e7327918794b21a6396a Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sat, 5 May 2018 00:14:03 +0200 Subject: [PATCH 02/12] Update python-telegram-bot from 10.0.2 to 10.1.0 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 7093d783e..492be0362 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ python-bittrex==0.3.0 SQLAlchemy==1.2.7 -python-telegram-bot==10.0.2 +python-telegram-bot==10.1.0 arrow==0.12.1 cachetools==2.0.1 requests==2.18.4 From 05ff0e00277299f38ed7220e99af83358aa79505 Mon Sep 17 00:00:00 2001 From: Gert Wohlgemuth Date: Sun, 6 May 2018 12:25:40 -0700 Subject: [PATCH 03/12] added support for improved graphics and strategy path configuration --- freqtrade/arguments.py | 10 +++ scripts/plot_dataframe.py | 142 ++++++++++++++++++++++++++++++++++---- 2 files changed, 138 insertions(+), 14 deletions(-) diff --git a/freqtrade/arguments.py b/freqtrade/arguments.py index 791ef85f2..51a8daeca 100644 --- a/freqtrade/arguments.py +++ b/freqtrade/arguments.py @@ -255,3 +255,13 @@ class Arguments(object): dest='pair', default=None ) + """ + Parses given arguments for plot scripts. + """ + self.parser.add_argument( + '--stop-loss', + help='Renders stop/loss informations in the main chart', + dest='stoplossdisplay', + default=False, + type=bool + ) diff --git a/scripts/plot_dataframe.py b/scripts/plot_dataframe.py index aa61fc172..9c58e238b 100755 --- a/scripts/plot_dataframe.py +++ b/scripts/plot_dataframe.py @@ -11,25 +11,117 @@ Optional Cli parameters --timerange: specify what timerange of data to use. -l / --live: Live, to download the latest ticker for the pair """ +import datetime import logging import sys from argparse import Namespace - from typing import List +import plotly.graph_objs as go from plotly import tools from plotly.offline import plot -import plotly.graph_objs as go -from freqtrade.arguments import Arguments -from freqtrade.analyze import Analyze -from freqtrade import exchange import freqtrade.optimize as optimize - +from freqtrade import exchange +from freqtrade.analyze import Analyze +from freqtrade.arguments import Arguments +from freqtrade.configuration import Configuration logger = logging.getLogger(__name__) +def plot_stop_loss_trade(df_sell, fig, analyze, args): + """ + plots the stop loss for the associated trades and buys + as well as the estimated profit ranges. + + will be enabled if --stop-loss is provided + as argument + + :param data: + :param trades: + :return: + """ + + if args.stoplossdisplay is False: + return + + stoploss = analyze.strategy.stoploss + + for index, x in df_sell.iterrows(): + if x['associated_buy_price'] > 0: + # draw stop loss + fig['layout']['shapes'].append( + { + 'fillcolor': 'red', + 'opacity': 0.1, + 'type': 'rect', + 'x0': x['associated_buy_date'], + 'x1': x['date'], + 'y0': x['associated_buy_price'], + 'y1': (x['associated_buy_price'] - abs(stoploss) * x['associated_buy_price']), + 'line': {'color': 'red'} + } + ) + + totalTime = 0 + for time in analyze.strategy.minimal_roi: + t = int(time) + totalTime = t + totalTime + + enddate = x['date'] + + date = x['associated_buy_date'] + datetime.timedelta(minutes=totalTime) + + # draw profit range + fig['layout']['shapes'].append( + { + 'fillcolor': 'green', + 'opacity': 0.1, + 'type': 'rect', + 'x0': date, + 'x1': enddate, + 'y0': x['associated_buy_price'], + 'y1': x['associated_buy_price'] + x['associated_buy_price'] * analyze.strategy.minimal_roi[ + time], + 'line': {'color': 'green'} + } + ) + + +def find_profits(data): + """ + finds the profits between sells and the associated buys. This does not take in account + ROI! + :param data: + :return: + """ + + # go over all the sells + # find all previous buys + + df_sell = data[data['sell'] == 1] + df_buys = data[data['buy'] == 1] + lastDate = data['date'].iloc[0] + + for index, row in df_sell.iterrows(): + + buys = df_buys[(df_buys['date'] < row['date']) & (df_buys['date'] > lastDate)] + + profit = None + if buys['date'].count() > 0: + buys = buys.tail() + profit = round(row['close'] / buys['close'].values[0] * 100 - 100, 2) + lastDate = row['date'] + + df_sell.loc[index, 'associated_buy_date'] = buys['date'].values[0] + df_sell.loc[index, 'associated_buy_price'] = buys['close'].values[0] + + df_sell.loc[index, 'profit'] = profit + + return df_sell + + def plot_analyzed_dataframe(args: Namespace) -> None: """ Calls analyze() and plots the returned dataframe @@ -40,7 +132,9 @@ def plot_analyzed_dataframe(args: Namespace) -> None: # Init strategy try: - analyze = Analyze({'strategy': args.strategy}) + config = Configuration(args) + + analyze = Analyze(config.get_config()) except AttributeError: logger.critical( 'Impossible to load the strategy. Please check the file "user_data/strategies/%s.py"', @@ -83,30 +177,35 @@ def plot_analyzed_dataframe(args: Namespace) -> None: ) df_buy = data[data['buy'] == 1] + buys = go.Scattergl( x=df_buy.date, - y=df_buy.close, + y=df_buy.close * 0.995, mode='markers', name='buy', marker=dict( symbol='triangle-up-dot', - size=9, + size=15, line=dict(width=1), color='green', ) ) - df_sell = data[data['sell'] == 1] - sells = go.Scattergl( + df_sell = find_profits(data) + + sells = go.Scatter( x=df_sell.date, - y=df_sell.close, - mode='markers', + y=df_sell.close * 1.01, + mode='markers+text', name='sell', + text=df_sell.profit, + textposition='top right', marker=dict( symbol='triangle-down-dot', - size=9, + size=15, line=dict(width=1), color='red', ) + ) bb_lower = go.Scatter( @@ -123,6 +222,15 @@ def plot_analyzed_dataframe(args: Namespace) -> None: fillcolor="rgba(0,176,246,0.2)", line={'color': "transparent"}, ) + bb_middle = go.Scatter( + x=data.date, + y=data.bb_middleband, + name='BB middle', + fill="tonexty", + fillcolor="rgba(0,176,246,0.2)", + line={'color': "red"}, + ) + macd = go.Scattergl(x=data['date'], y=data['macd'], name='MACD') macdsignal = go.Scattergl(x=data['date'], y=data['macdsignal'], name='MACD signal') volume = go.Bar(x=data['date'], y=data['volume'], name='Volume') @@ -137,9 +245,15 @@ def plot_analyzed_dataframe(args: Namespace) -> None: fig.append_trace(candles, 1, 1) fig.append_trace(bb_lower, 1, 1) + fig.append_trace(bb_middle, 1, 1) fig.append_trace(bb_upper, 1, 1) + fig.append_trace(buys, 1, 1) fig.append_trace(sells, 1, 1) + + # append stop loss/profit + plot_stop_loss_trade(df_sell, fig, analyze,args) + fig.append_trace(volume, 2, 1) fig.append_trace(macd, 3, 1) fig.append_trace(macdsignal, 3, 1) From 31e5d4d095276b403c89c80dfbc7832d445b8fcc Mon Sep 17 00:00:00 2001 From: Gert Wohlgemuth Date: Sun, 6 May 2018 13:40:49 -0700 Subject: [PATCH 04/12] added support for CCI and RSI plots --- freqtrade/arguments.py | 36 +++++++++++-- scripts/plot_dataframe.py | 104 +++++++++++++++++++++++++++++++++----- 2 files changed, 125 insertions(+), 15 deletions(-) diff --git a/freqtrade/arguments.py b/freqtrade/arguments.py index 51a8daeca..b402adddc 100644 --- a/freqtrade/arguments.py +++ b/freqtrade/arguments.py @@ -255,9 +255,7 @@ class Arguments(object): dest='pair', default=None ) - """ - Parses given arguments for plot scripts. - """ + self.parser.add_argument( '--stop-loss', help='Renders stop/loss informations in the main chart', @@ -265,3 +263,35 @@ class Arguments(object): default=False, type=bool ) + + self.parser.add_argument( + '--plot-rsi', + help='Renders a rsi chart of the given RSI dataframe name, for example --plot-rsi rsi', + dest='plotrsi', + default=None + ) + + self.parser.add_argument( + '--plot-cci', + help='Renders a cci chart of the given RSI dataframe name, for example --plot-cci cci', + dest='plotcci', + default=None + ) + + self.parser.add_argument( + '--plot-macd', + help='Renders a macd chart of the given RSI dataframe name, for example --plot-macd macd', + dest='plotmacd', + default=None + ) + + self.parser.add_argument( + '--plot-volume', + help='plots the volume as a subchart', + dest='plotvolume', + default=False, + type=bool + ) + + + diff --git a/scripts/plot_dataframe.py b/scripts/plot_dataframe.py index 9c58e238b..7f2d9fb3a 100755 --- a/scripts/plot_dataframe.py +++ b/scripts/plot_dataframe.py @@ -30,6 +30,59 @@ from freqtrade.configuration import Configuration logger = logging.getLogger(__name__) +def plot_volume_dataframe(data, fig, args, plotnumber): + """ + adds the plotting of the volume + :param data: + :param fig: + :param args: + :return: + """ + + volume = go.Bar(x=data['date'], y=data['volume'], name='Volume') + fig.append_trace(volume, plotnumber, 1) + +def plot_macd_dataframe(data, fig, args, plotnumber): + """ + adds the plotting of the MACD if specified + :param data: + :param fig: + :param args: + :return: + """ + + macd = go.Scattergl(x=data['date'], y=data[args.plotmacd], name='MACD') + macdsignal = go.Scattergl(x=data['date'], y=data[args.plotmacd + 'signal'], name='MACD signal') + fig.append_trace(macd, plotnumber, 1) + fig.append_trace(macdsignal, plotnumber, 1) + + +def plot_rsi_dataframe(data, fig, args, plotnumber): + """ + + this function plots an additional RSI chart under the exiting charts + :param data: + :param fig: + :param args: + :return: + """ + rsi = go.Scattergl(x=data['date'], y=data[args.plotrsi], name='RSI') + fig.append_trace(rsi, plotnumber, 1) + + +def plot_cci_dataframe(data, fig, args, plotnumber): + """ + + this function plots an additional cci chart under the exiting charts + :param data: + :param fig: + :param args: + :return: + """ + chart = go.Scattergl(x=data['date'], y=data[args.plotcci], name='CCI') + fig.append_trace(chart, plotnumber, 1) + + def plot_stop_loss_trade(df_sell, fig, analyze, args): """ plots the stop loss for the associated trades and buys @@ -231,18 +284,27 @@ def plot_analyzed_dataframe(args: Namespace) -> None: line={'color': "red"}, ) - macd = go.Scattergl(x=data['date'], y=data['macd'], name='MACD') - macdsignal = go.Scattergl(x=data['date'], y=data['macdsignal'], name='MACD signal') - volume = go.Bar(x=data['date'], y=data['volume'], name='Volume') + # ugly hack for now + rowWidth = [1] + if args.plotvolume: + rowWidth.append(1) + if args.plotmacd: + rowWidth.append(1) + if args.plotrsi: + rowWidth.append(1) + if args.plotcci: + rowWidth.append(1) + # standard layout signal + volume fig = tools.make_subplots( - rows=3, + rows=len(rowWidth), cols=1, shared_xaxes=True, - row_width=[1, 1, 4], + row_width=rowWidth, vertical_spacing=0.0001, ) + # todo should be optional fig.append_trace(candles, 1, 1) fig.append_trace(bb_lower, 1, 1) fig.append_trace(bb_middle, 1, 1) @@ -252,16 +314,34 @@ def plot_analyzed_dataframe(args: Namespace) -> None: fig.append_trace(sells, 1, 1) # append stop loss/profit - plot_stop_loss_trade(df_sell, fig, analyze,args) - - fig.append_trace(volume, 2, 1) - fig.append_trace(macd, 3, 1) - fig.append_trace(macdsignal, 3, 1) + plot_stop_loss_trade(df_sell, fig, analyze, args) fig['layout'].update(title=args.pair) fig['layout']['yaxis1'].update(title='Price') - fig['layout']['yaxis2'].update(title='Volume') - fig['layout']['yaxis3'].update(title='MACD') + + subplots = 1 + + if args.plotvolume: + subplots = subplots + 1 + plot_volume_dataframe(data, fig, args, subplots) + fig['layout']['yaxis' + str(subplots)].update(title='Volume') + + if args.plotmacd: + subplots = subplots + 1 + plot_macd_dataframe(data, fig, args, subplots) + fig['layout']['yaxis' + str(subplots)].update(title='MACD') + + if args.plotrsi: + subplots = subplots + 1 + plot_rsi_dataframe(data, fig, args, subplots) + fig['layout']['yaxis' + str(subplots)].update(title='RSI', range=[0, 100]) + + if args.plotcci: + subplots = subplots + 1 + plot_cci_dataframe(data, fig, args, subplots) + fig['layout']['yaxis' + str(subplots)].update(title='CCI') + + # updated all the plot(fig, filename='freqtrade-plot.html') From d2aca6fab24921fb2e2f0bea5a27539c386d7de4 Mon Sep 17 00:00:00 2001 From: Gert Wohlgemuth Date: Sun, 6 May 2018 16:36:04 -0700 Subject: [PATCH 05/12] added support to plot any given dataframe column --- freqtrade/arguments.py | 17 +++++++++++++---- scripts/plot_dataframe.py | 18 ++++++++++++++++++ 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/freqtrade/arguments.py b/freqtrade/arguments.py index b402adddc..a4f32411d 100644 --- a/freqtrade/arguments.py +++ b/freqtrade/arguments.py @@ -260,8 +260,7 @@ class Arguments(object): '--stop-loss', help='Renders stop/loss informations in the main chart', dest='stoplossdisplay', - default=False, - type=bool + action='store_true' ) self.parser.add_argument( @@ -285,13 +284,23 @@ class Arguments(object): default=None ) + self.parser.add_argument( + '--plot-dataframe', + help='Renders the specified dataframes', + dest='plotdataframe', + default=None, + nargs='+', + type=str + + ) + self.parser.add_argument( '--plot-volume', help='plots the volume as a subchart', dest='plotvolume', - default=False, - type=bool + action='store_true' ) + diff --git a/scripts/plot_dataframe.py b/scripts/plot_dataframe.py index 7f2d9fb3a..d187aa037 100755 --- a/scripts/plot_dataframe.py +++ b/scripts/plot_dataframe.py @@ -30,6 +30,20 @@ from freqtrade.configuration import Configuration logger = logging.getLogger(__name__) +def plot_dataframes(data, fig, args): + """ + plots additional dataframes in the main plot + :param data: + :param fig: + :param args: + :return: + """ + + for x in args.plotdataframe: + chart = go.Scattergl(x=data['date'], y=data[x], name=x) + fig.append_trace(chart, 1, 1) + + def plot_volume_dataframe(data, fig, args, plotnumber): """ adds the plotting of the volume @@ -42,6 +56,7 @@ def plot_volume_dataframe(data, fig, args, plotnumber): volume = go.Bar(x=data['date'], y=data['volume'], name='Volume') fig.append_trace(volume, plotnumber, 1) + def plot_macd_dataframe(data, fig, args, plotnumber): """ adds the plotting of the MACD if specified @@ -316,6 +331,9 @@ def plot_analyzed_dataframe(args: Namespace) -> None: # append stop loss/profit plot_stop_loss_trade(df_sell, fig, analyze, args) + # plot other dataframes + plot_dataframes(data, fig, args) + fig['layout'].update(title=args.pair) fig['layout']['yaxis1'].update(title='Price') From f420994006677b84e2122ec809f3c4abe41a8668 Mon Sep 17 00:00:00 2001 From: Gert Wohlgemuth Date: Sun, 6 May 2018 17:32:24 -0700 Subject: [PATCH 06/12] added support to defined custom clipping --- freqtrade/arguments.py | 16 ++++++++++++++++ scripts/plot_dataframe.py | 16 ++++++++++------ 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/freqtrade/arguments.py b/freqtrade/arguments.py index a4f32411d..42275a4cc 100644 --- a/freqtrade/arguments.py +++ b/freqtrade/arguments.py @@ -291,7 +291,16 @@ class Arguments(object): default=None, nargs='+', type=str + ) + + self.parser.add_argument( + '--plot-dataframe-marker', + help='Renders the specified dataframes as markers', + dest='plotdataframemarker', + default=None, + nargs='+', + type=str ) self.parser.add_argument( @@ -302,5 +311,12 @@ class Arguments(object): ) + self.parser.add_argument( + '--plot-max-ticks', + help='specify an upper limit of how many ticks we can display', + dest='plotticks', + default=750, + type=int + ) diff --git a/scripts/plot_dataframe.py b/scripts/plot_dataframe.py index d187aa037..9a9248c7c 100755 --- a/scripts/plot_dataframe.py +++ b/scripts/plot_dataframe.py @@ -39,9 +39,10 @@ def plot_dataframes(data, fig, args): :return: """ - for x in args.plotdataframe: - chart = go.Scattergl(x=data['date'], y=data[x], name=x) - fig.append_trace(chart, 1, 1) + if args.plotdataframe: + for x in args.plotdataframe: + chart = go.Scattergl(x=data['date'], y=data[x], name=x) + fig.append_trace(chart, 1, 1) def plot_volume_dataframe(data, fig, args, plotnumber): @@ -114,6 +115,9 @@ def plot_stop_loss_trade(df_sell, fig, analyze, args): if args.stoplossdisplay is False: return + if 'associated_buy_price' not in df_sell: + return + stoploss = analyze.strategy.stoploss for index, x in df_sell.iterrows(): @@ -231,9 +235,9 @@ def plot_analyzed_dataframe(args: Namespace) -> None: dataframe = analyze.populate_buy_trend(dataframe) dataframe = analyze.populate_sell_trend(dataframe) - if len(dataframe.index) > 750: - logger.warning('Ticker contained more than 750 candles, clipping.') - data = dataframe.tail(750) + if len(dataframe.index) > args.plotticks: + logger.warning('Ticker contained more than {} candles, clipping.'.format(args.plotticks)) + data = dataframe.tail(args.plotticks) candles = go.Candlestick( x=data.date, From 12b4ae7f46518395b8ab53a74f26288c3943e4be Mon Sep 17 00:00:00 2001 From: Gert Wohlgemuth Date: Sun, 6 May 2018 18:32:25 -0700 Subject: [PATCH 07/12] added support to plot markers of a dataframe, like hammers, etc. Added support to plot as many ticks as you want --- freqtrade/arguments.py | 2 +- scripts/plot_dataframe.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/freqtrade/arguments.py b/freqtrade/arguments.py index 42275a4cc..d3168fc82 100644 --- a/freqtrade/arguments.py +++ b/freqtrade/arguments.py @@ -296,7 +296,7 @@ class Arguments(object): self.parser.add_argument( '--plot-dataframe-marker', - help='Renders the specified dataframes as markers', + help='Renders the specified dataframes as markers. Accepted values for a marker are either 100 or -100', dest='plotdataframemarker', default=None, nargs='+', diff --git a/scripts/plot_dataframe.py b/scripts/plot_dataframe.py index 9a9248c7c..794536365 100755 --- a/scripts/plot_dataframe.py +++ b/scripts/plot_dataframe.py @@ -29,6 +29,33 @@ from freqtrade.configuration import Configuration logger = logging.getLogger(__name__) +def plot_dataframes_markers(data, fig, args): + """ + plots additional dataframe markers in the main plot + :param data: + :param fig: + :param args: + :return: + """ + + if args.plotdataframemarker: + for x in args.plotdataframemarker: + filter = data[(data[x] == 100 ) | (data[x] == -100) ] + marker = go.Scatter( + x=filter.date, + y=filter.low * 0.99, + mode='markers', + name=x, + marker=dict( + symbol='diamond-tall-open', + size=10, + line=dict(width=1) + ) + + ) + + fig.append_trace(marker, 1, 1) + def plot_dataframes(data, fig, args): """ @@ -337,6 +364,7 @@ def plot_analyzed_dataframe(args: Namespace) -> None: # plot other dataframes plot_dataframes(data, fig, args) + plot_dataframes_markers(data, fig, args) fig['layout'].update(title=args.pair) fig['layout']['yaxis1'].update(title='Price') From cec301479053dda50814355738e7e97e1fc0541b Mon Sep 17 00:00:00 2001 From: Gert Wohlgemuth Date: Sun, 6 May 2018 23:09:18 -0700 Subject: [PATCH 08/12] added more arguments --- freqtrade/arguments.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/freqtrade/arguments.py b/freqtrade/arguments.py index d3168fc82..d435377f8 100644 --- a/freqtrade/arguments.py +++ b/freqtrade/arguments.py @@ -267,7 +267,9 @@ class Arguments(object): '--plot-rsi', help='Renders a rsi chart of the given RSI dataframe name, for example --plot-rsi rsi', dest='plotrsi', + nargs='+', default=None + ) self.parser.add_argument( From 08ca4f10ba5104edf83d26bfa0fa4fbfdeeadeb4 Mon Sep 17 00:00:00 2001 From: Gert Wohlgemuth Date: Sun, 6 May 2018 23:09:38 -0700 Subject: [PATCH 09/12] added support for dynamic names --- scripts/plot_dataframe.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/scripts/plot_dataframe.py b/scripts/plot_dataframe.py index 794536365..f6c1f2649 100755 --- a/scripts/plot_dataframe.py +++ b/scripts/plot_dataframe.py @@ -109,8 +109,10 @@ def plot_rsi_dataframe(data, fig, args, plotnumber): :param args: :return: """ - rsi = go.Scattergl(x=data['date'], y=data[args.plotrsi], name='RSI') - fig.append_trace(rsi, plotnumber, 1) + if args.plotrsi: + for x in args.plotrsi: + rsi = go.Scattergl(x=data['date'], y=data[x], name=x) + fig.append_trace(rsi, plotnumber, 1) def plot_cci_dataframe(data, fig, args, plotnumber): @@ -122,7 +124,7 @@ def plot_cci_dataframe(data, fig, args, plotnumber): :param args: :return: """ - chart = go.Scattergl(x=data['date'], y=data[args.plotcci], name='CCI') + chart = go.Scattergl(x=data['date'], y=data[args.plotcci], name=args.plotcci) fig.append_trace(chart, plotnumber, 1) From 429fa1aee48a1d14794c2f96cadd7860585da97b Mon Sep 17 00:00:00 2001 From: Gert Wohlgemuth Date: Sun, 6 May 2018 23:16:37 -0700 Subject: [PATCH 10/12] fixed flake --- freqtrade/arguments.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/freqtrade/arguments.py b/freqtrade/arguments.py index d435377f8..b2559e696 100644 --- a/freqtrade/arguments.py +++ b/freqtrade/arguments.py @@ -258,7 +258,7 @@ class Arguments(object): self.parser.add_argument( '--stop-loss', - help='Renders stop/loss informations in the main chart', + help='Renders stop/loss information in the main chart', dest='stoplossdisplay', action='store_true' ) @@ -274,14 +274,15 @@ class Arguments(object): self.parser.add_argument( '--plot-cci', - help='Renders a cci chart of the given RSI dataframe name, for example --plot-cci cci', + help='Renders a cci chart of the given CCI dataframe name, for example --plot-cci cci', dest='plotcci', default=None ) self.parser.add_argument( '--plot-macd', - help='Renders a macd chart of the given RSI dataframe name, for example --plot-macd macd', + help='Renders a macd chart of the given ' + 'dataframe name, for example --plot-macd macd', dest='plotmacd', default=None ) @@ -295,10 +296,10 @@ class Arguments(object): type=str ) - self.parser.add_argument( '--plot-dataframe-marker', - help='Renders the specified dataframes as markers. Accepted values for a marker are either 100 or -100', + help='Renders the specified dataframes as markers. ' + 'Accepted values for a marker are either 100 or -100', dest='plotdataframemarker', default=None, nargs='+', @@ -307,12 +308,11 @@ class Arguments(object): self.parser.add_argument( '--plot-volume', - help='plots the volume as a subchart', + help='plots the volume as a sub plot', dest='plotvolume', action='store_true' ) - self.parser.add_argument( '--plot-max-ticks', help='specify an upper limit of how many ticks we can display', @@ -320,5 +320,3 @@ class Arguments(object): default=750, type=int ) - - From c403ef3b204abebe354432b5c3c9d25808ab667d Mon Sep 17 00:00:00 2001 From: Gert Wohlgemuth Date: Mon, 7 May 2018 13:24:50 -0700 Subject: [PATCH 11/12] fixed some minor bugs --- freqtrade/arguments.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/freqtrade/arguments.py b/freqtrade/arguments.py index b2559e696..a2468abfa 100644 --- a/freqtrade/arguments.py +++ b/freqtrade/arguments.py @@ -260,7 +260,9 @@ class Arguments(object): '--stop-loss', help='Renders stop/loss information in the main chart', dest='stoplossdisplay', - action='store_true' + action='store_true', + default=False + ) self.parser.add_argument( @@ -276,6 +278,8 @@ class Arguments(object): '--plot-cci', help='Renders a cci chart of the given CCI dataframe name, for example --plot-cci cci', dest='plotcci', + nargs='+', + default=None ) From 79b9eb229de36ae9bc17fd73ff7064743370b2ea Mon Sep 17 00:00:00 2001 From: Gert Wohlgemuth Date: Mon, 7 May 2018 13:25:01 -0700 Subject: [PATCH 12/12] fixed some minor bugs --- scripts/plot_dataframe.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/scripts/plot_dataframe.py b/scripts/plot_dataframe.py index f6c1f2649..d9153f7e0 100755 --- a/scripts/plot_dataframe.py +++ b/scripts/plot_dataframe.py @@ -124,8 +124,11 @@ def plot_cci_dataframe(data, fig, args, plotnumber): :param args: :return: """ - chart = go.Scattergl(x=data['date'], y=data[args.plotcci], name=args.plotcci) - fig.append_trace(chart, plotnumber, 1) + if args.plotcci: + for x in args.plotcci: + chart = go.Scattergl(x=data['date'], y=data[x], name=x) + fig.append_trace(chart, plotnumber, 1) + def plot_stop_loss_trade(df_sell, fig, analyze, args): @@ -202,6 +205,7 @@ def find_profits(data): # find all previous buys df_sell = data[data['sell'] == 1] + df_sell['profit'] = 0 df_buys = data[data['buy'] == 1] lastDate = data['date'].iloc[0]