Don't fail if strategy doesn't contain sell signal
This commit is contained in:
parent
d8d8261f1b
commit
c981641441
@ -483,8 +483,6 @@ class IStrategy(ABC, HyperStrategyMixin):
|
|||||||
message = "No dataframe returned (return statement missing?)."
|
message = "No dataframe returned (return statement missing?)."
|
||||||
elif 'buy' not in dataframe:
|
elif 'buy' not in dataframe:
|
||||||
message = "Buy column not set."
|
message = "Buy column not set."
|
||||||
elif 'sell' not in dataframe:
|
|
||||||
message = "Sell column not set."
|
|
||||||
elif df_len != len(dataframe):
|
elif df_len != len(dataframe):
|
||||||
message = message_template.format("length")
|
message = message_template.format("length")
|
||||||
elif df_close != dataframe["close"].iloc[-1]:
|
elif df_close != dataframe["close"].iloc[-1]:
|
||||||
@ -531,7 +529,11 @@ class IStrategy(ABC, HyperStrategyMixin):
|
|||||||
return False, False, None
|
return False, False, None
|
||||||
|
|
||||||
buy = latest[SignalType.BUY.value] == 1
|
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)
|
buy_tag = latest.get(SignalTagType.BUY_TAG.value, None)
|
||||||
|
|
||||||
logger.debug('trigger: %s (pair=%s) buy=%s sell=%s',
|
logger.debug('trigger: %s (pair=%s) buy=%s sell=%s',
|
||||||
|
@ -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)
|
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):
|
def test_ignore_expired_candle(default_conf):
|
||||||
default_conf.update({'strategy': 'DefaultStrategy'})
|
default_conf.update({'strategy': 'DefaultStrategy'})
|
||||||
strategy = StrategyResolver.load_strategy(default_conf)
|
strategy = StrategyResolver.load_strategy(default_conf)
|
||||||
@ -197,10 +218,6 @@ def test_assert_df(ohlcv_history, caplog):
|
|||||||
match="Buy column not set"):
|
match="Buy column not set"):
|
||||||
_STRATEGY.assert_df(ohlcv_history.drop('buy', axis=1), len(ohlcv_history),
|
_STRATEGY.assert_df(ohlcv_history.drop('buy', axis=1), len(ohlcv_history),
|
||||||
ohlcv_history.loc[df_len, 'close'], ohlcv_history.loc[0, 'date'])
|
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
|
_STRATEGY.disable_dataframe_checks = True
|
||||||
caplog.clear()
|
caplog.clear()
|
||||||
|
Loading…
Reference in New Issue
Block a user