Merge branch 'handleNotEnoughFundsException' into develop-berlinguyinca

# Conflicts:
#	freqtrade/tests/testdata/BTC_ADA-5.json
#	freqtrade/tests/testdata/BTC_DASH-5.json
#	freqtrade/tests/testdata/BTC_ETC-5.json
#	freqtrade/tests/testdata/BTC_ETH-5.json
#	freqtrade/tests/testdata/BTC_LTC-5.json
#	freqtrade/tests/testdata/BTC_NXT-5.json
#	freqtrade/tests/testdata/BTC_POWR-5.json
#	freqtrade/tests/testdata/BTC_XLM-5.json
#	freqtrade/tests/testdata/BTC_XMR-5.json
#	freqtrade/tests/testdata/BTC_ZEC-5.json
This commit is contained in:
Gert Wohlgemuth 2018-05-02 20:43:36 -07:00
commit 5d59cd4d51
13 changed files with 123 additions and 81 deletions

View File

@ -14,3 +14,11 @@ class OperationalException(BaseException):
Requires manual intervention. Requires manual intervention.
This happens when an exchange returns an unexpected error during runtime. This happens when an exchange returns an unexpected error during runtime.
""" """
class NotEnoughFundsExeption(BaseException):
"""
This happens when the exchange reports that not enough funds where available.
We do not want to stop the bot in this case and just keep it going and suppress
this message
"""

View File

@ -5,7 +5,7 @@ from bittrex.bittrex import API_V1_1, API_V2_0
from bittrex.bittrex import Bittrex as _Bittrex from bittrex.bittrex import Bittrex as _Bittrex
from requests.exceptions import ContentDecodingError from requests.exceptions import ContentDecodingError
from freqtrade import OperationalException from freqtrade import OperationalException, NotEnoughFundsExeption
from freqtrade.exchange.interface import Exchange from freqtrade.exchange.interface import Exchange
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -63,6 +63,14 @@ class Bittrex(Exchange):
data = _API.buy_limit(pair.replace('_', '-'), amount, rate) data = _API.buy_limit(pair.replace('_', '-'), amount, rate)
if not data['success']: if not data['success']:
Bittrex._validate_response(data) Bittrex._validate_response(data)
if data['message'] == "INSUFFICIENT_FUNDS":
raise NotEnoughFundsExeption('{message} params=({pair}, {rate}, {amount})'.format(
message=data['message'],
pair=pair,
rate=rate,
amount=amount))
else:
raise OperationalException('{message} params=({pair}, {rate}, {amount})'.format( raise OperationalException('{message} params=({pair}, {rate}, {amount})'.format(
message=data['message'], message=data['message'],
pair=pair, pair=pair,
@ -74,6 +82,13 @@ class Bittrex(Exchange):
data = _API.sell_limit(pair.replace('_', '-'), amount, rate) data = _API.sell_limit(pair.replace('_', '-'), amount, rate)
if not data['success']: if not data['success']:
Bittrex._validate_response(data) Bittrex._validate_response(data)
if data['message'] == "INSUFFICIENT_FUNDS":
raise NotEnoughFundsExeption('{message} params=({pair}, {rate}, {amount})'.format(
message=data['message'],
pair=pair,
rate=rate,
amount=amount))
else:
raise OperationalException('{message} params=({pair}, {rate}, {amount})'.format( raise OperationalException('{message} params=({pair}, {rate}, {amount})'.format(
message=data['message'], message=data['message'],
pair=pair, pair=pair,

View File

@ -15,8 +15,8 @@ import requests
from cachetools import cached, TTLCache from cachetools import cached, TTLCache
from freqtrade import ( from freqtrade import (
DependencyException, OperationalException, exchange, persistence, __version__ DependencyException, OperationalException, exchange, persistence, __version__,
) NotEnoughFundsExeption)
from freqtrade.analyze import Analyze from freqtrade.analyze import Analyze
from freqtrade import constants from freqtrade import constants
from freqtrade.fiat_convert import CryptoToFiatConverter from freqtrade.fiat_convert import CryptoToFiatConverter
@ -24,7 +24,6 @@ from freqtrade.persistence import Trade
from freqtrade.rpc.rpc_manager import RPCManager from freqtrade.rpc.rpc_manager import RPCManager
from freqtrade.state import State from freqtrade.state import State
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -166,7 +165,11 @@ class FreqtradeBot(object):
# Then looking for buy opportunities # Then looking for buy opportunities
if len(trades) < self.config['max_open_trades']: if len(trades) < self.config['max_open_trades']:
try:
state_changed = self.process_maybe_execute_buy() state_changed = self.process_maybe_execute_buy()
except NotEnoughFundsExeption:
logger.warning('insufficient funds to execute this buy order, ignoring it!')
state_changed = False
if 'unfilledtimeout' in self.config: if 'unfilledtimeout' in self.config:
# Check and handle any timed out open orders # Check and handle any timed out open orders
@ -176,6 +179,7 @@ class FreqtradeBot(object):
except (requests.exceptions.RequestException, json.JSONDecodeError) as error: except (requests.exceptions.RequestException, json.JSONDecodeError) as error:
logger.warning('%s, retrying in 30 seconds...', error) logger.warning('%s, retrying in 30 seconds...', error)
time.sleep(constants.RETRY_TIMEOUT) time.sleep(constants.RETRY_TIMEOUT)
except OperationalException: except OperationalException:
self.rpc.send_msg( self.rpc.send_msg(
'*Status:* OperationalException:\n```\n{traceback}```{hint}' '*Status:* OperationalException:\n```\n{traceback}```{hint}'
@ -468,6 +472,9 @@ class FreqtradeBot(object):
:return: None :return: None
""" """
# Execute sell and update trade record # Execute sell and update trade record
# check if we have these funds first
try:
order_id = exchange.sell(str(trade.pair), limit, trade.amount) order_id = exchange.sell(str(trade.pair), limit, trade.amount)
trade.open_order_id = order_id trade.open_order_id = order_id
@ -524,3 +531,5 @@ class FreqtradeBot(object):
# Send the message # Send the message
self.rpc.send_msg(message) self.rpc.send_msg(message)
Trade.session.flush() Trade.session.flush()
except NotEnoughFundsExeption:
logger.warning('Sell order failed, due to not having enough funds for %s.', trade)

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long