working on catching the 'sell insufficient funds error'

This commit is contained in:
Gert Wohlgemuth 2018-05-02 12:56:33 -07:00
parent 00aa1bee9d
commit 4322d40967
2 changed files with 68 additions and 56 deletions

View File

@ -82,11 +82,18 @@ 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)
raise OperationalException('{message} params=({pair}, {rate}, {amount})'.format( if data['message'] == "INSUFFICIENT_FUNDS":
message=data['message'], raise NotEnoughFundsExeption('{message} params=({pair}, {rate}, {amount})'.format(
pair=pair, message=data['message'],
rate=rate, pair=pair,
amount=amount)) rate=rate,
amount=amount))
else:
raise OperationalException('{message} params=({pair}, {rate}, {amount})'.format(
message=data['message'],
pair=pair,
rate=rate,
amount=amount))
return data['result']['uuid'] return data['result']['uuid']
def get_balance(self, currency: str) -> float: def get_balance(self, currency: str) -> float:

View File

@ -472,59 +472,64 @@ class FreqtradeBot(object):
:return: None :return: None
""" """
# Execute sell and update trade record # Execute sell and update trade record
order_id = exchange.sell(str(trade.pair), limit, trade.amount)
trade.open_order_id = order_id
fmt_exp_profit = round(trade.calc_profit_percent(rate=limit) * 100, 2) # check if we have these funds first
profit_trade = trade.calc_profit(rate=limit) try:
current_rate = exchange.get_ticker(trade.pair, False)['bid'] order_id = exchange.sell(str(trade.pair), limit, trade.amount)
profit = trade.calc_profit_percent(current_rate) trade.open_order_id = order_id
message = "*{exchange}:* Selling\n" \ fmt_exp_profit = round(trade.calc_profit_percent(rate=limit) * 100, 2)
"*Current Pair:* [{pair}]({pair_url})\n" \ profit_trade = trade.calc_profit(rate=limit)
"*Limit:* `{limit}`\n" \ current_rate = exchange.get_ticker(trade.pair, False)['bid']
"*Amount:* `{amount}`\n" \ profit = trade.calc_profit_percent(current_rate)
"*Open Rate:* `{open_rate:.8f}`\n" \
"*Current Rate:* `{current_rate:.8f}`\n" \
"*Profit:* `{profit:.2f}%`" \
"".format(
exchange=trade.exchange,
pair=trade.pair,
pair_url=exchange.get_pair_detail_url(trade.pair),
limit=limit,
open_rate=trade.open_rate,
current_rate=current_rate,
amount=round(trade.amount, 8),
profit=round(profit * 100, 2),
)
# For regular case, when the configuration exists message = "*{exchange}:* Selling\n" \
if 'stake_currency' in self.config and 'fiat_display_currency' in self.config: "*Current Pair:* [{pair}]({pair_url})\n" \
fiat_converter = CryptoToFiatConverter() "*Limit:* `{limit}`\n" \
profit_fiat = fiat_converter.convert_amount( "*Amount:* `{amount}`\n" \
profit_trade, "*Open Rate:* `{open_rate:.8f}`\n" \
self.config['stake_currency'], "*Current Rate:* `{current_rate:.8f}`\n" \
self.config['fiat_display_currency'] "*Profit:* `{profit:.2f}%`" \
) "".format(
message += '` ({gain}: {profit_percent:.2f}%, {profit_coin:.8f} {coin}`' \ exchange=trade.exchange,
'` / {profit_fiat:.3f} {fiat})`' \ pair=trade.pair,
''.format( pair_url=exchange.get_pair_detail_url(trade.pair),
gain="profit" if fmt_exp_profit > 0 else "loss", limit=limit,
profit_percent=fmt_exp_profit, open_rate=trade.open_rate,
profit_coin=profit_trade, current_rate=current_rate,
coin=self.config['stake_currency'], amount=round(trade.amount, 8),
profit_fiat=profit_fiat, profit=round(profit * 100, 2),
fiat=self.config['fiat_display_currency'],
) )
# Because telegram._forcesell does not have the configuration
# Ignore the FIAT value and does not show the stake_currency as well
else:
message += '` ({gain}: {profit_percent:.2f}%, {profit_coin:.8f})`'.format(
gain="profit" if fmt_exp_profit > 0 else "loss",
profit_percent=fmt_exp_profit,
profit_coin=profit_trade
)
# Send the message # For regular case, when the configuration exists
self.rpc.send_msg(message) if 'stake_currency' in self.config and 'fiat_display_currency' in self.config:
Trade.session.flush() fiat_converter = CryptoToFiatConverter()
profit_fiat = fiat_converter.convert_amount(
profit_trade,
self.config['stake_currency'],
self.config['fiat_display_currency']
)
message += '` ({gain}: {profit_percent:.2f}%, {profit_coin:.8f} {coin}`' \
'` / {profit_fiat:.3f} {fiat})`' \
''.format(
gain="profit" if fmt_exp_profit > 0 else "loss",
profit_percent=fmt_exp_profit,
profit_coin=profit_trade,
coin=self.config['stake_currency'],
profit_fiat=profit_fiat,
fiat=self.config['fiat_display_currency'],
)
# Because telegram._forcesell does not have the configuration
# Ignore the FIAT value and does not show the stake_currency as well
else:
message += '` ({gain}: {profit_percent:.2f}%, {profit_coin:.8f})`'.format(
gain="profit" if fmt_exp_profit > 0 else "loss",
profit_percent=fmt_exp_profit,
profit_coin=profit_trade
)
# Send the message
self.rpc.send_msg(message)
Trade.session.flush()
except NotEnoughFundsExeption:
logger.warning('Sell order failed, due to not having enough funds for %s.', trade)