diff --git a/freqtrade/exchange/binance.py b/freqtrade/exchange/binance.py index 21baa9124..ef5c65f5b 100644 --- a/freqtrade/exchange/binance.py +++ b/freqtrade/exchange/binance.py @@ -93,7 +93,7 @@ class Binance(Exchange): rate = self.price_to_precision(pair, rate) - self._lev_prep(pair, leverage) + self._lev_prep(pair, leverage, side) order = self._api.create_order( symbol=pair, type=ordertype, diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index a284780ea..2b35417d3 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -877,7 +877,12 @@ class Exchange: # Order handling - def _lev_prep(self, pair: str, leverage: float): + def _lev_prep( + self, + pair: str, + leverage: float, + side: str # buy or sell + ): if self.trading_mode != TradingMode.SPOT: self.set_margin_mode(pair, self.margin_mode) self._set_leverage(leverage, pair) @@ -923,7 +928,7 @@ class Exchange: rate_for_order = self.price_to_precision(pair, rate) if needs_price else None if not reduceOnly: - self._lev_prep(pair, leverage) + self._lev_prep(pair, leverage, side) order = self._api.create_order( pair, @@ -1853,7 +1858,7 @@ class Exchange: return try: - self._api.set_leverage(symbol=pair, leverage=round(leverage)) + self._api.set_leverage(symbol=pair, leverage=leverage) except ccxt.DDoSProtection as e: raise DDosProtection(e) from e except (ccxt.NetworkError, ccxt.ExchangeError) as e: diff --git a/freqtrade/exchange/ftx.py b/freqtrade/exchange/ftx.py index 143be73ac..be2e19c66 100644 --- a/freqtrade/exchange/ftx.py +++ b/freqtrade/exchange/ftx.py @@ -76,7 +76,7 @@ class Ftx(Exchange): params['stopPrice'] = stop_price amount = self.amount_to_precision(pair, amount) - self._lev_prep(pair, leverage) + self._lev_prep(pair, leverage, side) order = self._api.create_order(symbol=pair, type=ordertype, side=side, amount=amount, params=params) self._log_exchange_response('create_stoploss_order', order) diff --git a/freqtrade/exchange/okex.py b/freqtrade/exchange/okex.py index b6252ed1e..3c774cc9a 100644 --- a/freqtrade/exchange/okex.py +++ b/freqtrade/exchange/okex.py @@ -3,7 +3,7 @@ from typing import Dict, List, Tuple from freqtrade.enums import MarginMode, TradingMode from freqtrade.exchange import Exchange - +from freqtrade.exceptions import OperationalException logger = logging.getLogger(__name__) @@ -26,3 +26,22 @@ class Okex(Exchange): # (TradingMode.FUTURES, MarginMode.CROSS), # (TradingMode.FUTURES, MarginMode.ISOLATED) ] + + def _lev_prep( + self, + pair: str, + leverage: float, + side: str # buy or sell + ): + if self.trading_mode != TradingMode.SPOT: + if self.margin_mode is None: + raise OperationalException( + f"{self.name}.margin_mode must be set for {self.trading_mode.value}" + ) + self._api.set_leverage( + leverage, + pair, + params={ + "mgnMode": self.margin_mode.value, + "posSide": "long" if side == "buy" else "short", + })