separated test_leverage into test_interest and test_liquidation_price, and paramaterized tests
This commit is contained in:
parent
a087d03db9
commit
fe5e00361e
@ -13,12 +13,7 @@ def liquidation_price(
|
|||||||
collateral: Optional[Collateral]
|
collateral: Optional[Collateral]
|
||||||
) -> Optional[float]:
|
) -> Optional[float]:
|
||||||
|
|
||||||
leverage_exchanges = [
|
if trading_mode == TradingMode.SPOT:
|
||||||
'binance',
|
|
||||||
'kraken',
|
|
||||||
'ftx'
|
|
||||||
]
|
|
||||||
if trading_mode == TradingMode.SPOT or exchange_name.lower() not in leverage_exchanges:
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
if not collateral:
|
if not collateral:
|
||||||
@ -34,7 +29,7 @@ def liquidation_price(
|
|||||||
elif exchange_name.lower() == "ftx":
|
elif exchange_name.lower() == "ftx":
|
||||||
return ftx(open_rate, is_short, leverage, trading_mode, collateral)
|
return ftx(open_rate, is_short, leverage, trading_mode, collateral)
|
||||||
raise OperationalException(
|
raise OperationalException(
|
||||||
f"liquidation_price is not yet implemented for {exchange_name}"
|
f"liquidation_price is not implemented for {exchange_name}"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,89 +0,0 @@
|
|||||||
# from decimal import Decimal
|
|
||||||
|
|
||||||
from freqtrade.enums import Collateral, TradingMode
|
|
||||||
from freqtrade.leverage import liquidation_price
|
|
||||||
|
|
||||||
|
|
||||||
# from freqtrade.exceptions import OperationalException
|
|
||||||
binance = "binance"
|
|
||||||
kraken = "kraken"
|
|
||||||
ftx = "ftx"
|
|
||||||
other = "bittrex"
|
|
||||||
|
|
||||||
|
|
||||||
def test_liquidation_price():
|
|
||||||
|
|
||||||
spot = TradingMode.SPOT
|
|
||||||
margin = TradingMode.MARGIN
|
|
||||||
futures = TradingMode.FUTURES
|
|
||||||
|
|
||||||
cross = Collateral.CROSS
|
|
||||||
isolated = Collateral.ISOLATED
|
|
||||||
|
|
||||||
# NONE
|
|
||||||
assert liquidation_price(exchange_name=other, trading_mode=spot) is None
|
|
||||||
assert liquidation_price(exchange_name=other, trading_mode=margin,
|
|
||||||
collateral=cross) is None
|
|
||||||
assert liquidation_price(exchange_name=other, trading_mode=margin,
|
|
||||||
collateral=isolated) is None
|
|
||||||
assert liquidation_price(
|
|
||||||
exchange_name=other, trading_mode=futures, collateral=cross) is None
|
|
||||||
assert liquidation_price(exchange_name=other, trading_mode=futures,
|
|
||||||
collateral=isolated) is None
|
|
||||||
|
|
||||||
# Binance
|
|
||||||
assert liquidation_price(exchange_name=binance, trading_mode=spot) is None
|
|
||||||
assert liquidation_price(exchange_name=binance, trading_mode=spot,
|
|
||||||
collateral=cross) is None
|
|
||||||
assert liquidation_price(exchange_name=binance, trading_mode=spot,
|
|
||||||
collateral=isolated) is None
|
|
||||||
# TODO-lev: Uncomment these assertions and make them real calculation tests
|
|
||||||
# TODO-lev: Replace 1.0 with real value
|
|
||||||
# assert liquidation_price(
|
|
||||||
# exchange_name=binance,
|
|
||||||
# trading_mode=margin,
|
|
||||||
# collateral=cross
|
|
||||||
# ) == 1.0
|
|
||||||
# assert liquidation_price(
|
|
||||||
# exchange_name=binance,
|
|
||||||
# trading_mode=margin,
|
|
||||||
# collateral=isolated
|
|
||||||
# ) == 1.0
|
|
||||||
# assert liquidation_price(
|
|
||||||
# exchange_name=binance,
|
|
||||||
# trading_mode=futures,
|
|
||||||
# collateral=cross
|
|
||||||
# ) == 1.0
|
|
||||||
|
|
||||||
# Binance supports isolated margin, but freqtrade likely won't for a while on Binance
|
|
||||||
# liquidation_price(exchange_name=binance, trading_mode=margin, collateral=isolated)
|
|
||||||
# assert exception thrown #TODO-lev: Check that exception is thrown
|
|
||||||
|
|
||||||
# Kraken
|
|
||||||
assert liquidation_price(exchange_name=kraken, trading_mode=spot) is None
|
|
||||||
assert liquidation_price(exchange_name=kraken, trading_mode=spot, collateral=cross) is None
|
|
||||||
assert liquidation_price(exchange_name=kraken, trading_mode=spot,
|
|
||||||
collateral=isolated) is None
|
|
||||||
# TODO-lev: Uncomment these assertions and make them real calculation tests
|
|
||||||
# assert liquidation_price(kraken, trading_mode=margin, collateral=cross) == 1.0
|
|
||||||
# assert liquidation_price(kraken, trading_mode=margin, collateral=isolated) == 1.0
|
|
||||||
|
|
||||||
# liquidation_price(kraken, trading_mode=futures, collateral=cross)
|
|
||||||
# assert exception thrown #TODO-lev: Check that exception is thrown
|
|
||||||
|
|
||||||
# liquidation_price(kraken, trading_mode=futures, collateral=isolated)
|
|
||||||
# assert exception thrown #TODO-lev: Check that exception is thrown
|
|
||||||
|
|
||||||
# FTX
|
|
||||||
assert liquidation_price(ftx, trading_mode=spot) is None
|
|
||||||
assert liquidation_price(ftx, trading_mode=spot, collateral=cross) is None
|
|
||||||
assert liquidation_price(ftx, trading_mode=spot, collateral=isolated) is None
|
|
||||||
# TODO-lev: Uncomment these assertions and make them real calculation tests
|
|
||||||
# assert liquidation_price(ftx, trading_mode=margin, collateral=cross) == 1.0
|
|
||||||
# assert liquidation_price(ftx, trading_mode=margin, collateral=isolated) == 1.0
|
|
||||||
|
|
||||||
# liquidation_price(ftx, trading_mode=futures, collateral=cross)
|
|
||||||
# assert exception thrown #TODO-lev: Check that exception is thrown
|
|
||||||
|
|
||||||
# liquidation_price(ftx, trading_mode=futures, collateral=isolated)
|
|
||||||
# assert exception thrown #TODO-lev: Check that exception is thrown
|
|
113
tests/leverage/test_liquidation_price.py
Normal file
113
tests/leverage/test_liquidation_price.py
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
import pytest
|
||||||
|
|
||||||
|
from freqtrade.enums import Collateral, TradingMode
|
||||||
|
from freqtrade.leverage import liquidation_price
|
||||||
|
|
||||||
|
|
||||||
|
# from freqtrade.exceptions import OperationalException
|
||||||
|
|
||||||
|
spot = TradingMode.SPOT
|
||||||
|
margin = TradingMode.MARGIN
|
||||||
|
futures = TradingMode.FUTURES
|
||||||
|
|
||||||
|
cross = Collateral.CROSS
|
||||||
|
isolated = Collateral.ISOLATED
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('exchange_name,open_rate,is_short,leverage,trading_mode,collateral', [
|
||||||
|
# Bittrex
|
||||||
|
('bittrex', "2.0", False, "3.0", spot, None),
|
||||||
|
('bittrex', "2.0", False, "1.0", spot, cross),
|
||||||
|
('bittrex', "2.0", True, "3.0", spot, isolated),
|
||||||
|
# Binance
|
||||||
|
('binance', "2.0", False, "3.0", spot, None),
|
||||||
|
('binance', "2.0", False, "1.0", spot, cross),
|
||||||
|
('binance', "2.0", True, "3.0", spot, isolated),
|
||||||
|
# Kraken
|
||||||
|
('kraken', "2.0", False, "3.0", spot, None),
|
||||||
|
('kraken', "2.0", True, "3.0", spot, cross),
|
||||||
|
('kraken', "2.0", False, "1.0", spot, isolated),
|
||||||
|
# FTX
|
||||||
|
('ftx', "2.0", True, "3.0", spot, None),
|
||||||
|
('ftx', "2.0", False, "3.0", spot, cross),
|
||||||
|
('ftx', "2.0", False, "3.0", spot, isolated),
|
||||||
|
])
|
||||||
|
def test_liquidation_price_is_none(
|
||||||
|
exchange_name,
|
||||||
|
open_rate,
|
||||||
|
is_short,
|
||||||
|
leverage,
|
||||||
|
trading_mode,
|
||||||
|
collateral
|
||||||
|
):
|
||||||
|
assert liquidation_price(
|
||||||
|
exchange_name,
|
||||||
|
open_rate,
|
||||||
|
is_short,
|
||||||
|
leverage,
|
||||||
|
trading_mode,
|
||||||
|
collateral
|
||||||
|
) is None
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('exchange_name,open_rate,is_short,leverage,trading_mode,collateral', [
|
||||||
|
# Bittrex
|
||||||
|
('bittrex', "2.0", False, "3.0", margin, cross),
|
||||||
|
('bittrex', "2.0", False, "3.0", margin, isolated),
|
||||||
|
('bittrex', "2.0", False, "3.0", futures, cross),
|
||||||
|
('bittrex', "2.0", False, "3.0", futures, isolated),
|
||||||
|
# Binance
|
||||||
|
# Binance supports isolated margin, but freqtrade likely won't for a while on Binance
|
||||||
|
('binance', "2.0", True, "3.0", margin, isolated),
|
||||||
|
# Kraken
|
||||||
|
('kraken', "2.0", False, "1.0", margin, isolated),
|
||||||
|
('kraken', "2.0", False, "1.0", futures, isolated),
|
||||||
|
# FTX
|
||||||
|
('ftx', "2.0", False, "3.0", margin, isolated),
|
||||||
|
('ftx', "2.0", False, "3.0", futures, isolated),
|
||||||
|
])
|
||||||
|
def test_liquidation_price_exception_thrown(
|
||||||
|
exchange_name,
|
||||||
|
open_rate,
|
||||||
|
is_short,
|
||||||
|
leverage,
|
||||||
|
trading_mode,
|
||||||
|
collateral,
|
||||||
|
result
|
||||||
|
):
|
||||||
|
# TODO-lev assert exception is thrown
|
||||||
|
return # Here to avoid indent error, remove when implemented
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
'exchange_name,open_rate,is_short,leverage,trading_mode,collateral,result', [
|
||||||
|
# Binance
|
||||||
|
('binance', "2.0", False, "1.0", margin, cross, 1.0),
|
||||||
|
('binance', "2.0", False, "1.0", futures, cross, 1.0),
|
||||||
|
('binance', "2.0", False, "1.0", futures, isolated, 1.0),
|
||||||
|
# Kraken
|
||||||
|
('kraken', "2.0", True, "3.0", margin, cross, 1.0),
|
||||||
|
('kraken', "2.0", True, "3.0", futures, cross, 1.0),
|
||||||
|
# FTX
|
||||||
|
('ftx', "2.0", False, "3.0", margin, cross, 1.0),
|
||||||
|
('ftx', "2.0", False, "3.0", futures, cross, 1.0),
|
||||||
|
]
|
||||||
|
)
|
||||||
|
def test_liquidation_price(
|
||||||
|
exchange_name,
|
||||||
|
open_rate,
|
||||||
|
is_short,
|
||||||
|
leverage,
|
||||||
|
trading_mode,
|
||||||
|
collateral,
|
||||||
|
result
|
||||||
|
):
|
||||||
|
# assert liquidation_price(
|
||||||
|
# exchange_name,
|
||||||
|
# open_rate,
|
||||||
|
# is_short,
|
||||||
|
# leverage,
|
||||||
|
# trading_mode,
|
||||||
|
# collateral
|
||||||
|
# ) == result
|
||||||
|
return # Here to avoid indent error
|
Loading…
Reference in New Issue
Block a user