From dad921bf5b0fb39260928245d654e0dd394bd731 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 4 Nov 2024 19:23:17 +0100 Subject: [PATCH] chore: use CcxtOrder in more places --- freqtrade/exchange/exchange.py | 24 ++++++++++++++---------- freqtrade/exchange/gate.py | 2 +- freqtrade/exchange/kucoin.py | 4 ++-- freqtrade/exchange/okx.py | 6 +++--- freqtrade/freqtradebot.py | 25 +++++++++++++++---------- freqtrade/persistence/trade_model.py | 7 ++++--- 6 files changed, 39 insertions(+), 29 deletions(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 028fc734c..c6971ee37 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -588,7 +588,7 @@ class Exchange: trade["amount"] = trade["amount"] * contract_size return trades - def _order_contracts_to_amount(self, order: dict) -> dict: + def _order_contracts_to_amount(self, order: CcxtOrder) -> CcxtOrder: if "symbol" in order and order["symbol"] is not None: contract_size = self.get_contract_size(order["symbol"]) if contract_size != 1: @@ -998,7 +998,7 @@ class Exchange: self, pair: str, ordertype: str, - side: str, + side: BuySell, amount: float, rate: float, leverage: float, @@ -1249,7 +1249,7 @@ class Exchange: leverage: float, reduceOnly: bool = False, time_in_force: str = "GTC", - ) -> dict: + ) -> CcxtOrder: if self._config["dry_run"]: dry_order = self.create_dry_run_order( pair, ordertype, side, amount, self.price_to_precision(pair, rate), leverage @@ -1307,7 +1307,7 @@ class Exchange: except ccxt.BaseError as e: raise OperationalException(e) from e - def stoploss_adjust(self, stop_loss: float, order: dict, side: str) -> bool: + def stoploss_adjust(self, stop_loss: float, order: CcxtOrder, side: str) -> bool: """ Verify stop_loss against stoploss-order value (limit or price) Returns True if adjustment is necessary. @@ -1368,7 +1368,7 @@ class Exchange: order_types: dict, side: BuySell, leverage: float, - ) -> dict: + ) -> CcxtOrder: """ creates a stoploss order. requires `_ft_has['stoploss_order_types']` to be set as a dict mapping limit and market @@ -1543,7 +1543,7 @@ class Exchange: return self.fetch_stoploss_order(order_id, pair) return self.fetch_order(order_id, pair) - def check_order_canceled_empty(self, order: dict) -> bool: + def check_order_canceled_empty(self, order: CcxtOrder) -> bool: """ Verify if an order has been cancelled without being partially filled :param order: Order dict as returned from fetch_order() @@ -1623,7 +1623,9 @@ class Exchange: return order - def cancel_stoploss_order_with_result(self, order_id: str, pair: str, amount: float) -> dict: + def cancel_stoploss_order_with_result( + self, order_id: str, pair: str, amount: float + ) -> CcxtOrder: """ Cancel stoploss order returning a result. Creates a fake result if cancel order returns a non-usable result @@ -1717,7 +1719,9 @@ class Exchange: if not params: params = {} try: - orders: list[dict] = self._api.fetch_orders(pair, since=since_ms, params=params) + orders: list[CcxtOrder] = self._api.fetch_orders( + pair, since=since_ms, params=params + ) except ccxt.NotSupported: # Some exchanges don't support fetchOrders # attempt to fetch open and closed orders separately @@ -2095,7 +2099,7 @@ class Exchange: except ccxt.BaseError as e: raise OperationalException(e) from e - def get_order_id_conditional(self, order: dict[str, Any]) -> str: + def get_order_id_conditional(self, order: CcxtOrder) -> str: return order["id"] @retrier @@ -2144,7 +2148,7 @@ class Exchange: raise OperationalException(e) from e @staticmethod - def order_has_fee(order: dict) -> bool: + def order_has_fee(order: CcxtOrder) -> bool: """ Verifies if the passed in order dict has the needed keys to extract fees, and that these keys (currency, cost) are not empty. diff --git a/freqtrade/exchange/gate.py b/freqtrade/exchange/gate.py index e804e3716..bc366d587 100644 --- a/freqtrade/exchange/gate.py +++ b/freqtrade/exchange/gate.py @@ -99,7 +99,7 @@ class Gate(Exchange): } return trades - def get_order_id_conditional(self, order: dict[str, Any]) -> str: + def get_order_id_conditional(self, order: CcxtOrder) -> str: return safe_value_fallback2(order, order, "id_stop", "id") def fetch_stoploss_order( diff --git a/freqtrade/exchange/kucoin.py b/freqtrade/exchange/kucoin.py index fc4433f0b..de033dcc0 100644 --- a/freqtrade/exchange/kucoin.py +++ b/freqtrade/exchange/kucoin.py @@ -4,7 +4,7 @@ import logging from freqtrade.constants import BuySell from freqtrade.exchange import Exchange -from freqtrade.exchange.exchange_types import FtHas +from freqtrade.exchange.exchange_types import CcxtOrder, FtHas logger = logging.getLogger(__name__) @@ -47,7 +47,7 @@ class Kucoin(Exchange): leverage: float, reduceOnly: bool = False, time_in_force: str = "GTC", - ) -> dict: + ) -> CcxtOrder: res = super().create_order( pair=pair, ordertype=ordertype, diff --git a/freqtrade/exchange/okx.py b/freqtrade/exchange/okx.py index 804ef1995..ff63cf0de 100644 --- a/freqtrade/exchange/okx.py +++ b/freqtrade/exchange/okx.py @@ -191,7 +191,7 @@ class Okx(Exchange): params["posSide"] = self._get_posSide(side, True) return params - def _convert_stop_order(self, pair: str, order_id: str, order: dict) -> dict: + def _convert_stop_order(self, pair: str, order_id: str, order: CcxtOrder) -> CcxtOrder: if ( order.get("status", "open") == "closed" and (real_order_id := order.get("info", {}).get("ordId")) is not None @@ -258,14 +258,14 @@ class Okx(Exchange): raise OperationalException(e) from e raise RetryableOrderError(f"StoplossOrder not found (pair: {pair} id: {order_id}).") - def get_order_id_conditional(self, order: dict[str, Any]) -> str: + def get_order_id_conditional(self, order: CcxtOrder) -> str: if order.get("type", "") == "stop": return safe_value_fallback2(order, order, "id_stop", "id") return order["id"] def cancel_stoploss_order( self, order_id: str, pair: str, params: Optional[dict] = None - ) -> CcxtOrder: + ) -> dict: params1 = {"stop": True} # 'ordType': 'conditional' # diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 8bdca119b..a66f557ab 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -43,6 +43,7 @@ from freqtrade.exchange import ( timeframe_to_next_date, timeframe_to_seconds, ) +from freqtrade.exchange.exchange_types import CcxtOrder from freqtrade.leverage.liquidation_price import update_liquidation_prices from freqtrade.misc import safe_value_fallback, safe_value_fallback2 from freqtrade.mixins import LoggingMixin @@ -1466,7 +1467,7 @@ class FreqtradeBot(LoggingMixin): return False - def handle_trailing_stoploss_on_exchange(self, trade: Trade, order: dict) -> None: + def handle_trailing_stoploss_on_exchange(self, trade: Trade, order: CcxtOrder) -> None: """ Check to see if stoploss on exchange should be updated in case of trailing stoploss on exchange @@ -1504,7 +1505,7 @@ class FreqtradeBot(LoggingMixin): f"Could not create trailing stoploss order for pair {trade.pair}." ) - def manage_trade_stoploss_orders(self, trade: Trade, stoploss_orders: list[dict]): + def manage_trade_stoploss_orders(self, trade: Trade, stoploss_orders: list[CcxtOrder]): """ Perform required actions according to existing stoploss orders of trade :param trade: Corresponding Trade @@ -1580,7 +1581,9 @@ class FreqtradeBot(LoggingMixin): else: self.replace_order(order, open_order, trade) - def handle_cancel_order(self, order: dict, order_obj: Order, trade: Trade, reason: str) -> None: + def handle_cancel_order( + self, order: CcxtOrder, order_obj: Order, trade: Trade, reason: str + ) -> None: """ Check if current analyzed order timed out and cancel if necessary. :param order: Order dict grabbed with exchange.fetch_order() @@ -1632,7 +1635,7 @@ class FreqtradeBot(LoggingMixin): ) trade.delete() - def replace_order(self, order: dict, order_obj: Optional[Order], trade: Trade) -> None: + def replace_order(self, order: CcxtOrder, order_obj: Optional[Order], trade: Trade) -> None: """ Check if current analyzed entry order should be replaced or simply cancelled. To simply cancel the existing order(no replacement) adjust_entry_price() should return None @@ -1736,7 +1739,7 @@ class FreqtradeBot(LoggingMixin): def handle_cancel_enter( self, trade: Trade, - order: dict, + order: CcxtOrder, order_obj: Order, reason: str, replacing: Optional[bool] = False, @@ -1820,7 +1823,9 @@ class FreqtradeBot(LoggingMixin): ) return was_trade_fully_canceled - def handle_cancel_exit(self, trade: Trade, order: dict, order_obj: Order, reason: str) -> bool: + def handle_cancel_exit( + self, trade: Trade, order: CcxtOrder, order_obj: Order, reason: str + ) -> bool: """ exit order cancel - cancel order and update trade :return: True if exit order was cancelled, false otherwise @@ -2173,7 +2178,7 @@ class FreqtradeBot(LoggingMixin): self, trade: Trade, order_id: Optional[str], - action_order: Optional[dict[str, Any]] = None, + action_order: Optional[CcxtOrder] = None, *, stoploss_order: bool = False, send_msg: bool = True, @@ -2338,7 +2343,7 @@ class FreqtradeBot(LoggingMixin): return fee_abs return None - def handle_order_fee(self, trade: Trade, order_obj: Order, order: dict[str, Any]) -> None: + def handle_order_fee(self, trade: Trade, order_obj: Order, order: CcxtOrder) -> None: # Try update amount (binance-fix) try: fee_abs = self.get_real_amount(trade, order, order_obj) @@ -2347,7 +2352,7 @@ class FreqtradeBot(LoggingMixin): except DependencyException as exception: logger.warning("Could not update trade amount: %s", exception) - def get_real_amount(self, trade: Trade, order: dict, order_obj: Order) -> Optional[float]: + def get_real_amount(self, trade: Trade, order: CcxtOrder, order_obj: Order) -> Optional[float]: """ Detect and update trade fee. Calls trade.update_fee() upon correct detection. @@ -2407,7 +2412,7 @@ class FreqtradeBot(LoggingMixin): return True def fee_detection_from_trades( - self, trade: Trade, order: dict, order_obj: Order, order_amount: float, trades: list + self, trade: Trade, order: CcxtOrder, order_obj: Order, order_amount: float, trades: list ) -> Optional[float]: """ fee-detection fallback to Trades. diff --git a/freqtrade/persistence/trade_model.py b/freqtrade/persistence/trade_model.py index f765b9865..a5d3bc6e4 100644 --- a/freqtrade/persistence/trade_model.py +++ b/freqtrade/persistence/trade_model.py @@ -43,6 +43,7 @@ from freqtrade.exchange import ( amount_to_contract_precision, price_to_precision, ) +from freqtrade.exchange.exchange_types import CcxtOrder from freqtrade.leverage import interest from freqtrade.misc import safe_value_fallback from freqtrade.persistence.base import ModelBase, SessionType @@ -309,7 +310,7 @@ class Order(ModelBase): trade.adjust_stop_loss(trade.open_rate, trade.stop_loss_pct) @staticmethod - def update_orders(orders: list["Order"], order: dict[str, Any]): + def update_orders(orders: list["Order"], order: CcxtOrder): """ Get all non-closed orders - useful when trying to batch-update orders """ @@ -328,7 +329,7 @@ class Order(ModelBase): @classmethod def parse_from_ccxt_object( cls, - order: dict[str, Any], + order: CcxtOrder, pair: str, side: str, amount: Optional[float] = None, @@ -959,7 +960,7 @@ class LocalTrade: else: return False - def update_order(self, order: dict) -> None: + def update_order(self, order: CcxtOrder) -> None: Order.update_orders(self.orders, order) @property