update test_adjust_entry_maintain_replace test case, fix first RPC test

This commit is contained in:
axel
2023-06-17 00:06:30 -04:00
parent 32c919cfad
commit 171c4f182d
4 changed files with 37 additions and 26 deletions
+11 -2
View File
@@ -493,7 +493,11 @@ class LocalTrade():
@property @property
def open_orders_ids(self) -> list: def open_orders_ids(self) -> list:
return [open_order.order_id for open_order in self.open_orders] open_orders_ids_wo_sl = []
for oo in self.open_orders:
if (oo.ft_order_side not in ['stoploss']):
open_orders_ids_wo_sl.append(oo.order_id)
return open_orders_ids_wo_sl
def __init__(self, **kwargs): def __init__(self, **kwargs):
for key in kwargs: for key in kwargs:
@@ -1391,13 +1395,18 @@ class Trade(ModelBase, LocalTrade):
@hybrid_property @hybrid_property
def open_orders_ids(self) -> list: def open_orders_ids(self) -> list:
return [open_order.order_id for open_order in self.open_orders] open_orders_ids_wo_sl = []
for oo in self.open_orders:
if (oo.ft_order_side not in ['stoploss']):
open_orders_ids_wo_sl.append(oo.order_id)
return open_orders_ids_wo_sl
@open_orders_ids.expression @open_orders_ids.expression
def open_orders_ids(cls): def open_orders_ids(cls):
return ( return (
select(Order.order_id) select(Order.order_id)
.where(Order.ft_is_open is True) .where(Order.ft_is_open is True)
.where(Order.ft_order_side != "stoploss")
.where(Order.ft_trade_id == cls.id) .where(Order.ft_trade_id == cls.id)
.subquery() .subquery()
) )
+18 -16
View File
@@ -870,9 +870,9 @@ class RPC:
is_short = trade.is_short is_short = trade.is_short
if not self._freqtrade.strategy.position_adjustment_enable: if not self._freqtrade.strategy.position_adjustment_enable:
raise RPCException(f'position for {pair} already open - id: {trade.id}') raise RPCException(f'position for {pair} already open - id: {trade.id}')
if trade.open_order_id is not None: if trade.has_open_orders:
raise RPCException(f'position for {pair} already open - id: {trade.id} ' raise RPCException(f'position for {pair} already open - id: {trade.id} '
f'and has open order {trade.open_order_id}') f'and has open order {trade.open_orders_ids}')
else: else:
if Trade.get_open_trade_count() >= self._config['max_open_trades']: if Trade.get_open_trade_count() >= self._config['max_open_trades']:
raise RPCException("Maximum number of trades is reached.") raise RPCException("Maximum number of trades is reached.")
@@ -909,17 +909,18 @@ class RPC:
if not trade: if not trade:
logger.warning('cancel_open_order: Invalid trade_id received.') logger.warning('cancel_open_order: Invalid trade_id received.')
raise RPCException('Invalid trade_id.') raise RPCException('Invalid trade_id.')
if not trade.open_order_id: if not trade.has_open_orders:
logger.warning('cancel_open_order: No open order for trade_id.') logger.warning('cancel_open_order: No open order for trade_id.')
raise RPCException('No open order for trade_id.') raise RPCException('No open order for trade_id.')
try: for open_order in trade.open_orders:
order = self._freqtrade.exchange.fetch_order(trade.open_order_id, trade.pair) try:
except ExchangeError as e: order = self._freqtrade.exchange.fetch_order(open_order.order_id, trade.pair)
logger.info(f"Cannot query order for {trade} due to {e}.", exc_info=True) except ExchangeError as e:
raise RPCException("Order not found.") logger.info(f"Cannot query order for {trade} due to {e}.", exc_info=True)
self._freqtrade.handle_cancel_order(order, trade, CANCEL_REASON['USER_CANCEL']) raise RPCException("Order not found.")
Trade.commit() self._freqtrade.handle_cancel_order(order, trade, CANCEL_REASON['USER_CANCEL'])
Trade.commit()
def _rpc_delete(self, trade_id: int) -> Dict[str, Union[str, int]]: def _rpc_delete(self, trade_id: int) -> Dict[str, Union[str, int]]:
""" """
@@ -934,12 +935,13 @@ class RPC:
raise RPCException('invalid argument') raise RPCException('invalid argument')
# Try cancelling regular order if that exists # Try cancelling regular order if that exists
if trade.open_order_id: if trade.has_open_orders:
try: for open_order in trade.open_orders:
self._freqtrade.exchange.cancel_order(trade.open_order_id, trade.pair) try:
c_count += 1 self._freqtrade.exchange.cancel_order(open_order.order_id, trade.pair)
except (ExchangeError): c_count += 1
pass except (ExchangeError):
pass
# cancel stoploss on exchange ... # cancel stoploss on exchange ...
if (self._freqtrade.strategy.order_types.get('stoploss_on_exchange') if (self._freqtrade.strategy.order_types.get('stoploss_on_exchange')
+2 -2
View File
@@ -42,7 +42,6 @@ def test_rpc_trade_status(default_conf, ticker, fee, mocker) -> None:
'strategy': ANY, 'strategy': ANY,
'enter_tag': ANY, 'enter_tag': ANY,
'timeframe': 5, 'timeframe': 5,
'open_order_id': ANY,
'close_date': None, 'close_date': None,
'close_timestamp': None, 'close_timestamp': None,
'open_rate': 1.098e-05, 'open_rate': 1.098e-05,
@@ -1093,7 +1092,8 @@ def test_rpc_force_entry(mocker, default_conf, ticker, fee, limit_buy_order_open
trade = rpc._rpc_force_entry(pair, 0.0001, order_type='limit', stake_amount=0.05) trade = rpc._rpc_force_entry(pair, 0.0001, order_type='limit', stake_amount=0.05)
assert trade.stake_amount == 0.05 assert trade.stake_amount == 0.05
assert trade.buy_tag == 'force_entry' assert trade.buy_tag == 'force_entry'
assert trade.open_order_id == 'mocked_limit_buy' # assert trade.open_order_id == 'mocked_limit_buy'
assert trade.open_orders_ids[-1] == 'mocked_limit_buy'
freqtradebot.strategy.position_adjustment_enable = True freqtradebot.strategy.position_adjustment_enable = True
with pytest.raises(RPCException, match=r'position for LTC/BTC already open.*open order.*'): with pytest.raises(RPCException, match=r'position for LTC/BTC already open.*open order.*'):
+6 -6
View File
@@ -2339,15 +2339,15 @@ def test_update_trade_state_exception(mocker, default_conf_usdt, is_short, limit
# TODO: should not be magicmock # TODO: should not be magicmock
trade = MagicMock() trade = MagicMock()
trade.open_order_id = '123'
trade.amount = 123 trade.amount = 123
open_order_id = '123'
# Test raise of OperationalException exception # Test raise of OperationalException exception
mocker.patch( mocker.patch(
'freqtrade.freqtradebot.FreqtradeBot.get_real_amount', 'freqtrade.freqtradebot.FreqtradeBot.get_real_amount',
side_effect=DependencyException() side_effect=DependencyException()
) )
freqtrade.update_trade_state(trade, trade.open_order_id) freqtrade.update_trade_state(trade, open_order_id)
assert log_has('Could not update trade amount: ', caplog) assert log_has('Could not update trade amount: ', caplog)
@@ -2357,13 +2357,13 @@ def test_update_trade_state_orderexception(mocker, default_conf_usdt, caplog) ->
# TODO: should not be magicmock # TODO: should not be magicmock
trade = MagicMock() trade = MagicMock()
trade.open_order_id = '123' open_order_id = '123'
# Test raise of OperationalException exception # Test raise of OperationalException exception
grm_mock = mocker.patch("freqtrade.freqtradebot.FreqtradeBot.get_real_amount", MagicMock()) grm_mock = mocker.patch("freqtrade.freqtradebot.FreqtradeBot.get_real_amount", MagicMock())
freqtrade.update_trade_state(trade, trade.open_order_id) freqtrade.update_trade_state(trade, open_order_id)
assert grm_mock.call_count == 0 assert grm_mock.call_count == 0
assert log_has(f'Unable to fetch order {trade.open_order_id}: ', caplog) assert log_has(f'Unable to fetch order {open_order_id}: ', caplog)
@pytest.mark.parametrize("is_short", [False, True]) @pytest.mark.parametrize("is_short", [False, True])
@@ -2848,7 +2848,7 @@ def test_adjust_entry_cancel(
assert freqtrade.strategy.adjust_entry_price.call_count == 1 assert freqtrade.strategy.adjust_entry_price.call_count == 1
@pytest.mark.parametrize("is_short", [False]) @pytest.mark.parametrize("is_short", [False, True])
def test_adjust_entry_maintain_replace( def test_adjust_entry_maintain_replace(
default_conf_usdt, ticker_usdt, limit_buy_order_old, open_trade, default_conf_usdt, ticker_usdt, limit_buy_order_old, open_trade,
limit_sell_order_old, fee, mocker, caplog, is_short limit_sell_order_old, fee, mocker, caplog, is_short