Merge pull request #6360 from stash86/pos_adjust
Hide some lines for /status when a trade is closed
This commit is contained in:
commit
fe33b86308
@ -370,7 +370,7 @@ class Telegram(RPCHandler):
|
|||||||
else:
|
else:
|
||||||
return "\N{CROSS MARK}"
|
return "\N{CROSS MARK}"
|
||||||
|
|
||||||
def _prepare_buy_details(self, filled_orders, base_currency):
|
def _prepare_buy_details(self, filled_orders, base_currency, is_open):
|
||||||
"""
|
"""
|
||||||
Prepare details of trade with buy adjustment enabled
|
Prepare details of trade with buy adjustment enabled
|
||||||
"""
|
"""
|
||||||
@ -400,8 +400,9 @@ class Telegram(RPCHandler):
|
|||||||
hours, remainder = divmod(dur_buys.seconds, 3600)
|
hours, remainder = divmod(dur_buys.seconds, 3600)
|
||||||
minutes, seconds = divmod(remainder, 60)
|
minutes, seconds = divmod(remainder, 60)
|
||||||
lines.append("*Buy #{}:* at {:.2%} avg profit".format(x+1, minus_on_buy))
|
lines.append("*Buy #{}:* at {:.2%} avg profit".format(x+1, minus_on_buy))
|
||||||
lines.append("({})".format(current_buy_datetime
|
if is_open:
|
||||||
.humanize(granularity=["day", "hour", "minute"])))
|
lines.append("({})".format(current_buy_datetime
|
||||||
|
.humanize(granularity=["day", "hour", "minute"])))
|
||||||
lines.append("*Buy Amount:* {} ({:.8f} {})"
|
lines.append("*Buy Amount:* {} ({:.8f} {})"
|
||||||
.format(cur_buy_amount, order["cost"], base_currency))
|
.format(cur_buy_amount, order["cost"], base_currency))
|
||||||
lines.append("*Average Buy Price:* {} ({:.2%} from 1st buy rate)"
|
lines.append("*Average Buy Price:* {} ({:.2%} from 1st buy rate)"
|
||||||
@ -435,13 +436,15 @@ class Telegram(RPCHandler):
|
|||||||
|
|
||||||
results = self._rpc._rpc_trade_status(trade_ids=trade_ids)
|
results = self._rpc._rpc_trade_status(trade_ids=trade_ids)
|
||||||
position_adjust = self._config.get('position_adjustment_enable', False)
|
position_adjust = self._config.get('position_adjustment_enable', False)
|
||||||
|
max_entries = self._config.get('max_entry_position_adjustment', -1)
|
||||||
messages = []
|
messages = []
|
||||||
for r in results:
|
for r in results:
|
||||||
r['open_date_hum'] = arrow.get(r['open_date']).humanize()
|
r['open_date_hum'] = arrow.get(r['open_date']).humanize()
|
||||||
r['num_entries'] = len(r['filled_entry_orders'])
|
r['num_entries'] = len(r['filled_entry_orders'])
|
||||||
r['sell_reason'] = r.get('sell_reason', "")
|
r['sell_reason'] = r.get('sell_reason', "")
|
||||||
lines = [
|
lines = [
|
||||||
"*Trade ID:* `{trade_id}` `(since {open_date_hum})`",
|
"*Trade ID:* `{trade_id}`" +
|
||||||
|
("` (since {open_date_hum})`" if r['is_open'] else ""),
|
||||||
"*Current Pair:* {pair}",
|
"*Current Pair:* {pair}",
|
||||||
"*Amount:* `{amount} ({stake_amount} {base_currency})`",
|
"*Amount:* `{amount} ({stake_amount} {base_currency})`",
|
||||||
"*Buy Tag:* `{buy_tag}`" if r['buy_tag'] else "",
|
"*Buy Tag:* `{buy_tag}`" if r['buy_tag'] else "",
|
||||||
@ -449,39 +452,40 @@ class Telegram(RPCHandler):
|
|||||||
]
|
]
|
||||||
|
|
||||||
if position_adjust:
|
if position_adjust:
|
||||||
lines.append("*Number of Buy(s):* `{num_entries}`")
|
max_buy_str = (f"/{max_entries + 1}" if (max_entries > 0) else "")
|
||||||
|
lines.append("*Number of Buy(s):* `{num_entries}`" + max_buy_str)
|
||||||
|
|
||||||
lines.extend([
|
lines.extend([
|
||||||
"*Open Rate:* `{open_rate:.8f}`",
|
"*Open Rate:* `{open_rate:.8f}`",
|
||||||
"*Close Rate:* `{close_rate:.8f}`" if r['close_rate'] else "",
|
"*Close Rate:* `{close_rate:.8f}`" if r['close_rate'] else "",
|
||||||
"*Open Date:* `{open_date}`",
|
"*Open Date:* `{open_date}`",
|
||||||
"*Close Date:* `{close_date}`" if r['close_date'] else "",
|
"*Close Date:* `{close_date}`" if r['close_date'] else "",
|
||||||
"*Current Rate:* `{current_rate:.8f}`",
|
"*Current Rate:* `{current_rate:.8f}`" if r['is_open'] else "",
|
||||||
("*Current Profit:* " if r['is_open'] else "*Close Profit: *")
|
("*Current Profit:* " if r['is_open'] else "*Close Profit: *")
|
||||||
+ "`{profit_ratio:.2%}`",
|
+ "`{profit_ratio:.2%}`",
|
||||||
])
|
])
|
||||||
|
|
||||||
if (r['stop_loss_abs'] != r['initial_stop_loss_abs']
|
if r['is_open']:
|
||||||
and r['initial_stop_loss_ratio'] is not None):
|
if (r['stop_loss_abs'] != r['initial_stop_loss_abs']
|
||||||
# Adding initial stoploss only if it is different from stoploss
|
and r['initial_stop_loss_ratio'] is not None):
|
||||||
lines.append("*Initial Stoploss:* `{initial_stop_loss_abs:.8f}` "
|
# Adding initial stoploss only if it is different from stoploss
|
||||||
"`({initial_stop_loss_ratio:.2%})`")
|
lines.append("*Initial Stoploss:* `{initial_stop_loss_abs:.8f}` "
|
||||||
|
"`({initial_stop_loss_ratio:.2%})`")
|
||||||
|
|
||||||
# Adding stoploss and stoploss percentage only if it is not None
|
# Adding stoploss and stoploss percentage only if it is not None
|
||||||
lines.append("*Stoploss:* `{stop_loss_abs:.8f}` " +
|
lines.append("*Stoploss:* `{stop_loss_abs:.8f}` " +
|
||||||
("`({stop_loss_ratio:.2%})`" if r['stop_loss_ratio'] else ""))
|
("`({stop_loss_ratio:.2%})`" if r['stop_loss_ratio'] else ""))
|
||||||
lines.append("*Stoploss distance:* `{stoploss_current_dist:.8f}` "
|
lines.append("*Stoploss distance:* `{stoploss_current_dist:.8f}` "
|
||||||
"`({stoploss_current_dist_ratio:.2%})`")
|
"`({stoploss_current_dist_ratio:.2%})`")
|
||||||
if r['open_order']:
|
if r['open_order']:
|
||||||
if r['sell_order_status']:
|
if r['sell_order_status']:
|
||||||
lines.append("*Open Order:* `{open_order}` - `{sell_order_status}`")
|
lines.append("*Open Order:* `{open_order}` - `{sell_order_status}`")
|
||||||
else:
|
else:
|
||||||
lines.append("*Open Order:* `{open_order}`")
|
lines.append("*Open Order:* `{open_order}`")
|
||||||
|
|
||||||
if len(r['filled_entry_orders']) > 1:
|
lines_detail = self._prepare_buy_details(
|
||||||
lines_detail = self._prepare_buy_details(
|
r['filled_entry_orders'], r['base_currency'], r['is_open'])
|
||||||
r['filled_entry_orders'], r['base_currency'])
|
lines.extend((lines_detail if (len(r['filled_entry_orders']) > 1) else ""))
|
||||||
lines.extend(lines_detail)
|
|
||||||
|
|
||||||
# Filter empty lines using list-comprehension
|
# Filter empty lines using list-comprehension
|
||||||
messages.append("\n".join([line for line in lines if line]).format(**r))
|
messages.append("\n".join([line for line in lines if line]).format(**r))
|
||||||
|
@ -263,6 +263,34 @@ def test_telegram_status_multi_entry(default_conf, update, mocker, fee) -> None:
|
|||||||
assert re.search(r'Number of Buy.*2', msg)
|
assert re.search(r'Number of Buy.*2', msg)
|
||||||
assert re.search(r'Average Buy Price', msg)
|
assert re.search(r'Average Buy Price', msg)
|
||||||
assert re.search(r'Order filled at', msg)
|
assert re.search(r'Order filled at', msg)
|
||||||
|
assert re.search(r'Close Date:', msg) is None
|
||||||
|
assert re.search(r'Close Profit:', msg) is None
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.usefixtures("init_persistence")
|
||||||
|
def test_telegram_status_closed_trade(default_conf, update, mocker, fee) -> None:
|
||||||
|
update.message.chat.id = "123"
|
||||||
|
default_conf['telegram']['enabled'] = False
|
||||||
|
default_conf['telegram']['chat_id'] = "123"
|
||||||
|
default_conf['position_adjustment_enable'] = True
|
||||||
|
mocker.patch.multiple(
|
||||||
|
'freqtrade.exchange.Exchange',
|
||||||
|
fetch_order=MagicMock(return_value=None),
|
||||||
|
get_rate=MagicMock(return_value=0.22),
|
||||||
|
)
|
||||||
|
|
||||||
|
telegram, _, msg_mock = get_telegram_testobject(mocker, default_conf)
|
||||||
|
|
||||||
|
create_mock_trades(fee)
|
||||||
|
trades = Trade.get_trades([Trade.is_open.is_(False)])
|
||||||
|
trade = trades[0]
|
||||||
|
context = MagicMock()
|
||||||
|
context.args = [str(trade.id)]
|
||||||
|
telegram._status(update=update, context=context)
|
||||||
|
assert msg_mock.call_count == 1
|
||||||
|
msg = msg_mock.call_args_list[0][0][0]
|
||||||
|
assert re.search(r'Close Date:', msg)
|
||||||
|
assert re.search(r'Close Profit:', msg)
|
||||||
|
|
||||||
|
|
||||||
def test_status_handle(default_conf, update, ticker, fee, mocker) -> None:
|
def test_status_handle(default_conf, update, ticker, fee, mocker) -> None:
|
||||||
|
Loading…
Reference in New Issue
Block a user