Force ROI to be within candle
This commit is contained in:
parent
44e616c264
commit
f4149ee462
@ -355,7 +355,10 @@ class Backtesting:
|
|||||||
# use Open rate if open_rate > calculated sell rate
|
# use Open rate if open_rate > calculated sell rate
|
||||||
return sell_row[OPEN_IDX]
|
return sell_row[OPEN_IDX]
|
||||||
|
|
||||||
return close_rate
|
# Use the maximum between close_rate and low as we
|
||||||
|
# cannot sell outside of a candle.
|
||||||
|
# Applies when a new ROI setting comes in place and the whole candle is above that.
|
||||||
|
return min(max(close_rate, sell_row[LOW_IDX]), sell_row[HIGH_IDX])
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# This should not be reached...
|
# This should not be reached...
|
||||||
@ -384,7 +387,7 @@ class Backtesting:
|
|||||||
|
|
||||||
def _get_order_filled(self, rate: float, row: Tuple) -> bool:
|
def _get_order_filled(self, rate: float, row: Tuple) -> bool:
|
||||||
""" Rate is within candle, therefore filled"""
|
""" Rate is within candle, therefore filled"""
|
||||||
return row[LOW_IDX] < rate < row[HIGH_IDX]
|
return row[LOW_IDX] <= rate <= row[HIGH_IDX]
|
||||||
|
|
||||||
def _get_sell_trade_entry_for_candle(self, trade: LocalTrade,
|
def _get_sell_trade_entry_for_candle(self, trade: LocalTrade,
|
||||||
sell_row: Tuple) -> Optional[LocalTrade]:
|
sell_row: Tuple) -> Optional[LocalTrade]:
|
||||||
@ -563,6 +566,9 @@ class Backtesting:
|
|||||||
exchange='backtesting',
|
exchange='backtesting',
|
||||||
orders=[]
|
orders=[]
|
||||||
)
|
)
|
||||||
|
else:
|
||||||
|
trade.open_order_id = self.order_id_counter
|
||||||
|
|
||||||
trade.adjust_stop_loss(trade.open_rate, self.strategy.stoploss, initial=True)
|
trade.adjust_stop_loss(trade.open_rate, self.strategy.stoploss, initial=True)
|
||||||
|
|
||||||
order = Order(
|
order = Order(
|
||||||
@ -697,7 +703,7 @@ class Backtesting:
|
|||||||
trade = self._enter_trade(pair, row)
|
trade = self._enter_trade(pair, row)
|
||||||
if trade:
|
if trade:
|
||||||
# TODO: hacky workaround to avoid opening > max_open_trades
|
# TODO: hacky workaround to avoid opening > max_open_trades
|
||||||
# This emulates previous behaviour - not sure if this is correct
|
# This emulates previous behavior - not sure if this is correct
|
||||||
# Prevents buying if the trade-slot was freed in this candle
|
# Prevents buying if the trade-slot was freed in this candle
|
||||||
open_trade_count_start += 1
|
open_trade_count_start += 1
|
||||||
open_trade_count += 1
|
open_trade_count += 1
|
||||||
|
@ -635,7 +635,8 @@ def test_backtest__get_sell_trade_entry(default_conf, fee, mocker) -> None:
|
|||||||
assert res.sell_reason == SellType.ROI.value
|
assert res.sell_reason == SellType.ROI.value
|
||||||
# Sell at minute 3 (not available above!)
|
# Sell at minute 3 (not available above!)
|
||||||
assert res.close_date_utc == datetime(2020, 1, 1, 5, 3, tzinfo=timezone.utc)
|
assert res.close_date_utc == datetime(2020, 1, 1, 5, 3, tzinfo=timezone.utc)
|
||||||
assert round(res.close_rate, 3) == round(209.0225, 3)
|
sell_order = res.select_order('sell', True)
|
||||||
|
assert sell_order is not None
|
||||||
|
|
||||||
|
|
||||||
def test_backtest_one(default_conf, fee, mocker, testdatadir) -> None:
|
def test_backtest_one(default_conf, fee, mocker, testdatadir) -> None:
|
||||||
|
Loading…
Reference in New Issue
Block a user