Avoid a few calculations during backtesting

This commit is contained in:
Matthias 2019-12-07 15:28:56 +01:00
parent 189835b963
commit 45d12dbc83

View File

@ -262,13 +262,22 @@ class Backtesting:
return ticker return ticker
def _get_close_rate(self, sell_row, trade: Trade, sell, trade_dur) -> float: def _get_close_rate(self, sell_row, trade: Trade, sell, trade_dur) -> float:
"""
Get close rate for backtesting result
"""
# Special handling if high or low hit STOP_LOSS or ROI # Special handling if high or low hit STOP_LOSS or ROI
if sell.sell_type in (SellType.STOP_LOSS, SellType.TRAILING_STOP_LOSS): if sell.sell_type in (SellType.STOP_LOSS, SellType.TRAILING_STOP_LOSS):
# Set close_rate to stoploss # Set close_rate to stoploss
closerate = trade.stop_loss return trade.stop_loss
elif sell.sell_type == (SellType.ROI): elif sell.sell_type == (SellType.ROI):
roi_entry, roi = self.strategy.min_roi_reached_entry(trade_dur) roi_entry, roi = self.strategy.min_roi_reached_entry(trade_dur)
if roi is not None: if roi is not None:
if roi == -1 and roi_entry % self.timeframe_mins == 0:
# When forceselling with ROI=-1, the roi-entry will always be "on the entry".
# If that entry is a multiple of the timeframe (so on open)
# - we'll use open instead of close
return sell_row.open
# - (Expected abs profit + open_rate + open_fee) / (fee_close -1) # - (Expected abs profit + open_rate + open_fee) / (fee_close -1)
closerate = - (trade.open_rate * roi + trade.open_rate * closerate = - (trade.open_rate * roi + trade.open_rate *
(1 + trade.fee_open)) / (trade.fee_close - 1) (1 + trade.fee_open)) / (trade.fee_close - 1)
@ -276,19 +285,13 @@ class Backtesting:
# Use the maximum between closerate and low as we # Use the maximum between closerate and low as we
# cannot sell outside of a candle. # cannot sell outside of a candle.
# Applies when a new ROI setting comes in place and the whole candle is above that. # Applies when a new ROI setting comes in place and the whole candle is above that.
closerate = max(closerate, sell_row.low) return max(closerate, sell_row.low)
if roi == -1 and roi_entry % self.timeframe_mins == 0:
# When forceselling with ROI=-1, the roi-entry will always be "on the entry".
# If that entry is a multiple of the timeframe (so on open)
# - we'll use open instead of close
closerate = max(closerate, sell_row.open)
else: else:
# This should not be reached... # This should not be reached...
closerate = sell_row.open return sell_row.open
else: else:
closerate = sell_row.open return sell_row.open
return closerate
def _get_sell_trade_entry( def _get_sell_trade_entry(
self, pair: str, buy_row: DataFrame, self, pair: str, buy_row: DataFrame,