Merge pull request #8914 from freqtrade/fix/8877
Dry-run open balance should include realized profit
This commit is contained in:
@@ -84,6 +84,7 @@ class Wallets:
|
|||||||
tot_profit = Trade.get_total_closed_profit()
|
tot_profit = Trade.get_total_closed_profit()
|
||||||
else:
|
else:
|
||||||
tot_profit = LocalTrade.total_profit
|
tot_profit = LocalTrade.total_profit
|
||||||
|
tot_profit += sum(trade.realized_profit for trade in open_trades)
|
||||||
tot_in_trades = sum(trade.stake_amount for trade in open_trades)
|
tot_in_trades = sum(trade.stake_amount for trade in open_trades)
|
||||||
used_stake = 0.0
|
used_stake = 0.0
|
||||||
|
|
||||||
|
|||||||
@@ -494,6 +494,8 @@ def test_dca_exiting(default_conf_usdt, ticker_usdt, fee, mocker, caplog, levera
|
|||||||
get_funding_fees=MagicMock(return_value=0),
|
get_funding_fees=MagicMock(return_value=0),
|
||||||
)
|
)
|
||||||
mocker.patch(f"{EXMS}.get_max_leverage", return_value=10)
|
mocker.patch(f"{EXMS}.get_max_leverage", return_value=10)
|
||||||
|
starting_amount = freqtrade.wallets.get_total('USDT')
|
||||||
|
assert starting_amount == 1000
|
||||||
|
|
||||||
patch_get_signal(freqtrade)
|
patch_get_signal(freqtrade)
|
||||||
freqtrade.strategy.leverage = MagicMock(return_value=leverage)
|
freqtrade.strategy.leverage = MagicMock(return_value=leverage)
|
||||||
@@ -506,6 +508,11 @@ def test_dca_exiting(default_conf_usdt, ticker_usdt, fee, mocker, caplog, levera
|
|||||||
assert trade.leverage == leverage
|
assert trade.leverage == leverage
|
||||||
assert pytest.approx(trade.amount) == 30.0 * leverage
|
assert pytest.approx(trade.amount) == 30.0 * leverage
|
||||||
assert trade.open_rate == 2.0
|
assert trade.open_rate == 2.0
|
||||||
|
assert pytest.approx(freqtrade.wallets.get_free('USDT')) == starting_amount - 60
|
||||||
|
if spot:
|
||||||
|
assert pytest.approx(freqtrade.wallets.get_total('USDT')) == starting_amount - 60
|
||||||
|
else:
|
||||||
|
assert freqtrade.wallets.get_total('USDT') == starting_amount
|
||||||
|
|
||||||
# Too small size
|
# Too small size
|
||||||
freqtrade.strategy.adjust_trade_position = MagicMock(return_value=-59)
|
freqtrade.strategy.adjust_trade_position = MagicMock(return_value=-59)
|
||||||
@@ -528,6 +535,14 @@ def test_dca_exiting(default_conf_usdt, ticker_usdt, fee, mocker, caplog, levera
|
|||||||
assert trade.open_rate == 2.0
|
assert trade.open_rate == 2.0
|
||||||
assert trade.is_open
|
assert trade.is_open
|
||||||
assert trade.realized_profit > 0.098 * leverage
|
assert trade.realized_profit > 0.098 * leverage
|
||||||
|
expected_profit = starting_amount - 40.1980 + trade.realized_profit
|
||||||
|
assert pytest.approx(freqtrade.wallets.get_free('USDT')) == expected_profit
|
||||||
|
|
||||||
|
if spot:
|
||||||
|
assert pytest.approx(freqtrade.wallets.get_total('USDT')) == expected_profit
|
||||||
|
else:
|
||||||
|
# total won't change in futures mode, only free / used will.
|
||||||
|
assert freqtrade.wallets.get_total('USDT') == starting_amount + trade.realized_profit
|
||||||
caplog.clear()
|
caplog.clear()
|
||||||
|
|
||||||
# Sell more than what we got (we got ~20 coins left)
|
# Sell more than what we got (we got ~20 coins left)
|
||||||
@@ -552,3 +567,10 @@ def test_dca_exiting(default_conf_usdt, ticker_usdt, fee, mocker, caplog, levera
|
|||||||
assert pytest.approx(trade.stake_amount) == 40.198
|
assert pytest.approx(trade.stake_amount) == 40.198
|
||||||
assert trade.is_open
|
assert trade.is_open
|
||||||
assert log_has_re('Amount to exit is 0.0 due to exchange limits - not exiting.', caplog)
|
assert log_has_re('Amount to exit is 0.0 due to exchange limits - not exiting.', caplog)
|
||||||
|
expected_profit = starting_amount - 40.1980 + trade.realized_profit
|
||||||
|
assert pytest.approx(freqtrade.wallets.get_free('USDT')) == expected_profit
|
||||||
|
if spot:
|
||||||
|
assert pytest.approx(freqtrade.wallets.get_total('USDT')) == expected_profit
|
||||||
|
else:
|
||||||
|
# total won't change in futures mode, only free / used will.
|
||||||
|
assert freqtrade.wallets.get_total('USDT') == starting_amount + trade.realized_profit
|
||||||
|
|||||||
+29
-1
@@ -8,7 +8,8 @@ from sqlalchemy import select
|
|||||||
from freqtrade.constants import UNLIMITED_STAKE_AMOUNT
|
from freqtrade.constants import UNLIMITED_STAKE_AMOUNT
|
||||||
from freqtrade.exceptions import DependencyException
|
from freqtrade.exceptions import DependencyException
|
||||||
from freqtrade.persistence import Trade
|
from freqtrade.persistence import Trade
|
||||||
from tests.conftest import EXMS, create_mock_trades, get_patched_freqtradebot, patch_wallet
|
from tests.conftest import (EXMS, create_mock_trades, create_mock_trades_usdt,
|
||||||
|
get_patched_freqtradebot, patch_wallet)
|
||||||
|
|
||||||
|
|
||||||
def test_sync_wallet_at_boot(mocker, default_conf):
|
def test_sync_wallet_at_boot(mocker, default_conf):
|
||||||
@@ -341,6 +342,33 @@ def test_sync_wallet_futures_live(mocker, default_conf):
|
|||||||
assert 'ETH/USDT:USDT' not in freqtrade.wallets._positions
|
assert 'ETH/USDT:USDT' not in freqtrade.wallets._positions
|
||||||
|
|
||||||
|
|
||||||
|
def test_sync_wallet_dry(mocker, default_conf_usdt, fee):
|
||||||
|
default_conf_usdt['dry_run'] = True
|
||||||
|
freqtrade = get_patched_freqtradebot(mocker, default_conf_usdt)
|
||||||
|
assert len(freqtrade.wallets._wallets) == 1
|
||||||
|
assert len(freqtrade.wallets._positions) == 0
|
||||||
|
assert freqtrade.wallets.get_total('USDT') == 1000
|
||||||
|
|
||||||
|
create_mock_trades_usdt(fee, is_short=None)
|
||||||
|
|
||||||
|
freqtrade.wallets.update()
|
||||||
|
|
||||||
|
assert len(freqtrade.wallets._wallets) == 5
|
||||||
|
assert len(freqtrade.wallets._positions) == 0
|
||||||
|
bal = freqtrade.wallets.get_all_balances()
|
||||||
|
assert bal['NEO'].total == 10
|
||||||
|
assert bal['XRP'].total == 10
|
||||||
|
assert bal['LTC'].total == 2
|
||||||
|
assert bal['USDT'].total == 922.74
|
||||||
|
|
||||||
|
assert freqtrade.wallets.get_starting_balance() == default_conf_usdt['dry_run_wallet']
|
||||||
|
total = freqtrade.wallets.get_total('LTC')
|
||||||
|
free = freqtrade.wallets.get_free('LTC')
|
||||||
|
used = freqtrade.wallets.get_used('LTC')
|
||||||
|
assert free != 0
|
||||||
|
assert free + used == total
|
||||||
|
|
||||||
|
|
||||||
def test_sync_wallet_futures_dry(mocker, default_conf, fee):
|
def test_sync_wallet_futures_dry(mocker, default_conf, fee):
|
||||||
default_conf['dry_run'] = True
|
default_conf['dry_run'] = True
|
||||||
default_conf['trading_mode'] = 'futures'
|
default_conf['trading_mode'] = 'futures'
|
||||||
|
|||||||
Reference in New Issue
Block a user