Use FtPrecise in interest calculation
This commit is contained in:
parent
da253f12fe
commit
902afc2f02
@ -1,20 +1,20 @@
|
|||||||
from decimal import Decimal
|
|
||||||
from math import ceil
|
from math import ceil
|
||||||
|
|
||||||
from freqtrade.exceptions import OperationalException
|
from freqtrade.exceptions import OperationalException
|
||||||
|
from freqtrade.util import FtPrecise
|
||||||
|
|
||||||
|
|
||||||
one = Decimal(1.0)
|
one = FtPrecise(1.0)
|
||||||
four = Decimal(4.0)
|
four = FtPrecise(4.0)
|
||||||
twenty_four = Decimal(24.0)
|
twenty_four = FtPrecise(24.0)
|
||||||
|
|
||||||
|
|
||||||
def interest(
|
def interest(
|
||||||
exchange_name: str,
|
exchange_name: str,
|
||||||
borrowed: Decimal,
|
borrowed: FtPrecise,
|
||||||
rate: Decimal,
|
rate: FtPrecise,
|
||||||
hours: Decimal
|
hours: FtPrecise
|
||||||
) -> Decimal:
|
) -> FtPrecise:
|
||||||
"""
|
"""
|
||||||
Equation to calculate interest on margin trades
|
Equation to calculate interest on margin trades
|
||||||
|
|
||||||
@ -31,13 +31,13 @@ def interest(
|
|||||||
"""
|
"""
|
||||||
exchange_name = exchange_name.lower()
|
exchange_name = exchange_name.lower()
|
||||||
if exchange_name == "binance":
|
if exchange_name == "binance":
|
||||||
return borrowed * rate * ceil(hours) / twenty_four
|
return borrowed * rate * FtPrecise(ceil(hours)) / twenty_four
|
||||||
elif exchange_name == "kraken":
|
elif exchange_name == "kraken":
|
||||||
# Rounded based on https://kraken-fees-calculator.github.io/
|
# Rounded based on https://kraken-fees-calculator.github.io/
|
||||||
return borrowed * rate * (one + ceil(hours / four))
|
return borrowed * rate * (one + FtPrecise(ceil(hours / four)))
|
||||||
elif exchange_name == "ftx":
|
elif exchange_name == "ftx":
|
||||||
# As Explained under #Interest rates section in
|
# As Explained under #Interest rates section in
|
||||||
# https://help.ftx.com/hc/en-us/articles/360053007671-Spot-Margin-Trading-Explainer
|
# https://help.ftx.com/hc/en-us/articles/360053007671-Spot-Margin-Trading-Explainer
|
||||||
return borrowed * rate * ceil(hours) / twenty_four
|
return borrowed * rate * FtPrecise(ceil(hours)) / twenty_four
|
||||||
else:
|
else:
|
||||||
raise OperationalException(f"Leverage not available on {exchange_name} with freqtrade")
|
raise OperationalException(f"Leverage not available on {exchange_name} with freqtrade")
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
from decimal import Decimal
|
|
||||||
from math import isclose
|
from math import isclose
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from freqtrade.leverage import interest
|
from freqtrade.leverage import interest
|
||||||
|
from freqtrade.util import FtPrecise
|
||||||
|
|
||||||
|
|
||||||
ten_mins = Decimal(1 / 6)
|
ten_mins = FtPrecise(1 / 6)
|
||||||
five_hours = Decimal(5.0)
|
five_hours = FtPrecise(5.0)
|
||||||
twentyfive_hours = Decimal(25.0)
|
twentyfive_hours = FtPrecise(25.0)
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize('exchange,interest_rate,hours,expected', [
|
@pytest.mark.parametrize('exchange,interest_rate,hours,expected', [
|
||||||
@ -28,11 +28,11 @@ twentyfive_hours = Decimal(25.0)
|
|||||||
('ftx', 0.00025, twentyfive_hours, 0.015625),
|
('ftx', 0.00025, twentyfive_hours, 0.015625),
|
||||||
])
|
])
|
||||||
def test_interest(exchange, interest_rate, hours, expected):
|
def test_interest(exchange, interest_rate, hours, expected):
|
||||||
borrowed = Decimal(60.0)
|
borrowed = FtPrecise(60.0)
|
||||||
|
|
||||||
assert isclose(interest(
|
assert isclose(interest(
|
||||||
exchange_name=exchange,
|
exchange_name=exchange,
|
||||||
borrowed=borrowed,
|
borrowed=borrowed,
|
||||||
rate=Decimal(interest_rate),
|
rate=FtPrecise(interest_rate),
|
||||||
hours=hours
|
hours=hours
|
||||||
), expected)
|
), expected)
|
||||||
|
@ -892,7 +892,7 @@ def test_api_performance(botclient, fee):
|
|||||||
assert_response(rc)
|
assert_response(rc)
|
||||||
assert len(rc.json()) == 2
|
assert len(rc.json()) == 2
|
||||||
assert rc.json() == [{'count': 1, 'pair': 'LTC/ETH', 'profit': 7.61, 'profit_pct': 7.61,
|
assert rc.json() == [{'count': 1, 'pair': 'LTC/ETH', 'profit': 7.61, 'profit_pct': 7.61,
|
||||||
'profit_ratio': 0.07609203, 'profit_abs': 0.01872279},
|
'profit_ratio': 0.07609203, 'profit_abs': 0.0187228},
|
||||||
{'count': 1, 'pair': 'XRP/ETH', 'profit': -5.57, 'profit_pct': -5.57,
|
{'count': 1, 'pair': 'XRP/ETH', 'profit': -5.57, 'profit_pct': -5.57,
|
||||||
'profit_ratio': -0.05570419, 'profit_abs': -0.1150375}]
|
'profit_ratio': -0.05570419, 'profit_abs': -0.1150375}]
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user