From d7bebc4385cf833aa69732343ec7d62fd36f6762 Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 29 May 2019 19:54:47 +0200 Subject: [PATCH 1/4] persistence.init does not need the config dict --- freqtrade/freqtradebot.py | 2 +- freqtrade/persistence.py | 5 ++--- freqtrade/tests/test_persistence.py | 24 ++++++++++++------------ scripts/plot_dataframe.py | 2 +- 4 files changed, 16 insertions(+), 17 deletions(-) diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 8b29d6d40..1a5187d8c 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -73,7 +73,7 @@ class FreqtradeBot(object): self.active_pair_whitelist: List[str] = self.config['exchange']['pair_whitelist'] - persistence.init(self.config) + persistence.init(self.config.get('db_url', None), self.config.get('dry_run', False)) # Set initial bot state from config initial_state = self.config.get('initial_state') diff --git a/freqtrade/persistence.py b/freqtrade/persistence.py index e64e0b89c..5218b793a 100644 --- a/freqtrade/persistence.py +++ b/freqtrade/persistence.py @@ -25,7 +25,7 @@ _DECL_BASE: Any = declarative_base() _SQL_DOCS_URL = 'http://docs.sqlalchemy.org/en/latest/core/engines.html#database-urls' -def init(config: Dict) -> None: +def init(db_url: str, dry_run: bool = False) -> None: """ Initializes this module with the given config, registers all known command handlers @@ -33,7 +33,6 @@ def init(config: Dict) -> None: :param config: config to use :return: None """ - db_url = config.get('db_url', None) kwargs = {} # Take care of thread ownership if in-memory db @@ -57,7 +56,7 @@ def init(config: Dict) -> None: check_migrate(engine) # Clean dry_run DB if the db is not in-memory - if config.get('dry_run', False) and db_url != 'sqlite://': + if dry_run and db_url != 'sqlite://': clean_dry_run_db() diff --git a/freqtrade/tests/test_persistence.py b/freqtrade/tests/test_persistence.py index 8c15fa8e8..7e47abf39 100644 --- a/freqtrade/tests/test_persistence.py +++ b/freqtrade/tests/test_persistence.py @@ -13,12 +13,12 @@ from freqtrade.tests.conftest import log_has @pytest.fixture(scope='function') def init_persistence(default_conf): - init(default_conf) + init(default_conf['db_url'], default_conf['dry_run']) def test_init_create_session(default_conf): # Check if init create a session - init(default_conf) + init(default_conf['db_url'], default_conf['dry_run']) assert hasattr(Trade, 'session') assert 'Session' in type(Trade.session).__name__ @@ -28,7 +28,7 @@ def test_init_custom_db_url(default_conf, mocker): default_conf.update({'db_url': 'sqlite:///tmp/freqtrade2_test.sqlite'}) create_engine_mock = mocker.patch('freqtrade.persistence.create_engine', MagicMock()) - init(default_conf) + init(default_conf['db_url'], default_conf['dry_run']) assert create_engine_mock.call_count == 1 assert create_engine_mock.mock_calls[0][1][0] == 'sqlite:///tmp/freqtrade2_test.sqlite' @@ -37,7 +37,7 @@ def test_init_invalid_db_url(default_conf): # Update path to a value other than default, but still in-memory default_conf.update({'db_url': 'unknown:///some.url'}) with pytest.raises(OperationalException, match=r'.*no valid database URL*'): - init(default_conf) + init(default_conf['db_url'], default_conf['dry_run']) def test_init_prod_db(default_conf, mocker): @@ -46,7 +46,7 @@ def test_init_prod_db(default_conf, mocker): create_engine_mock = mocker.patch('freqtrade.persistence.create_engine', MagicMock()) - init(default_conf) + init(default_conf['db_url'], default_conf['dry_run']) assert create_engine_mock.call_count == 1 assert create_engine_mock.mock_calls[0][1][0] == 'sqlite:///tradesv3.sqlite' @@ -57,7 +57,7 @@ def test_init_dryrun_db(default_conf, mocker): create_engine_mock = mocker.patch('freqtrade.persistence.create_engine', MagicMock()) - init(default_conf) + init(default_conf['db_url'], default_conf['dry_run']) assert create_engine_mock.call_count == 1 assert create_engine_mock.mock_calls[0][1][0] == 'sqlite://' @@ -336,8 +336,8 @@ def test_calc_profit_percent(limit_buy_order, limit_sell_order, fee): assert trade.calc_profit_percent(fee=0.003) == 0.06147824 +@pytest.mark.usefixtures("init_persistence") def test_clean_dry_run_db(default_conf, fee): - init(default_conf) # Simulate dry_run entries trade = Trade( @@ -424,7 +424,7 @@ def test_migrate_old(mocker, default_conf, fee): engine.execute(create_table_old) engine.execute(insert_table_old) # Run init to test migration - init(default_conf) + init(default_conf['db_url'], default_conf['dry_run']) assert len(Trade.query.filter(Trade.id == 1).all()) == 1 trade = Trade.query.filter(Trade.id == 1).first() @@ -497,7 +497,7 @@ def test_migrate_new(mocker, default_conf, fee, caplog): engine.execute("create table trades_bak1 as select * from trades") # Run init to test migration - init(default_conf) + init(default_conf['db_url'], default_conf['dry_run']) assert len(Trade.query.filter(Trade.id == 1).all()) == 1 trade = Trade.query.filter(Trade.id == 1).first() @@ -566,7 +566,7 @@ def test_migrate_mid_state(mocker, default_conf, fee, caplog): engine.execute(insert_table_old) # Run init to test migration - init(default_conf) + init(default_conf['db_url'], default_conf['dry_run']) assert len(Trade.query.filter(Trade.id == 1).all()) == 1 trade = Trade.query.filter(Trade.id == 1).first() @@ -668,8 +668,8 @@ def test_adjust_min_max_rates(fee): assert trade.min_rate == 0.96 +@pytest.mark.usefixtures("init_persistence") def test_get_open(default_conf, fee): - init(default_conf) # Simulate dry_run entries trade = Trade( @@ -713,8 +713,8 @@ def test_get_open(default_conf, fee): assert len(Trade.get_open_trades()) == 2 +@pytest.mark.usefixtures("init_persistence") def test_to_json(default_conf, fee): - init(default_conf) # Simulate dry_run entries trade = Trade( diff --git a/scripts/plot_dataframe.py b/scripts/plot_dataframe.py index ba549deb5..49ae857b6 100755 --- a/scripts/plot_dataframe.py +++ b/scripts/plot_dataframe.py @@ -55,7 +55,7 @@ timeZone = pytz.UTC def load_trades(args: Namespace, pair: str, timerange: TimeRange) -> pd.DataFrame: trades: pd.DataFrame = pd.DataFrame() if args.db_url: - persistence.init(_CONF) + persistence.init(args.db_url, True) columns = ["pair", "profit", "open_time", "close_time", "open_rate", "close_rate", "duration"] From d6cf3144813a6f1d14a50c195f109a1ff027c9bc Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 30 May 2019 06:30:06 +0200 Subject: [PATCH 2/4] Don't default to false for init() --- freqtrade/freqtradebot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 1a5187d8c..dfffc21b3 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -73,7 +73,7 @@ class FreqtradeBot(object): self.active_pair_whitelist: List[str] = self.config['exchange']['pair_whitelist'] - persistence.init(self.config.get('db_url', None), self.config.get('dry_run', False)) + persistence.init(self.config.get('db_url', None), self.config.get('dry_run')) # Set initial bot state from config initial_state = self.config.get('initial_state') From b6e8fecbf50b3f22c7efdbabe7e3f75230d8c166 Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 30 May 2019 06:31:34 +0200 Subject: [PATCH 3/4] Change persistence.init parameter It should describe what it does --- freqtrade/freqtradebot.py | 3 ++- freqtrade/persistence.py | 8 +++++--- scripts/plot_dataframe.py | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index dfffc21b3..3f8c1e106 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -73,7 +73,8 @@ class FreqtradeBot(object): self.active_pair_whitelist: List[str] = self.config['exchange']['pair_whitelist'] - persistence.init(self.config.get('db_url', None), self.config.get('dry_run')) + persistence.init(self.config.get('db_url', None), + clean_open_orders=self.config.get('dry_run', False)) # Set initial bot state from config initial_state = self.config.get('initial_state') diff --git a/freqtrade/persistence.py b/freqtrade/persistence.py index 5218b793a..3d86d4f4d 100644 --- a/freqtrade/persistence.py +++ b/freqtrade/persistence.py @@ -25,12 +25,14 @@ _DECL_BASE: Any = declarative_base() _SQL_DOCS_URL = 'http://docs.sqlalchemy.org/en/latest/core/engines.html#database-urls' -def init(db_url: str, dry_run: bool = False) -> None: +def init(db_url: str, clean_open_orders: bool = False) -> None: """ Initializes this module with the given config, registers all known command handlers and starts polling for message updates - :param config: config to use + :param db_url: Database to use + :param clean_open_orders: Remove open orders from the database. + Useful for dry-run or if all orders have been reset on the exchange. :return: None """ kwargs = {} @@ -56,7 +58,7 @@ def init(db_url: str, dry_run: bool = False) -> None: check_migrate(engine) # Clean dry_run DB if the db is not in-memory - if dry_run and db_url != 'sqlite://': + if clean_open_orders and db_url != 'sqlite://': clean_dry_run_db() diff --git a/scripts/plot_dataframe.py b/scripts/plot_dataframe.py index 49ae857b6..74e8573e5 100755 --- a/scripts/plot_dataframe.py +++ b/scripts/plot_dataframe.py @@ -55,7 +55,7 @@ timeZone = pytz.UTC def load_trades(args: Namespace, pair: str, timerange: TimeRange) -> pd.DataFrame: trades: pd.DataFrame = pd.DataFrame() if args.db_url: - persistence.init(args.db_url, True) + persistence.init(args.db_url, False) columns = ["pair", "profit", "open_time", "close_time", "open_rate", "close_rate", "duration"] From 338f2a2322b87affc4c34f63517f31773e4ef131 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 1 Jun 2019 06:26:03 +0200 Subject: [PATCH 4/4] Use kwarg to call persistence.init() --- scripts/plot_dataframe.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/plot_dataframe.py b/scripts/plot_dataframe.py index 74e8573e5..9316c953b 100755 --- a/scripts/plot_dataframe.py +++ b/scripts/plot_dataframe.py @@ -55,7 +55,8 @@ timeZone = pytz.UTC def load_trades(args: Namespace, pair: str, timerange: TimeRange) -> pd.DataFrame: trades: pd.DataFrame = pd.DataFrame() if args.db_url: - persistence.init(args.db_url, False) + persistence.init(args.db_url, clean_open_orders=False) + columns = ["pair", "profit", "open_time", "close_time", "open_rate", "close_rate", "duration"]