diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 2d6b46745..14bd940b3 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -661,18 +661,15 @@ class FreqtradeBot(LoggingMixin): self.exchange.name, order['filled'], order['amount'], order['remaining'] ) - stake_amount = order['cost'] amount = safe_value_fallback(order, 'filled', 'amount') enter_limit_filled_price = safe_value_fallback(order, 'average', 'price') + stake_amount = amount * enter_limit_filled_price / leverage # in case of FOK the order may be filled immediately and fully elif order_status == 'closed': - # TODO-lev: Evaluate this. Why is setting stake_amount here necessary? - # it should never change in theory - and in case of leveraged orders, - # may be the leveraged amount. - stake_amount = order['cost'] amount = safe_value_fallback(order, 'filled', 'amount') enter_limit_filled_price = safe_value_fallback(order, 'average', 'price') + stake_amount = amount * enter_limit_filled_price / leverage # TODO: this might be unnecessary, as we're calling it in update_trade_state. isolated_liq = self.exchange.get_liquidation_price( diff --git a/tests/test_freqtradebot.py b/tests/test_freqtradebot.py index 6e8b1afbf..3a4781c54 100644 --- a/tests/test_freqtradebot.py +++ b/tests/test_freqtradebot.py @@ -842,7 +842,7 @@ def test_execute_entry(mocker, default_conf_usdt, fee, limit_order, assert trade assert trade.open_order_id is None assert trade.open_rate == 10 - assert trade.stake_amount == 100 + assert trade.stake_amount == round(order['price'] * order['filled'] / leverage, 8) # In case of rejected or expired order and partially filled order['status'] = 'expired' @@ -860,7 +860,7 @@ def test_execute_entry(mocker, default_conf_usdt, fee, limit_order, assert trade assert trade.open_order_id == '555' assert trade.open_rate == 0.5 - assert trade.stake_amount == 15.0 + assert trade.stake_amount == round(order['price'] * order['filled'] / leverage, 8) # Test with custom stake order['status'] = 'open'