diff --git a/freqtrade/strategy/interface.py b/freqtrade/strategy/interface.py index f10a12fa9..6f3e047eb 100644 --- a/freqtrade/strategy/interface.py +++ b/freqtrade/strategy/interface.py @@ -483,8 +483,6 @@ class IStrategy(ABC, HyperStrategyMixin): message = "No dataframe returned (return statement missing?)." elif 'buy' not in dataframe: message = "Buy column not set." - elif 'sell' not in dataframe: - message = "Sell column not set." elif df_len != len(dataframe): message = message_template.format("length") elif df_close != dataframe["close"].iloc[-1]: @@ -531,7 +529,11 @@ class IStrategy(ABC, HyperStrategyMixin): return False, False, None buy = latest[SignalType.BUY.value] == 1 - sell = latest[SignalType.SELL.value] == 1 + + sell = False + if SignalType.SELL.value in latest: + sell = latest[SignalType.SELL.value] == 1 + buy_tag = latest.get(SignalTagType.BUY_TAG.value, None) logger.debug('trigger: %s (pair=%s) buy=%s sell=%s', diff --git a/tests/strategy/test_interface.py b/tests/strategy/test_interface.py index 751f08344..d8c87506c 100644 --- a/tests/strategy/test_interface.py +++ b/tests/strategy/test_interface.py @@ -126,6 +126,27 @@ def test_get_signal_old_dataframe(default_conf, mocker, caplog, ohlcv_history): assert log_has('Outdated history for pair xyz. Last tick is 16 minutes old', caplog) +def test_get_signal_no_sell_column(default_conf, mocker, caplog, ohlcv_history): + # default_conf defines a 5m interval. we check interval * 2 + 5m + # this is necessary as the last candle is removed (partial candles) by default + ohlcv_history.loc[1, 'date'] = arrow.utcnow() + # Take a copy to correctly modify the call + mocked_history = ohlcv_history.copy() + # Intentionally don't set sell column + # mocked_history['sell'] = 0 + mocked_history['buy'] = 0 + mocked_history.loc[1, 'buy'] = 1 + + caplog.set_level(logging.INFO) + mocker.patch.object(_STRATEGY, 'assert_df') + + assert (True, False, None) == _STRATEGY.get_signal( + 'xyz', + default_conf['timeframe'], + mocked_history + ) + + def test_ignore_expired_candle(default_conf): default_conf.update({'strategy': 'DefaultStrategy'}) strategy = StrategyResolver.load_strategy(default_conf) @@ -197,10 +218,6 @@ def test_assert_df(ohlcv_history, caplog): match="Buy column not set"): _STRATEGY.assert_df(ohlcv_history.drop('buy', axis=1), len(ohlcv_history), ohlcv_history.loc[df_len, 'close'], ohlcv_history.loc[0, 'date']) - with pytest.raises(StrategyError, - match="Sell column not set"): - _STRATEGY.assert_df(ohlcv_history.drop('sell', axis=1), len(ohlcv_history), - ohlcv_history.loc[df_len, 'close'], ohlcv_history.loc[0, 'date']) _STRATEGY.disable_dataframe_checks = True caplog.clear()