From 9f53e9f5dde06f2edcd9eb8fa9399daaa3e96f8b Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 1 Sep 2019 09:08:35 +0200 Subject: [PATCH] Raise InvalidOrder error when stoploss-creation fails --- freqtrade/exchange/binance.py | 7 +++++-- freqtrade/freqtradebot.py | 6 ++++++ freqtrade/tests/exchange/test_binance.py | 8 +++++--- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/freqtrade/exchange/binance.py b/freqtrade/exchange/binance.py index 5834f26cd..c3021c50b 100644 --- a/freqtrade/exchange/binance.py +++ b/freqtrade/exchange/binance.py @@ -4,7 +4,8 @@ from typing import Dict import ccxt -from freqtrade import DependencyException, OperationalException, TemporaryError +from freqtrade import (DependencyException, InvalidOrderException, + OperationalException, TemporaryError) from freqtrade.exchange import Exchange logger = logging.getLogger(__name__) @@ -69,7 +70,9 @@ class Binance(Exchange): f'Tried to sell amount {amount} at rate {rate}.' f'Message: {e}') from e except ccxt.InvalidOrder as e: - raise DependencyException( + # Errors: + # `binance Order would trigger immediately.` + raise InvalidOrderException( f'Could not create {ordertype} sell order on market {pair}. ' f'Tried to sell amount {amount} at rate {rate}.' f'Message: {e}') from e diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 881e489be..ebc1fd4e8 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -632,6 +632,12 @@ class FreqtradeBot(object): rate=rate * LIMIT_PRICE_PCT) trade.stoploss_order_id = str(stoploss_order['id']) return True + except InvalidOrderException: + trade.stoploss_order_id = None + logger.exception('Unable to place a stoploss order on exchange.') + logger.warning('Selling the trade forcefully') + self.execute_sell(trade, trade.stop_loss, sell_reason=SellType.EMERGENCY_SELL) + except DependencyException: trade.stoploss_order_id = None logger.exception('Unable to place a stoploss order on exchange.') diff --git a/freqtrade/tests/exchange/test_binance.py b/freqtrade/tests/exchange/test_binance.py index 4afb7fcc4..6518c8523 100644 --- a/freqtrade/tests/exchange/test_binance.py +++ b/freqtrade/tests/exchange/test_binance.py @@ -4,7 +4,8 @@ from unittest.mock import MagicMock import ccxt import pytest -from freqtrade import DependencyException, OperationalException, TemporaryError +from freqtrade import (DependencyException, InvalidOrderException, + OperationalException, TemporaryError) from freqtrade.tests.conftest import get_patched_exchange @@ -49,8 +50,9 @@ def test_stoploss_limit_order(default_conf, mocker): exchange = get_patched_exchange(mocker, default_conf, api_mock, 'binance') exchange.stoploss_limit(pair='ETH/BTC', amount=1, stop_price=220, rate=200) - with pytest.raises(DependencyException): - api_mock.create_order = MagicMock(side_effect=ccxt.InvalidOrder("Order not found")) + 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_limit(pair='ETH/BTC', amount=1, stop_price=220, rate=200)