Add expired to list of canceled statuses
This commit is contained in:
		| @@ -49,6 +49,8 @@ USERPATH_NOTEBOOKS = 'notebooks' | |||||||
| TELEGRAM_SETTING_OPTIONS = ['on', 'off', 'silent'] | TELEGRAM_SETTING_OPTIONS = ['on', 'off', 'silent'] | ||||||
| ENV_VAR_PREFIX = 'FREQTRADE__' | ENV_VAR_PREFIX = 'FREQTRADE__' | ||||||
|  |  | ||||||
|  | NON_OPEN_EXCHANGE_STATES = ('cancelled', 'canceled', 'closed', 'expired') | ||||||
|  |  | ||||||
|  |  | ||||||
| # Define decimals per coin for outputs | # Define decimals per coin for outputs | ||||||
| # Only used for outputs. | # Only used for outputs. | ||||||
|   | |||||||
| @@ -19,7 +19,8 @@ from ccxt.base.decimal_to_precision import (ROUND_DOWN, ROUND_UP, TICK_SIZE, TRU | |||||||
|                                             decimal_to_precision) |                                             decimal_to_precision) | ||||||
| from pandas import DataFrame | from pandas import DataFrame | ||||||
|  |  | ||||||
| from freqtrade.constants import DEFAULT_AMOUNT_RESERVE_PERCENT, ListPairsWithTimeframes | from freqtrade.constants import (DEFAULT_AMOUNT_RESERVE_PERCENT, NON_OPEN_EXCHANGE_STATES, | ||||||
|  |                                  ListPairsWithTimeframes) | ||||||
| from freqtrade.data.converter import ohlcv_to_dataframe, trades_dict_to_list | from freqtrade.data.converter import ohlcv_to_dataframe, trades_dict_to_list | ||||||
| from freqtrade.exceptions import (DDosProtection, ExchangeError, InsufficientFundsError, | from freqtrade.exceptions import (DDosProtection, ExchangeError, InsufficientFundsError, | ||||||
|                                   InvalidOrderException, OperationalException, PricingError, |                                   InvalidOrderException, OperationalException, PricingError, | ||||||
| @@ -804,7 +805,7 @@ class Exchange: | |||||||
|         :param order: Order dict as returned from fetch_order() |         :param order: Order dict as returned from fetch_order() | ||||||
|         :return: True if order has been cancelled without being filled, False otherwise. |         :return: True if order has been cancelled without being filled, False otherwise. | ||||||
|         """ |         """ | ||||||
|         return (order.get('status') in ('closed', 'canceled', 'cancelled') |         return (order.get('status') in NON_OPEN_EXCHANGE_STATES | ||||||
|                 and order.get('filled') == 0.0) |                 and order.get('filled') == 0.0) | ||||||
|  |  | ||||||
|     @retrier |     @retrier | ||||||
|   | |||||||
| @@ -945,7 +945,7 @@ class FreqtradeBot(LoggingMixin): | |||||||
|         was_trade_fully_canceled = False |         was_trade_fully_canceled = False | ||||||
|  |  | ||||||
|         # Cancelled orders may have the status of 'canceled' or 'closed' |         # Cancelled orders may have the status of 'canceled' or 'closed' | ||||||
|         if order['status'] not in ('cancelled', 'canceled', 'closed'): |         if order['status'] not in constants.NON_OPEN_EXCHANGE_STATES: | ||||||
|             filled_val = order.get('filled', 0.0) or 0.0 |             filled_val = order.get('filled', 0.0) or 0.0 | ||||||
|             filled_stake = filled_val * trade.open_rate |             filled_stake = filled_val * trade.open_rate | ||||||
|             minstake = self.exchange.get_min_pair_stake_amount( |             minstake = self.exchange.get_min_pair_stake_amount( | ||||||
| @@ -961,7 +961,7 @@ class FreqtradeBot(LoggingMixin): | |||||||
|             # Avoid race condition where the order could not be cancelled coz its already filled. |             # Avoid race condition where the order could not be cancelled coz its already filled. | ||||||
|             # Simply bailing here is the only safe way - as this order will then be |             # Simply bailing here is the only safe way - as this order will then be | ||||||
|             # handled in the next iteration. |             # handled in the next iteration. | ||||||
|             if corder.get('status') not in ('cancelled', 'canceled', 'closed'): |             if corder.get('status') not in constants.NON_OPEN_EXCHANGE_STATES: | ||||||
|                 logger.warning(f"Order {trade.open_order_id} for {trade.pair} not cancelled.") |                 logger.warning(f"Order {trade.open_order_id} for {trade.pair} not cancelled.") | ||||||
|                 return False |                 return False | ||||||
|         else: |         else: | ||||||
| @@ -1142,7 +1142,7 @@ class FreqtradeBot(LoggingMixin): | |||||||
|         trade.close_rate_requested = limit |         trade.close_rate_requested = limit | ||||||
|         trade.sell_reason = sell_reason.sell_reason |         trade.sell_reason = sell_reason.sell_reason | ||||||
|         # In case of market sell orders the order can be closed immediately |         # In case of market sell orders the order can be closed immediately | ||||||
|         if order.get('status', 'unknown') == 'closed': |         if order.get('status', 'unknown') in ('closed', 'expired'): | ||||||
|             self.update_trade_state(trade, trade.open_order_id, order) |             self.update_trade_state(trade, trade.open_order_id, order) | ||||||
|         Trade.commit() |         Trade.commit() | ||||||
|  |  | ||||||
|   | |||||||
| @@ -13,7 +13,7 @@ from sqlalchemy.orm import Query, declarative_base, relationship, scoped_session | |||||||
| from sqlalchemy.pool import StaticPool | from sqlalchemy.pool import StaticPool | ||||||
| from sqlalchemy.sql.schema import UniqueConstraint | from sqlalchemy.sql.schema import UniqueConstraint | ||||||
|  |  | ||||||
| from freqtrade.constants import DATETIME_PRINT_FORMAT | from freqtrade.constants import DATETIME_PRINT_FORMAT, NON_OPEN_EXCHANGE_STATES | ||||||
| from freqtrade.enums import SellType | from freqtrade.enums import SellType | ||||||
| from freqtrade.exceptions import DependencyException, OperationalException | from freqtrade.exceptions import DependencyException, OperationalException | ||||||
| from freqtrade.misc import safe_value_fallback | from freqtrade.misc import safe_value_fallback | ||||||
| @@ -159,7 +159,7 @@ class Order(_DECL_BASE): | |||||||
|             self.order_date = datetime.fromtimestamp(order['timestamp'] / 1000, tz=timezone.utc) |             self.order_date = datetime.fromtimestamp(order['timestamp'] / 1000, tz=timezone.utc) | ||||||
|  |  | ||||||
|         self.ft_is_open = True |         self.ft_is_open = True | ||||||
|         if self.status in ('closed', 'canceled', 'cancelled'): |         if self.status in NON_OPEN_EXCHANGE_STATES: | ||||||
|             self.ft_is_open = False |             self.ft_is_open = False | ||||||
|             if (order.get('filled', 0.0) or 0.0) > 0: |             if (order.get('filled', 0.0) or 0.0) > 0: | ||||||
|                 self.order_filled_date = datetime.now(timezone.utc) |                 self.order_filled_date = datetime.now(timezone.utc) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user