diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 32cd99da5e1..7e6d6e5af38 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -484,13 +484,14 @@ def execute_buy(self, pair: str, stake_amount: float, price: Optional[float] = N self.strategy.stoploss) if not self.edge: - max_stake_amount = self.wallets._get_available_stake_amount( - Trade.total_open_trades_stakes()) + tied_up_stake = Trade.total_open_trades_stakes() + max_stake_amount = self.wallets._get_available_stake_amount(tied_up_stake) + wallet_size = max_stake_amount + tied_up_stake stake_amount = strategy_safe_wrapper(self.strategy.custom_stake_amount, default_retval=None)( pair=pair, current_time=datetime.now(timezone.utc), current_rate=buy_limit_requested, proposed_stake=stake_amount, - min_stake=min_stake_amount, max_stake=max_stake_amount) + min_stake=min_stake_amount, max_stake=max_stake_amount, wallet_size=wallet_size) if not stake_amount or stake_amount > max_stake_amount: logger.debug(f"Stake amount is {stake_amount}, ignoring possible trade for {pair}.") diff --git a/freqtrade/optimize/backtesting.py b/freqtrade/optimize/backtesting.py index 9dca4a48fbe..b6c717dc0ac 100644 --- a/freqtrade/optimize/backtesting.py +++ b/freqtrade/optimize/backtesting.py @@ -312,14 +312,17 @@ def _enter_trade(self, pair: str, row: List) -> Optional[LocalTrade]: except DependencyException: return None + tied_up_stake = Trade.total_open_trades_stakes() min_stake_amount = self.exchange.get_min_pair_stake_amount(pair, row[OPEN_IDX], -0.05) or 0 max_stake_amount = self.wallets._get_available_stake_amount( Trade.total_open_trades_stakes()) + wallet_size = max_stake_amount + tied_up_stake stake_amount = strategy_safe_wrapper(self.strategy.custom_stake_amount, default_retval=None)( pair=pair, current_time=row[DATE_IDX].to_pydatetime(), current_rate=row[OPEN_IDX], - proposed_stake=stake_amount, min_stake=min_stake_amount, max_stake=max_stake_amount) + proposed_stake=stake_amount, min_stake=min_stake_amount, max_stake=max_stake_amount, + wallet_size=wallet_size) if not stake_amount or stake_amount < min_stake_amount or \ (stake_amount or 0) > max_stake_amount: logger.error(f'Strategy requested stake amount to be {stake_amount}, while stake ' diff --git a/freqtrade/strategy/interface.py b/freqtrade/strategy/interface.py index c0f6481fc48..9f5d60ae1b7 100644 --- a/freqtrade/strategy/interface.py +++ b/freqtrade/strategy/interface.py @@ -305,7 +305,7 @@ def custom_sell(self, pair: str, trade: Trade, current_time: datetime, current_r def custom_stake_amount(self, pair: str, current_time: datetime, current_rate: float, proposed_stake: float, min_stake: float, max_stake: float, - **kwargs) -> float: + wallet_size: float, **kwargs) -> float: """ Customize stake size for each new trade. This method is not called when edge module is enabled. @@ -316,6 +316,7 @@ def custom_stake_amount(self, pair: str, current_time: datetime, current_rate: f :param proposed_stake: A stake amount proposed by the bot. :param min_stake: Minimal stake size allowed by exchange. :param max_stake: Balance available for trading. + :param wallet_size: Size of wallet, including tied up funds. :return: A stake size, which is between min_stake and max_stake. """ return proposed_stake