From da6f1a3945259302cab765b53759be2f77e29367 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 1 Jan 2019 16:32:45 +0100 Subject: [PATCH 1/5] Sequence of minroi dict must be irrelevant --- freqtrade/tests/strategy/test_interface.py | 38 ++++++++++++---------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/freqtrade/tests/strategy/test_interface.py b/freqtrade/tests/strategy/test_interface.py index 22ba9a2b6..e7a44fe7e 100644 --- a/freqtrade/tests/strategy/test_interface.py +++ b/freqtrade/tests/strategy/test_interface.py @@ -117,26 +117,30 @@ def test_tickerdata_to_dataframe(default_conf) -> None: def test_min_roi_reached(default_conf, fee) -> None: - strategy = DefaultStrategy(default_conf) - strategy.minimal_roi = {0: 0.1, 20: 0.05, 55: 0.01} - trade = Trade( - pair='ETH/BTC', - stake_amount=0.001, - open_date=arrow.utcnow().shift(hours=-1).datetime, - fee_open=fee.return_value, - fee_close=fee.return_value, - exchange='bittrex', - open_rate=1, - ) - assert not strategy.min_roi_reached(trade, 0.01, arrow.utcnow().shift(minutes=-55).datetime) - assert strategy.min_roi_reached(trade, 0.12, arrow.utcnow().shift(minutes=-55).datetime) + min_roi_list = [{20: 0.05, 55: 0.01, 0: 0.1}, + {0: 0.1, 20: 0.05, 55: 0.01}] + for roi in min_roi_list: + strategy = DefaultStrategy(default_conf) + strategy.minimal_roi = roi + trade = Trade( + pair='ETH/BTC', + stake_amount=0.001, + open_date=arrow.utcnow().shift(hours=-1).datetime, + fee_open=fee.return_value, + fee_close=fee.return_value, + exchange='bittrex', + open_rate=1, + ) - assert not strategy.min_roi_reached(trade, 0.04, arrow.utcnow().shift(minutes=-39).datetime) - assert strategy.min_roi_reached(trade, 0.06, arrow.utcnow().shift(minutes=-39).datetime) + assert not strategy.min_roi_reached(trade, 0.02, arrow.utcnow().shift(minutes=-55).datetime) + assert strategy.min_roi_reached(trade, 0.12, arrow.utcnow().shift(minutes=-55).datetime) - assert not strategy.min_roi_reached(trade, -0.01, arrow.utcnow().shift(minutes=-1).datetime) - assert strategy.min_roi_reached(trade, 0.02, arrow.utcnow().shift(minutes=-1).datetime) + assert not strategy.min_roi_reached(trade, 0.04, arrow.utcnow().shift(minutes=-39).datetime) + assert strategy.min_roi_reached(trade, 0.06, arrow.utcnow().shift(minutes=-39).datetime) + + assert not strategy.min_roi_reached(trade, -0.01, arrow.utcnow().shift(minutes=-1).datetime) + assert strategy.min_roi_reached(trade, 0.02, arrow.utcnow().shift(minutes=-1).datetime) def test_analyze_ticker_default(ticker_history, mocker, caplog) -> None: From b55994cb71d07bb8d0cc952050dfeca0dd6fbe3f Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 1 Jan 2019 16:33:02 +0100 Subject: [PATCH 2/5] Clarify documentation --- docs/bot-optimization.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/bot-optimization.md b/docs/bot-optimization.md index 4ff0c6f24..1cfae1bc4 100644 --- a/docs/bot-optimization.md +++ b/docs/bot-optimization.md @@ -179,10 +179,9 @@ minimal_roi = { The above configuration would therefore mean: - Sell whenever 4% profit was reached -- Sell after 20 minutes when 2% profit was reached -- Sell after 20 minutes when 2% profit was reached -- Sell after 30 minutes when 1% profit was reached -- Sell after 40 minutes when the trade is non-loosing (no profit) +- Sell when 2% profit was reached (in effect after 20 minutes) +- Sell when 1% profit was reached (in effect after 30 minutes) +- Sell when trade is non-loosing (in effect after 40 minutes) The calculation does include fees. From 1d518885a95a79f86278393b01c44bd6c3d521fc Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 1 Jan 2019 16:45:52 +0100 Subject: [PATCH 3/5] fix roi-reached when list is unsorted --- freqtrade/strategy/interface.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freqtrade/strategy/interface.py b/freqtrade/strategy/interface.py index a5c10b58c..2d4de2358 100644 --- a/freqtrade/strategy/interface.py +++ b/freqtrade/strategy/interface.py @@ -321,7 +321,7 @@ class IStrategy(ABC): time_diff = (current_time.timestamp() - trade.open_date.timestamp()) / 60 for duration, threshold in self.minimal_roi.items(): if time_diff <= duration: - return False + continue if current_profit > threshold: return True From 2bc76771bfb3dfbc4b51085ecb4e8071706e609e Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 1 Jan 2019 16:50:10 +0100 Subject: [PATCH 4/5] Align backtest to interface.py interface.py roi calculation skips on <= duration the correct selection is therefore trade_duration > x. --- freqtrade/optimize/backtesting.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/freqtrade/optimize/backtesting.py b/freqtrade/optimize/backtesting.py index cc05c5de8..48d47d9c1 100644 --- a/freqtrade/optimize/backtesting.py +++ b/freqtrade/optimize/backtesting.py @@ -219,8 +219,9 @@ class Backtesting(object): # Set close_rate to stoploss closerate = trade.stop_loss elif sell.sell_type == (SellType.ROI): - # get entry in min_roi >= to trade duration - roi_entry = max(list(filter(lambda x: trade_dur >= x, + # get next entry in min_roi > to trade duration + # Interface.py skips on trade_duration <= duration + roi_entry = max(list(filter(lambda x: trade_dur > x, self.strategy.minimal_roi.keys()))) roi = self.strategy.minimal_roi[roi_entry] From 1b84aa82ebc18dafeb6877382411c4b736717512 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 1 Jan 2019 16:54:44 +0100 Subject: [PATCH 5/5] dont use 55 for regular check as that's a key in the dict --- freqtrade/tests/strategy/test_interface.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/freqtrade/tests/strategy/test_interface.py b/freqtrade/tests/strategy/test_interface.py index e7a44fe7e..89d50d036 100644 --- a/freqtrade/tests/strategy/test_interface.py +++ b/freqtrade/tests/strategy/test_interface.py @@ -133,8 +133,8 @@ def test_min_roi_reached(default_conf, fee) -> None: open_rate=1, ) - assert not strategy.min_roi_reached(trade, 0.02, arrow.utcnow().shift(minutes=-55).datetime) - assert strategy.min_roi_reached(trade, 0.12, arrow.utcnow().shift(minutes=-55).datetime) + assert not strategy.min_roi_reached(trade, 0.02, arrow.utcnow().shift(minutes=-56).datetime) + assert strategy.min_roi_reached(trade, 0.12, arrow.utcnow().shift(minutes=-56).datetime) assert not strategy.min_roi_reached(trade, 0.04, arrow.utcnow().shift(minutes=-39).datetime) assert strategy.min_roi_reached(trade, 0.06, arrow.utcnow().shift(minutes=-39).datetime)