chore: use CcxtOrder in more places

This commit is contained in:
Matthias
2024-11-04 19:23:17 +01:00
parent e020bafc38
commit dad921bf5b
6 changed files with 39 additions and 29 deletions

View File

@@ -588,7 +588,7 @@ class Exchange:
trade["amount"] = trade["amount"] * contract_size trade["amount"] = trade["amount"] * contract_size
return trades 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: if "symbol" in order and order["symbol"] is not None:
contract_size = self.get_contract_size(order["symbol"]) contract_size = self.get_contract_size(order["symbol"])
if contract_size != 1: if contract_size != 1:
@@ -998,7 +998,7 @@ class Exchange:
self, self,
pair: str, pair: str,
ordertype: str, ordertype: str,
side: str, side: BuySell,
amount: float, amount: float,
rate: float, rate: float,
leverage: float, leverage: float,
@@ -1249,7 +1249,7 @@ class Exchange:
leverage: float, leverage: float,
reduceOnly: bool = False, reduceOnly: bool = False,
time_in_force: str = "GTC", time_in_force: str = "GTC",
) -> dict: ) -> CcxtOrder:
if self._config["dry_run"]: if self._config["dry_run"]:
dry_order = self.create_dry_run_order( dry_order = self.create_dry_run_order(
pair, ordertype, side, amount, self.price_to_precision(pair, rate), leverage pair, ordertype, side, amount, self.price_to_precision(pair, rate), leverage
@@ -1307,7 +1307,7 @@ class Exchange:
except ccxt.BaseError as e: except ccxt.BaseError as e:
raise OperationalException(e) from 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) Verify stop_loss against stoploss-order value (limit or price)
Returns True if adjustment is necessary. Returns True if adjustment is necessary.
@@ -1368,7 +1368,7 @@ class Exchange:
order_types: dict, order_types: dict,
side: BuySell, side: BuySell,
leverage: float, leverage: float,
) -> dict: ) -> CcxtOrder:
""" """
creates a stoploss order. creates a stoploss order.
requires `_ft_has['stoploss_order_types']` to be set as a dict mapping limit and market 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_stoploss_order(order_id, pair)
return self.fetch_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 Verify if an order has been cancelled without being partially filled
:param order: Order dict as returned from fetch_order() :param order: Order dict as returned from fetch_order()
@@ -1623,7 +1623,9 @@ class Exchange:
return order 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. Cancel stoploss order returning a result.
Creates a fake result if cancel order returns a non-usable result Creates a fake result if cancel order returns a non-usable result
@@ -1717,7 +1719,9 @@ class Exchange:
if not params: if not params:
params = {} params = {}
try: 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: except ccxt.NotSupported:
# Some exchanges don't support fetchOrders # Some exchanges don't support fetchOrders
# attempt to fetch open and closed orders separately # attempt to fetch open and closed orders separately
@@ -2095,7 +2099,7 @@ class Exchange:
except ccxt.BaseError as e: except ccxt.BaseError as e:
raise OperationalException(e) from 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"] return order["id"]
@retrier @retrier
@@ -2144,7 +2148,7 @@ class Exchange:
raise OperationalException(e) from e raise OperationalException(e) from e
@staticmethod @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, Verifies if the passed in order dict has the needed keys to extract fees,
and that these keys (currency, cost) are not empty. and that these keys (currency, cost) are not empty.

View File

@@ -99,7 +99,7 @@ class Gate(Exchange):
} }
return trades 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") return safe_value_fallback2(order, order, "id_stop", "id")
def fetch_stoploss_order( def fetch_stoploss_order(

View File

@@ -4,7 +4,7 @@ import logging
from freqtrade.constants import BuySell from freqtrade.constants import BuySell
from freqtrade.exchange import Exchange from freqtrade.exchange import Exchange
from freqtrade.exchange.exchange_types import FtHas from freqtrade.exchange.exchange_types import CcxtOrder, FtHas
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -47,7 +47,7 @@ class Kucoin(Exchange):
leverage: float, leverage: float,
reduceOnly: bool = False, reduceOnly: bool = False,
time_in_force: str = "GTC", time_in_force: str = "GTC",
) -> dict: ) -> CcxtOrder:
res = super().create_order( res = super().create_order(
pair=pair, pair=pair,
ordertype=ordertype, ordertype=ordertype,

View File

@@ -191,7 +191,7 @@ class Okx(Exchange):
params["posSide"] = self._get_posSide(side, True) params["posSide"] = self._get_posSide(side, True)
return params 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 ( if (
order.get("status", "open") == "closed" order.get("status", "open") == "closed"
and (real_order_id := order.get("info", {}).get("ordId")) is not None 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 OperationalException(e) from e
raise RetryableOrderError(f"StoplossOrder not found (pair: {pair} id: {order_id}).") 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": if order.get("type", "") == "stop":
return safe_value_fallback2(order, order, "id_stop", "id") return safe_value_fallback2(order, order, "id_stop", "id")
return order["id"] return order["id"]
def cancel_stoploss_order( def cancel_stoploss_order(
self, order_id: str, pair: str, params: Optional[dict] = None self, order_id: str, pair: str, params: Optional[dict] = None
) -> CcxtOrder: ) -> dict:
params1 = {"stop": True} params1 = {"stop": True}
# 'ordType': 'conditional' # 'ordType': 'conditional'
# #

View File

@@ -43,6 +43,7 @@ from freqtrade.exchange import (
timeframe_to_next_date, timeframe_to_next_date,
timeframe_to_seconds, timeframe_to_seconds,
) )
from freqtrade.exchange.exchange_types import CcxtOrder
from freqtrade.leverage.liquidation_price import update_liquidation_prices from freqtrade.leverage.liquidation_price import update_liquidation_prices
from freqtrade.misc import safe_value_fallback, safe_value_fallback2 from freqtrade.misc import safe_value_fallback, safe_value_fallback2
from freqtrade.mixins import LoggingMixin from freqtrade.mixins import LoggingMixin
@@ -1466,7 +1467,7 @@ class FreqtradeBot(LoggingMixin):
return False 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 Check to see if stoploss on exchange should be updated
in case of trailing stoploss on exchange 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}." 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 Perform required actions according to existing stoploss orders of trade
:param trade: Corresponding Trade :param trade: Corresponding Trade
@@ -1580,7 +1581,9 @@ class FreqtradeBot(LoggingMixin):
else: else:
self.replace_order(order, open_order, trade) 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. Check if current analyzed order timed out and cancel if necessary.
:param order: Order dict grabbed with exchange.fetch_order() :param order: Order dict grabbed with exchange.fetch_order()
@@ -1632,7 +1635,7 @@ class FreqtradeBot(LoggingMixin):
) )
trade.delete() 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. 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 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( def handle_cancel_enter(
self, self,
trade: Trade, trade: Trade,
order: dict, order: CcxtOrder,
order_obj: Order, order_obj: Order,
reason: str, reason: str,
replacing: Optional[bool] = False, replacing: Optional[bool] = False,
@@ -1820,7 +1823,9 @@ class FreqtradeBot(LoggingMixin):
) )
return was_trade_fully_canceled 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 exit order cancel - cancel order and update trade
:return: True if exit order was cancelled, false otherwise :return: True if exit order was cancelled, false otherwise
@@ -2173,7 +2178,7 @@ class FreqtradeBot(LoggingMixin):
self, self,
trade: Trade, trade: Trade,
order_id: Optional[str], order_id: Optional[str],
action_order: Optional[dict[str, Any]] = None, action_order: Optional[CcxtOrder] = None,
*, *,
stoploss_order: bool = False, stoploss_order: bool = False,
send_msg: bool = True, send_msg: bool = True,
@@ -2338,7 +2343,7 @@ class FreqtradeBot(LoggingMixin):
return fee_abs return fee_abs
return None 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 update amount (binance-fix)
try: try:
fee_abs = self.get_real_amount(trade, order, order_obj) fee_abs = self.get_real_amount(trade, order, order_obj)
@@ -2347,7 +2352,7 @@ class FreqtradeBot(LoggingMixin):
except DependencyException as exception: except DependencyException as exception:
logger.warning("Could not update trade amount: %s", 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. Detect and update trade fee.
Calls trade.update_fee() upon correct detection. Calls trade.update_fee() upon correct detection.
@@ -2407,7 +2412,7 @@ class FreqtradeBot(LoggingMixin):
return True return True
def fee_detection_from_trades( 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]: ) -> Optional[float]:
""" """
fee-detection fallback to Trades. fee-detection fallback to Trades.

View File

@@ -43,6 +43,7 @@ from freqtrade.exchange import (
amount_to_contract_precision, amount_to_contract_precision,
price_to_precision, price_to_precision,
) )
from freqtrade.exchange.exchange_types import CcxtOrder
from freqtrade.leverage import interest from freqtrade.leverage import interest
from freqtrade.misc import safe_value_fallback from freqtrade.misc import safe_value_fallback
from freqtrade.persistence.base import ModelBase, SessionType 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) trade.adjust_stop_loss(trade.open_rate, trade.stop_loss_pct)
@staticmethod @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 Get all non-closed orders - useful when trying to batch-update orders
""" """
@@ -328,7 +329,7 @@ class Order(ModelBase):
@classmethod @classmethod
def parse_from_ccxt_object( def parse_from_ccxt_object(
cls, cls,
order: dict[str, Any], order: CcxtOrder,
pair: str, pair: str,
side: str, side: str,
amount: Optional[float] = None, amount: Optional[float] = None,
@@ -959,7 +960,7 @@ class LocalTrade:
else: else:
return False return False
def update_order(self, order: dict) -> None: def update_order(self, order: CcxtOrder) -> None:
Order.update_orders(self.orders, order) Order.update_orders(self.orders, order)
@property @property