ignore_roi_if_buy_signal -> ignore_roi_if_entry_signal

This commit is contained in:
Matthias 2022-04-05 20:20:51 +02:00
parent 5bafdb6108
commit b1378efdeb
17 changed files with 42 additions and 38 deletions

View File

@ -18,7 +18,7 @@
"use_exit_signal": true, "use_exit_signal": true,
"exit_profit_only": false, "exit_profit_only": false,
"exit_profit_offset": 0.0, "exit_profit_offset": 0.0,
"ignore_roi_if_buy_signal": false, "ignore_roi_if_entry_signal": false,
"ignore_buying_expired_candle_after": 300, "ignore_buying_expired_candle_after": 300,
"trading_mode": "spot", "trading_mode": "spot",
"margin_mode": "", "margin_mode": "",

View File

@ -119,7 +119,7 @@ Mandatory parameters are marked as **Required**, which means that they are requi
| `use_exit_signal` | Use sell signals produced by the strategy in addition to the `minimal_roi`. [Strategy Override](#parameters-in-the-strategy). <br>*Defaults to `true`.* <br> **Datatype:** Boolean | `use_exit_signal` | Use sell signals produced by the strategy in addition to the `minimal_roi`. [Strategy Override](#parameters-in-the-strategy). <br>*Defaults to `true`.* <br> **Datatype:** Boolean
| `exit_profit_only` | Wait until the bot reaches `exit_profit_offset` before taking an exit decision. [Strategy Override](#parameters-in-the-strategy). <br>*Defaults to `false`.* <br> **Datatype:** Boolean | `exit_profit_only` | Wait until the bot reaches `exit_profit_offset` before taking an exit decision. [Strategy Override](#parameters-in-the-strategy). <br>*Defaults to `false`.* <br> **Datatype:** Boolean
| `exit_profit_offset` | Sell-signal is only active above this value. Only active in combination with `exit_profit_only=True`. [Strategy Override](#parameters-in-the-strategy). <br>*Defaults to `0.0`.* <br> **Datatype:** Float (as ratio) | `exit_profit_offset` | Sell-signal is only active above this value. Only active in combination with `exit_profit_only=True`. [Strategy Override](#parameters-in-the-strategy). <br>*Defaults to `0.0`.* <br> **Datatype:** Float (as ratio)
| `ignore_roi_if_buy_signal` | Do not sell if the buy signal is still active. This setting takes preference over `minimal_roi` and `use_exit_signal`. [Strategy Override](#parameters-in-the-strategy). <br>*Defaults to `false`.* <br> **Datatype:** Boolean | `ignore_roi_if_entry_signal` | Do not sell if the buy signal is still active. This setting takes preference over `minimal_roi` and `use_exit_signal`. [Strategy Override](#parameters-in-the-strategy). <br>*Defaults to `false`.* <br> **Datatype:** Boolean
| `ignore_buying_expired_candle_after` | Specifies the number of seconds until a buy signal is no longer used. <br> **Datatype:** Integer | `ignore_buying_expired_candle_after` | Specifies the number of seconds until a buy signal is no longer used. <br> **Datatype:** Integer
| `order_types` | Configure order-types depending on the action (`"entry"`, `"exit"`, `"stoploss"`, `"stoploss_on_exchange"`). [More information below](#understand-order_types). [Strategy Override](#parameters-in-the-strategy).<br> **Datatype:** Dict | `order_types` | Configure order-types depending on the action (`"entry"`, `"exit"`, `"stoploss"`, `"stoploss_on_exchange"`). [More information below](#understand-order_types). [Strategy Override](#parameters-in-the-strategy).<br> **Datatype:** Dict
| `order_time_in_force` | Configure time in force for entry and exit orders. [More information below](#understand-order_time_in_force). [Strategy Override](#parameters-in-the-strategy). <br> **Datatype:** Dict | `order_time_in_force` | Configure time in force for entry and exit orders. [More information below](#understand-order_time_in_force). [Strategy Override](#parameters-in-the-strategy). <br> **Datatype:** Dict
@ -201,7 +201,7 @@ Values set in the configuration file always overwrite values set in the strategy
- `use_exit_signal` - `use_exit_signal`
* `exit_profit_only` * `exit_profit_only`
- `exit_profit_offset` - `exit_profit_offset`
* `ignore_roi_if_buy_signal` - `ignore_roi_if_entry_signal`
* `ignore_buying_expired_candle_after` * `ignore_buying_expired_candle_after`
* `position_adjustment_enable` * `position_adjustment_enable`
* `max_entry_position_adjustment` * `max_entry_position_adjustment`

View File

@ -320,3 +320,5 @@ def _strategy_settings(conf: Dict[str, Any]) -> None:
process_deprecated_setting(conf, None, 'use_sell_signal', None, 'use_exit_signal') process_deprecated_setting(conf, None, 'use_sell_signal', None, 'use_exit_signal')
process_deprecated_setting(conf, None, 'sell_profit_only', None, 'exit_profit_only') process_deprecated_setting(conf, None, 'sell_profit_only', None, 'exit_profit_only')
process_deprecated_setting(conf, None, 'sell_profit_offset', None, 'exit_profit_offset') process_deprecated_setting(conf, None, 'sell_profit_offset', None, 'exit_profit_offset')
process_deprecated_setting(conf, None, 'ignore_roi_if_buy_signal',
None, 'ignore_roi_if_entry_signal')

View File

@ -73,8 +73,6 @@ def process_temporary_deprecated_settings(config: Dict[str, Any]) -> None:
# check_conflicting_settings(config, 'ask_strategy', 'use_sell_signal', # check_conflicting_settings(config, 'ask_strategy', 'use_sell_signal',
# 'experimental', 'use_sell_signal') # 'experimental', 'use_sell_signal')
process_deprecated_setting(config, 'ask_strategy', 'ignore_roi_if_buy_signal',
None, 'ignore_roi_if_buy_signal')
process_deprecated_setting(config, 'ask_strategy', 'ignore_buying_expired_candle_after', process_deprecated_setting(config, 'ask_strategy', 'ignore_buying_expired_candle_after',
None, 'ignore_buying_expired_candle_after') None, 'ignore_buying_expired_candle_after')
# New settings # New settings
@ -105,15 +103,17 @@ def process_temporary_deprecated_settings(config: Dict[str, Any]) -> None:
# Legacy way - having them in experimental ... # Legacy way - having them in experimental ...
process_removed_setting(config, 'experimental', 'use_sell_signal', None, 'use_sell_signal') process_removed_setting(config, 'experimental', 'use_sell_signal', None, 'use_exit_signal')
process_removed_setting(config, 'experimental', 'sell_profit_only', None, 'sell_profit_only') process_removed_setting(config, 'experimental', 'sell_profit_only', None, 'exit_profit_only')
process_removed_setting(config, 'experimental', 'ignore_roi_if_buy_signal', process_removed_setting(config, 'experimental', 'ignore_roi_if_buy_signal',
None, 'ignore_roi_if_buy_signal') None, 'ignore_roi_if_entry_signal')
process_removed_setting(config, 'ask_strategy', 'use_sell_signal', None, 'use_sell_signal')
process_removed_setting(config, 'ask_strategy', 'sell_profit_only', None, 'sell_profit_only')
process_removed_setting(config, 'ask_strategy', 'sell_profit_offset',
None, 'sell_profit_offset')
process_removed_setting(config, 'ask_strategy', 'use_sell_signal', None, 'exit_sell_signal')
process_removed_setting(config, 'ask_strategy', 'sell_profit_only', None, 'exit_profit_only')
process_removed_setting(config, 'ask_strategy', 'sell_profit_offset',
None, 'exit_profit_offset')
process_removed_setting(config, 'ask_strategy', 'ignore_roi_if_buy_signal',
None, 'ignore_roi_if_entry_signal')
if (config.get('edge', {}).get('enabled', False) if (config.get('edge', {}).get('enabled', False)
and 'capital_available_percentage' in config.get('edge', {})): and 'capital_available_percentage' in config.get('edge', {})):
raise OperationalException( raise OperationalException(

View File

@ -152,7 +152,7 @@ CONF_SCHEMA = {
'use_exit_signal': {'type': 'boolean'}, 'use_exit_signal': {'type': 'boolean'},
'exit_profit_only': {'type': 'boolean'}, 'exit_profit_only': {'type': 'boolean'},
'exit_profit_offset': {'type': 'number'}, 'exit_profit_offset': {'type': 'number'},
'ignore_roi_if_buy_signal': {'type': 'boolean'}, 'ignore_roi_if_entry_signal': {'type': 'boolean'},
'ignore_buying_expired_candle_after': {'type': 'number'}, 'ignore_buying_expired_candle_after': {'type': 'number'},
'trading_mode': {'type': 'string', 'enum': TRADING_MODES}, 'trading_mode': {'type': 'string', 'enum': TRADING_MODES},
'margin_mode': {'type': 'string', 'enum': MARGIN_MODES}, 'margin_mode': {'type': 'string', 'enum': MARGIN_MODES},

View File

@ -927,7 +927,7 @@ class FreqtradeBot(LoggingMixin):
exit_signal_type = "exit_short" if trade.is_short else "exit_long" exit_signal_type = "exit_short" if trade.is_short else "exit_long"
if (self.config.get('use_exit_signal', True) or if (self.config.get('use_exit_signal', True) or
self.config.get('ignore_roi_if_buy_signal', False)): self.config.get('ignore_roi_if_entry_signal', False)):
analyzed_df, _ = self.dataprovider.get_analyzed_dataframe(trade.pair, analyzed_df, _ = self.dataprovider.get_analyzed_dataframe(trade.pair,
self.strategy.timeframe) self.strategy.timeframe)

View File

@ -463,7 +463,7 @@ def generate_strategy_stats(pairlist: List[str],
'use_exit_signal': config['use_exit_signal'], 'use_exit_signal': config['use_exit_signal'],
'exit_profit_only': config['exit_profit_only'], 'exit_profit_only': config['exit_profit_only'],
'exit_profit_offset': config['exit_profit_offset'], 'exit_profit_offset': config['exit_profit_offset'],
'ignore_roi_if_buy_signal': config['ignore_roi_if_buy_signal'], 'ignore_roi_if_entry_signal': config['ignore_roi_if_entry_signal'],
**daily_stats, **daily_stats,
**trade_stats **trade_stats
} }

View File

@ -87,7 +87,7 @@ class StrategyResolver(IResolver):
("unfilledtimeout", None), ("unfilledtimeout", None),
("use_exit_signal", True), ("use_exit_signal", True),
("exit_profit_only", False), ("exit_profit_only", False),
("ignore_roi_if_buy_signal", False), ("ignore_roi_if_entry_signal", False),
("exit_profit_offset", 0.0), ("exit_profit_offset", 0.0),
("disable_dataframe_checks", False), ("disable_dataframe_checks", False),
("ignore_buying_expired_candle_after", 0), ("ignore_buying_expired_candle_after", 0),
@ -190,12 +190,16 @@ class StrategyResolver(IResolver):
warn_deprecated_setting(strategy, 'sell_profit_only', 'exit_profit_only', True) warn_deprecated_setting(strategy, 'sell_profit_only', 'exit_profit_only', True)
warn_deprecated_setting(strategy, 'sell_profit_offset', 'exit_profit_offset', True) warn_deprecated_setting(strategy, 'sell_profit_offset', 'exit_profit_offset', True)
warn_deprecated_setting(strategy, 'use_sell_signal', 'use_exit_signal', True) warn_deprecated_setting(strategy, 'use_sell_signal', 'use_exit_signal', True)
warn_deprecated_setting(strategy, 'ignore_roi_if_buy_signal',
'ignore_roi_if_entry_signal', True)
else: else:
# TODO: Implementing one of the following methods should show a deprecation warning # TODO: Implementing one of the following methods should show a deprecation warning
# buy_trend and sell_trend, custom_sell # buy_trend and sell_trend, custom_sell
warn_deprecated_setting(strategy, 'sell_profit_only', 'exit_profit_only') warn_deprecated_setting(strategy, 'sell_profit_only', 'exit_profit_only')
warn_deprecated_setting(strategy, 'sell_profit_offset', 'exit_profit_offset') warn_deprecated_setting(strategy, 'sell_profit_offset', 'exit_profit_offset')
warn_deprecated_setting(strategy, 'use_sell_signal', 'use_exit_signal') warn_deprecated_setting(strategy, 'use_sell_signal', 'use_exit_signal')
warn_deprecated_setting(strategy, 'ignore_roi_if_buy_signal',
'ignore_roi_if_entry_signal')
if ( if (
not check_override(strategy, IStrategy, 'populate_buy_trend') not check_override(strategy, IStrategy, 'populate_buy_trend')

View File

@ -93,7 +93,7 @@ class IStrategy(ABC, HyperStrategyMixin):
use_exit_signal: bool use_exit_signal: bool
exit_profit_only: bool exit_profit_only: bool
exit_profit_offset: float exit_profit_offset: float
ignore_roi_if_buy_signal: bool ignore_roi_if_entry_signal: bool
# Position adjustment is disabled by default # Position adjustment is disabled by default
position_adjustment_enable: bool = False position_adjustment_enable: bool = False
@ -871,7 +871,7 @@ class IStrategy(ABC, HyperStrategyMixin):
current_profit = trade.calc_profit_ratio(current_rate) current_profit = trade.calc_profit_ratio(current_rate)
# if enter signal and ignore_roi is set, we don't need to evaluate min_roi. # if enter signal and ignore_roi is set, we don't need to evaluate min_roi.
roi_reached = (not (enter and self.ignore_roi_if_buy_signal) roi_reached = (not (enter and self.ignore_roi_if_entry_signal)
and self.min_roi_reached(trade=trade, current_profit=current_profit, and self.min_roi_reached(trade=trade, current_profit=current_profit,
current_time=current_time)) current_time=current_time))

View File

@ -67,7 +67,7 @@ class {{ strategy }}(IStrategy):
# These values can be overridden in the config. # These values can be overridden in the config.
use_exit_signal = True use_exit_signal = True
exit_profit_only = False exit_profit_only = False
ignore_roi_if_buy_signal = False ignore_roi_if_entry_signal = False
# Number of candles the strategy requires before producing valid signals # Number of candles the strategy requires before producing valid signals
startup_candle_count: int = 30 startup_candle_count: int = 30

View File

@ -67,7 +67,7 @@ class SampleStrategy(IStrategy):
# These values can be overridden in the config. # These values can be overridden in the config.
use_exit_signal = True use_exit_signal = True
exit_profit_only = False exit_profit_only = False
ignore_roi_if_buy_signal = False ignore_roi_if_entry_signal = False
# Hyperoptable parameters # Hyperoptable parameters
buy_rsi = IntParameter(low=1, high=50, default=30, space='buy', optimize=True, load=True) buy_rsi = IntParameter(low=1, high=50, default=30, space='buy', optimize=True, load=True)

View File

@ -1154,7 +1154,7 @@ def test_backtest_start_multi_strat(default_conf, mocker, caplog, testdatadir):
"use_exit_signal": True, "use_exit_signal": True,
"exit_profit_only": False, "exit_profit_only": False,
"exit_profit_offset": 0.0, "exit_profit_offset": 0.0,
"ignore_roi_if_buy_signal": False, "ignore_roi_if_entry_signal": False,
}) })
patch_exchange(mocker) patch_exchange(mocker)
backtestmock = MagicMock(return_value={ backtestmock = MagicMock(return_value={
@ -1231,7 +1231,7 @@ def test_backtest_start_multi_strat_nomock(default_conf, mocker, caplog, testdat
"use_exit_signal": True, "use_exit_signal": True,
"exit_profit_only": False, "exit_profit_only": False,
"exit_profit_offset": 0.0, "exit_profit_offset": 0.0,
"ignore_roi_if_buy_signal": False, "ignore_roi_if_entry_signal": False,
}) })
patch_exchange(mocker) patch_exchange(mocker)
result1 = pd.DataFrame({'pair': ['XRP/BTC', 'LTC/BTC'], result1 = pd.DataFrame({'pair': ['XRP/BTC', 'LTC/BTC'],
@ -1349,7 +1349,7 @@ def test_backtest_start_nomock_futures(default_conf_usdt, mocker,
"use_exit_signal": True, "use_exit_signal": True,
"exit_profit_only": False, "exit_profit_only": False,
"exit_profit_offset": 0.0, "exit_profit_offset": 0.0,
"ignore_roi_if_buy_signal": False, "ignore_roi_if_entry_signal": False,
"strategy": CURRENT_TEST_STRATEGY, "strategy": CURRENT_TEST_STRATEGY,
}) })
patch_exchange(mocker) patch_exchange(mocker)
@ -1453,7 +1453,7 @@ def test_backtest_start_multi_strat_nomock_detail(default_conf, mocker,
"use_exit_signal": True, "use_exit_signal": True,
"exit_profit_only": False, "exit_profit_only": False,
"exit_profit_offset": 0.0, "exit_profit_offset": 0.0,
"ignore_roi_if_buy_signal": False, "ignore_roi_if_entry_signal": False,
}) })
patch_exchange(mocker) patch_exchange(mocker)
result1 = pd.DataFrame({'pair': ['XRP/BTC', 'LTC/BTC'], result1 = pd.DataFrame({'pair': ['XRP/BTC', 'LTC/BTC'],
@ -1560,7 +1560,7 @@ def test_backtest_start_multi_strat_caching(default_conf, mocker, caplog, testda
"use_exit_signal": True, "use_exit_signal": True,
"exit_profit_only": False, "exit_profit_only": False,
"exit_profit_offset": 0.0, "exit_profit_offset": 0.0,
"ignore_roi_if_buy_signal": False, "ignore_roi_if_entry_signal": False,
}) })
patch_exchange(mocker) patch_exchange(mocker)
backtestmock = MagicMock(return_value={ backtestmock = MagicMock(return_value={

View File

@ -1240,8 +1240,6 @@ def test_pairlist_resolving_fallback(mocker):
@pytest.mark.parametrize("setting", [ @pytest.mark.parametrize("setting", [
("webhook", "webhookbuy", 'testWEbhook', ("webhook", "webhookbuy", 'testWEbhook',
"webhook", "webhookentry", 'testWEbhook'), "webhook", "webhookentry", 'testWEbhook'),
("ask_strategy", "ignore_roi_if_buy_signal", True,
None, "ignore_roi_if_buy_signal", False),
("ask_strategy", "ignore_buying_expired_candle_after", 5, ("ask_strategy", "ignore_buying_expired_candle_after", 5,
None, "ignore_buying_expired_candle_after", 6), None, "ignore_buying_expired_candle_after", 6),
]) ])

View File

@ -3799,7 +3799,7 @@ def test_locked_pairs(default_conf_usdt, ticker_usdt, fee,
@pytest.mark.parametrize("is_short", [False, True]) @pytest.mark.parametrize("is_short", [False, True])
def test_ignore_roi_if_buy_signal(default_conf_usdt, limit_order, limit_order_open, is_short, def test_ignore_roi_if_entry_signal(default_conf_usdt, limit_order, limit_order_open, is_short,
fee, mocker) -> None: fee, mocker) -> None:
patch_RPCManager(mocker) patch_RPCManager(mocker)
patch_exchange(mocker) patch_exchange(mocker)
@ -3817,7 +3817,7 @@ def test_ignore_roi_if_buy_signal(default_conf_usdt, limit_order, limit_order_op
]), ]),
get_fee=fee, get_fee=fee,
) )
default_conf_usdt['ignore_roi_if_buy_signal'] = True default_conf_usdt['ignore_roi_if_entry_signal'] = True
freqtrade = FreqtradeBot(default_conf_usdt) freqtrade = FreqtradeBot(default_conf_usdt)
patch_get_signal(freqtrade, enter_short=is_short, enter_long=not is_short) patch_get_signal(freqtrade, enter_short=is_short, enter_long=not is_short)
@ -4016,7 +4016,7 @@ def test_trailing_stop_loss_positive(
@pytest.mark.parametrize("is_short", [False, True]) @pytest.mark.parametrize("is_short", [False, True])
def test_disable_ignore_roi_if_buy_signal(default_conf_usdt, limit_order, limit_order_open, def test_disable_ignore_roi_if_entry_signal(default_conf_usdt, limit_order, limit_order_open,
is_short, fee, mocker) -> None: is_short, fee, mocker) -> None:
patch_RPCManager(mocker) patch_RPCManager(mocker)
patch_exchange(mocker) patch_exchange(mocker)
@ -4037,7 +4037,7 @@ def test_disable_ignore_roi_if_buy_signal(default_conf_usdt, limit_order, limit_
_is_dry_limit_order_filled=MagicMock(return_value=False), _is_dry_limit_order_filled=MagicMock(return_value=False),
) )
default_conf_usdt['exit_pricing'] = { default_conf_usdt['exit_pricing'] = {
'ignore_roi_if_buy_signal': False 'ignore_roi_if_entry_signal': False
} }
freqtrade = FreqtradeBot(default_conf_usdt) freqtrade = FreqtradeBot(default_conf_usdt)
patch_get_signal(freqtrade, enter_short=is_short, enter_long=not is_short) patch_get_signal(freqtrade, enter_short=is_short, enter_long=not is_short)

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long