chore: Update bybit dry-liquidation calculation

the result remains the same - but the calculation now matches
the bybit documentation better.
This commit is contained in:
Matthias
2025-03-08 17:29:55 +01:00
parent cd971cff4f
commit 4a7140c05d
+11 -7
View File
@@ -166,15 +166,16 @@ class Bybit(Exchange):
PERPETUAL: PERPETUAL:
bybit: bybit:
https://www.bybithelp.com/HelpCenterKnowledge/bybitHC_Article?language=en_US&id=000001067 https://www.bybithelp.com/HelpCenterKnowledge/bybitHC_Article?language=en_US&id=000001067
https://www.bybit.com/en/help-center/article/Liquidation-Price-Calculation-under-Isolated-Mode-Unified-Trading-Account#b
Long: Long:
Liquidation Price = ( Liquidation Price = (
Entry Price * (1 - Initial Margin Rate + Maintenance Margin Rate) Entry Price - [(Initial Margin - Maintenance Margin)/Contract Quantity]
- Extra Margin Added/ Contract) - (Extra Margin Added/Contract Quantity))
Short: Short:
Liquidation Price = ( Liquidation Price = (
Entry Price * (1 + Initial Margin Rate - Maintenance Margin Rate) Entry Price + [(Initial Margin - Maintenance Margin)/Contract Quantity]
+ Extra Margin Added/ Contract) + (Extra Margin Added/Contract Quantity))
Implementation Note: Extra margin is currently not used. Implementation Note: Extra margin is currently not used.
@@ -196,13 +197,16 @@ class Bybit(Exchange):
if self.trading_mode == TradingMode.FUTURES and self.margin_mode == MarginMode.ISOLATED: if self.trading_mode == TradingMode.FUTURES and self.margin_mode == MarginMode.ISOLATED:
if market["inverse"]: if market["inverse"]:
raise OperationalException("Freqtrade does not yet support inverse contracts") raise OperationalException("Freqtrade does not yet support inverse contracts")
initial_margin_rate = 1 / leverage position_value = amount * open_rate
initial_margin = position_value / leverage
maintenance_margin = position_value * mm_ratio
margin_diff_per_contract = (initial_margin - maintenance_margin) / amount
# See docstring - ignores extra margin! # See docstring - ignores extra margin!
if is_short: if is_short:
return open_rate * (1 + initial_margin_rate - mm_ratio) return open_rate + margin_diff_per_contract
else: else:
return open_rate * (1 - initial_margin_rate + mm_ratio) return open_rate - margin_diff_per_contract
else: else:
raise OperationalException( raise OperationalException(