|
|
|
|
@ -20,8 +20,8 @@ from freqtrade.persistence import LocalTrade, Trade, init_db
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
# Newest format
|
|
|
|
|
BT_DATA_COLUMNS = ['pair', 'stake_amount', 'amount', 'open_date', 'close_date',
|
|
|
|
|
'open_rate', 'close_rate',
|
|
|
|
|
BT_DATA_COLUMNS = ['pair', 'stake_amount', 'max_stake_amount', 'amount',
|
|
|
|
|
'open_date', 'close_date', 'open_rate', 'close_rate',
|
|
|
|
|
'fee_open', 'fee_close', 'trade_duration',
|
|
|
|
|
'profit_ratio', 'profit_abs', 'exit_reason',
|
|
|
|
|
'initial_stop_loss_abs', 'initial_stop_loss_ratio', 'stop_loss_abs',
|
|
|
|
|
@ -241,6 +241,33 @@ def find_existing_backtest_stats(dirname: Union[Path, str], run_ids: Dict[str, s
|
|
|
|
|
return results
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _load_backtest_data_df_compatibility(df: pd.DataFrame) -> pd.DataFrame:
|
|
|
|
|
"""
|
|
|
|
|
Compatibility support for older backtest data.
|
|
|
|
|
"""
|
|
|
|
|
df['open_date'] = pd.to_datetime(df['open_date'],
|
|
|
|
|
utc=True,
|
|
|
|
|
infer_datetime_format=True
|
|
|
|
|
)
|
|
|
|
|
df['close_date'] = pd.to_datetime(df['close_date'],
|
|
|
|
|
utc=True,
|
|
|
|
|
infer_datetime_format=True
|
|
|
|
|
)
|
|
|
|
|
# Compatibility support for pre short Columns
|
|
|
|
|
if 'is_short' not in df.columns:
|
|
|
|
|
df['is_short'] = False
|
|
|
|
|
if 'leverage' not in df.columns:
|
|
|
|
|
df['leverage'] = 1.0
|
|
|
|
|
if 'enter_tag' not in df.columns:
|
|
|
|
|
df['enter_tag'] = df['buy_tag']
|
|
|
|
|
df = df.drop(['buy_tag'], axis=1)
|
|
|
|
|
if 'max_stake_amount' not in df.columns:
|
|
|
|
|
df['max_stake_amount'] = df['stake_amount']
|
|
|
|
|
if 'orders' not in df.columns:
|
|
|
|
|
df['orders'] = None
|
|
|
|
|
return df
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def load_backtest_data(filename: Union[Path, str], strategy: Optional[str] = None) -> pd.DataFrame:
|
|
|
|
|
"""
|
|
|
|
|
Load backtest data file.
|
|
|
|
|
@ -269,24 +296,7 @@ def load_backtest_data(filename: Union[Path, str], strategy: Optional[str] = Non
|
|
|
|
|
data = data['strategy'][strategy]['trades']
|
|
|
|
|
df = pd.DataFrame(data)
|
|
|
|
|
if not df.empty:
|
|
|
|
|
df['open_date'] = pd.to_datetime(df['open_date'],
|
|
|
|
|
utc=True,
|
|
|
|
|
infer_datetime_format=True
|
|
|
|
|
)
|
|
|
|
|
df['close_date'] = pd.to_datetime(df['close_date'],
|
|
|
|
|
utc=True,
|
|
|
|
|
infer_datetime_format=True
|
|
|
|
|
)
|
|
|
|
|
# Compatibility support for pre short Columns
|
|
|
|
|
if 'is_short' not in df.columns:
|
|
|
|
|
df['is_short'] = False
|
|
|
|
|
if 'leverage' not in df.columns:
|
|
|
|
|
df['leverage'] = 1.0
|
|
|
|
|
if 'enter_tag' not in df.columns:
|
|
|
|
|
df['enter_tag'] = df['buy_tag']
|
|
|
|
|
df = df.drop(['buy_tag'], axis=1)
|
|
|
|
|
if 'orders' not in df.columns:
|
|
|
|
|
df['orders'] = None
|
|
|
|
|
df = _load_backtest_data_df_compatibility(df)
|
|
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
# old format - only with lists.
|
|
|
|
|
|