return dict from _rpc_status and handle rendering in module impl

This commit is contained in:
gcarq 2018-06-22 03:54:10 +02:00
parent ec4e6272d0
commit 8d54a20122
4 changed files with 63 additions and 50 deletions

View File

@ -65,7 +65,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
@ -77,7 +77,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:
@ -88,33 +88,23 @@ class RPC(object):
fmt_close_profit = '{:.2f}%'.format( fmt_close_profit = '{:.2f}%'.format(
round(trade.close_profit * 100, 2) round(trade.close_profit * 100, 2)
) if trade.close_profit else None ) if trade.close_profit else None
message = "*Trade ID:* `{trade_id}`\n" \
"*Current Pair:* [{pair}]({market_url})\n" \ results.append(dict(
"*Open Since:* `{date}`\n" \ trade_id=trade.id,
"*Amount:* `{amount}`\n" \ pair=trade.pair,
"*Open Rate:* `{open_rate:.8f}`\n" \ market_url=exchange.get_pair_detail_url(trade.pair),
"*Close Rate:* `{close_rate}`\n" \ date=arrow.get(trade.open_date).humanize(),
"*Current Rate:* `{current_rate:.8f}`\n" \ open_rate=trade.open_rate,
"*Close Profit:* `{close_profit}`\n" \ close_rate=trade.close_rate,
"*Current Profit:* `{current_profit:.2f}%`\n" \ current_rate=current_rate,
"*Open Order:* `{open_order}`"\ amount=round(trade.amount, 8),
.format( close_profit=fmt_close_profit,
trade_id=trade.id, current_profit=round(current_profit * 100, 2),
pair=trade.pair, open_order='({} {} rem={:.8f})'.format(
market_url=exchange.get_pair_detail_url(trade.pair), order['type'], order['side'], order['remaining']
date=arrow.get(trade.open_date).humanize(), ) if order else None,
open_rate=trade.open_rate, ))
close_rate=trade.close_rate, return results
current_rate=current_rate,
amount=round(trade.amount, 8),
close_profit=fmt_close_profit,
current_profit=round(current_profit * 100, 2),
open_order='({} {} rem={:.8f})'.format(
order['type'], order['side'], order['remaining']
) if order else None,
)
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()

View File

@ -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)

View File

@ -51,24 +51,21 @@ def test_rpc_trade_status(default_conf, ticker, fee, 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, mocker) -> None: def test_rpc_status_table(default_conf, ticker, fee, mocker) -> None:

View File

@ -209,7 +209,19 @@ def test_status(default_conf, update, mocker, fee, ticker) -> 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
) )
@ -223,7 +235,7 @@ def test_status(default_conf, update, mocker, fee, ticker) -> 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')