diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 43f4fec99..e2b40f85a 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -388,22 +388,22 @@ class FreqtradeBot(object): for trade in Trade.query.filter(Trade.open_order_id.isnot(None)).all(): try: - order = exchange.get_order(trade.open_order_id) + order = exchange.get_order(trade.open_order_id, trade.pair) except requests.exceptions.RequestException: self.logger.info( 'Cannot query order for %s due to %s', trade, traceback.format_exc()) continue - ordertime = arrow.get(order['opened']) + ordertime = arrow.get(order['datetime']).datetime # Check if trade is still actually open if int(order['remaining']) == 0: continue - if order['type'] == "LIMIT_BUY" and ordertime < timeoutthreashold: + if order['side'] == 'buy' and ordertime < timeoutthreashold: self.handle_timedout_limit_buy(trade, order) - elif order['type'] == "LIMIT_SELL" and ordertime < timeoutthreashold: + elif order['side'] == 'sell' and ordertime < timeoutthreashold: self.handle_timedout_limit_sell(trade, order) # FIX: 20180110, why is cancel.order unconditionally here, whereas @@ -465,7 +465,7 @@ class FreqtradeBot(object): :return: None """ # Execute sell and update trade record - order_id = exchange.sell(str(trade.pair), limit, trade.amount) + order_id = exchange.sell(str(trade.pair), limit, trade.amount)['id'] trade.open_order_id = order_id fmt_exp_profit = round(trade.calc_profit_percent(rate=limit) * 100, 2) diff --git a/freqtrade/persistence.py b/freqtrade/persistence.py index 56fe336d2..55f53329a 100644 --- a/freqtrade/persistence.py +++ b/freqtrade/persistence.py @@ -111,20 +111,20 @@ class Trade(_DECL_BASE): :return: None """ # Ignore open and cancelled orders - if not order['closed'] or order['rate'] is None: + if order['status'] == 'open' or order['price'] is None: return logger.info('Updating trade (id=%d) ...', self.id) getcontext().prec = 8 # Bittrex do not go above 8 decimal - if order['type'] == 'LIMIT_BUY': + if order['type'] == 'limit' and order['side'] == 'buy': # Update open rate and actual amount - self.open_rate = Decimal(order['rate']) + self.open_rate = Decimal(order['price']) self.amount = Decimal(order['amount']) logger.info('LIMIT_BUY has been fulfilled for %s.', self) self.open_order_id = None - elif order['type'] == 'LIMIT_SELL': - self.close(order['rate']) + elif order['type'] == 'limit' and order['side'] == 'sell': + self.close(order['price']) else: raise ValueError('Unknown order type: {}'.format(order['type'])) cleanup() diff --git a/freqtrade/rpc/rpc.py b/freqtrade/rpc/rpc.py index b00baa747..3a85a6e9e 100644 --- a/freqtrade/rpc/rpc.py +++ b/freqtrade/rpc/rpc.py @@ -50,7 +50,7 @@ class RPC(object): for trade in trades: order = None if trade.open_order_id: - order = exchange.get_order(trade.open_order_id) + order = exchange.get_order(trade.open_order_id, trade.pair) # calculate profit and send message to user current_rate = exchange.get_ticker(trade.pair, False)['bid'] current_profit = trade.calc_profit_percent(current_rate) @@ -78,8 +78,8 @@ class RPC(object): amount=round(trade.amount, 8), close_profit=fmt_close_profit, current_profit=round(current_profit * 100, 2), - open_order='({} rem={:.8f})'.format( - order['type'], order['remaining'] + open_order='({} {} rem={:.8f})'.format( + order['type'], order['side'], order['remaining'] ) if order else None, ) result.append(message) @@ -311,17 +311,21 @@ class RPC(object): def _exec_forcesell(trade: Trade) -> None: # Check if there is there is an open order if trade.open_order_id: - order = exchange.get_order(trade.open_order_id) + order = exchange.get_order(trade.open_order_id, trade.pair) # Cancel open LIMIT_BUY orders and close trade - if order and not order['closed'] and order['type'] == 'LIMIT_BUY': - exchange.cancel_order(trade.open_order_id) - trade.close(order.get('rate') or trade.open_rate) + if order and order['status'] == 'open' \ + and order['type'] == 'limit' \ + and order['side'] == 'buy': + exchange.cancel_order(trade.open_order_id, trade.pair) + trade.close(order.get('price') or trade.open_rate) # TODO: sell amount which has been bought already return # Ignore trades with an attached LIMIT_SELL order - if order and not order['closed'] and order['type'] == 'LIMIT_SELL': + if order and order['status'] == 'open' \ + and order['type'] == 'limit' \ + and order['side'] == 'sell': return # Get current rate and execute sell diff --git a/freqtrade/tests/rpc/test_rpc.py b/freqtrade/tests/rpc/test_rpc.py index bbaa2385f..dd4a4e9bb 100644 --- a/freqtrade/tests/rpc/test_rpc.py +++ b/freqtrade/tests/rpc/test_rpc.py @@ -67,7 +67,7 @@ def test_rpc_trade_status(default_conf, ticker, mocker) -> None: '*Current Rate:* `0.00001098`\n' '*Close Profit:* `None`\n' '*Current Profit:* `-0.59%`\n' - '*Open Order:* `(LIMIT_BUY rem=0.00000000)`' + '*Open Order:* `(limit buy rem=0.00000000)`' ] assert result == result_message assert trade.find('[ETH/BTC]') >= 0 @@ -401,8 +401,9 @@ def test_rpc_forcesell(default_conf, ticker, mocker) -> None: cancel_order=cancel_order_mock, get_order=MagicMock( return_value={ - 'closed': True, - 'type': 'LIMIT_BUY', + 'status': 'closed', + 'type': 'limit', + 'side': 'buy' } ) ) @@ -448,8 +449,9 @@ def test_rpc_forcesell(default_conf, ticker, mocker) -> None: mocker.patch( 'freqtrade.freqtradebot.exchange.get_order', return_value={ - 'closed': None, - 'type': 'LIMIT_BUY' + 'status': 'open', + 'type': 'limit', + 'side': 'buy' } ) # check that the trade is called, which is done @@ -464,8 +466,9 @@ def test_rpc_forcesell(default_conf, ticker, mocker) -> None: mocker.patch( 'freqtrade.freqtradebot.exchange.get_order', return_value={ - 'closed': None, - 'type': 'LIMIT_SELL' + 'status': 'open', + 'type': 'limit', + 'side': 'sell' } ) (error, res) = rpc.rpc_forcesell('2') diff --git a/freqtrade/tests/test_persistence.py b/freqtrade/tests/test_persistence.py index 59ea2cd48..6ee145328 100644 --- a/freqtrade/tests/test_persistence.py +++ b/freqtrade/tests/test_persistence.py @@ -191,7 +191,7 @@ def test_update_open_order(limit_buy_order): assert trade.close_profit is None assert trade.close_date is None - limit_buy_order['closed'] = False + limit_buy_order['status'] = 'open' trade.update(limit_buy_order) assert trade.open_order_id is None