Merge branch 'freqtrade:develop' into develop
This commit is contained in:
@@ -43,10 +43,10 @@ The FreqAI strategy requires including the following lines of code in the standa
|
|||||||
|
|
||||||
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
|
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
|
||||||
|
|
||||||
# the model will return all labels created by user in `set_freqai_labels()`
|
# the model will return all labels created by user in `set_freqai_targets()`
|
||||||
# (& appended targets), an indication of whether or not the prediction should be accepted,
|
# (& appended targets), an indication of whether or not the prediction should be accepted,
|
||||||
# the target mean/std values for each of the labels created by user in
|
# the target mean/std values for each of the labels created by user in
|
||||||
# `feature_engineering_*` for each training period.
|
# `set_freqai_targets()` for each training period.
|
||||||
|
|
||||||
dataframe = self.freqai.start(dataframe, metadata, self)
|
dataframe = self.freqai.start(dataframe, metadata, self)
|
||||||
|
|
||||||
|
|||||||
@@ -125,6 +125,20 @@ class Okx(Exchange):
|
|||||||
params['posSide'] = self._get_posSide(side, reduceOnly)
|
params['posSide'] = self._get_posSide(side, reduceOnly)
|
||||||
return params
|
return params
|
||||||
|
|
||||||
|
def __fetch_leverage_already_set(self, pair: str, leverage: float, side: BuySell) -> bool:
|
||||||
|
try:
|
||||||
|
res_lev = self._api.fetch_leverage(symbol=pair, params={
|
||||||
|
"mgnMode": self.margin_mode.value,
|
||||||
|
"posSide": self._get_posSide(side, False),
|
||||||
|
})
|
||||||
|
self._log_exchange_response('get_leverage', res_lev)
|
||||||
|
already_set = all(float(x['lever']) == leverage for x in res_lev['data'])
|
||||||
|
return already_set
|
||||||
|
|
||||||
|
except ccxt.BaseError:
|
||||||
|
# Assume all errors as "not set yet"
|
||||||
|
return False
|
||||||
|
|
||||||
@retrier
|
@retrier
|
||||||
def _lev_prep(self, pair: str, leverage: float, side: BuySell, accept_fail: bool = False):
|
def _lev_prep(self, pair: str, leverage: float, side: BuySell, accept_fail: bool = False):
|
||||||
if self.trading_mode != TradingMode.SPOT and self.margin_mode is not None:
|
if self.trading_mode != TradingMode.SPOT and self.margin_mode is not None:
|
||||||
@@ -141,8 +155,11 @@ class Okx(Exchange):
|
|||||||
except ccxt.DDoSProtection as e:
|
except ccxt.DDoSProtection as e:
|
||||||
raise DDosProtection(e) from e
|
raise DDosProtection(e) from e
|
||||||
except (ccxt.NetworkError, ccxt.ExchangeError) as e:
|
except (ccxt.NetworkError, ccxt.ExchangeError) as e:
|
||||||
raise TemporaryError(
|
already_set = self.__fetch_leverage_already_set(pair, leverage, side)
|
||||||
f'Could not set leverage due to {e.__class__.__name__}. Message: {e}') from e
|
if not already_set:
|
||||||
|
raise TemporaryError(
|
||||||
|
f'Could not set leverage due to {e.__class__.__name__}. Message: {e}'
|
||||||
|
) from e
|
||||||
except ccxt.BaseError as e:
|
except ccxt.BaseError as e:
|
||||||
raise OperationalException(e) from e
|
raise OperationalException(e) from e
|
||||||
|
|
||||||
|
|||||||
@@ -232,7 +232,7 @@ class FreqaiExampleStrategy(IStrategy):
|
|||||||
|
|
||||||
# All indicators must be populated by feature_engineering_*() functions
|
# All indicators must be populated by feature_engineering_*() functions
|
||||||
|
|
||||||
# the model will return all labels created by user in `feature_engineering_*`
|
# the model will return all labels created by user in `set_freqai_targets()`
|
||||||
# (& appended targets), an indication of whether or not the prediction should be accepted,
|
# (& appended targets), an indication of whether or not the prediction should be accepted,
|
||||||
# the target mean/std values for each of the labels created by user in
|
# the target mean/std values for each of the labels created by user in
|
||||||
# `set_freqai_targets()` for each training period.
|
# `set_freqai_targets()` for each training period.
|
||||||
|
|||||||
@@ -499,7 +499,11 @@ def test__set_leverage_okx(mocker, default_conf):
|
|||||||
assert api_mock.set_leverage.call_args_list[0][1]['params'] == {
|
assert api_mock.set_leverage.call_args_list[0][1]['params'] == {
|
||||||
'mgnMode': 'isolated',
|
'mgnMode': 'isolated',
|
||||||
'posSide': 'net'}
|
'posSide': 'net'}
|
||||||
|
api_mock.set_leverage = MagicMock(side_effect=ccxt.NetworkError())
|
||||||
|
exchange._lev_prep('BTC/USDT:USDT', 3.2, 'buy')
|
||||||
|
api_mock.fetch_leverage.call_count == 1
|
||||||
|
|
||||||
|
api_mock.fetch_leverage = MagicMock(side_effect=ccxt.NetworkError())
|
||||||
ccxt_exceptionhandlers(
|
ccxt_exceptionhandlers(
|
||||||
mocker,
|
mocker,
|
||||||
default_conf,
|
default_conf,
|
||||||
@@ -592,3 +596,25 @@ def test_stoploss_adjust_okx(mocker, default_conf, sl1, sl2, sl3, side):
|
|||||||
}
|
}
|
||||||
assert exchange.stoploss_adjust(sl1, order, side=side)
|
assert exchange.stoploss_adjust(sl1, order, side=side)
|
||||||
assert not exchange.stoploss_adjust(sl2, order, side=side)
|
assert not exchange.stoploss_adjust(sl2, order, side=side)
|
||||||
|
|
||||||
|
|
||||||
|
def test_stoploss_cancel_okx(mocker, default_conf):
|
||||||
|
exchange = get_patched_exchange(mocker, default_conf, id='okx')
|
||||||
|
|
||||||
|
exchange.cancel_order = MagicMock()
|
||||||
|
|
||||||
|
exchange.cancel_stoploss_order('1234', 'ETH/USDT')
|
||||||
|
assert exchange.cancel_order.call_count == 1
|
||||||
|
assert exchange.cancel_order.call_args_list[0][1]['order_id'] == '1234'
|
||||||
|
assert exchange.cancel_order.call_args_list[0][1]['pair'] == 'ETH/USDT'
|
||||||
|
assert exchange.cancel_order.call_args_list[0][1]['params'] == {'stop': True}
|
||||||
|
|
||||||
|
|
||||||
|
def test__get_stop_params_okx(mocker, default_conf):
|
||||||
|
default_conf['trading_mode'] = 'futures'
|
||||||
|
default_conf['margin_mode'] = 'isolated'
|
||||||
|
exchange = get_patched_exchange(mocker, default_conf, id='okx')
|
||||||
|
params = exchange._get_stop_params('ETH/USDT:USDT', 1500, 'sell')
|
||||||
|
|
||||||
|
assert params['tdMode'] == 'isolated'
|
||||||
|
assert params['posSide'] == 'net'
|
||||||
|
|||||||
Reference in New Issue
Block a user