add test and fix exchange_resolver
This commit is contained in:
		
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -81,6 +81,7 @@ target/ | ||||
|  | ||||
| # Jupyter Notebook | ||||
| .ipynb_checkpoints | ||||
| *.ipynb | ||||
|  | ||||
| # pyenv | ||||
| .python-version | ||||
|   | ||||
| @@ -56,7 +56,7 @@ class FreqtradeBot(object): | ||||
|  | ||||
|         self.rpc: RPCManager = RPCManager(self) | ||||
|  | ||||
|         exchange_name = self.config.get('exchange', {}).get('name', 'bittrex') | ||||
|         exchange_name = self.config.get('exchange', {}).get('name', 'bittrex').title() | ||||
|         try: | ||||
|             self.exchange = ExchangeResolver(exchange_name, self.config).exchange | ||||
|         except ImportError: | ||||
|   | ||||
| @@ -32,23 +32,17 @@ class ExchangeResolver(IResolver): | ||||
|         :param extra_dir: additional directory to search for the given exchange | ||||
|         :return: Exchange instance or None | ||||
|         """ | ||||
|         current_path = Path(__file__).parent.parent.joinpath('exchange').resolve() | ||||
|         abs_path = Path(__file__).parent.parent.joinpath('exchange').resolve() | ||||
|  | ||||
|         abs_paths = [ | ||||
|             current_path.parent.parent.joinpath('user_data/exchange'), | ||||
|             current_path, | ||||
|         ] | ||||
|  | ||||
|         for _path in abs_paths: | ||||
|         try: | ||||
|                 exchange = self._search_object(directory=_path, object_type=Exchange, | ||||
|             exchange = self._search_object(directory=abs_path, object_type=Exchange, | ||||
|                                            object_name=exchange_name, | ||||
|                                            kwargs=kwargs) | ||||
|             if exchange: | ||||
|                     logger.info('Using resolved exchange %s from \'%s\'', exchange_name, _path) | ||||
|                 logger.info('Using resolved exchange %s from \'%s\'', exchange_name, abs_path) | ||||
|                 return exchange | ||||
|         except FileNotFoundError: | ||||
|                 logger.warning('Path "%s" does not exist', _path.relative_to(Path.cwd())) | ||||
|             logger.warning('Path "%s" does not exist', abs_path.relative_to(Path.cwd())) | ||||
|  | ||||
|         raise ImportError( | ||||
|             "Impossible to load Exchange '{}'. This class does not exist" | ||||
|   | ||||
| @@ -16,6 +16,7 @@ from freqtrade.data.converter import parse_ticker_dataframe | ||||
| from freqtrade.exchange import Exchange | ||||
| from freqtrade.edge import Edge, PairInfo | ||||
| from freqtrade.freqtradebot import FreqtradeBot | ||||
| from freqtrade.resolvers import ExchangeResolver | ||||
|  | ||||
| logging.getLogger('').setLevel(logging.INFO) | ||||
|  | ||||
| @@ -49,6 +50,10 @@ def patch_exchange(mocker, api_mock=None, id='bittrex') -> None: | ||||
|  | ||||
| def get_patched_exchange(mocker, config, api_mock=None, id='bittrex') -> Exchange: | ||||
|     patch_exchange(mocker, api_mock, id) | ||||
|     config["exchange"]["name"] = id | ||||
|     try: | ||||
|         exchange = ExchangeResolver(id.title(), config).exchange | ||||
|     except ImportError: | ||||
|         exchange = Exchange(config) | ||||
|     return exchange | ||||
|  | ||||
|   | ||||
| @@ -531,6 +531,38 @@ def test_buy_considers_time_in_force(default_conf, mocker): | ||||
|     assert api_mock.create_order.call_args[0][5] == {'timeInForce': 'ioc'} | ||||
|  | ||||
|  | ||||
| def test_buy_kraken_trading_agreement(default_conf, mocker): | ||||
|     api_mock = MagicMock() | ||||
|     order_id = 'test_prod_buy_{}'.format(randint(0, 10 ** 6)) | ||||
|     order_type = 'market' | ||||
|     time_in_force = 'ioc' | ||||
|     api_mock.create_order = MagicMock(return_value={ | ||||
|         'id': order_id, | ||||
|         'info': { | ||||
|             'foo': 'bar' | ||||
|         } | ||||
|     }) | ||||
|     default_conf['dry_run'] = False | ||||
|  | ||||
|     mocker.patch('freqtrade.exchange.Exchange.symbol_amount_prec', lambda s, x, y: y) | ||||
|     mocker.patch('freqtrade.exchange.Exchange.symbol_price_prec', lambda s, x, y: y) | ||||
|     exchange = get_patched_exchange(mocker, default_conf, api_mock, id="kraken") | ||||
|  | ||||
|     order = exchange.buy(pair='ETH/BTC', ordertype=order_type, | ||||
|                          amount=1, rate=200, time_in_force=time_in_force) | ||||
|  | ||||
|     assert 'id' in order | ||||
|     assert 'info' in order | ||||
|     assert order['id'] == order_id | ||||
|     assert api_mock.create_order.call_args[0][0] == 'ETH/BTC' | ||||
|     assert api_mock.create_order.call_args[0][1] == order_type | ||||
|     assert api_mock.create_order.call_args[0][2] == 'buy' | ||||
|     assert api_mock.create_order.call_args[0][3] == 1 | ||||
|     assert api_mock.create_order.call_args[0][4] is None | ||||
|     assert api_mock.create_order.call_args[0][5] == {'timeInForce': 'ioc', | ||||
|                                                      'trading_agreement': 'agree'} | ||||
|  | ||||
|  | ||||
| def test_sell_dry_run(default_conf, mocker): | ||||
|     default_conf['dry_run'] = True | ||||
|     exchange = get_patched_exchange(mocker, default_conf) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user