add test and migration
This commit is contained in:
		| @@ -11,6 +11,6 @@ class SignalType(Enum): | ||||
|  | ||||
| class SignalNameType(Enum): | ||||
|     """ | ||||
|     Enum to distinguish between buy and sell signals | ||||
|     Enum for signal name | ||||
|     """ | ||||
|     BUY_SIGNAL_NAME = "buy_signal_name" | ||||
|   | ||||
| @@ -690,7 +690,7 @@ class FreqtradeBot(LoggingMixin): | ||||
|             analyzed_df, _ = self.dataprovider.get_analyzed_dataframe(trade.pair, | ||||
|                                                                       self.strategy.timeframe) | ||||
|  | ||||
|             (buy, sell) = self.strategy.get_signal(trade.pair, self.strategy.timeframe, analyzed_df) | ||||
|             (buy, sell, _) = self.strategy.get_signal(trade.pair, self.strategy.timeframe, analyzed_df) | ||||
|  | ||||
|         logger.debug('checking sell') | ||||
|         sell_rate = self.exchange.get_sell_rate(trade.pair, True) | ||||
|   | ||||
| @@ -47,6 +47,7 @@ def migrate_trades_table(decl_base, inspector, engine, table_back_name: str, col | ||||
|     min_rate = get_column_def(cols, 'min_rate', 'null') | ||||
|     sell_reason = get_column_def(cols, 'sell_reason', 'null') | ||||
|     strategy = get_column_def(cols, 'strategy', 'null') | ||||
|     buy_signal_name = get_column_def(cols, 'buy_signal_name', 'null') | ||||
|     # If ticker-interval existed use that, else null. | ||||
|     if has_column(cols, 'ticker_interval'): | ||||
|         timeframe = get_column_def(cols, 'timeframe', 'ticker_interval') | ||||
| @@ -80,7 +81,7 @@ def migrate_trades_table(decl_base, inspector, engine, table_back_name: str, col | ||||
|             stake_amount, amount, amount_requested, open_date, close_date, open_order_id, | ||||
|             stop_loss, stop_loss_pct, initial_stop_loss, initial_stop_loss_pct, | ||||
|             stoploss_order_id, stoploss_last_update, | ||||
|             max_rate, min_rate, sell_reason, sell_order_status, strategy, | ||||
|             max_rate, min_rate, sell_reason, sell_order_status, strategy, buy_signal_name, | ||||
|             timeframe, open_trade_value, close_profit_abs | ||||
|             ) | ||||
|         select id, lower(exchange), | ||||
| @@ -103,7 +104,7 @@ def migrate_trades_table(decl_base, inspector, engine, table_back_name: str, col | ||||
|             {stoploss_order_id} stoploss_order_id, {stoploss_last_update} stoploss_last_update, | ||||
|             {max_rate} max_rate, {min_rate} min_rate, {sell_reason} sell_reason, | ||||
|             {sell_order_status} sell_order_status, | ||||
|             {strategy} strategy, {timeframe} timeframe, | ||||
|             {strategy} strategy, {buy_signal_name} buy_signal_name, {timeframe} timeframe, | ||||
|             {open_trade_value} open_trade_value, {close_profit_abs} close_profit_abs | ||||
|             from {table_back_name} | ||||
|             """)) | ||||
| @@ -160,7 +161,7 @@ def check_migrate(engine, decl_base, previous_tables) -> None: | ||||
|     table_back_name = get_backup_name(tabs, 'trades_bak') | ||||
|  | ||||
|     # Check for latest column | ||||
|     if not has_column(cols, 'open_trade_value'): | ||||
|     if not has_column(cols, 'open_trade_value') or not has_column(cols, 'buy_signal_name'): | ||||
|         logger.info(f'Running database migration for trades - backup: {table_back_name}') | ||||
|         migrate_trades_table(decl_base, inspector, engine, table_back_name, cols) | ||||
|         # Reread columns - the above recreated the table! | ||||
|   | ||||
| @@ -37,15 +37,20 @@ def test_returns_latest_signal(mocker, default_conf, ohlcv_history): | ||||
|     mocked_history['buy'] = 0 | ||||
|     mocked_history.loc[1, 'sell'] = 1 | ||||
|  | ||||
|     assert _STRATEGY.get_signal('ETH/BTC', '5m', mocked_history) == (False, True) | ||||
|     assert _STRATEGY.get_signal('ETH/BTC', '5m', mocked_history) == (False, True, '') | ||||
|     mocked_history.loc[1, 'sell'] = 0 | ||||
|     mocked_history.loc[1, 'buy'] = 1 | ||||
|  | ||||
|     assert _STRATEGY.get_signal('ETH/BTC', '5m', mocked_history) == (True, False) | ||||
|     assert _STRATEGY.get_signal('ETH/BTC', '5m', mocked_history) == (True, False, '') | ||||
|     mocked_history.loc[1, 'sell'] = 0 | ||||
|     mocked_history.loc[1, 'buy'] = 0 | ||||
|  | ||||
|     assert _STRATEGY.get_signal('ETH/BTC', '5m', mocked_history) == (False, False) | ||||
|     assert _STRATEGY.get_signal('ETH/BTC', '5m', mocked_history) == (False, False, '') | ||||
|     mocked_history.loc[1, 'sell'] = 0 | ||||
|     mocked_history.loc[1, 'buy'] = 1 | ||||
|     mocked_history.loc[1, 'buy_signal_name'] = 'buy_signal_01' | ||||
|  | ||||
|     assert _STRATEGY.get_signal('ETH/BTC', '5m', mocked_history) == (True, False, 'buy_signal_01') | ||||
|  | ||||
|  | ||||
| def test_analyze_pair_empty(default_conf, mocker, caplog, ohlcv_history): | ||||
| @@ -62,15 +67,15 @@ def test_analyze_pair_empty(default_conf, mocker, caplog, ohlcv_history): | ||||
|  | ||||
|  | ||||
| def test_get_signal_empty(default_conf, mocker, caplog): | ||||
|     assert (False, False) == _STRATEGY.get_signal('foo', default_conf['timeframe'], DataFrame()) | ||||
|     assert (False, False, '') == _STRATEGY.get_signal('foo', default_conf['timeframe'], DataFrame()) | ||||
|     assert log_has('Empty candle (OHLCV) data for pair foo', caplog) | ||||
|     caplog.clear() | ||||
|  | ||||
|     assert (False, False) == _STRATEGY.get_signal('bar', default_conf['timeframe'], None) | ||||
|     assert (False, False, '') == _STRATEGY.get_signal('bar', default_conf['timeframe'], None) | ||||
|     assert log_has('Empty candle (OHLCV) data for pair bar', caplog) | ||||
|     caplog.clear() | ||||
|  | ||||
|     assert (False, False) == _STRATEGY.get_signal('baz', default_conf['timeframe'], DataFrame([])) | ||||
|     assert (False, False, '') == _STRATEGY.get_signal('baz', default_conf['timeframe'], DataFrame([])) | ||||
|     assert log_has('Empty candle (OHLCV) data for pair baz', caplog) | ||||
|  | ||||
|  | ||||
| @@ -106,7 +111,7 @@ def test_get_signal_old_dataframe(default_conf, mocker, caplog, ohlcv_history): | ||||
|     caplog.set_level(logging.INFO) | ||||
|     mocker.patch.object(_STRATEGY, 'assert_df') | ||||
|  | ||||
|     assert (False, False) == _STRATEGY.get_signal('xyz', default_conf['timeframe'], mocked_history) | ||||
|     assert (False, False, '') == _STRATEGY.get_signal('xyz', default_conf['timeframe'], mocked_history) | ||||
|     assert log_has('Outdated history for pair xyz. Last tick is 16 minutes old', caplog) | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -736,7 +736,7 @@ def test_process_informative_pairs_added(default_conf, ticker, mocker) -> None: | ||||
|         refresh_latest_ohlcv=refresh_mock, | ||||
|     ) | ||||
|     inf_pairs = MagicMock(return_value=[("BTC/ETH", '1m'), ("ETH/USDT", "1h")]) | ||||
|     mocker.patch('freqtrade.strategy.interface.IStrategy.get_signal', return_value=(False, False)) | ||||
|     mocker.patch('freqtrade.strategy.interface.IStrategy.get_signal', return_value=(False, False, '')) | ||||
|     mocker.patch('time.sleep', return_value=None) | ||||
|  | ||||
|     freqtrade = FreqtradeBot(default_conf) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user