From 8a55423ac7b24482a1fca2096bb4eef8da773dc4 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 16 Jul 2023 16:02:23 +0200 Subject: [PATCH 1/4] Add asserts for wallet size --- tests/test_integration.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tests/test_integration.py b/tests/test_integration.py index 0d3fd419a..61dc5afae 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -493,6 +493,8 @@ def test_dca_exiting(default_conf_usdt, ticker_usdt, fee, mocker, caplog, levera get_funding_fees=MagicMock(return_value=0), ) 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) freqtrade.strategy.leverage = MagicMock(return_value=leverage) @@ -505,6 +507,11 @@ def test_dca_exiting(default_conf_usdt, ticker_usdt, fee, mocker, caplog, levera assert trade.leverage == leverage assert pytest.approx(trade.amount) == 30.0 * leverage 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 freqtrade.strategy.adjust_trade_position = MagicMock(return_value=-59) @@ -527,6 +534,14 @@ def test_dca_exiting(default_conf_usdt, ticker_usdt, fee, mocker, caplog, levera assert trade.open_rate == 2.0 assert trade.is_open assert trade.realized_profit > 0.098 * leverage + expected_profit = starting_amount - 40.1980 + 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 caplog.clear() # Sell more than what we got (we got ~20 coins left) @@ -551,3 +566,10 @@ def test_dca_exiting(default_conf_usdt, ticker_usdt, fee, mocker, caplog, levera assert pytest.approx(trade.stake_amount) == 40.198 assert trade.is_open assert log_has_re('Amount to exit is 0.0 due to exchange limits - not exiting.', caplog) + expected_profit = starting_amount - 40.1980 + 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 From d0e0e156b18b2dc8baf179b77da2fecfca291dc3 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 16 Jul 2023 16:05:46 +0200 Subject: [PATCH 2/4] Update tests to account for realized profit/loss --- tests/test_integration.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_integration.py b/tests/test_integration.py index 61dc5afae..5d5f223ab 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -534,14 +534,14 @@ def test_dca_exiting(default_conf_usdt, ticker_usdt, fee, mocker, caplog, levera assert trade.open_rate == 2.0 assert trade.is_open assert trade.realized_profit > 0.098 * leverage - expected_profit = starting_amount - 40.1980 + 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 + assert freqtrade.wallets.get_total('USDT') == starting_amount + trade.realized_profit caplog.clear() # Sell more than what we got (we got ~20 coins left) @@ -566,10 +566,10 @@ def test_dca_exiting(default_conf_usdt, ticker_usdt, fee, mocker, caplog, levera assert pytest.approx(trade.stake_amount) == 40.198 assert trade.is_open assert log_has_re('Amount to exit is 0.0 due to exchange limits - not exiting.', caplog) - expected_profit = starting_amount - 40.1980 + 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 + assert freqtrade.wallets.get_total('USDT') == starting_amount + trade.realized_profit From cf9ba527bb1b60fb44faf8d59c012f814799edfe Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 15 Jul 2023 16:56:05 +0200 Subject: [PATCH 3/4] Include realized_profit in update_dry closes #8877 --- freqtrade/wallets.py | 1 + 1 file changed, 1 insertion(+) diff --git a/freqtrade/wallets.py b/freqtrade/wallets.py index da64515a4..ceef8d158 100644 --- a/freqtrade/wallets.py +++ b/freqtrade/wallets.py @@ -84,6 +84,7 @@ class Wallets: tot_profit = Trade.get_total_closed_profit() else: 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) used_stake = 0.0 From 35714c469b99b156ca45f522ec037b285472cb62 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 15 Jul 2023 17:12:29 +0200 Subject: [PATCH 4/4] Add explicit dry_wallet test --- tests/test_wallets.py | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/tests/test_wallets.py b/tests/test_wallets.py index c3ff4ccd0..478993058 100644 --- a/tests/test_wallets.py +++ b/tests/test_wallets.py @@ -8,7 +8,8 @@ from sqlalchemy import select from freqtrade.constants import UNLIMITED_STAKE_AMOUNT from freqtrade.exceptions import DependencyException 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): @@ -341,6 +342,33 @@ def test_sync_wallet_futures_live(mocker, default_conf): 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): default_conf['dry_run'] = True default_conf['trading_mode'] = 'futures'