Add test for "combine_funding_and_mark", fix bug
This commit is contained in:
parent
2df42a3035
commit
0d388b561b
@ -2437,9 +2437,11 @@ class Exchange:
|
|||||||
|
|
||||||
else:
|
else:
|
||||||
# Fill up missing funding_rate candles with fallback value
|
# Fill up missing funding_rate candles with fallback value
|
||||||
return mark_rates.merge(
|
combined = mark_rates.merge(
|
||||||
funding_rates, on='date', how="outer", suffixes=["_mark", "_fund"]
|
funding_rates, on='date', how="outer", suffixes=["_mark", "_fund"]
|
||||||
)['open_fund'].fillna(futures_funding_rate)
|
)
|
||||||
|
combined['open_fund'] = combined['open_fund'].fillna(futures_funding_rate)
|
||||||
|
return combined
|
||||||
|
|
||||||
def calculate_funding_fees(
|
def calculate_funding_fees(
|
||||||
self,
|
self,
|
||||||
|
@ -3912,6 +3912,70 @@ def test_calculate_funding_fees(
|
|||||||
) == kraken_fee
|
) == kraken_fee
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
'mark_price,funding_rate,futures_funding_rate', [
|
||||||
|
(1000, 0.001, None),
|
||||||
|
(1000, 0.001, 0.01),
|
||||||
|
(1000, 0.001, 0.0),
|
||||||
|
(1000, 0.001, -0.01),
|
||||||
|
])
|
||||||
|
def test_combine_funding_and_mark(
|
||||||
|
default_conf,
|
||||||
|
mocker,
|
||||||
|
funding_rate,
|
||||||
|
mark_price,
|
||||||
|
futures_funding_rate,
|
||||||
|
):
|
||||||
|
exchange = get_patched_exchange(mocker, default_conf)
|
||||||
|
prior2_date = timeframe_to_prev_date('1h', datetime.now(timezone.utc) - timedelta(hours=2))
|
||||||
|
prior_date = timeframe_to_prev_date('1h', datetime.now(timezone.utc) - timedelta(hours=1))
|
||||||
|
trade_date = timeframe_to_prev_date('1h', datetime.now(timezone.utc))
|
||||||
|
funding_rates = DataFrame([
|
||||||
|
{'date': prior2_date, 'open': funding_rate},
|
||||||
|
{'date': prior_date, 'open': funding_rate},
|
||||||
|
{'date': trade_date, 'open': funding_rate},
|
||||||
|
])
|
||||||
|
mark_rates = DataFrame([
|
||||||
|
{'date': prior2_date, 'open': mark_price},
|
||||||
|
{'date': prior_date, 'open': mark_price},
|
||||||
|
{'date': trade_date, 'open': mark_price},
|
||||||
|
])
|
||||||
|
|
||||||
|
df = exchange.combine_funding_and_mark(funding_rates, mark_rates, futures_funding_rate)
|
||||||
|
assert 'open_mark' in df.columns
|
||||||
|
assert 'open_fund' in df.columns
|
||||||
|
assert len(df) == 3
|
||||||
|
|
||||||
|
funding_rates = DataFrame([
|
||||||
|
{'date': trade_date, 'open': funding_rate},
|
||||||
|
])
|
||||||
|
mark_rates = DataFrame([
|
||||||
|
{'date': prior2_date, 'open': mark_price},
|
||||||
|
{'date': prior_date, 'open': mark_price},
|
||||||
|
{'date': trade_date, 'open': mark_price},
|
||||||
|
])
|
||||||
|
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 df.iloc[0]['open_fund'] == futures_funding_rate
|
||||||
|
assert df.iloc[1]['open_fund'] == futures_funding_rate
|
||||||
|
assert df.iloc[2]['open_fund'] == funding_rate
|
||||||
|
else:
|
||||||
|
assert len(df) == 1
|
||||||
|
|
||||||
|
# Empty funding rates
|
||||||
|
funding_rates = DataFrame([], columns=['date', 'open'])
|
||||||
|
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 df.iloc[0]['open_fund'] == futures_funding_rate
|
||||||
|
assert df.iloc[1]['open_fund'] == futures_funding_rate
|
||||||
|
assert df.iloc[2]['open_fund'] == futures_funding_rate
|
||||||
|
else:
|
||||||
|
assert len(df) == 0
|
||||||
|
|
||||||
|
|
||||||
def test_get_or_calculate_liquidation_price(mocker, default_conf):
|
def test_get_or_calculate_liquidation_price(mocker, default_conf):
|
||||||
|
|
||||||
api_mock = MagicMock()
|
api_mock = MagicMock()
|
||||||
|
Loading…
Reference in New Issue
Block a user