From 271fc6b58558f70099f87472b166d2167b5e866d Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 2 Dec 2025 21:11:28 +0100 Subject: [PATCH] feat: don't fill up missing funding-fees after merge --- freqtrade/exchange/exchange.py | 12 ++++++++++-- tests/exchange/test_exchange.py | 9 +++++---- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 717844db7..e71e374a1 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -3808,8 +3808,16 @@ class Exchange: combined = mark_rates.merge( funding_rates, on="date", how="left", suffixes=["_mark", "_fund"] ) - combined["open_fund"] = combined["open_fund"].fillna(futures_funding_rate) - return combined[relevant_cols] + # Fill only leading missing funding rates so gaps stay untouched + first_valid_idx = combined["open_fund"].first_valid_index() + if first_valid_idx is None: + combined["open_fund"] = futures_funding_rate + else: + is_leading_na = (combined.index <= first_valid_idx) & combined[ + "open_fund" + ].isna() + combined.loc[is_leading_na, "open_fund"] = futures_funding_rate + return combined[relevant_cols].dropna() def calculate_funding_fees( self, diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 8d7e0b0d8..4daeb1855 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -5350,11 +5350,12 @@ def test_combine_funding_and_mark( df = exchange.combine_funding_and_mark(funding_rates, mark_rates, futures_funding_rate) if futures_funding_rate is not None: - assert len(df) == 3 + assert len(df) == 2 assert df.iloc[0]["open_fund"] == funding_rate - assert df.iloc[1]["open_fund"] == futures_funding_rate - assert df.iloc[2]["open_fund"] == funding_rate - assert df["date"].to_list() == [prior2_date, prior_date, trade_date] + # assert df.iloc[1]["open_fund"] == futures_funding_rate + assert df.iloc[-1]["open_fund"] == funding_rate + # Mid-candle is dropped ... + assert df["date"].to_list() == [prior2_date, trade_date] else: assert len(df) == 2 assert df["date"].to_list() == [prior2_date, trade_date]