diff --git a/freqtrade/persistence/migrations.py b/freqtrade/persistence/migrations.py index 067bb5b64..6129797e8 100644 --- a/freqtrade/persistence/migrations.py +++ b/freqtrade/persistence/migrations.py @@ -268,6 +268,13 @@ def set_sqlite_to_wal(engine): def fix_old_dry_orders(engine): with engine.begin() as connection: + + # Update current dry-run Orders where + # - current Order is open + # - current Trade is closed + # - current Order trade_id not equal to current Trade.id + # - current Order not stoploss + stmt = update(Order).where( Order.ft_is_open.is_(True), tuple_(Order.ft_trade_id, Order.order_id).not_in( @@ -281,36 +288,14 @@ def fix_old_dry_orders(engine): ).values(ft_is_open=False) connection.execute(stmt) - # OLD - stmt = update(Order).where( - Order.ft_is_open.is_(True), - tuple_(Order.ft_trade_id, Order.order_id).not_in( - select( - Trade.id, Trade.open_order_id - ).where(Trade.open_order_id.is_not(None)) - ), - Order.ft_order_side != 'stoploss', - Order.order_id.like('dry%') - - ).values(ft_is_open=False) - connection.execute(stmt) - - # Update current Order where - # -current Order is open - # -current Order trade_id not equal to current Trade.id - # -current Order not stoploss - # -order_id not equal to current Trade.stoploss_order_id - # -current Order is dry - - # NEW WIP + # Close dry-run orders for closed trades. stmt = update(Order).where( Order.ft_is_open.is_(True), Order.ft_trade_id.not_in( - select(Trade.id).where(Trade.open_orders_count.is_not(0)) - ), - Order.order_id.not_in( - select(Trade.open_orders).filter(Order.order_id).first() - ), + select( + Trade.id + ).where(Trade.is_open.is_(True)) + ), Order.ft_order_side != 'stoploss', Order.order_id.like('dry%') @@ -363,7 +348,7 @@ def check_migrate(engine, decl_base, previous_tables) -> None: "start with a fresh database.") set_sqlite_to_wal(engine) - # fix_old_dry_orders(engine) # TODO Fix that + fix_old_dry_orders(engine) if migrating: logger.info("Database migration finished.") diff --git a/tests/persistence/test_migrations.py b/tests/persistence/test_migrations.py index 13b3f89bf..1e87d3940 100644 --- a/tests/persistence/test_migrations.py +++ b/tests/persistence/test_migrations.py @@ -15,6 +15,7 @@ from freqtrade.persistence import Trade, init_db from freqtrade.persistence.base import ModelBase from freqtrade.persistence.migrations import get_last_sequence_ids, set_sequence_ids from freqtrade.persistence.models import PairLock +from freqtrade.persistence.trade_model import Order from tests.conftest import log_has @@ -217,6 +218,23 @@ def test_migrate_new(mocker, default_conf, fee, caplog): {amount}, 0, {amount * 0.00258580} + ), + ( + -- Order without reference trade + 2, + 'buy', + 'ETC/BTC', + 1, + 'dry_buy_order55', + 'canceled', + 'ETC/BTC', + 'limit', + 'buy', + 0.00258580, + {amount}, + {amount}, + 0, + {amount * 0.00258580} ) """ engine = create_engine('sqlite://') @@ -238,9 +256,10 @@ def test_migrate_new(mocker, default_conf, fee, caplog): # Run init to test migration init_db(default_conf['db_url']) - trades = Trade.session.scalars(select(Trade).filter(Trade.id == 1)).all() + trades = Trade.session.scalars(select(Trade)).all() assert len(trades) == 1 trade = trades[0] + assert trade.id == 1 assert trade.fee_open == fee.return_value assert trade.fee_close == fee.return_value assert trade.open_rate_requested is None @@ -281,12 +300,18 @@ def test_migrate_new(mocker, default_conf, fee, caplog): assert orders[1].order_id == 'dry_buy_order22' assert orders[1].ft_order_side == 'buy' - assert orders[1].ft_is_open is False + assert orders[1].ft_is_open is True assert orders[2].order_id == 'dry_stop_order_id11X' assert orders[2].ft_order_side == 'stoploss' assert orders[2].ft_is_open is False + orders1 = Order.session.scalars(select(Order)).all() + assert len(orders1) == 5 + order = orders1[4] + assert order.ft_trade_id == 2 + assert order.ft_is_open is False + def test_migrate_too_old(mocker, default_conf, fee, caplog): """