Merge pull request #3449 from freqtrade/ask_strategy_verbosity

Ask strategy verbosity
This commit is contained in:
Matthias 2020-06-06 17:38:58 +02:00 committed by GitHub
commit 6df981b5b6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 63 additions and 61 deletions

View File

@ -702,10 +702,9 @@ class FreqtradeBot:
self.dataprovider.ohlcv(trade.pair, self.strategy.ticker_interval)) self.dataprovider.ohlcv(trade.pair, self.strategy.ticker_interval))
if config_ask_strategy.get('use_order_book', False): if config_ask_strategy.get('use_order_book', False):
# logger.debug('Order book %s',orderBook)
order_book_min = config_ask_strategy.get('order_book_min', 1) order_book_min = config_ask_strategy.get('order_book_min', 1)
order_book_max = config_ask_strategy.get('order_book_max', 1) order_book_max = config_ask_strategy.get('order_book_max', 1)
logger.info(f'Using order book between {order_book_min} and {order_book_max} ' logger.debug(f'Using order book between {order_book_min} and {order_book_max} '
f'for selling {trade.pair}...') f'for selling {trade.pair}...')
order_book = self._order_book_gen(trade.pair, f"{config_ask_strategy['price_side']}s", order_book = self._order_book_gen(trade.pair, f"{config_ask_strategy['price_side']}s",

View File

@ -105,6 +105,8 @@ class RPC:
'exchange': config['exchange']['name'], 'exchange': config['exchange']['name'],
'strategy': config['strategy'], 'strategy': config['strategy'],
'forcebuy_enabled': config.get('forcebuy_enable', False), 'forcebuy_enabled': config.get('forcebuy_enable', False),
'ask_strategy': config.get('ask_strategy', {}),
'bid_strategy': config.get('bid_strategy', {}),
'state': str(self._freqtrade.state) 'state': str(self._freqtrade.state)
} }
return val return val

View File

@ -144,8 +144,8 @@ class Telegram(RPC):
message += ")`" message += ")`"
elif msg['type'] == RPCMessageType.BUY_CANCEL_NOTIFICATION: elif msg['type'] == RPCMessageType.BUY_CANCEL_NOTIFICATION:
message = "\N{WARNING SIGN} *{exchange}:* " \ message = ("\N{WARNING SIGN} *{exchange}:* "
"Cancelling Open Buy Order for {pair}".format(**msg) "Cancelling Open Buy Order for {pair}".format(**msg))
elif msg['type'] == RPCMessageType.SELL_NOTIFICATION: elif msg['type'] == RPCMessageType.SELL_NOTIFICATION:
msg['amount'] = round(msg['amount'], 8) msg['amount'] = round(msg['amount'], 8)
@ -388,11 +388,11 @@ class Telegram(RPC):
) )
for currency in result['currencies']: for currency in result['currencies']:
if currency['est_stake'] > 0.0001: if currency['est_stake'] > 0.0001:
curr_output = "*{currency}:*\n" \ curr_output = ("*{currency}:*\n"
"\t`Available: {free: .8f}`\n" \ "\t`Available: {free: .8f}`\n"
"\t`Balance: {balance: .8f}`\n" \ "\t`Balance: {balance: .8f}`\n"
"\t`Pending: {used: .8f}`\n" \ "\t`Pending: {used: .8f}`\n"
"\t`Est. {stake}: {est_stake: .8f}`\n".format(**currency) "\t`Est. {stake}: {est_stake: .8f}`\n").format(**currency)
else: else:
curr_output = "*{currency}:* not showing <1$ amount \n".format(**currency) curr_output = "*{currency}:* not showing <1$ amount \n".format(**currency)
@ -403,9 +403,9 @@ class Telegram(RPC):
else: else:
output += curr_output output += curr_output
output += "\n*Estimated Value*:\n" \ output += ("\n*Estimated Value*:\n"
"\t`{stake}: {total: .8f}`\n" \ "\t`{stake}: {total: .8f}`\n"
"\t`{symbol}: {value: .2f}`\n".format(**result) "\t`{symbol}: {value: .2f}`\n").format(**result)
self._send_msg(output) self._send_msg(output)
except RPCException as e: except RPCException as e:
self._send_msg(str(e)) self._send_msg(str(e))
@ -598,32 +598,32 @@ class Telegram(RPC):
:param update: message update :param update: message update
:return: None :return: None
""" """
forcebuy_text = "*/forcebuy <pair> [<rate>]:* `Instantly buys the given pair. " \ forcebuy_text = ("*/forcebuy <pair> [<rate>]:* `Instantly buys the given pair. "
"Optionally takes a rate at which to buy.` \n" "Optionally takes a rate at which to buy.` \n")
message = "*/start:* `Starts the trader`\n" \ message = ("*/start:* `Starts the trader`\n"
"*/stop:* `Stops the trader`\n" \ "*/stop:* `Stops the trader`\n"
"*/status [table]:* `Lists all open trades`\n" \ "*/status [table]:* `Lists all open trades`\n"
" *table :* `will display trades in a table`\n" \ " *table :* `will display trades in a table`\n"
" `pending buy orders are marked with an asterisk (*)`\n" \ " `pending buy orders are marked with an asterisk (*)`\n"
" `pending sell orders are marked with a double asterisk (**)`\n" \ " `pending sell orders are marked with a double asterisk (**)`\n"
"*/profit:* `Lists cumulative profit from all finished trades`\n" \ "*/profit:* `Lists cumulative profit from all finished trades`\n"
"*/forcesell <trade_id>|all:* `Instantly sells the given trade or all trades, " \ "*/forcesell <trade_id>|all:* `Instantly sells the given trade or all trades, "
"regardless of profit`\n" \ "regardless of profit`\n"
f"{forcebuy_text if self._config.get('forcebuy_enable', False) else ''}" \ f"{forcebuy_text if self._config.get('forcebuy_enable', False) else ''}"
"*/performance:* `Show performance of each finished trade grouped by pair`\n" \ "*/performance:* `Show performance of each finished trade grouped by pair`\n"
"*/daily <n>:* `Shows profit or loss per day, over the last n days`\n" \ "*/daily <n>:* `Shows profit or loss per day, over the last n days`\n"
"*/count:* `Show number of trades running compared to allowed number of trades`" \ "*/count:* `Show number of trades running compared to allowed number of trades`"
"\n" \ "\n"
"*/balance:* `Show account balance per currency`\n" \ "*/balance:* `Show account balance per currency`\n"
"*/stopbuy:* `Stops buying, but handles open trades gracefully` \n" \ "*/stopbuy:* `Stops buying, but handles open trades gracefully` \n"
"*/reload_conf:* `Reload configuration file` \n" \ "*/reload_conf:* `Reload configuration file` \n"
"*/show_config:* `Show running configuration` \n" \ "*/show_config:* `Show running configuration` \n"
"*/whitelist:* `Show current whitelist` \n" \ "*/whitelist:* `Show current whitelist` \n"
"*/blacklist [pair]:* `Show current blacklist, or adds one or more pairs " \ "*/blacklist [pair]:* `Show current blacklist, or adds one or more pairs "
"to the blacklist.` \n" \ "to the blacklist.` \n"
"*/edge:* `Shows validated pairs by Edge if it is enabled` \n" \ "*/edge:* `Shows validated pairs by Edge if it is enabled` \n"
"*/help:* `This help message`\n" \ "*/help:* `This help message`\n"
"*/version:* `Show version`" "*/version:* `Show version`")
self._send_msg(message) self._send_msg(message)
@ -665,6 +665,8 @@ class Telegram(RPC):
f"*Stake per trade:* `{val['stake_amount']} {val['stake_currency']}`\n" f"*Stake per trade:* `{val['stake_amount']} {val['stake_currency']}`\n"
f"*Max open Trades:* `{val['max_open_trades']}`\n" f"*Max open Trades:* `{val['max_open_trades']}`\n"
f"*Minimum ROI:* `{val['minimal_roi']}`\n" f"*Minimum ROI:* `{val['minimal_roi']}`\n"
f"*Ask strategy:* ```\n{val['ask_strategy']}```\n"
f"*Bid strategy:* ```\n{val['bid_strategy']}```\n"
f"{sl_info}" f"{sl_info}"
f"*Ticker Interval:* `{val['ticker_interval']}`\n" f"*Ticker Interval:* `{val['ticker_interval']}`\n"
f"*Strategy:* `{val['strategy']}`\n" f"*Strategy:* `{val['strategy']}`\n"

View File

@ -325,6 +325,8 @@ def test_api_show_config(botclient, mocker):
assert rc.json['ticker_interval'] == '5m' assert rc.json['ticker_interval'] == '5m'
assert rc.json['state'] == 'running' assert rc.json['state'] == 'running'
assert not rc.json['trailing_stop'] assert not rc.json['trailing_stop']
assert 'bid_strategy' in rc.json
assert 'ask_strategy' in rc.json
def test_api_daily(botclient, mocker, ticker, fee, markets): def test_api_daily(botclient, mocker, ticker, fee, markets):

View File

@ -71,10 +71,10 @@ def test_init(default_conf, mocker, caplog) -> None:
assert start_polling.dispatcher.add_handler.call_count > 0 assert start_polling.dispatcher.add_handler.call_count > 0
assert start_polling.start_polling.call_count == 1 assert start_polling.start_polling.call_count == 1
message_str = "rpc.telegram is listening for following commands: [['status'], ['profit'], " \ message_str = ("rpc.telegram is listening for following commands: [['status'], ['profit'], "
"['balance'], ['start'], ['stop'], ['forcesell'], ['forcebuy'], " \ "['balance'], ['start'], ['stop'], ['forcesell'], ['forcebuy'], "
"['performance'], ['daily'], ['count'], ['reload_conf'], ['show_config'], " \ "['performance'], ['daily'], ['count'], ['reload_conf'], ['show_config'], "
"['stopbuy'], ['whitelist'], ['blacklist'], ['edge'], ['help'], ['version']]" "['stopbuy'], ['whitelist'], ['blacklist'], ['edge'], ['help'], ['version']]")
assert log_has(message_str, caplog) assert log_has(message_str, caplog)
@ -1016,9 +1016,8 @@ def test_count_handle(default_conf, update, ticker, fee, mocker) -> None:
msg_mock.reset_mock() msg_mock.reset_mock()
telegram._count(update=update, context=MagicMock()) telegram._count(update=update, context=MagicMock())
msg = '<pre> current max total stake\n--------- ----- -------------\n' \ msg = ('<pre> current max total stake\n--------- ----- -------------\n'
' 1 {} {}</pre>'\ ' 1 {} {}</pre>').format(
.format(
default_conf['max_open_trades'], default_conf['max_open_trades'],
default_conf['stake_amount'] default_conf['stake_amount']
) )
@ -1441,12 +1440,11 @@ def test_send_msg_buy_notification_no_fiat(default_conf, mocker) -> None:
'amount': 1333.3333333333335, 'amount': 1333.3333333333335,
'open_date': arrow.utcnow().shift(hours=-1) 'open_date': arrow.utcnow().shift(hours=-1)
}) })
assert msg_mock.call_args[0][0] \ assert msg_mock.call_args[0][0] == ('\N{LARGE BLUE CIRCLE} *Bittrex:* Buying ETH/BTC\n'
== '\N{LARGE BLUE CIRCLE} *Bittrex:* Buying ETH/BTC\n' \ '*Amount:* `1333.33333333`\n'
'*Amount:* `1333.33333333`\n' \ '*Open Rate:* `0.00001099`\n'
'*Open Rate:* `0.00001099`\n' \ '*Current Rate:* `0.00001099`\n'
'*Current Rate:* `0.00001099`\n' \ '*Total:* `(0.001000 BTC)`')
'*Total:* `(0.001000 BTC)`'
def test_send_msg_sell_notification_no_fiat(default_conf, mocker) -> None: def test_send_msg_sell_notification_no_fiat(default_conf, mocker) -> None:
@ -1477,15 +1475,14 @@ def test_send_msg_sell_notification_no_fiat(default_conf, mocker) -> None:
'open_date': arrow.utcnow().shift(hours=-2, minutes=-35, seconds=-3), 'open_date': arrow.utcnow().shift(hours=-2, minutes=-35, seconds=-3),
'close_date': arrow.utcnow(), 'close_date': arrow.utcnow(),
}) })
assert msg_mock.call_args[0][0] \ assert msg_mock.call_args[0][0] == ('\N{WARNING SIGN} *Binance:* Selling KEY/ETH\n'
== '\N{WARNING SIGN} *Binance:* Selling KEY/ETH\n' \ '*Amount:* `1333.33333333`\n'
'*Amount:* `1333.33333333`\n' \ '*Open Rate:* `0.00007500`\n'
'*Open Rate:* `0.00007500`\n' \ '*Current Rate:* `0.00003201`\n'
'*Current Rate:* `0.00003201`\n' \ '*Close Rate:* `0.00003201`\n'
'*Close Rate:* `0.00003201`\n' \ '*Sell Reason:* `stop_loss`\n'
'*Sell Reason:* `stop_loss`\n' \ '*Duration:* `2:35:03 (155.1 min)`\n'
'*Duration:* `2:35:03 (155.1 min)`\n' \ '*Profit:* `-57.41%`')
'*Profit:* `-57.41%`'
@pytest.mark.parametrize('msg,expected', [ @pytest.mark.parametrize('msg,expected', [