Merge branch 'freqtrade:develop' into develop

This commit is contained in:
farmage 2022-07-07 12:41:04 +03:00 committed by GitHub
commit d5548fd61c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 79 additions and 37 deletions

View File

@ -634,7 +634,7 @@ class FreqtradeBot(LoggingMixin):
pair=pair, order_type=order_type, amount=amount, rate=enter_limit_requested, pair=pair, order_type=order_type, amount=amount, rate=enter_limit_requested,
time_in_force=time_in_force, current_time=datetime.now(timezone.utc), time_in_force=time_in_force, current_time=datetime.now(timezone.utc),
entry_tag=enter_tag, side=trade_side): entry_tag=enter_tag, side=trade_side):
logger.info(f"User requested abortion of buying {pair}") logger.info(f"User denied entry for {pair}.")
return False return False
order = self.exchange.create_order( order = self.exchange.create_order(
pair=pair, pair=pair,
@ -1465,7 +1465,7 @@ class FreqtradeBot(LoggingMixin):
time_in_force=time_in_force, exit_reason=exit_reason, time_in_force=time_in_force, exit_reason=exit_reason,
sell_reason=exit_reason, # sellreason -> compatibility sell_reason=exit_reason, # sellreason -> compatibility
current_time=datetime.now(timezone.utc)): current_time=datetime.now(timezone.utc)):
logger.info(f"User requested abortion of {trade.pair} exit.") logger.info(f"User denied exit for {trade.pair}.")
return False return False
try: try:

View File

@ -1,9 +1,10 @@
import logging import logging
from typing import List from typing import List
from sqlalchemy import inspect, text from sqlalchemy import inspect, select, text, tuple_, update
from freqtrade.exceptions import OperationalException from freqtrade.exceptions import OperationalException
from freqtrade.persistence.trade_model import Order, Trade
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -251,31 +252,31 @@ def set_sqlite_to_wal(engine):
def fix_old_dry_orders(engine): def fix_old_dry_orders(engine):
with engine.begin() as connection: with engine.begin() as connection:
connection.execute( stmt = update(Order).where(
text( Order.ft_is_open.is_(True),
""" tuple_(Order.ft_trade_id, Order.order_id).not_in(
update orders select(
set ft_is_open = 0 Trade.id, Trade.stoploss_order_id
where ft_is_open = 1 and (ft_trade_id, order_id) not in ( ).where(Trade.stoploss_order_id.is_not(None))
select id, stoploss_order_id from trades where stoploss_order_id is not null ),
) and ft_order_side = 'stoploss' Order.ft_order_side == 'stoploss',
and order_id like 'dry_%' Order.order_id.like('dry%'),
"""
) ).values(ft_is_open=False)
) connection.execute(stmt)
connection.execute(
text( stmt = update(Order).where(
""" Order.ft_is_open.is_(True),
update orders tuple_(Order.ft_trade_id, Order.order_id).not_in(
set ft_is_open = 0 select(
where ft_is_open = 1 Trade.id, Trade.open_order_id
and (ft_trade_id, order_id) not in ( ).where(Trade.open_order_id.is_not(None))
select id, open_order_id from trades where open_order_id is not null ),
) and ft_order_side != 'stoploss' Order.ft_order_side != 'stoploss',
and order_id like 'dry_%' Order.order_id.like('dry%')
"""
) ).values(ft_is_open=False)
) connection.execute(stmt)
def check_migrate(engine, decl_base, previous_tables) -> None: def check_migrate(engine, decl_base, previous_tables) -> None:

View File

@ -1200,7 +1200,7 @@ def test_migrate_new(mocker, default_conf, fee, caplog):
0.00258580, {stake}, {amount}, 0.00258580, {stake}, {amount},
'2019-11-28 12:44:24.000000', '2019-11-28 12:44:24.000000',
0.0, 0.0, 0.0, '5m', 0.0, 0.0, 0.0, '5m',
'buy_order', 'stop_order_id222') 'buy_order', 'dry_stop_order_id222')
""".format(fee=fee.return_value, """.format(fee=fee.return_value,
stake=default_conf.get("stake_amount"), stake=default_conf.get("stake_amount"),
amount=amount amount=amount
@ -1226,7 +1226,7 @@ def test_migrate_new(mocker, default_conf, fee, caplog):
'buy', 'buy',
'ETC/BTC', 'ETC/BTC',
0, 0,
'buy_order', 'dry_buy_order',
'closed', 'closed',
'ETC/BTC', 'ETC/BTC',
'limit', 'limit',
@ -1238,12 +1238,44 @@ def test_migrate_new(mocker, default_conf, fee, caplog):
{amount * 0.00258580} {amount * 0.00258580}
), ),
( (
1,
'buy',
'ETC/BTC',
1,
'dry_buy_order22',
'canceled',
'ETC/BTC',
'limit',
'buy',
0.00258580,
{amount},
{amount},
0,
{amount * 0.00258580}
),
(
1, 1,
'stoploss', 'stoploss',
'ETC/BTC', 'ETC/BTC',
1,
'dry_stop_order_id11X',
'canceled',
'ETC/BTC',
'limit',
'sell',
0.00258580,
{amount},
{amount},
0, 0,
'stop_order_id222', {amount * 0.00258580}
'closed', ),
(
1,
'stoploss',
'ETC/BTC',
1,
'dry_stop_order_id222',
'open',
'ETC/BTC', 'ETC/BTC',
'limit', 'limit',
'sell', 'sell',
@ -1292,7 +1324,7 @@ def test_migrate_new(mocker, default_conf, fee, caplog):
assert trade.exit_reason is None assert trade.exit_reason is None
assert trade.strategy is None assert trade.strategy is None
assert trade.timeframe == '5m' assert trade.timeframe == '5m'
assert trade.stoploss_order_id == 'stop_order_id222' assert trade.stoploss_order_id == 'dry_stop_order_id222'
assert trade.stoploss_last_update is None assert trade.stoploss_last_update is None
assert log_has("trying trades_bak1", caplog) assert log_has("trying trades_bak1", caplog)
assert log_has("trying trades_bak2", caplog) assert log_has("trying trades_bak2", caplog)
@ -1302,12 +1334,21 @@ def test_migrate_new(mocker, default_conf, fee, caplog):
assert trade.close_profit_abs is None assert trade.close_profit_abs is None
orders = trade.orders orders = trade.orders
assert len(orders) == 2 assert len(orders) == 4
assert orders[0].order_id == 'buy_order' assert orders[0].order_id == 'dry_buy_order'
assert orders[0].ft_order_side == 'buy' assert orders[0].ft_order_side == 'buy'
assert orders[1].order_id == 'stop_order_id222' assert orders[-1].order_id == 'dry_stop_order_id222'
assert orders[1].ft_order_side == 'stoploss' assert orders[-1].ft_order_side == 'stoploss'
assert orders[-1].ft_is_open is True
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[2].order_id == 'dry_stop_order_id11X'
assert orders[2].ft_order_side == 'stoploss'
assert orders[2].ft_is_open is False
def test_migrate_too_old(mocker, default_conf, fee, caplog): def test_migrate_too_old(mocker, default_conf, fee, caplog):