filled in liq formula class with what needs to be done

This commit is contained in:
Sam Germain 2021-07-30 17:13:34 -06:00
parent 797d7e5ce6
commit 5312d044a0
3 changed files with 85 additions and 0 deletions

View File

@ -1,6 +1,8 @@
# flake8: noqa: F401 # flake8: noqa: F401
from freqtrade.enums.backteststate import BacktestState from freqtrade.enums.backteststate import BacktestState
from freqtrade.enums.interestmode import InterestMode from freqtrade.enums.interestmode import InterestMode
from freqtrade.enums.leveragemode import LeverageMode
from freqtrade.enums.liqformula import LiqFormula
from freqtrade.enums.rpcmessagetype import RPCMessageType from freqtrade.enums.rpcmessagetype import RPCMessageType
from freqtrade.enums.runmode import NON_UTIL_MODES, OPTIMIZE_MODES, TRADING_MODES, RunMode from freqtrade.enums.runmode import NON_UTIL_MODES, OPTIMIZE_MODES, TRADING_MODES, RunMode
from freqtrade.enums.selltype import SellType from freqtrade.enums.selltype import SellType

View File

@ -0,0 +1,11 @@
from enum import Enum
class LeverageMode(Enum):
"""
Enum to distinguish between cross margin, isolated margin, and futures
"""
CROSS = "cross"
ISOLATED = "isolated"
CROSS_FUTURES = "cross_futures"
ISOLATED_FUTURES = "cross_futures"

View File

@ -0,0 +1,72 @@
# from decimal import Decimal
from enum import Enum
# from math import ceil
from typing import Optional
from freqtrade.enums import LeverageMode
from freqtrade.exceptions import OperationalException
class LiqFormula(Enum):
"""Equations to calculate liquidation price"""
BINANCE = "BINANCE"
KRAKEN = "KRAKEN"
FTX = "FTX"
def __exception(self, leverage_mode: LeverageMode, freq_specific: Optional[bool] = True):
"""
Raises an exception if exchange used doesn't support desired leverage mode
:param leverage_mode: cross, isolated, cross_futures or isolated_futures
:param freq_specific:
False if the exchange does not support this leverage mode
True if only freqtrade doesn't support it
"""
if freq_specific:
raise OperationalException(
f"Freqtrade does not support {leverage_mode.value} on {self.name}")
else:
raise OperationalException(f"{self.name} does not support {leverage_mode.value}")
def __call__(self, **k):
leverage_mode: LeverageMode = k.leverage_mode
# * Cross Margin
if leverage_mode == LeverageMode.CROSS:
if self.name == "BINANCE":
# TODO: perform a calculation based on this formula
# https://www.binance.com/en/support/faq/f6b010588e55413aa58b7d63ee0125ed
self.__exception(leverage_mode)
elif self.name == "KRAKEN":
# TODO: perform a calculation based on this formula
# https://support.kraken.com/hc/en-us/articles/203325763-Margin-Call-Level-and-Margin-Liquidation-Level
self.__exception(leverage_mode)
elif self.name == "FTX":
self.__exception(leverage_mode)
# * Isolated Margin
elif leverage_mode == LeverageMode.ISOLATED:
if self.name == "KRAKEN": # Kraken doesn't have isolated margin
self.__exception(leverage_mode, False)
else:
self.__exception(leverage_mode)
# * Cross Futures
elif leverage_mode == LeverageMode.CROSS_FUTURES:
if self.name == "BINANCE":
# TODO: perform a calculation based on this formula
# https://www.binance.com/en/support/faq/b3c689c1f50a44cabb3a84e663b81d93
self.__exception(leverage_mode)
else:
self.__exception(leverage_mode)
# * Isolated Futures
elif leverage_mode == LeverageMode.ISOLATED_FUTURES:
if self.name == "BINANCE":
# TODO: perform a calculation based on this formula
# https://www.binance.com/en/support/faq/b3c689c1f50a44cabb3a84e663b81d93
self.__exception(leverage_mode)
elif self.name == "KRAKEN": # Kraken doesn't have isolated margin
self.__exception(leverage_mode, False)
else:
self.__exception(leverage_mode)