Use FtPrecise in interest calculation

This commit is contained in:
Matthias 2022-08-10 20:56:04 +02:00
parent da253f12fe
commit 902afc2f02
3 changed files with 18 additions and 18 deletions

View File

@ -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")

View File

@ -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)

View File

@ -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}]