Allow loading of any additional configuration to ccxt
seperated by async and non-async
This commit is contained in:
parent
939aa6009a
commit
e7d5cf9d9d
@ -93,8 +93,9 @@ class Exchange(object):
|
|||||||
logger.info('Instance is running with dry_run enabled')
|
logger.info('Instance is running with dry_run enabled')
|
||||||
|
|
||||||
exchange_config = config['exchange']
|
exchange_config = config['exchange']
|
||||||
self._api = self._init_ccxt(exchange_config)
|
self._api = self._init_ccxt(exchange_config, ccxt_kwargs=exchange_config.get('ccxt_config'))
|
||||||
self._api_async = self._init_ccxt(exchange_config, ccxt_async)
|
self._api_async = self._init_ccxt(exchange_config, ccxt_async,
|
||||||
|
ccxt_kwargs=exchange_config.get('ccxt_async_config'))
|
||||||
|
|
||||||
logger.info('Using Exchange "%s"', self.name)
|
logger.info('Using Exchange "%s"', self.name)
|
||||||
|
|
||||||
@ -114,7 +115,8 @@ class Exchange(object):
|
|||||||
if self._api_async and inspect.iscoroutinefunction(self._api_async.close):
|
if self._api_async and inspect.iscoroutinefunction(self._api_async.close):
|
||||||
asyncio.get_event_loop().run_until_complete(self._api_async.close())
|
asyncio.get_event_loop().run_until_complete(self._api_async.close())
|
||||||
|
|
||||||
def _init_ccxt(self, exchange_config: dict, ccxt_module=ccxt) -> ccxt.Exchange:
|
def _init_ccxt(self, exchange_config: dict, ccxt_module=ccxt,
|
||||||
|
ccxt_kwargs: dict = None) -> ccxt.Exchange:
|
||||||
"""
|
"""
|
||||||
Initialize ccxt with given config and return valid
|
Initialize ccxt with given config and return valid
|
||||||
ccxt instance.
|
ccxt instance.
|
||||||
@ -124,14 +126,20 @@ class Exchange(object):
|
|||||||
|
|
||||||
if name not in ccxt_module.exchanges:
|
if name not in ccxt_module.exchanges:
|
||||||
raise OperationalException(f'Exchange {name} is not supported')
|
raise OperationalException(f'Exchange {name} is not supported')
|
||||||
try:
|
|
||||||
api = getattr(ccxt_module, name.lower())({
|
ex_config = {
|
||||||
'apiKey': exchange_config.get('key'),
|
'apiKey': exchange_config.get('key'),
|
||||||
'secret': exchange_config.get('secret'),
|
'secret': exchange_config.get('secret'),
|
||||||
'password': exchange_config.get('password'),
|
'password': exchange_config.get('password'),
|
||||||
'uid': exchange_config.get('uid', ''),
|
'uid': exchange_config.get('uid', ''),
|
||||||
'enableRateLimit': exchange_config.get('ccxt_rate_limit', True)
|
'enableRateLimit': exchange_config.get('ccxt_rate_limit', True)
|
||||||
})
|
}
|
||||||
|
if ccxt_kwargs:
|
||||||
|
logger.info('Applying additional ccxt config: %s', ccxt_kwargs)
|
||||||
|
ex_config.update(ccxt_kwargs)
|
||||||
|
try:
|
||||||
|
|
||||||
|
api = getattr(ccxt_module, name.lower())(ex_config)
|
||||||
except (KeyError, AttributeError):
|
except (KeyError, AttributeError):
|
||||||
raise OperationalException(f'Exchange {name} is not supported')
|
raise OperationalException(f'Exchange {name} is not supported')
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
# pragma pylint: disable=missing-docstring, C0103, bad-continuation, global-statement
|
# pragma pylint: disable=missing-docstring, C0103, bad-continuation, global-statement
|
||||||
# pragma pylint: disable=protected-access
|
# pragma pylint: disable=protected-access
|
||||||
|
import copy
|
||||||
import logging
|
import logging
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from random import randint
|
from random import randint
|
||||||
@ -56,6 +57,32 @@ def test_init(default_conf, mocker, caplog):
|
|||||||
assert log_has('Instance is running with dry_run enabled', caplog.record_tuples)
|
assert log_has('Instance is running with dry_run enabled', caplog.record_tuples)
|
||||||
|
|
||||||
|
|
||||||
|
def test_init_ccxt_kwargs(default_conf, mocker, caplog):
|
||||||
|
mocker.patch('freqtrade.exchange.Exchange._load_markets', MagicMock(return_value={}))
|
||||||
|
caplog.set_level(logging.INFO)
|
||||||
|
conf = copy.deepcopy(default_conf)
|
||||||
|
conf['exchange']['ccxt_async_config'] = {'aiohttp_trust_env': True}
|
||||||
|
ex = Exchange(conf)
|
||||||
|
assert log_has("Applying additional ccxt config: {'aiohttp_trust_env': True}",
|
||||||
|
caplog.record_tuples)
|
||||||
|
assert ex._api_async.aiohttp_trust_env
|
||||||
|
assert not ex._api.aiohttp_trust_env
|
||||||
|
|
||||||
|
# Reset logging and config
|
||||||
|
caplog.clear()
|
||||||
|
conf = copy.deepcopy(default_conf)
|
||||||
|
conf['exchange']['ccxt_config'] = {'TestKWARG': 11}
|
||||||
|
ex = Exchange(conf)
|
||||||
|
assert not log_has("Applying additional ccxt config: {'aiohttp_trust_env': True}",
|
||||||
|
caplog.record_tuples)
|
||||||
|
assert not ex._api_async.aiohttp_trust_env
|
||||||
|
assert hasattr(ex._api, 'TestKWARG')
|
||||||
|
assert ex._api.TestKWARG == 11
|
||||||
|
assert not hasattr(ex._api_async, 'TestKWARG')
|
||||||
|
assert log_has("Applying additional ccxt config: {'TestKWARG': 11}",
|
||||||
|
caplog.record_tuples)
|
||||||
|
|
||||||
|
|
||||||
def test_destroy(default_conf, mocker, caplog):
|
def test_destroy(default_conf, mocker, caplog):
|
||||||
caplog.set_level(logging.DEBUG)
|
caplog.set_level(logging.DEBUG)
|
||||||
get_patched_exchange(mocker, default_conf)
|
get_patched_exchange(mocker, default_conf)
|
||||||
|
Loading…
Reference in New Issue
Block a user