From 898ab5a3707148675a9dd83403efe299dba7636a Mon Sep 17 00:00:00 2001 From: gcarq Date: Sat, 30 Sep 2017 17:01:12 +0200 Subject: [PATCH 1/2] implement test to reproduce it --- freqtrade/tests/test_main.py | 40 +++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/freqtrade/tests/test_main.py b/freqtrade/tests/test_main.py index deadc7d62..fc8d40c84 100644 --- a/freqtrade/tests/test_main.py +++ b/freqtrade/tests/test_main.py @@ -1,6 +1,7 @@ import unittest -from unittest.mock import patch, MagicMock +from unittest.mock import patch, MagicMock, call +import copy from jsonschema import validate from freqtrade import exchange @@ -29,7 +30,10 @@ class TestMain(unittest.TestCase): "key": "key", "secret": "secret", "pair_whitelist": [ - "BTC_ETH" + "BTC_ETH", + "BTC_TKN", + "BTC_TRST", + "BTC_SWT", ] }, "telegram": { @@ -50,19 +54,27 @@ class TestMain(unittest.TestCase): 'last': 0.07256061 }), buy=MagicMock(return_value='mocked_order_id')): + # Save state of current whitelist + whitelist = copy.deepcopy(self.conf['bittrex']['pair_whitelist']) + init(self.conf, 'sqlite://') - trade = create_trade(15.0, exchange.Exchange.BITTREX) - Trade.session.add(trade) - Trade.session.flush() - self.assertIsNotNone(trade) - self.assertEqual(trade.open_rate, 0.072661) - self.assertEqual(trade.pair, 'BTC_ETH') - self.assertEqual(trade.exchange, exchange.Exchange.BITTREX) - self.assertEqual(trade.amount, 206.43811673387373) - self.assertEqual(trade.stake_amount, 15.0) - self.assertEqual(trade.is_open, True) - self.assertIsNotNone(trade.open_date) - buy_signal.assert_called_once_with('BTC_ETH') + for pair in ['BTC_ETH', 'BTC_TKN', 'BTC_TRST', 'BTC_SWT']: + trade = create_trade(15.0, exchange.Exchange.BITTREX) + Trade.session.add(trade) + Trade.session.flush() + self.assertIsNotNone(trade) + self.assertEqual(trade.open_rate, 0.072661) + self.assertEqual(trade.pair, pair) + self.assertEqual(trade.exchange, exchange.Exchange.BITTREX) + self.assertEqual(trade.amount, 206.43811673387373) + self.assertEqual(trade.stake_amount, 15.0) + self.assertEqual(trade.is_open, True) + self.assertIsNotNone(trade.open_date) + self.assertEqual(whitelist, self.conf['bittrex']['pair_whitelist']) + + buy_signal.assert_has_calls( + [call('BTC_ETH'), call('BTC_TKN'), call('BTC_TRST'), call('BTC_SWT')] + ) def test_2_handle_trade(self): with patch.dict('freqtrade.main._CONF', self.conf): From 4b42e1af4b9738269e895d344aede71508133945 Mon Sep 17 00:00:00 2001 From: gcarq Date: Sat, 30 Sep 2017 17:02:07 +0200 Subject: [PATCH 2/2] use deepcopy --- freqtrade/main.py | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/freqtrade/main.py b/freqtrade/main.py index 6c80d490c..518c82a6d 100755 --- a/freqtrade/main.py +++ b/freqtrade/main.py @@ -6,6 +6,7 @@ import traceback from datetime import datetime from typing import Dict, Optional +import copy from jsonschema import validate from freqtrade import exchange, persistence, __version__ @@ -88,11 +89,7 @@ def execute_sell(trade: Trade, current_rate: float) -> None: # Get available balance currency = trade.pair.split('_')[1] balance = exchange.get_balance(currency) - whitelist = _CONF[trade.exchange.name.lower()]['pair_whitelist'] - profit = trade.exec_sell_order(current_rate, balance) - if trade.pair not in whitelist: - whitelist.append(trade.pair) message = '*{}:* Selling [{}]({}) at rate `{:f} (profit: {}%)`'.format( trade.exchange.name, trade.pair.replace('_', '/'), @@ -161,7 +158,7 @@ def create_trade(stake_amount: float, _exchange: exchange.Exchange) -> Optional[ :param _exchange: exchange to use """ logger.info('Creating new trade with stake_amount: %f ...', stake_amount) - whitelist = _CONF[_exchange.name.lower()]['pair_whitelist'] + whitelist = copy.deepcopy(_CONF[_exchange.name.lower()]['pair_whitelist']) # Check if stake_amount is fulfilled if exchange.get_balance(_CONF['stake_currency']) < stake_amount: raise ValueError( @@ -169,11 +166,7 @@ def create_trade(stake_amount: float, _exchange: exchange.Exchange) -> Optional[ ) # Remove currently opened and latest pairs from whitelist - trades = Trade.query.filter(Trade.is_open.is_(True)).all() - latest_trade = Trade.query.filter(Trade.is_open.is_(False)).order_by(Trade.id.desc()).first() - if latest_trade: - trades.append(latest_trade) - for trade in trades: + for trade in Trade.query.filter(Trade.is_open.is_(True)).all(): if trade.pair in whitelist: whitelist.remove(trade.pair) logger.debug('Ignoring %s in pair whitelist', trade.pair)