return dict from _rpc_status and handle rendering in module impl
This commit is contained in:
		| @@ -64,7 +64,7 @@ class RPC(object): | |||||||
|     def send_msg(self, msg: str) -> None: |     def send_msg(self, msg: str) -> None: | ||||||
|         """ Sends a message to all registered rpc modules """ |         """ Sends a message to all registered rpc modules """ | ||||||
|  |  | ||||||
|     def _rpc_trade_status(self) -> List[str]: |     def _rpc_trade_status(self) -> List[Dict]: | ||||||
|         """ |         """ | ||||||
|         Below follows the RPC backend it is prefixed with rpc_ to raise awareness that it is |         Below follows the RPC backend it is prefixed with rpc_ to raise awareness that it is | ||||||
|         a remotely exposed function |         a remotely exposed function | ||||||
| @@ -76,7 +76,7 @@ class RPC(object): | |||||||
|         elif not trades: |         elif not trades: | ||||||
|             raise RPCException('no active trade') |             raise RPCException('no active trade') | ||||||
|         else: |         else: | ||||||
|             result = [] |             results = [] | ||||||
|             for trade in trades: |             for trade in trades: | ||||||
|                 order = None |                 order = None | ||||||
|                 if trade.open_order_id: |                 if trade.open_order_id: | ||||||
| @@ -86,32 +86,22 @@ class RPC(object): | |||||||
|                 current_profit = trade.calc_profit_percent(current_rate) |                 current_profit = trade.calc_profit_percent(current_rate) | ||||||
|                 fmt_close_profit = (f'{round(trade.close_profit * 100, 2):.2f}%' |                 fmt_close_profit = (f'{round(trade.close_profit * 100, 2):.2f}%' | ||||||
|                                     if trade.close_profit else None) |                                     if trade.close_profit else None) | ||||||
|                 market_url = self._freqtrade.exchange.get_pair_detail_url(trade.pair) |                 results.append(dict( | ||||||
|                 trade_date = arrow.get(trade.open_date).humanize() |                     trade_id=trade.id, | ||||||
|                 open_rate = trade.open_rate |                     pair=trade.pair, | ||||||
|                 close_rate = trade.close_rate |                     market_url=self._freqtrade.exchange.get_pair_detail_url(trade.pair), | ||||||
|                 amount = round(trade.amount, 8) |                     date=arrow.get(trade.open_date).humanize(), | ||||||
|                 current_profit = round(current_profit * 100, 2) |                     open_rate=trade.open_rate, | ||||||
|                 open_order = '' |                     close_rate=trade.close_rate, | ||||||
|                 if order: |                     current_rate=current_rate, | ||||||
|                     order_type = order['type'] |                     amount=round(trade.amount, 8), | ||||||
|                     order_side = order['side'] |                     close_profit=fmt_close_profit, | ||||||
|                     order_rem = order['remaining'] |                     current_profit=round(current_profit * 100, 2), | ||||||
|                     open_order = f'({order_type} {order_side} rem={order_rem:.8f})' |                     open_order='({} {} rem={:.8f})'.format( | ||||||
|  |                       order['type'], order['side'], order['remaining'] | ||||||
|                 message = f"*Trade ID:* `{trade.id}`\n" \ |                     ) if order else None, | ||||||
|                           f"*Current Pair:* [{trade.pair}]({market_url})\n" \ |                 )) | ||||||
|                           f"*Open Since:* `{trade_date}`\n" \ |             return results | ||||||
|                           f"*Amount:* `{amount}`\n" \ |  | ||||||
|                           f"*Open Rate:* `{open_rate:.8f}`\n" \ |  | ||||||
|                           f"*Close Rate:* `{close_rate}`\n" \ |  | ||||||
|                           f"*Current Rate:* `{current_rate:.8f}`\n" \ |  | ||||||
|                           f"*Close Profit:* `{fmt_close_profit}`\n" \ |  | ||||||
|                           f"*Current Profit:* `{current_profit:.2f}%`\n" \ |  | ||||||
|                           f"*Open Order:* `{open_order}`"\ |  | ||||||
|  |  | ||||||
|                 result.append(message) |  | ||||||
|             return result |  | ||||||
|  |  | ||||||
|     def _rpc_status_table(self) -> DataFrame: |     def _rpc_status_table(self) -> DataFrame: | ||||||
|         trades = Trade.query.filter(Trade.is_open.is_(True)).all() |         trades = Trade.query.filter(Trade.is_open.is_(True)).all() | ||||||
|   | |||||||
| @@ -136,8 +136,22 @@ class Telegram(RPC): | |||||||
|             return |             return | ||||||
|  |  | ||||||
|         try: |         try: | ||||||
|             for trade_msg in self._rpc_trade_status(): |             results = self._rpc_trade_status() | ||||||
|                 self._send_msg(trade_msg, bot=bot) |             messages = [ | ||||||
|  |                 "*Trade ID:* `{trade_id}`\n" | ||||||
|  |                 "*Current Pair:* [{pair}]({market_url})\n" | ||||||
|  |                 "*Open Since:* `{date}`\n" | ||||||
|  |                 "*Amount:* `{amount}`\n" | ||||||
|  |                 "*Open Rate:* `{open_rate:.8f}`\n" | ||||||
|  |                 "*Close Rate:* `{close_rate}`\n" | ||||||
|  |                 "*Current Rate:* `{current_rate:.8f}`\n" | ||||||
|  |                 "*Close Profit:* `{close_profit}`\n" | ||||||
|  |                 "*Current Profit:* `{current_profit:.2f}%`\n" | ||||||
|  |                 "*Open Order:* `{open_order}`".format(**result) | ||||||
|  |                 for result in results | ||||||
|  |             ] | ||||||
|  |             for msg in messages: | ||||||
|  |                 self._send_msg(msg, bot=bot) | ||||||
|         except RPCException as e: |         except RPCException as e: | ||||||
|             self._send_msg(str(e), bot=bot) |             self._send_msg(str(e), bot=bot) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -53,24 +53,21 @@ def test_rpc_trade_status(default_conf, ticker, fee, markets, mocker) -> None: | |||||||
|         rpc._rpc_trade_status() |         rpc._rpc_trade_status() | ||||||
|  |  | ||||||
|     freqtradebot.create_trade() |     freqtradebot.create_trade() | ||||||
|     trades = rpc._rpc_trade_status() |     results = rpc._rpc_trade_status() | ||||||
|     trade = trades[0] |  | ||||||
|  |  | ||||||
|     result_message = [ |     assert { | ||||||
|         '*Trade ID:* `1`\n' |         'trade_id': 1, | ||||||
|         '*Current Pair:* ' |         'pair': 'ETH/BTC', | ||||||
|         '[ETH/BTC](https://bittrex.com/Market/Index?MarketName=BTC-ETH)\n' |         'market_url': 'https://bittrex.com/Market/Index?MarketName=BTC-ETH', | ||||||
|         '*Open Since:* `just now`\n' |         'date': 'just now', | ||||||
|         '*Amount:* `90.99181074`\n' |         'open_rate': 1.099e-05, | ||||||
|         '*Open Rate:* `0.00001099`\n' |         'close_rate': None, | ||||||
|         '*Close Rate:* `None`\n' |         'current_rate': 1.098e-05, | ||||||
|         '*Current Rate:* `0.00001098`\n' |         'amount': 90.99181074, | ||||||
|         '*Close Profit:* `None`\n' |         'close_profit': None, | ||||||
|         '*Current Profit:* `-0.59%`\n' |         'current_profit': -0.59, | ||||||
|         '*Open Order:* `(limit buy rem=0.00000000)`' |         'open_order': '(limit buy rem=0.00000000)' | ||||||
|     ] |     } == results[0] | ||||||
|     assert trades == result_message |  | ||||||
|     assert trade.find('[ETH/BTC]') >= 0 |  | ||||||
|  |  | ||||||
|  |  | ||||||
| def test_rpc_status_table(default_conf, ticker, fee, markets, mocker) -> None: | def test_rpc_status_table(default_conf, ticker, fee, markets, mocker) -> None: | ||||||
|   | |||||||
| @@ -210,7 +210,19 @@ def test_status(default_conf, update, mocker, fee, ticker, markets) -> None: | |||||||
|     mocker.patch.multiple( |     mocker.patch.multiple( | ||||||
|         'freqtrade.rpc.telegram.Telegram', |         'freqtrade.rpc.telegram.Telegram', | ||||||
|         _init=MagicMock(), |         _init=MagicMock(), | ||||||
|         _rpc_trade_status=MagicMock(return_value=[1, 2, 3]), |         _rpc_trade_status=MagicMock(return_value=[{ | ||||||
|  |             'trade_id': 1, | ||||||
|  |             'pair': 'ETH/BTC', | ||||||
|  |             'market_url': 'https://bittrex.com/Market/Index?MarketName=BTC-ETH', | ||||||
|  |             'date': 'just now', | ||||||
|  |             'open_rate': 1.099e-05, | ||||||
|  |             'close_rate': None, | ||||||
|  |             'current_rate': 1.098e-05, | ||||||
|  |             'amount': 90.99181074, | ||||||
|  |             'close_profit': None, | ||||||
|  |             'current_profit': -0.59, | ||||||
|  |             'open_order': '(limit buy rem=0.00000000)' | ||||||
|  |         }]), | ||||||
|         _status_table=status_table, |         _status_table=status_table, | ||||||
|         _send_msg=msg_mock |         _send_msg=msg_mock | ||||||
|     ) |     ) | ||||||
| @@ -224,7 +236,7 @@ def test_status(default_conf, update, mocker, fee, ticker, markets) -> None: | |||||||
|         freqtradebot.create_trade() |         freqtradebot.create_trade() | ||||||
|  |  | ||||||
|     telegram._status(bot=MagicMock(), update=update) |     telegram._status(bot=MagicMock(), update=update) | ||||||
|     assert msg_mock.call_count == 3 |     assert msg_mock.call_count == 1 | ||||||
|  |  | ||||||
|     update.message.text = MagicMock() |     update.message.text = MagicMock() | ||||||
|     update.message.text.replace = MagicMock(return_value='table 2 3') |     update.message.text.replace = MagicMock(return_value='table 2 3') | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user