diff --git a/freqtrade/rpc/rpc.py b/freqtrade/rpc/rpc.py index 84e681992..f15bf3cd0 100644 --- a/freqtrade/rpc/rpc.py +++ b/freqtrade/rpc/rpc.py @@ -6,6 +6,7 @@ from abc import abstractmethod from datetime import date, datetime, timedelta from decimal import Decimal from enum import Enum +from math import isnan from typing import Any, Dict, List, Optional, Tuple import arrow @@ -116,7 +117,7 @@ class RPC: results.append(trade_dict) return results - def _rpc_status_table(self, fiat_display_currency: str) -> Tuple[List, List]: + def _rpc_status_table(self, stake_currency, fiat_display_currency: str) -> Tuple[List, List]: trades = Trade.get_open_trades() if not trades: raise RPCException('no active order') @@ -129,15 +130,27 @@ class RPC: except DependencyException: current_rate = NAN trade_perc = (100 * trade.calc_profit_percent(current_rate)) + trade_profit = trade.calc_profit(current_rate) + profit_str = f'{trade_perc:.2f}%' + if self._fiat_converter: + fiat_profit = self._fiat_converter.convert_amount( + trade_profit, + stake_currency, + fiat_display_currency + ) + if fiat_profit and not isnan(fiat_profit): + profit_str += f" ({fiat_profit:.2f})" trades_list.append([ trade.id, trade.pair, shorten_date(arrow.get(trade.open_date).humanize(only_distance=True)), - f'{trade_perc:.2f}%' - + profit_str ]) + profitcol = "Profit" + if self._fiat_converter: + profitcol += " (" + fiat_display_currency + ")" - columns = ['ID', 'Pair', 'Since', 'Profit'] + columns = ['ID', 'Pair', 'Since', profitcol] return trades_list, columns def _rpc_daily_profit( diff --git a/freqtrade/rpc/telegram.py b/freqtrade/rpc/telegram.py index 25422973d..8a81848ac 100644 --- a/freqtrade/rpc/telegram.py +++ b/freqtrade/rpc/telegram.py @@ -234,7 +234,8 @@ class Telegram(RPC): :return: None """ try: - statlist, head = self._rpc_status_table(self._config.get('fiat_display_currency', '')) + statlist, head = self._rpc_status_table(self._config['stake_currency'], + self._config.get('fiat_display_currency', '')) message = tabulate(statlist, headers=head, tablefmt='simple') self._send_msg(f"
{message}", parse_mode=ParseMode.HTML)
except RPCException as e:
diff --git a/tests/rpc/test_rpc.py b/tests/rpc/test_rpc.py
index 06203a3d7..e7f41f6e7 100644
--- a/tests/rpc/test_rpc.py
+++ b/tests/rpc/test_rpc.py
@@ -96,6 +96,11 @@ def test_rpc_trade_status(default_conf, ticker, fee, mocker) -> None:
def test_rpc_status_table(default_conf, ticker, fee, mocker) -> None:
+ mocker.patch.multiple(
+ 'freqtrade.rpc.fiat_convert.Market',
+ ticker=MagicMock(return_value={'price_usd': 15000.0}),
+ )
+ mocker.patch('freqtrade.rpc.rpc.CryptoToFiatConverter._find_price', return_value=15000.0)
mocker.patch('freqtrade.rpc.telegram.Telegram', MagicMock())
mocker.patch.multiple(
'freqtrade.exchange.Exchange',
@@ -109,24 +114,34 @@ def test_rpc_status_table(default_conf, ticker, fee, mocker) -> None:
freqtradebot.state = State.RUNNING
with pytest.raises(RPCException, match=r'.*no active order*'):
- rpc._rpc_status_table('USD')
+ rpc._rpc_status_table(default_conf['stake_currency'], 'USD')
freqtradebot.create_trades()
- result, headers = rpc._rpc_status_table('USD')
+
+ result, headers = rpc._rpc_status_table(default_conf['stake_currency'], 'USD')
assert "Since" in headers
assert "Pair" in headers
- assert 'instantly' in result[0][2]
- assert 'ETH/BTC' in result[0][1]
- assert '-0.59%' in result[0][3]
+ assert 'instantly' == result[0][2]
+ assert 'ETH/BTC' == result[0][1]
+ assert '-0.59%' == result[0][3]
+ # Test with fiatconvert
+
+ rpc._fiat_converter = CryptoToFiatConverter()
+ result, headers = rpc._rpc_status_table(default_conf['stake_currency'], 'USD')
+ assert "Since" in headers
+ assert "Pair" in headers
+ assert 'instantly' == result[0][2]
+ assert 'ETH/BTC' == result[0][1]
+ assert '-0.59% (-0.09)' == result[0][3]
mocker.patch('freqtrade.exchange.Exchange.get_ticker',
MagicMock(side_effect=DependencyException(f"Pair 'ETH/BTC' not available")))
# invalidate ticker cache
rpc._freqtrade.exchange._cached_ticker = {}
- result = rpc._rpc_status_table()
- assert 'instantly' in result['Since'].all()
- assert 'ETH/BTC' in result['Pair'].all()
- assert 'nan%' in result['Profit'].all()
+ result, headers = rpc._rpc_status_table(default_conf['stake_currency'], 'USD')
+ assert 'instantly' == result[0][2]
+ assert 'ETH/BTC' == result[0][1]
+ assert 'nan%' == result[0][3]
def test_rpc_daily_profit(default_conf, update, ticker, fee,