From 1e79c1961ba51ed09e680943d4d99990fcf80382 Mon Sep 17 00:00:00 2001 From: matstedt Date: Wed, 25 Feb 2026 22:21:06 +0100 Subject: [PATCH] krakenfutures: aggregate order fees in _adjust_krakenfutures_order --- freqtrade/exchange/krakenfutures.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/freqtrade/exchange/krakenfutures.py b/freqtrade/exchange/krakenfutures.py index 16e9b6ac4..e0de6814f 100644 --- a/freqtrade/exchange/krakenfutures.py +++ b/freqtrade/exchange/krakenfutures.py @@ -152,13 +152,16 @@ class Krakenfutures(Exchange): return order def _adjust_krakenfutures_order(self, order: CcxtOrder) -> CcxtOrder: - """Fix missing average price on filled orders by fetching trades. + """Fix missing average price and aggregate fees for filled orders. Kraken Futures' /orders/status endpoint does not include execution data, so CCXT sets price/average to the limitPrice (the order's limit, not the actual fill price). For closed/filled orders we ALWAYS fetch trades and compute VWAP because CCXT's average field is unreliable. + We also aggregate fees here to avoid a redundant get_trades_for_order call + from fee_detection_from_trades. + See: https://github.com/ccxt/ccxt/issues/27979 """ filled = self._safe_float(order.get("filled")) or 0.0 @@ -169,10 +172,23 @@ class Krakenfutures(Exchange): if trades: total_amount = sum(t["amount"] for t in trades) if total_amount: + # Compute VWAP order["average"] = sum(t["price"] * t["amount"] for t in trades) / total_amount trade_costs = [t["cost"] for t in trades if t.get("cost") is not None] if trade_costs: order["cost"] = sum(trade_costs) + # Aggregate fees to avoid redundant get_trades_for_order call + total_fee = sum( + t["fee"]["cost"] + for t in trades + if t.get("fee") and t["fee"].get("cost") is not None + ) + if total_fee: + order["fee"] = { + "cost": total_fee, + "currency": self.get_pair_quote_currency(order["symbol"]), + "rate": None, + } return order def get_trades_for_order(