From e987a915e8d69f7f51cf0e3e3fc298acae885857 Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 21 Feb 2019 06:56:22 +0100 Subject: [PATCH 1/6] Rename exchange file --- freqtrade/exchange/{__init__.py => exchange.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename freqtrade/exchange/{__init__.py => exchange.py} (100%) diff --git a/freqtrade/exchange/__init__.py b/freqtrade/exchange/exchange.py similarity index 100% rename from freqtrade/exchange/__init__.py rename to freqtrade/exchange/exchange.py From e0f426d8637ff26314c824381dd0415d636ff20c Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 21 Feb 2019 06:59:52 +0100 Subject: [PATCH 2/6] Allow import freqtrade.exchange.* --- freqtrade/exchange/__init__.py | 2 ++ freqtrade/tests/exchange/test_exchange.py | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 freqtrade/exchange/__init__.py diff --git a/freqtrade/exchange/__init__.py b/freqtrade/exchange/__init__.py new file mode 100644 index 000000000..204ed971e --- /dev/null +++ b/freqtrade/exchange/__init__.py @@ -0,0 +1,2 @@ +from freqtrade.exchange.exchange import Exchange # noqa: F401 +from freqtrade.exchange.kraken import Kraken # noqa: F401 diff --git a/freqtrade/tests/exchange/test_exchange.py b/freqtrade/tests/exchange/test_exchange.py index 72919103c..ca76a0bd7 100644 --- a/freqtrade/tests/exchange/test_exchange.py +++ b/freqtrade/tests/exchange/test_exchange.py @@ -12,7 +12,8 @@ import pytest from pandas import DataFrame from freqtrade import DependencyException, OperationalException, TemporaryError -from freqtrade.exchange import API_RETRY_COUNT, Exchange +from freqtrade.exchange import Exchange +from freqtrade.exchange.exchange import API_RETRY_COUNT from freqtrade.tests.conftest import get_patched_exchange, log_has, log_has_re from freqtrade.resolvers.exchange_resolver import ExchangeResolver @@ -1058,7 +1059,7 @@ async def test___async_get_candle_history_sort(default_conf, mocker): ] exchange = get_patched_exchange(mocker, default_conf) exchange._api_async.fetch_ohlcv = get_mock_coro(tick) - sort_mock = mocker.patch('freqtrade.exchange.sorted', MagicMock(side_effect=sort_data)) + sort_mock = mocker.patch('freqtrade.exchange.exchange.sorted', MagicMock(side_effect=sort_data)) # Test the ticker history sort res = await exchange._async_get_candle_history('ETH/BTC', default_conf['ticker_interval']) assert res[0] == 'ETH/BTC' From be754244a3c9f153a5920353d5450f25b8058122 Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 21 Feb 2019 07:07:45 +0100 Subject: [PATCH 3/6] Only resolve exchanges from correct location --- freqtrade/resolvers/exchange_resolver.py | 22 +++++++++++----------- freqtrade/tests/exchange/test_exchange.py | 3 ++- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/freqtrade/resolvers/exchange_resolver.py b/freqtrade/resolvers/exchange_resolver.py index a68219527..8d1845c71 100644 --- a/freqtrade/resolvers/exchange_resolver.py +++ b/freqtrade/resolvers/exchange_resolver.py @@ -2,9 +2,9 @@ This module loads custom exchanges """ import logging -from pathlib import Path from freqtrade.exchange import Exchange +import freqtrade.exchange as exchanges from freqtrade.resolvers import IResolver logger = logging.getLogger(__name__) @@ -20,7 +20,7 @@ class ExchangeResolver(IResolver): def __init__(self, exchange_name: str, config: dict) -> None: """ Load the custom class from config parameter - :param config: configuration dictionary or None + :param config: configuration dictionary """ try: self.exchange = self._load_exchange(exchange_name, kwargs={'config': config}) @@ -32,22 +32,22 @@ class ExchangeResolver(IResolver): def _load_exchange( self, exchange_name: str, kwargs: dict) -> Exchange: """ - Search and loads the specified exchange. + Loads the specified exchange. + Only checks for exchanges exported in freqtrade.exchanges :param exchange_name: name of the module to import - :param extra_dir: additional directory to search for the given exchange :return: Exchange instance or None """ - abs_path = Path(__file__).parent.parent.joinpath('exchange').resolve() try: - exchange = self._search_object(directory=abs_path, object_type=Exchange, - object_name=exchange_name, - kwargs=kwargs) + ex_class = getattr(exchanges, exchange_name) + + exchange = ex_class(kwargs['config']) if exchange: - logger.info("Using resolved exchange %s from '%s'", exchange_name, abs_path) + logger.info("Using resolved exchange %s", exchange_name) return exchange - except FileNotFoundError: - logger.warning('Path "%s" does not exist', abs_path.relative_to(Path.cwd())) + except AttributeError: + # Pass and raise ImportError instead + pass raise ImportError( "Impossible to load Exchange '{}'. This class does not exist" diff --git a/freqtrade/tests/exchange/test_exchange.py b/freqtrade/tests/exchange/test_exchange.py index ca76a0bd7..15da5e924 100644 --- a/freqtrade/tests/exchange/test_exchange.py +++ b/freqtrade/tests/exchange/test_exchange.py @@ -12,7 +12,7 @@ import pytest from pandas import DataFrame from freqtrade import DependencyException, OperationalException, TemporaryError -from freqtrade.exchange import Exchange +from freqtrade.exchange import Exchange, Kraken from freqtrade.exchange.exchange import API_RETRY_COUNT from freqtrade.tests.conftest import get_patched_exchange, log_has, log_has_re from freqtrade.resolvers.exchange_resolver import ExchangeResolver @@ -121,6 +121,7 @@ def test_exchange_resolver(default_conf, mocker, caplog): exchange = ExchangeResolver('Kraken', default_conf).exchange assert isinstance(exchange, Exchange) + assert isinstance(exchange, Kraken) assert not log_has_re(r"No .* specific subclass found. Using the generic class instead.", caplog.record_tuples) From 7738ebbc0ff08b5b53c274e10b6e1a4dbd2ad8b1 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Thu, 21 Feb 2019 13:31:05 +0100 Subject: [PATCH 4/6] Update ccxt from 1.18.270 to 1.18.280 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index b4dd302e3..6ebbaa1ca 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -ccxt==1.18.270 +ccxt==1.18.280 SQLAlchemy==1.2.18 python-telegram-bot==11.1.0 arrow==0.13.1 From 29b8b79732fcc02ed7a03737cafc5b6adb56e2d1 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Fri, 22 Feb 2019 13:30:08 +0100 Subject: [PATCH 5/6] Update ccxt from 1.18.280 to 1.18.281 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 6ebbaa1ca..cd1d89c6d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -ccxt==1.18.280 +ccxt==1.18.281 SQLAlchemy==1.2.18 python-telegram-bot==11.1.0 arrow==0.13.1 From a1b00f90535132c7df53444bd8da29808e0fa05a Mon Sep 17 00:00:00 2001 From: hroff-1902 <47309513+hroff-1902@users.noreply.github.com> Date: Fri, 22 Feb 2019 17:37:59 +0300 Subject: [PATCH 6/6] Edge question added; minor improvements (sections for Hyperopt and Edge) --- docs/faq.md | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/docs/faq.md b/docs/faq.md index 4bbf28fe6..3eaa771ee 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -1,4 +1,6 @@ -# freqtrade FAQ +# Freqtrade FAQ + +### Freqtrade commons #### I have waited 5 minutes, why hasn't the bot made any trades yet?! @@ -34,7 +36,9 @@ perform anymore BUYS? You can use the `/forcesell all` command from Telegram. -### How many epoch do I need to get a good Hyperopt result? +### Hyperopt module + +#### How many epoch do I need to get a good Hyperopt result? Per default Hyperopts without `-e` or `--epochs` parameter will only run 100 epochs, means 100 evals of your triggers, guards, .... Too few to find a great result (unless if you are very lucky), so you probably @@ -68,3 +72,18 @@ but it will give the idea. With only these triggers and guards there is already 8*10^9*10 evaluations. A roughly total of 80 billion evals. Did you run 100 000 evals? Congrats, you've done roughly 1 / 100 000 th of the search space. + +### Edge module + +#### Edge implements interesting approach for controlling position size, is there any theory behind it? + +The Edge module is mostly a result of brainstorming of [@mishaker](https://github.com/mishaker) and [@creslinux](https://github.com/creslinux) freqtrade team members. + +You can find further info on expectancy, winrate, risk management and position size in the following sources: +* https://www.tradeciety.com/ultimate-math-guide-for-traders/ +* http://www.vantharp.com/tharp-concepts/expectancy.asp +* https://samuraitradingacademy.com/trading-expectancy/ +* https://www.learningmarkets.com/determining-expectancy-in-your-trading/ +* http://www.lonestocktrader.com/make-money-trading-positive-expectancy/ +* https://www.babypips.com/trading/trade-expectancy-matter +