Test for short exchange.stoploss exchange.stoploss_adjust
This commit is contained in:
		| @@ -55,7 +55,10 @@ class Binance(Exchange): | ||||
|         :param side: "buy" or "sell" | ||||
|         """ | ||||
|         # Limit price threshold: As limit price should always be below stop-price | ||||
|         limit_price_pct = order_types.get('stoploss_on_exchange_limit_ratio', 0.99) | ||||
|         limit_price_pct = order_types.get( | ||||
|             'stoploss_on_exchange_limit_ratio', | ||||
|             0.99 if side == 'sell' else 1.01 | ||||
|         ) | ||||
|         rate = stop_price * limit_price_pct | ||||
|  | ||||
|         ordertype = "stop_loss_limit" | ||||
|   | ||||
| @@ -624,6 +624,7 @@ class Exchange: | ||||
|  | ||||
|     def _apply_leverage_to_stake_amount(self, stake_amount: float, leverage: float): | ||||
|         """ | ||||
|         #TODO-lev: Find out how this works on Kraken and FTX | ||||
|         # * Should be implemented by child classes if leverage affects the stake_amount | ||||
|         Takes the minimum stake amount for a pair with no leverage and returns the minimum | ||||
|         stake amount when leverage is considered | ||||
|   | ||||
| @@ -57,7 +57,10 @@ class Ftx(Exchange): | ||||
|  | ||||
|         Limit orders are defined by having orderPrice set, otherwise a market order is used. | ||||
|         """ | ||||
|         limit_price_pct = order_types.get('stoploss_on_exchange_limit_ratio', 0.99) | ||||
|         limit_price_pct = order_types.get( | ||||
|             'stoploss_on_exchange_limit_ratio', | ||||
|             0.99 if side == "sell" else 1.01 | ||||
|         ) | ||||
|         limit_rate = stop_price * limit_price_pct | ||||
|  | ||||
|         ordertype = "stop" | ||||
| @@ -164,10 +167,6 @@ class Ftx(Exchange): | ||||
|             return safe_value_fallback2(order, order, 'id_stop', 'id') | ||||
|         return order['id'] | ||||
|  | ||||
|     def _apply_leverage_to_stake_amount(self, stake_amount: float, leverage: float): | ||||
|         # TODO-lev: implement | ||||
|         return stake_amount | ||||
|  | ||||
|     def fill_leverage_brackets(self): | ||||
|         """ | ||||
|             FTX leverage is static across the account, and doesn't change from pair to pair, | ||||
|   | ||||
| @@ -9,12 +9,22 @@ from tests.conftest import get_patched_exchange | ||||
| from tests.exchange.test_exchange import ccxt_exceptionhandlers | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('limitratio,expected', [ | ||||
|     (None, 220 * 0.99), | ||||
|     (0.99, 220 * 0.99), | ||||
|     (0.98, 220 * 0.98), | ||||
| @pytest.mark.parametrize('limitratio,exchangelimitratio,expected,side', [ | ||||
|     (None, 1.05, 220 * 0.99, "sell"), | ||||
|     (0.99, 1.05, 220 * 0.99, "sell"), | ||||
|     (0.98, 1.05, 220 * 0.98, "sell"), | ||||
|     (None, 0.95, 220 * 1.01, "buy"), | ||||
|     (1.01, 0.95, 220 * 1.01, "buy"), | ||||
|     (1.02, 0.95, 220 * 1.02, "buy"), | ||||
| ]) | ||||
| def test_stoploss_order_binance(default_conf, mocker, limitratio, expected): | ||||
| def test_stoploss_order_binance( | ||||
|     default_conf, | ||||
|     mocker, | ||||
|     limitratio, | ||||
|     exchangelimitratio, | ||||
|     expected, | ||||
|     side | ||||
| ): | ||||
|     api_mock = MagicMock() | ||||
|     order_id = 'test_prod_buy_{}'.format(randint(0, 10 ** 6)) | ||||
|     order_type = 'stop_loss_limit' | ||||
| @@ -32,20 +42,25 @@ def test_stoploss_order_binance(default_conf, mocker, limitratio, expected): | ||||
|     exchange = get_patched_exchange(mocker, default_conf, api_mock, 'binance') | ||||
|  | ||||
|     with pytest.raises(OperationalException): | ||||
|         order = exchange.stoploss(pair='ETH/BTC', amount=1, stop_price=190, side="sell", | ||||
|                                   order_types={'stoploss_on_exchange_limit_ratio': 1.05}) | ||||
|         order = exchange.stoploss( | ||||
|             pair='ETH/BTC', | ||||
|             amount=1, | ||||
|             stop_price=190, | ||||
|             side=side, | ||||
|             order_types={'stoploss_on_exchange_limit_ratio': exchangelimitratio} | ||||
|         ) | ||||
|  | ||||
|     api_mock.create_order.reset_mock() | ||||
|     order_types = {} if limitratio is None else {'stoploss_on_exchange_limit_ratio': limitratio} | ||||
|     order = exchange.stoploss(pair='ETH/BTC', amount=1, stop_price=220, | ||||
|                               order_types=order_types, side="sell") | ||||
|                               order_types=order_types, side=side) | ||||
|  | ||||
|     assert 'id' in order | ||||
|     assert 'info' in order | ||||
|     assert order['id'] == order_id | ||||
|     assert api_mock.create_order.call_args_list[0][1]['symbol'] == 'ETH/BTC' | ||||
|     assert api_mock.create_order.call_args_list[0][1]['type'] == order_type | ||||
|     assert api_mock.create_order.call_args_list[0][1]['side'] == 'sell' | ||||
|     assert api_mock.create_order.call_args_list[0][1]['side'] == side | ||||
|     assert api_mock.create_order.call_args_list[0][1]['amount'] == 1 | ||||
|     # Price should be 1% below stopprice | ||||
|     assert api_mock.create_order.call_args_list[0][1]['price'] == expected | ||||
| @@ -55,17 +70,17 @@ def test_stoploss_order_binance(default_conf, mocker, limitratio, expected): | ||||
|     with pytest.raises(DependencyException): | ||||
|         api_mock.create_order = MagicMock(side_effect=ccxt.InsufficientFunds("0 balance")) | ||||
|         exchange = get_patched_exchange(mocker, default_conf, api_mock, 'binance') | ||||
|         exchange.stoploss(pair='ETH/BTC', amount=1, stop_price=220, order_types={}, side="sell") | ||||
|         exchange.stoploss(pair='ETH/BTC', amount=1, stop_price=220, order_types={}, side=side) | ||||
|  | ||||
|     with pytest.raises(InvalidOrderException): | ||||
|         api_mock.create_order = MagicMock( | ||||
|             side_effect=ccxt.InvalidOrder("binance Order would trigger immediately.")) | ||||
|         exchange = get_patched_exchange(mocker, default_conf, api_mock, 'binance') | ||||
|         exchange.stoploss(pair='ETH/BTC', amount=1, stop_price=220, order_types={}, side="sell") | ||||
|         exchange.stoploss(pair='ETH/BTC', amount=1, stop_price=220, order_types={}, side=side) | ||||
|  | ||||
|     ccxt_exceptionhandlers(mocker, default_conf, api_mock, "binance", | ||||
|                            "stoploss", "create_order", retries=1, | ||||
|                            pair='ETH/BTC', amount=1, stop_price=220, order_types={}, side="sell") | ||||
|                            pair='ETH/BTC', amount=1, stop_price=220, order_types={}, side=side) | ||||
|  | ||||
|  | ||||
| def test_stoploss_order_dry_run_binance(default_conf, mocker): | ||||
| @@ -94,18 +109,22 @@ def test_stoploss_order_dry_run_binance(default_conf, mocker): | ||||
|     assert order['amount'] == 1 | ||||
|  | ||||
|  | ||||
| def test_stoploss_adjust_binance(mocker, default_conf): | ||||
| @pytest.mark.parametrize('sl1,sl2,sl3,side', [ | ||||
|     (1501, 1499, 1501, "sell"), | ||||
|     (1499, 1501, 1499, "buy") | ||||
| ]) | ||||
| def test_stoploss_adjust_binance(mocker, default_conf, sl1, sl2, sl3, side): | ||||
|     exchange = get_patched_exchange(mocker, default_conf, id='binance') | ||||
|     order = { | ||||
|         'type': 'stop_loss_limit', | ||||
|         'price': 1500, | ||||
|         'info': {'stopPrice': 1500}, | ||||
|     } | ||||
|     assert exchange.stoploss_adjust(1501, order, side="sell") | ||||
|     assert not exchange.stoploss_adjust(1499, order, side="sell") | ||||
|     assert exchange.stoploss_adjust(sl1, order, side=side) | ||||
|     assert not exchange.stoploss_adjust(sl2, order, side=side) | ||||
|     # Test with invalid order case | ||||
|     order['type'] = 'stop_loss' | ||||
|     assert not exchange.stoploss_adjust(1501, order, side="sell") | ||||
|     assert not exchange.stoploss_adjust(sl3, order, side=side) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('pair,nominal_value,max_lev', [ | ||||
|   | ||||
| @@ -16,7 +16,11 @@ STOPLOSS_ORDERTYPE = 'stop' | ||||
| # TODO-lev: All these stoploss tests with shorts | ||||
|  | ||||
|  | ||||
| def test_stoploss_order_ftx(default_conf, mocker): | ||||
| @pytest.mark.parametrize('order_price,exchangelimitratio,side', [ | ||||
|     (217.8, 1.05, "sell"), | ||||
|     (222.2, 0.95, "buy"), | ||||
| ]) | ||||
| def test_stoploss_order_ftx(default_conf, mocker, order_price, exchangelimitratio, side): | ||||
|     api_mock = MagicMock() | ||||
|     order_id = 'test_prod_buy_{}'.format(randint(0, 10 ** 6)) | ||||
|  | ||||
| @@ -34,12 +38,12 @@ def test_stoploss_order_ftx(default_conf, mocker): | ||||
|     exchange = get_patched_exchange(mocker, default_conf, api_mock, 'ftx') | ||||
|  | ||||
|     # stoploss_on_exchange_limit_ratio is irrelevant for ftx market orders | ||||
|     order = exchange.stoploss(pair='ETH/BTC', amount=1, stop_price=190, side="sell", | ||||
|                               order_types={'stoploss_on_exchange_limit_ratio': 1.05}) | ||||
|     order = exchange.stoploss(pair='ETH/BTC', amount=1, stop_price=190, side=side, | ||||
|                               order_types={'stoploss_on_exchange_limit_ratio': exchangelimitratio}) | ||||
|  | ||||
|     assert api_mock.create_order.call_args_list[0][1]['symbol'] == 'ETH/BTC' | ||||
|     assert api_mock.create_order.call_args_list[0][1]['type'] == STOPLOSS_ORDERTYPE | ||||
|     assert api_mock.create_order.call_args_list[0][1]['side'] == 'sell' | ||||
|     assert api_mock.create_order.call_args_list[0][1]['side'] == side | ||||
|     assert api_mock.create_order.call_args_list[0][1]['amount'] == 1 | ||||
|     assert 'orderPrice' not in api_mock.create_order.call_args_list[0][1]['params'] | ||||
|     assert 'stopPrice' in api_mock.create_order.call_args_list[0][1]['params'] | ||||
| @@ -49,51 +53,52 @@ def test_stoploss_order_ftx(default_conf, mocker): | ||||
|  | ||||
|     api_mock.create_order.reset_mock() | ||||
|  | ||||
|     order = exchange.stoploss(pair='ETH/BTC', amount=1, stop_price=220, order_types={}, side="sell") | ||||
|     order = exchange.stoploss(pair='ETH/BTC', amount=1, stop_price=220, order_types={}, side=side) | ||||
|  | ||||
|     assert 'id' in order | ||||
|     assert 'info' in order | ||||
|     assert order['id'] == order_id | ||||
|     assert api_mock.create_order.call_args_list[0][1]['symbol'] == 'ETH/BTC' | ||||
|     assert api_mock.create_order.call_args_list[0][1]['type'] == STOPLOSS_ORDERTYPE | ||||
|     assert api_mock.create_order.call_args_list[0][1]['side'] == 'sell' | ||||
|     assert api_mock.create_order.call_args_list[0][1]['side'] == side | ||||
|     assert api_mock.create_order.call_args_list[0][1]['amount'] == 1 | ||||
|     assert 'orderPrice' not in api_mock.create_order.call_args_list[0][1]['params'] | ||||
|     assert api_mock.create_order.call_args_list[0][1]['params']['stopPrice'] == 220 | ||||
|  | ||||
|     api_mock.create_order.reset_mock() | ||||
|     order = exchange.stoploss(pair='ETH/BTC', amount=1, stop_price=220, | ||||
|                               order_types={'stoploss': 'limit'}, side="sell") | ||||
|                               order_types={'stoploss': 'limit'}, side=side) | ||||
|  | ||||
|     assert 'id' in order | ||||
|     assert 'info' in order | ||||
|     assert order['id'] == order_id | ||||
|     assert api_mock.create_order.call_args_list[0][1]['symbol'] == 'ETH/BTC' | ||||
|     assert api_mock.create_order.call_args_list[0][1]['type'] == STOPLOSS_ORDERTYPE | ||||
|     assert api_mock.create_order.call_args_list[0][1]['side'] == 'sell' | ||||
|     assert api_mock.create_order.call_args_list[0][1]['side'] == side | ||||
|     assert api_mock.create_order.call_args_list[0][1]['amount'] == 1 | ||||
|     assert 'orderPrice' in api_mock.create_order.call_args_list[0][1]['params'] | ||||
|     assert api_mock.create_order.call_args_list[0][1]['params']['orderPrice'] == 217.8 | ||||
|     assert api_mock.create_order.call_args_list[0][1]['params']['orderPrice'] == order_price | ||||
|     assert api_mock.create_order.call_args_list[0][1]['params']['stopPrice'] == 220 | ||||
|  | ||||
|     # test exception handling | ||||
|     with pytest.raises(DependencyException): | ||||
|         api_mock.create_order = MagicMock(side_effect=ccxt.InsufficientFunds("0 balance")) | ||||
|         exchange = get_patched_exchange(mocker, default_conf, api_mock, 'ftx') | ||||
|         exchange.stoploss(pair='ETH/BTC', amount=1, stop_price=220, order_types={}, side="sell") | ||||
|         exchange.stoploss(pair='ETH/BTC', amount=1, stop_price=220, order_types={}, side=side) | ||||
|  | ||||
|     with pytest.raises(InvalidOrderException): | ||||
|         api_mock.create_order = MagicMock( | ||||
|             side_effect=ccxt.InvalidOrder("ftx Order would trigger immediately.")) | ||||
|         exchange = get_patched_exchange(mocker, default_conf, api_mock, 'ftx') | ||||
|         exchange.stoploss(pair='ETH/BTC', amount=1, stop_price=220, order_types={}, side="sell") | ||||
|         exchange.stoploss(pair='ETH/BTC', amount=1, stop_price=220, order_types={}, side=side) | ||||
|  | ||||
|     ccxt_exceptionhandlers(mocker, default_conf, api_mock, "ftx", | ||||
|                            "stoploss", "create_order", retries=1, | ||||
|                            pair='ETH/BTC', amount=1, stop_price=220, order_types={}, side="sell") | ||||
|                            pair='ETH/BTC', amount=1, stop_price=220, order_types={}, side=side) | ||||
|  | ||||
|  | ||||
| def test_stoploss_order_dry_run_ftx(default_conf, mocker): | ||||
| @pytest.mark.parametrize('side', [("sell"), ("buy")]) | ||||
| def test_stoploss_order_dry_run_ftx(default_conf, mocker, side): | ||||
|     api_mock = MagicMock() | ||||
|     default_conf['dry_run'] = True | ||||
|     mocker.patch('freqtrade.exchange.Exchange.amount_to_precision', lambda s, x, y: y) | ||||
| @@ -103,7 +108,7 @@ def test_stoploss_order_dry_run_ftx(default_conf, mocker): | ||||
|  | ||||
|     api_mock.create_order.reset_mock() | ||||
|  | ||||
|     order = exchange.stoploss(pair='ETH/BTC', amount=1, stop_price=220, order_types={}, side="sell") | ||||
|     order = exchange.stoploss(pair='ETH/BTC', amount=1, stop_price=220, order_types={}, side=side) | ||||
|  | ||||
|     assert 'id' in order | ||||
|     assert 'info' in order | ||||
| @@ -114,20 +119,24 @@ def test_stoploss_order_dry_run_ftx(default_conf, mocker): | ||||
|     assert order['amount'] == 1 | ||||
|  | ||||
|  | ||||
| def test_stoploss_adjust_ftx(mocker, default_conf): | ||||
| @pytest.mark.parametrize('sl1,sl2,sl3,side', [ | ||||
|     (1501, 1499, 1501, "sell"), | ||||
|     (1499, 1501, 1499, "buy") | ||||
| ]) | ||||
| def test_stoploss_adjust_ftx(mocker, default_conf, sl1, sl2, sl3, side): | ||||
|     exchange = get_patched_exchange(mocker, default_conf, id='ftx') | ||||
|     order = { | ||||
|         'type': STOPLOSS_ORDERTYPE, | ||||
|         'price': 1500, | ||||
|     } | ||||
|     assert exchange.stoploss_adjust(1501, order, side="sell") | ||||
|     assert not exchange.stoploss_adjust(1499, order, side="sell") | ||||
|     assert exchange.stoploss_adjust(sl1, order, side=side) | ||||
|     assert not exchange.stoploss_adjust(sl2, order, side=side) | ||||
|     # Test with invalid order case ... | ||||
|     order['type'] = 'stop_loss_limit' | ||||
|     assert not exchange.stoploss_adjust(1501, order, side="sell") | ||||
|     assert not exchange.stoploss_adjust(sl3, order, side=side) | ||||
|  | ||||
|  | ||||
| def test_fetch_stoploss_order(default_conf, mocker, limit_sell_order): | ||||
| def test_fetch_stoploss_order(default_conf, mocker, limit_sell_order, limit_buy_order): | ||||
|     default_conf['dry_run'] = True | ||||
|     order = MagicMock() | ||||
|     order.myid = 123 | ||||
| @@ -160,6 +169,16 @@ def test_fetch_stoploss_order(default_conf, mocker, limit_sell_order): | ||||
|     assert resp['type'] == 'stop' | ||||
|     assert resp['status_stop'] == 'triggered' | ||||
|  | ||||
|     api_mock.fetch_order = MagicMock(return_value=limit_buy_order) | ||||
|  | ||||
|     resp = exchange.fetch_stoploss_order('X', 'TKN/BTC') | ||||
|     assert resp | ||||
|     assert api_mock.fetch_order.call_count == 1 | ||||
|     assert resp['id_stop'] == 'mocked_limit_buy' | ||||
|     assert resp['id'] == 'X' | ||||
|     assert resp['type'] == 'stop' | ||||
|     assert resp['status_stop'] == 'triggered' | ||||
|  | ||||
|     with pytest.raises(InvalidOrderException): | ||||
|         api_mock.fetch_orders = MagicMock(side_effect=ccxt.InvalidOrder("Order not found")) | ||||
|         exchange = get_patched_exchange(mocker, default_conf, api_mock, id='ftx') | ||||
|   | ||||
| @@ -164,11 +164,13 @@ def test_get_balances_prod(default_conf, mocker): | ||||
|     ccxt_exceptionhandlers(mocker, default_conf, api_mock, "kraken", | ||||
|                            "get_balances", "fetch_balance") | ||||
|  | ||||
| # TODO-lev: All these stoploss tests with shorts | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('ordertype', ['market', 'limit']) | ||||
| def test_stoploss_order_kraken(default_conf, mocker, ordertype): | ||||
| @pytest.mark.parametrize('side,limitratio,adjustedprice', [ | ||||
|     ("buy", 0.99, 217.8), | ||||
|     ("sell", 1.01, 222.2), | ||||
| ]) | ||||
| def test_stoploss_order_kraken(default_conf, mocker, ordertype, side, limitratio, adjustedprice): | ||||
|     api_mock = MagicMock() | ||||
|     order_id = 'test_prod_buy_{}'.format(randint(0, 10 ** 6)) | ||||
|  | ||||
| @@ -185,9 +187,9 @@ def test_stoploss_order_kraken(default_conf, mocker, ordertype): | ||||
|  | ||||
|     exchange = get_patched_exchange(mocker, default_conf, api_mock, 'kraken') | ||||
|  | ||||
|     order = exchange.stoploss(pair='ETH/BTC', amount=1, stop_price=220, side="sell", | ||||
|     order = exchange.stoploss(pair='ETH/BTC', amount=1, stop_price=220, side=side, | ||||
|                               order_types={'stoploss': ordertype, | ||||
|                                            'stoploss_on_exchange_limit_ratio': 0.99 | ||||
|                                            'stoploss_on_exchange_limit_ratio': limitratio | ||||
|                                            }) | ||||
|  | ||||
|     assert 'id' in order | ||||
| @@ -197,12 +199,12 @@ def test_stoploss_order_kraken(default_conf, mocker, ordertype): | ||||
|     if ordertype == 'limit': | ||||
|         assert api_mock.create_order.call_args_list[0][1]['type'] == STOPLOSS_LIMIT_ORDERTYPE | ||||
|         assert api_mock.create_order.call_args_list[0][1]['params'] == { | ||||
|             'trading_agreement': 'agree', 'price2': 217.8} | ||||
|             'trading_agreement': 'agree', 'price2': adjustedprice} | ||||
|     else: | ||||
|         assert api_mock.create_order.call_args_list[0][1]['type'] == STOPLOSS_ORDERTYPE | ||||
|         assert api_mock.create_order.call_args_list[0][1]['params'] == { | ||||
|             'trading_agreement': 'agree'} | ||||
|     assert api_mock.create_order.call_args_list[0][1]['side'] == 'sell' | ||||
|     assert api_mock.create_order.call_args_list[0][1]['side'] == side | ||||
|     assert api_mock.create_order.call_args_list[0][1]['amount'] == 1 | ||||
|     assert api_mock.create_order.call_args_list[0][1]['price'] == 220 | ||||
|  | ||||
| @@ -210,20 +212,21 @@ def test_stoploss_order_kraken(default_conf, mocker, ordertype): | ||||
|     with pytest.raises(DependencyException): | ||||
|         api_mock.create_order = MagicMock(side_effect=ccxt.InsufficientFunds("0 balance")) | ||||
|         exchange = get_patched_exchange(mocker, default_conf, api_mock, 'kraken') | ||||
|         exchange.stoploss(pair='ETH/BTC', amount=1, stop_price=220, order_types={}, side="sell") | ||||
|         exchange.stoploss(pair='ETH/BTC', amount=1, stop_price=220, order_types={}, side=side) | ||||
|  | ||||
|     with pytest.raises(InvalidOrderException): | ||||
|         api_mock.create_order = MagicMock( | ||||
|             side_effect=ccxt.InvalidOrder("kraken Order would trigger immediately.")) | ||||
|         exchange = get_patched_exchange(mocker, default_conf, api_mock, 'kraken') | ||||
|         exchange.stoploss(pair='ETH/BTC', amount=1, stop_price=220, order_types={}, side="sell") | ||||
|         exchange.stoploss(pair='ETH/BTC', amount=1, stop_price=220, order_types={}, side=side) | ||||
|  | ||||
|     ccxt_exceptionhandlers(mocker, default_conf, api_mock, "kraken", | ||||
|                            "stoploss", "create_order", retries=1, | ||||
|                            pair='ETH/BTC', amount=1, stop_price=220, order_types={}, side="sell") | ||||
|                            pair='ETH/BTC', amount=1, stop_price=220, order_types={}, side=side) | ||||
|  | ||||
|  | ||||
| def test_stoploss_order_dry_run_kraken(default_conf, mocker): | ||||
| @pytest.mark.parametrize('side', ['buy', 'sell']) | ||||
| def test_stoploss_order_dry_run_kraken(default_conf, mocker, side): | ||||
|     api_mock = MagicMock() | ||||
|     default_conf['dry_run'] = True | ||||
|     mocker.patch('freqtrade.exchange.Exchange.amount_to_precision', lambda s, x, y: y) | ||||
| @@ -233,7 +236,7 @@ def test_stoploss_order_dry_run_kraken(default_conf, mocker): | ||||
|  | ||||
|     api_mock.create_order.reset_mock() | ||||
|  | ||||
|     order = exchange.stoploss(pair='ETH/BTC', amount=1, stop_price=220, order_types={}, side="sell") | ||||
|     order = exchange.stoploss(pair='ETH/BTC', amount=1, stop_price=220, order_types={}, side=side) | ||||
|  | ||||
|     assert 'id' in order | ||||
|     assert 'info' in order | ||||
| @@ -244,17 +247,21 @@ def test_stoploss_order_dry_run_kraken(default_conf, mocker): | ||||
|     assert order['amount'] == 1 | ||||
|  | ||||
|  | ||||
| def test_stoploss_adjust_kraken(mocker, default_conf): | ||||
| @pytest.mark.parametrize('sl1,sl2,sl3,side', [ | ||||
|     (1501, 1499, 1501, "sell"), | ||||
|     (1499, 1501, 1499, "buy") | ||||
| ]) | ||||
| def test_stoploss_adjust_kraken(mocker, default_conf, sl1, sl2, sl3, side): | ||||
|     exchange = get_patched_exchange(mocker, default_conf, id='kraken') | ||||
|     order = { | ||||
|         'type': STOPLOSS_ORDERTYPE, | ||||
|         'price': 1500, | ||||
|     } | ||||
|     assert exchange.stoploss_adjust(1501, order, side="sell") | ||||
|     assert not exchange.stoploss_adjust(1499, order, side="sell") | ||||
|     assert exchange.stoploss_adjust(sl1, order, side=side) | ||||
|     assert not exchange.stoploss_adjust(sl2, order, side=side) | ||||
|     # Test with invalid order case ... | ||||
|     order['type'] = 'stop_loss_limit' | ||||
|     assert not exchange.stoploss_adjust(1501, order, side="sell") | ||||
|     assert not exchange.stoploss_adjust(sl3, order, side=side) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('pair,nominal_value,max_lev', [ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user