Avoid a few calculations during backtesting
This commit is contained in:
parent
189835b963
commit
45d12dbc83
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user