From 3ea4b2ba00a4d3cef42def46dc0b32a7ef7b7603 Mon Sep 17 00:00:00 2001 From: axel Date: Mon, 16 Aug 2021 15:18:57 -0400 Subject: [PATCH] add custom_price_max_distance_percent security to get_valid_price, update tests --- freqtrade/freqtradebot.py | 17 ++++++++++++++--- tests/test_freqtradebot.py | 14 +++++++++++++- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 9a1b2ab0c..13632bad1 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -1401,10 +1401,21 @@ class FreqtradeBot(LoggingMixin): """ if custom_price: try: - valid_price = float(custom_price) + valid_custom_price = float(custom_price) except ValueError: - valid_price = proposed_price + valid_custom_price = proposed_price else: - valid_price = proposed_price + valid_custom_price = proposed_price + + cust_p_max_dist_pct = self.config.get('custom_price_max_distance_percent', 2.0) + min_custom_price_allowed = proposed_price - ((proposed_price * cust_p_max_dist_pct) / 100) + max_custom_price_allowed = proposed_price + ((proposed_price * cust_p_max_dist_pct) / 100) + + if valid_custom_price > max_custom_price_allowed: + valid_price = max_custom_price_allowed + elif valid_custom_price < min_custom_price_allowed: + valid_price = min_custom_price_allowed + else: + valid_price = valid_custom_price return valid_price diff --git a/tests/test_freqtradebot.py b/tests/test_freqtradebot.py index a475ced48..80bcabdb6 100644 --- a/tests/test_freqtradebot.py +++ b/tests/test_freqtradebot.py @@ -4594,19 +4594,25 @@ def test_get_valid_price(mocker, default_conf) -> None: patch_RPCManager(mocker) patch_exchange(mocker) freqtrade = FreqtradeBot(default_conf) + freqtrade.config['custom_price_max_distance_percent'] = 2.0 custom_price_string = "10" custom_price_badstring = "10abc" custom_price_float = 10.0 custom_price_int = 10 - proposed_price = 12.2 + custom_price_over_max_alwd = 11.0 + custom_price_under_min_alwd = 9.0 + proposed_price = 10.1 valid_price_from_string = freqtrade.get_valid_price(custom_price_string, proposed_price) valid_price_from_badstring = freqtrade.get_valid_price(custom_price_badstring, proposed_price) valid_price_from_int = freqtrade.get_valid_price(custom_price_int, proposed_price) valid_price_from_float = freqtrade.get_valid_price(custom_price_float, proposed_price) + valid_price_at_max_alwd = freqtrade.get_valid_price(custom_price_over_max_alwd, proposed_price) + valid_price_at_min_alwd = freqtrade.get_valid_price(custom_price_under_min_alwd, proposed_price) + assert isinstance(valid_price_from_string, float) assert isinstance(valid_price_from_badstring, float) assert isinstance(valid_price_from_int, float) @@ -4616,3 +4622,9 @@ def test_get_valid_price(mocker, default_conf) -> None: assert valid_price_from_badstring == proposed_price assert valid_price_from_int == custom_price_int assert valid_price_from_float == custom_price_float + + assert valid_price_at_max_alwd != custom_price_over_max_alwd + assert valid_price_at_max_alwd > proposed_price + + assert valid_price_at_min_alwd != custom_price_under_min_alwd + assert valid_price_at_min_alwd < proposed_price