mirror of
https://github.com/freqtrade/freqtrade.git
synced 2025-12-15 20:31:43 +00:00
chore: use CcxtOrder in more places
This commit is contained in:
@@ -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.
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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'
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user