From 0b18c93d19d52fc6a41f7e1e508058bde7d138c7 Mon Sep 17 00:00:00 2001 From: Stephen Dade Date: Tue, 12 Dec 2017 19:38:18 +1100 Subject: [PATCH] Daily profit command - better message formatting and minor fixes --- README.md | 2 +- freqtrade/rpc/telegram.py | 42 +++++++++++++++------------- freqtrade/tests/test_rpc_telegram.py | 15 ++++++++-- 3 files changed, 37 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index af4fdc887..a372c5a93 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ Persistence is achieved through sqlite. * /forcesell |all: Instantly sells the given trade (Ignoring `minimum_roi`). * /performance: Show performance of each finished trade grouped by pair * /balance: Show account balance per currency -* /daily [n]: Shows profit or loss per day, over the last n (default 7) days +* /daily : Shows profit or loss per day, over the last n days * /help: Show help message * /version: Show version diff --git a/freqtrade/rpc/telegram.py b/freqtrade/rpc/telegram.py index 0ef55efaf..ab288854a 100644 --- a/freqtrade/rpc/telegram.py +++ b/freqtrade/rpc/telegram.py @@ -212,7 +212,6 @@ def _daily(bot: Bot, update: Update) -> None: """ Handler for /daily Returns a daily profit (in BTC) over the last n days. - Default is 7 days :param bot: telegram bot :param update: message update :return: None @@ -222,28 +221,32 @@ def _daily(bot: Bot, update: Update) -> None: profit_days = {} try: - timescale = update.message.text.replace('/daily', '').strip() + timescale = int(update.message.text.replace('/daily', '').strip()) except: - timescale = 7 + send_msg('*Daily :* `must be an integer greater than 0`', bot=bot) + return + + if not (isinstance(timescale, int) and timescale > 0): + send_msg('*Daily :* `must be an integer greater than 0`', bot=bot) + return for day in range(0, timescale): - #need to query between day+1 and day-1 - nextdate = date.fromordinal(today-day+1) - prevdate = date.fromordinal(today-day-1) - trades = Trade.query.filter(between(Trade.close_date, prevdate, nextdate)).all() - curdayprofit = 0 - for trade in trades: - curdayprofit += trade.close_profit * trade.stake_amount - profit_days[date.fromordinal(today-day)] = curdayprofit + #need to query between day+1 and day-1 + nextdate = date.fromordinal(today-day+1) + prevdate = date.fromordinal(today-day-1) + trades = Trade.query.filter(between(Trade.close_date, prevdate, nextdate)).all() + curdayprofit = 0 + for trade in trades: + curdayprofit += trade.close_profit * trade.stake_amount + profit_days[date.fromordinal(today-day)] = curdayprofit + stats = [] + for key, value in profit_days.items(): + stats.append([key, str(value) + ' BTC']) + stats = tabulate(stats, headers=['Day', 'Profit'], tablefmt='simple') - stats = '\n'.join('{index}\t{profit} BTC'.format( - index=key, - profit=value, - ) for key, value in profit_days.items()) - - message = 'Daily Profit:\n{}'.format(stats) - send_msg(message, bot=bot) + message = 'Daily Profit over the last {} days:\n
{}
'.format(timescale, stats) + send_msg(message, bot=bot, parse_mode=ParseMode.HTML) @authorized_only def _profit(bot: Bot, update: Update) -> None: @@ -469,6 +472,7 @@ def _help(bot: Bot, update: Update) -> None: */profit:* `Lists cumulative profit from all finished trades` */forcesell |all:* `Instantly sells the given trade or all trades, regardless of profit` */performance:* `Show performance of each finished trade grouped by pair` +*/daily :* `Shows profit or loss per day, over the last n days` */count:* `Show number of trades running compared to allowed number of trades` */balance:* `Show account balance per currency` */help:* `This help message` @@ -514,7 +518,7 @@ def send_msg(msg: str, bot: Bot = None, parse_mode: ParseMode = ParseMode.MARKDO bot = bot or _UPDATER.bot - keyboard = [['/status table', '/profit', '/performance', ], + keyboard = [['/daily', '/status table', '/profit', '/performance', ], ['/balance', '/status', '/count'], ['/start', '/stop', '/help']] diff --git a/freqtrade/tests/test_rpc_telegram.py b/freqtrade/tests/test_rpc_telegram.py index 359810b8a..78f5f42c0 100644 --- a/freqtrade/tests/test_rpc_telegram.py +++ b/freqtrade/tests/test_rpc_telegram.py @@ -330,7 +330,7 @@ def test_daily_handle( validate_pairs=MagicMock(), get_ticker=ticker) init(default_conf, create_engine('sqlite://')) - + # Create some test data create_trade(15.0) trade = Trade.query.first() @@ -345,10 +345,21 @@ def test_daily_handle( trade.close_date = datetime.utcnow() trade.is_open = False + #try valid data + update.message.text = '/daily 7' _daily(bot=MagicMock(), update=update) assert msg_mock.call_count == 1 assert 'Daily' in msg_mock.call_args_list[0][0][0] - assert str(date.today()) + '\t1.50701325 BTC' in msg_mock.call_args_list[0][0][0] + assert str(date.today()) + ' 1.50701325 BTC' in msg_mock.call_args_list[0][0][0] + + #try invalid data + msg_mock.reset_mock() + update_state(State.RUNNING) + update.message.text = '/daily' + _daily(bot=MagicMock(), update=update) + assert msg_mock.call_count == 1 + assert 'must be an integer greater than 0' in msg_mock.call_args_list[0][0][0] + def test_count_handle(default_conf, update, ticker, mocker): mocker.patch.dict('freqtrade.main._CONF', default_conf)