From 02527eeea404f5b461b657238a34b3e47712e3ae Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 10 Nov 2018 20:07:09 +0100 Subject: [PATCH 1/4] Add rpc_whitelist call --- freqtrade/rpc/rpc.py | 7 +++++++ freqtrade/tests/rpc/test_rpc.py | 25 +++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/freqtrade/rpc/rpc.py b/freqtrade/rpc/rpc.py index c3cbce2e7..cf283c6b1 100644 --- a/freqtrade/rpc/rpc.py +++ b/freqtrade/rpc/rpc.py @@ -443,3 +443,10 @@ class RPC(object): raise RPCException('trader is not running') return Trade.query.filter(Trade.is_open.is_(True)).all() + + def _rpc_whitelist(self) -> Dict: + """ Returns the currently active whitelist""" + res = {'method': self._freqtrade.config.get('dynamic_whitelist', 0) or 'static', + 'whitelist': self._freqtrade.active_pair_whitelist + } + return res diff --git a/freqtrade/tests/rpc/test_rpc.py b/freqtrade/tests/rpc/test_rpc.py index 19692db50..ff72ef634 100644 --- a/freqtrade/tests/rpc/test_rpc.py +++ b/freqtrade/tests/rpc/test_rpc.py @@ -645,3 +645,28 @@ def test_rpcforcebuy_disabled(mocker, default_conf) -> None: pair = 'ETH/BTC' with pytest.raises(RPCException, match=r'Forcebuy not enabled.'): rpc._rpc_forcebuy(pair, None) + + +def test_rpc_whitelist(mocker, default_conf) -> None: + patch_coinmarketcap(mocker) + patch_exchange(mocker) + mocker.patch('freqtrade.rpc.telegram.Telegram', MagicMock()) + + freqtradebot = FreqtradeBot(default_conf) + rpc = RPC(freqtradebot) + ret = rpc._rpc_whitelist() + assert ret['method'] == 'static' + assert ret['whitelist'] == default_conf['exchange']['pair_whitelist'] + + +def test_rpc_whitelist_dynamic(mocker, default_conf) -> None: + patch_coinmarketcap(mocker) + patch_exchange(mocker) + default_conf['dynamic_whitelist'] = 4 + mocker.patch('freqtrade.rpc.telegram.Telegram', MagicMock()) + + freqtradebot = FreqtradeBot(default_conf) + rpc = RPC(freqtradebot) + ret = rpc._rpc_whitelist() + assert ret['method'] == 4 + assert ret['whitelist'] == default_conf['exchange']['pair_whitelist'] From 62402351b38a24964aa82a9481b4433825289ba0 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 10 Nov 2018 20:14:46 +0100 Subject: [PATCH 2/4] Clarify volume selection for dynamic whitelist --- freqtrade/freqtradebot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 51160332d..b63329ac5 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -133,7 +133,7 @@ class FreqtradeBot(object): f'*Strategy:* `{strategy_name}`' }) if self.config.get('dynamic_whitelist', False): - top_pairs = 'top ' + str(self.config.get('dynamic_whitelist', 20)) + top_pairs = 'top volume ' + str(self.config.get('dynamic_whitelist', 20)) specific_pairs = '' else: top_pairs = 'whitelisted' From 08ef2730a94595597e059843bcb573dea79f1b0f Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 10 Nov 2018 20:15:06 +0100 Subject: [PATCH 3/4] Add /whitelist call to telegram --- freqtrade/rpc/telegram.py | 20 ++++++++++++ freqtrade/tests/rpc/test_rpc_telegram.py | 40 +++++++++++++++++++++++- 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/freqtrade/rpc/telegram.py b/freqtrade/rpc/telegram.py index eaabd35c6..43aabf1dc 100644 --- a/freqtrade/rpc/telegram.py +++ b/freqtrade/rpc/telegram.py @@ -91,6 +91,7 @@ class Telegram(RPC): CommandHandler('daily', self._daily), CommandHandler('count', self._count), CommandHandler('reload_conf', self._reload_conf), + CommandHandler('whitelist', self._whitelist), CommandHandler('help', self._help), CommandHandler('version', self._version), ] @@ -438,6 +439,25 @@ class Telegram(RPC): except RPCException as e: self._send_msg(str(e), bot=bot) + @authorized_only + def _whitelist(self, bot: Bot, update: Update) -> None: + """ + Handler for /whitelist + Shows the currently active whitelist + """ + try: + whitelist = self._rpc_whitelist() + if whitelist['method'] == 'static': + message = f"Using static whitelist with `{len(whitelist['whitelist'])}` pairs \n" + else: + message = f"Dynamic whitelist with `{whitelist['method']}` pairs\n" + message += f"`{', '.join(whitelist['whitelist'])}`" + + logger.debug(message) + self._send_msg(message) + except RPCException as e: + self._send_msg(str(e), bot=bot) + @authorized_only def _help(self, bot: Bot, update: Update) -> None: """ diff --git a/freqtrade/tests/rpc/test_rpc_telegram.py b/freqtrade/tests/rpc/test_rpc_telegram.py index 097fc1ff2..a8e8bf003 100644 --- a/freqtrade/tests/rpc/test_rpc_telegram.py +++ b/freqtrade/tests/rpc/test_rpc_telegram.py @@ -72,7 +72,8 @@ def test_init(default_conf, mocker, caplog) -> None: message_str = "rpc.telegram is listening for following commands: [['status'], ['profit'], " \ "['balance'], ['start'], ['stop'], ['forcesell'], ['forcebuy'], " \ - "['performance'], ['daily'], ['count'], ['reload_conf'], ['help'], ['version']]" + "['performance'], ['daily'], ['count'], ['reload_conf'], " \ + "['whitelist'], ['help'], ['version']]" assert log_has(message_str, caplog.record_tuples) @@ -1006,6 +1007,43 @@ def test_count_handle(default_conf, update, ticker, fee, markets, mocker) -> Non assert msg in msg_mock.call_args_list[0][0][0] +def test_whitelist_static(default_conf, update, mocker) -> None: + patch_coinmarketcap(mocker) + msg_mock = MagicMock() + mocker.patch.multiple( + 'freqtrade.rpc.telegram.Telegram', + _init=MagicMock(), + _send_msg=msg_mock + ) + freqtradebot = get_patched_freqtradebot(mocker, default_conf) + + telegram = Telegram(freqtradebot) + + telegram._whitelist(bot=MagicMock(), update=update) + assert msg_mock.call_count == 1 + assert ('Using static whitelist with `4` pairs \n`ETH/BTC, LTC/BTC, XRP/BTC, NEO/BTC`' + in msg_mock.call_args_list[0][0][0]) + + +def test_whitelist_dynamic(default_conf, update, mocker) -> None: + patch_coinmarketcap(mocker) + msg_mock = MagicMock() + mocker.patch.multiple( + 'freqtrade.rpc.telegram.Telegram', + _init=MagicMock(), + _send_msg=msg_mock + ) + default_conf['dynamic_whitelist'] = 4 + freqtradebot = get_patched_freqtradebot(mocker, default_conf) + + telegram = Telegram(freqtradebot) + + telegram._whitelist(bot=MagicMock(), update=update) + assert msg_mock.call_count == 1 + assert ('Dynamic whitelist with `4` pairs\n`ETH/BTC, LTC/BTC, XRP/BTC, NEO/BTC`' + in msg_mock.call_args_list[0][0][0]) + + def test_help_handle(default_conf, update, mocker) -> None: patch_coinmarketcap(mocker) msg_mock = MagicMock() From 060a1b3fbcf94269bf7d2d12b4a960a7b704bc59 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 10 Nov 2018 20:16:20 +0100 Subject: [PATCH 4/4] Add /whitelist to help message --- freqtrade/rpc/telegram.py | 1 + 1 file changed, 1 insertion(+) diff --git a/freqtrade/rpc/telegram.py b/freqtrade/rpc/telegram.py index 43aabf1dc..55c5abef2 100644 --- a/freqtrade/rpc/telegram.py +++ b/freqtrade/rpc/telegram.py @@ -480,6 +480,7 @@ class Telegram(RPC): "\n" \ "*/balance:* `Show account balance per currency`\n" \ "*/reload_conf:* `Reload configuration file` \n" \ + "*/whitelist:* `Show current whitelist` \n" \ "*/help:* `This help message`\n" \ "*/version:* `Show version`"