Extract backtesting row validation to separate function

This commit is contained in:
Matthias 2022-01-30 20:00:11 +01:00
parent 58fad72778
commit 9bf86bbe27
1 changed files with 19 additions and 13 deletions

View File

@ -658,6 +658,22 @@ class Backtesting:
return False return False
def validate_row(
self, data: Dict, pair: str, row_index: int, current_time: datetime) -> Optional[Tuple]:
try:
# Row is treated as "current incomplete candle".
# Buy / sell signals are shifted by 1 to compensate for this.
row = data[pair][row_index]
except IndexError:
# missing Data for one pair at the end.
# Warnings for this are shown during data loading
return None
# Waits until the time-counter reaches the start of the data for this pair.
if row[DATE_IDX] > current_time:
return None
return row
def backtest(self, processed: Dict, def backtest(self, processed: Dict,
start_date: datetime, end_date: datetime, start_date: datetime, end_date: datetime,
max_open_trades: int = 0, position_stacking: bool = False, max_open_trades: int = 0, position_stacking: bool = False,
@ -701,17 +717,8 @@ class Backtesting:
self.check_abort() self.check_abort()
for i, pair in enumerate(data): for i, pair in enumerate(data):
row_index = indexes[pair] row_index = indexes[pair]
try: row = self.validate_row(data, pair, row_index, current_time)
# Row is treated as "current incomplete candle". if not row:
# Buy / sell signals are shifted by 1 to compensate for this.
row = data[pair][row_index]
except IndexError:
# missing Data for one pair at the end.
# Warnings for this are shown during data loading
continue
# Waits until the time-counter reaches the start of the data for this pair.
if row[DATE_IDX] > current_time:
continue continue
row_index += 1 row_index += 1
@ -769,8 +776,7 @@ class Backtesting:
self.run_protections(enable_protections, pair, current_time) self.run_protections(enable_protections, pair, current_time)
# 5. Cancel expired buy/sell orders. # 5. Cancel expired buy/sell orders.
canceled = self.check_order_cancel(trade, current_time) if self.check_order_cancel(trade, current_time):
if canceled:
# Close trade due to buy timeout expiration. # Close trade due to buy timeout expiration.
open_trade_count -= 1 open_trade_count -= 1
open_trades[pair].remove(trade) open_trades[pair].remove(trade)