Cache dataframe before cutting the first candle
This allows providing the "current closed" candle in all cases.
This commit is contained in:
parent
cf27968b97
commit
3f160c7144
@ -246,11 +246,11 @@ class Backtesting:
|
|||||||
if has_buy_tag:
|
if has_buy_tag:
|
||||||
df_analyzed.loc[:, 'buy_tag'] = df_analyzed.loc[:, 'buy_tag'].shift(1)
|
df_analyzed.loc[:, 'buy_tag'] = df_analyzed.loc[:, 'buy_tag'].shift(1)
|
||||||
|
|
||||||
df_analyzed.drop(df_analyzed.head(1).index, inplace=True)
|
|
||||||
|
|
||||||
# Update dataprovider cache
|
# Update dataprovider cache
|
||||||
self.dataprovider._set_cached_df(pair, self.timeframe, df_analyzed)
|
self.dataprovider._set_cached_df(pair, self.timeframe, df_analyzed)
|
||||||
|
|
||||||
|
df_analyzed = df_analyzed.drop(df_analyzed.head(1).index)
|
||||||
|
|
||||||
# Convert from Pandas to list for performance reasons
|
# Convert from Pandas to list for performance reasons
|
||||||
# (Looping Pandas is slow.)
|
# (Looping Pandas is slow.)
|
||||||
data[pair] = df_analyzed[headers].values.tolist()
|
data[pair] = df_analyzed[headers].values.tolist()
|
||||||
@ -478,9 +478,9 @@ class Backtesting:
|
|||||||
if row[DATE_IDX] > tmp:
|
if row[DATE_IDX] > tmp:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
self.dataprovider._set_dataframe_max_index(row_index)
|
|
||||||
row_index += 1
|
row_index += 1
|
||||||
indexes[pair] = row_index
|
indexes[pair] = row_index
|
||||||
|
self.dataprovider._set_dataframe_max_index(row_index)
|
||||||
|
|
||||||
# without positionstacking, we can only have one open trade per pair.
|
# without positionstacking, we can only have one open trade per pair.
|
||||||
# max_open_trades must be respected
|
# max_open_trades must be respected
|
||||||
|
@ -742,9 +742,9 @@ def test_backtest_alternate_buy_sell(default_conf, fee, mocker, testdatadir):
|
|||||||
# 100 buys signals
|
# 100 buys signals
|
||||||
results = result['results']
|
results = result['results']
|
||||||
assert len(results) == 100
|
assert len(results) == 100
|
||||||
# Cached data should be 199 (missing 1 candle at the start)
|
# Cached data should be 200
|
||||||
analyzed_df = backtesting.dataprovider.get_analyzed_dataframe('UNITTEST/BTC', '1m')[0]
|
analyzed_df = backtesting.dataprovider.get_analyzed_dataframe('UNITTEST/BTC', '1m')[0]
|
||||||
assert len(analyzed_df) == 199
|
assert len(analyzed_df) == 200
|
||||||
# Expect last candle to be 1 below end date (as the last candle is assumed as "incomplete"
|
# Expect last candle to be 1 below end date (as the last candle is assumed as "incomplete"
|
||||||
# during backtesting)
|
# during backtesting)
|
||||||
expected_last_candle_date = backtest_conf['end_date'] - timedelta(minutes=1)
|
expected_last_candle_date = backtest_conf['end_date'] - timedelta(minutes=1)
|
||||||
@ -807,11 +807,11 @@ def test_backtest_multi_pair(default_conf, fee, mocker, tres, pair, testdatadir)
|
|||||||
assert len(evaluate_result_multi(results['results'], '5m', 3)) == 0
|
assert len(evaluate_result_multi(results['results'], '5m', 3)) == 0
|
||||||
|
|
||||||
# Cached data correctly removed amounts
|
# Cached data correctly removed amounts
|
||||||
offset = 2 if tres == 0 else 1
|
offset = 1 if tres == 0 else 0
|
||||||
removed_candles = len(data[pair]) - offset - backtesting.strategy.startup_candle_count
|
removed_candles = len(data[pair]) - offset - backtesting.strategy.startup_candle_count
|
||||||
assert len(backtesting.dataprovider.get_analyzed_dataframe(pair, '5m')[0]) == removed_candles
|
assert len(backtesting.dataprovider.get_analyzed_dataframe(pair, '5m')[0]) == removed_candles
|
||||||
assert len(backtesting.dataprovider.get_analyzed_dataframe(
|
assert len(backtesting.dataprovider.get_analyzed_dataframe(
|
||||||
'NXT/BTC', '5m')[0]) == len(data['NXT/BTC']) - 2 - backtesting.strategy.startup_candle_count
|
'NXT/BTC', '5m')[0]) == len(data['NXT/BTC']) - 1 - backtesting.strategy.startup_candle_count
|
||||||
|
|
||||||
backtest_conf = {
|
backtest_conf = {
|
||||||
'processed': processed,
|
'processed': processed,
|
||||||
|
Loading…
Reference in New Issue
Block a user