Merge branch 'freqtrade:develop' into develop
This commit is contained in:
commit
d5548fd61c
@ -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:
|
||||||
|
@ -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:
|
||||||
|
@ -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):
|
||||||
|
Loading…
Reference in New Issue
Block a user