diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 6112a599e..b56a3550f 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -433,7 +433,7 @@ class FreqtradeBot: Trade.total_open_trades_stakes() ) else: - stake_amount = self.config['stake_amount'] + stake_amount = self.strategy.get_stake_amount(pair) if stake_amount == constants.UNLIMITED_STAKE_AMOUNT: stake_amount = self._calculate_unlimited_stake_amount() diff --git a/freqtrade/optimize/backtesting.py b/freqtrade/optimize/backtesting.py index 47bb9edd9..5254d1d49 100644 --- a/freqtrade/optimize/backtesting.py +++ b/freqtrade/optimize/backtesting.py @@ -281,7 +281,7 @@ class Backtesting: trades.append(trade_entry) return trades - def backtest(self, processed: Dict, stake_amount: float, + def backtest(self, processed: Dict, start_date: datetime, end_date: datetime, max_open_trades: int = 0, position_stacking: bool = False) -> DataFrame: """ @@ -292,7 +292,6 @@ class Backtesting: Avoid extensive logging in this method and functions it calls. :param processed: a processed dictionary with format {pair, data} - :param stake_amount: amount to use for each trade :param start_date: backtesting timerange start datetime :param end_date: backtesting timerange end datetime :param max_open_trades: maximum number of concurrent trades, <= 0 means unlimited @@ -308,6 +307,7 @@ class Backtesting: # Use dict of lists with data for performance # (looping lists is a lot faster than pandas DataFrames) data: Dict = self._get_ohlcv_as_lists(processed) + get_stake_amount = self.strategy.get_stake_amount # Indexes per pair, so some pairs are allowed to have a missing start. indexes: Dict = {} @@ -344,6 +344,7 @@ class Backtesting: and tmp != end_date and row[BUY_IDX] == 1 and row[SELL_IDX] != 1): # Enter trade + stake_amount = get_stake_amount(pair, row[DATE_IDX]) trade = Trade( pair=pair, open_rate=row[OPEN_IDX], @@ -387,8 +388,7 @@ class Backtesting: """ data: Dict[str, Any] = {} - logger.info('Using stake_currency: %s ...', self.config['stake_currency']) - logger.info('Using stake_amount: %s ...', self.config['stake_amount']) + logger.info("Using stake_currency: %s ...", self.config["stake_currency"]) position_stacking = self.config.get('position_stacking', False) @@ -422,7 +422,6 @@ class Backtesting: # Execute backtest and print results results = self.backtest( processed=preprocessed, - stake_amount=self.config['stake_amount'], start_date=min_date.datetime, end_date=max_date.datetime, max_open_trades=max_open_trades, diff --git a/freqtrade/strategy/interface.py b/freqtrade/strategy/interface.py index e6256cafb..c03d36161 100644 --- a/freqtrade/strategy/interface.py +++ b/freqtrade/strategy/interface.py @@ -267,6 +267,13 @@ class IStrategy(ABC): """ return [] + def get_stake_amount(self, pair: str, date: datetime) -> float: + """ Called when placing a buy order + :param pair: Pair that's about to be bought. + :param date: date of the trade (should be the latest candle for live run mode). + """ + return self.config['stake_amount'] + ### # END - Intended to be overridden by strategy ###