From 5312d044a06a8cea59727449ae43bee9e92aff9a Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Fri, 30 Jul 2021 17:13:34 -0600 Subject: [PATCH] filled in liq formula class with what needs to be done --- freqtrade/enums/__init__.py | 2 + freqtrade/enums/leveragemode.py | 11 +++++ freqtrade/enums/liqformula.py | 72 +++++++++++++++++++++++++++++++++ 3 files changed, 85 insertions(+) create mode 100644 freqtrade/enums/leveragemode.py create mode 100644 freqtrade/enums/liqformula.py diff --git a/freqtrade/enums/__init__.py b/freqtrade/enums/__init__.py index 6099f7003..df1bc1dc8 100644 --- a/freqtrade/enums/__init__.py +++ b/freqtrade/enums/__init__.py @@ -1,6 +1,8 @@ # flake8: noqa: F401 from freqtrade.enums.backteststate import BacktestState 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.runmode import NON_UTIL_MODES, OPTIMIZE_MODES, TRADING_MODES, RunMode from freqtrade.enums.selltype import SellType diff --git a/freqtrade/enums/leveragemode.py b/freqtrade/enums/leveragemode.py new file mode 100644 index 000000000..c77251c0d --- /dev/null +++ b/freqtrade/enums/leveragemode.py @@ -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" diff --git a/freqtrade/enums/liqformula.py b/freqtrade/enums/liqformula.py new file mode 100644 index 000000000..fb55bf8d3 --- /dev/null +++ b/freqtrade/enums/liqformula.py @@ -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)