Rename sell_profit_only to exit_profit_only
This commit is contained in:
parent
5c01969969
commit
bba9629a2a
@ -16,7 +16,7 @@
|
|||||||
"trailing_stop_positive_offset": 0.0051,
|
"trailing_stop_positive_offset": 0.0051,
|
||||||
"trailing_only_offset_is_reached": false,
|
"trailing_only_offset_is_reached": false,
|
||||||
"use_sell_signal": true,
|
"use_sell_signal": true,
|
||||||
"sell_profit_only": false,
|
"exit_profit_only": false,
|
||||||
"sell_profit_offset": 0.0,
|
"sell_profit_offset": 0.0,
|
||||||
"ignore_roi_if_buy_signal": false,
|
"ignore_roi_if_buy_signal": false,
|
||||||
"ignore_buying_expired_candle_after": 300,
|
"ignore_buying_expired_candle_after": 300,
|
||||||
|
@ -117,8 +117,8 @@ Mandatory parameters are marked as **Required**, which means that they are requi
|
|||||||
| `exit_pricing.use_order_book` | Enable exiting of open trades using [Order Book Exit](#exit-price-with-orderbook-enabled). <br> *Defaults to `True`.*<br> **Datatype:** Boolean
|
| `exit_pricing.use_order_book` | Enable exiting of open trades using [Order Book Exit](#exit-price-with-orderbook-enabled). <br> *Defaults to `True`.*<br> **Datatype:** Boolean
|
||||||
| `exit_pricing.order_book_top` | Bot will use the top N rate in Order Book "price_side" to sell. I.e. a value of 2 will allow the bot to pick the 2nd ask rate in [Order Book Exit](#exit-price-with-orderbook-enabled)<br>*Defaults to `1`.* <br> **Datatype:** Positive Integer
|
| `exit_pricing.order_book_top` | Bot will use the top N rate in Order Book "price_side" to sell. I.e. a value of 2 will allow the bot to pick the 2nd ask rate in [Order Book Exit](#exit-price-with-orderbook-enabled)<br>*Defaults to `1`.* <br> **Datatype:** Positive Integer
|
||||||
| `use_sell_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_sell_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
|
||||||
| `sell_profit_only` | Wait until the bot reaches `sell_profit_offset` before taking a sell 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
|
||||||
| `sell_profit_offset` | Sell-signal is only active above this value. Only active in combination with `sell_profit_only=True`. [Strategy Override](#parameters-in-the-strategy). <br>*Defaults to `0.0`.* <br> **Datatype:** Float (as ratio)
|
| `sell_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_sell_signal`. [Strategy Override](#parameters-in-the-strategy). <br>*Defaults to `false`.* <br> **Datatype:** Boolean
|
| `ignore_roi_if_buy_signal` | Do not sell if the buy signal is still active. This setting takes preference over `minimal_roi` and `use_sell_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
|
||||||
@ -199,7 +199,7 @@ Values set in the configuration file always overwrite values set in the strategy
|
|||||||
* `unfilledtimeout`
|
* `unfilledtimeout`
|
||||||
* `disable_dataframe_checks`
|
* `disable_dataframe_checks`
|
||||||
* `use_sell_signal`
|
* `use_sell_signal`
|
||||||
* `sell_profit_only`
|
* `exit_profit_only`
|
||||||
* `sell_profit_offset`
|
* `sell_profit_offset`
|
||||||
* `ignore_roi_if_buy_signal`
|
* `ignore_roi_if_buy_signal`
|
||||||
* `ignore_buying_expired_candle_after`
|
* `ignore_buying_expired_candle_after`
|
||||||
|
@ -91,7 +91,7 @@ For example you could implement a 1:2 risk-reward ROI with `custom_exit()`.
|
|||||||
Using custom_exit() signals in place of stoploss though *is not recommended*. It is a inferior method to using `custom_stoploss()` in this regard - which also allows you to keep the stoploss on exchange.
|
Using custom_exit() signals in place of stoploss though *is not recommended*. It is a inferior method to using `custom_stoploss()` in this regard - which also allows you to keep the stoploss on exchange.
|
||||||
|
|
||||||
!!! Note
|
!!! Note
|
||||||
Returning a (none-empty) `string` or `True` from this method is equal to setting sell signal on a candle at specified time. This method is not called when sell signal is set already, or if sell signals are disabled (`use_sell_signal=False` or `sell_profit_only=True` while profit is below `sell_profit_offset`). `string` max length is 64 characters. Exceeding this limit will cause the message to be truncated to 64 characters.
|
Returning a (none-empty) `string` or `True` from this method is equal to setting sell signal on a candle at specified time. This method is not called when sell signal is set already, or if sell signals are disabled (`use_sell_signal=False` or `exit_profit_only=True` while profit is below `sell_profit_offset`). `string` max length is 64 characters. Exceeding this limit will cause the message to be truncated to 64 characters.
|
||||||
|
|
||||||
An example of how we can use different indicators depending on the current profit and also sell trades that were open longer than one day:
|
An example of how we can use different indicators depending on the current profit and also sell trades that were open longer than one day:
|
||||||
|
|
||||||
|
@ -219,6 +219,7 @@ def validate_migrated_strategy_settings(conf: Dict[str, Any]) -> None:
|
|||||||
_validate_order_types(conf)
|
_validate_order_types(conf)
|
||||||
_validate_unfilledtimeout(conf)
|
_validate_unfilledtimeout(conf)
|
||||||
_validate_pricing_rules(conf)
|
_validate_pricing_rules(conf)
|
||||||
|
_strategy_settings(conf)
|
||||||
|
|
||||||
|
|
||||||
def _validate_time_in_force(conf: Dict[str, Any]) -> None:
|
def _validate_time_in_force(conf: Dict[str, Any]) -> None:
|
||||||
@ -312,3 +313,8 @@ def _validate_pricing_rules(conf: Dict[str, Any]) -> None:
|
|||||||
else:
|
else:
|
||||||
process_deprecated_setting(conf, 'ask_strategy', obj, 'exit_pricing', obj)
|
process_deprecated_setting(conf, 'ask_strategy', obj, 'exit_pricing', obj)
|
||||||
del conf['ask_strategy']
|
del conf['ask_strategy']
|
||||||
|
|
||||||
|
|
||||||
|
def _strategy_settings(conf: Dict[str, Any]) -> None:
|
||||||
|
|
||||||
|
process_deprecated_setting(conf, None, 'sell_profit_only', None, 'exit_profit_only')
|
||||||
|
@ -72,12 +72,7 @@ def process_temporary_deprecated_settings(config: Dict[str, Any]) -> None:
|
|||||||
# Kept for future deprecated / moved settings
|
# Kept for future deprecated / moved settings
|
||||||
# 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', 'use_sell_signal',
|
|
||||||
None, 'use_sell_signal')
|
|
||||||
process_deprecated_setting(config, 'ask_strategy', 'sell_profit_only',
|
|
||||||
None, 'sell_profit_only')
|
|
||||||
process_deprecated_setting(config, 'ask_strategy', 'sell_profit_offset',
|
|
||||||
None, 'sell_profit_offset')
|
|
||||||
process_deprecated_setting(config, 'ask_strategy', 'ignore_roi_if_buy_signal',
|
process_deprecated_setting(config, 'ask_strategy', 'ignore_roi_if_buy_signal',
|
||||||
None, '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',
|
||||||
@ -109,12 +104,15 @@ def process_temporary_deprecated_settings(config: Dict[str, Any]) -> None:
|
|||||||
'webhook', 'webhookexitfill')
|
'webhook', 'webhookexitfill')
|
||||||
|
|
||||||
# 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_sell_signal')
|
||||||
process_removed_setting(config, 'experimental', 'sell_profit_only',
|
process_removed_setting(config, 'experimental', 'sell_profit_only', None, 'sell_profit_only')
|
||||||
None, 'sell_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_buy_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')
|
||||||
|
|
||||||
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', {})):
|
||||||
|
@ -150,7 +150,7 @@ CONF_SCHEMA = {
|
|||||||
'trailing_stop_positive_offset': {'type': 'number', 'minimum': 0, 'maximum': 1},
|
'trailing_stop_positive_offset': {'type': 'number', 'minimum': 0, 'maximum': 1},
|
||||||
'trailing_only_offset_is_reached': {'type': 'boolean'},
|
'trailing_only_offset_is_reached': {'type': 'boolean'},
|
||||||
'use_sell_signal': {'type': 'boolean'},
|
'use_sell_signal': {'type': 'boolean'},
|
||||||
'sell_profit_only': {'type': 'boolean'},
|
'exit_profit_only': {'type': 'boolean'},
|
||||||
'sell_profit_offset': {'type': 'number'},
|
'sell_profit_offset': {'type': 'number'},
|
||||||
'ignore_roi_if_buy_signal': {'type': 'boolean'},
|
'ignore_roi_if_buy_signal': {'type': 'boolean'},
|
||||||
'ignore_buying_expired_candle_after': {'type': 'number'},
|
'ignore_buying_expired_candle_after': {'type': 'number'},
|
||||||
|
@ -461,7 +461,7 @@ def generate_strategy_stats(pairlist: List[str],
|
|||||||
'use_custom_stoploss': config.get('use_custom_stoploss', False),
|
'use_custom_stoploss': config.get('use_custom_stoploss', False),
|
||||||
'minimal_roi': config['minimal_roi'],
|
'minimal_roi': config['minimal_roi'],
|
||||||
'use_sell_signal': config['use_sell_signal'],
|
'use_sell_signal': config['use_sell_signal'],
|
||||||
'sell_profit_only': config['sell_profit_only'],
|
'exit_profit_only': config['exit_profit_only'],
|
||||||
'sell_profit_offset': config['sell_profit_offset'],
|
'sell_profit_offset': config['sell_profit_offset'],
|
||||||
'ignore_roi_if_buy_signal': config['ignore_roi_if_buy_signal'],
|
'ignore_roi_if_buy_signal': config['ignore_roi_if_buy_signal'],
|
||||||
**daily_stats,
|
**daily_stats,
|
||||||
|
@ -86,7 +86,7 @@ class StrategyResolver(IResolver):
|
|||||||
("startup_candle_count", None),
|
("startup_candle_count", None),
|
||||||
("unfilledtimeout", None),
|
("unfilledtimeout", None),
|
||||||
("use_sell_signal", True),
|
("use_sell_signal", True),
|
||||||
("sell_profit_only", False),
|
("exit_profit_only", False),
|
||||||
("ignore_roi_if_buy_signal", False),
|
("ignore_roi_if_buy_signal", False),
|
||||||
("sell_profit_offset", 0.0),
|
("sell_profit_offset", 0.0),
|
||||||
("disable_dataframe_checks", False),
|
("disable_dataframe_checks", False),
|
||||||
@ -187,9 +187,13 @@ class StrategyResolver(IResolver):
|
|||||||
if check_override(strategy, IStrategy, 'custom_sell'):
|
if check_override(strategy, IStrategy, 'custom_sell'):
|
||||||
raise OperationalException(
|
raise OperationalException(
|
||||||
"Please migrate your implementation of `custom_sell` to `custom_exit`.")
|
"Please migrate your implementation of `custom_sell` to `custom_exit`.")
|
||||||
|
warn_deprecated_setting(strategy, 'sell_profit_only', 'exit_profit_only', 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')
|
||||||
|
|
||||||
if (
|
if (
|
||||||
not check_override(strategy, IStrategy, 'populate_buy_trend')
|
not check_override(strategy, IStrategy, 'populate_buy_trend')
|
||||||
and not check_override(strategy, IStrategy, 'populate_entry_trend')
|
and not check_override(strategy, IStrategy, 'populate_entry_trend')
|
||||||
@ -262,6 +266,15 @@ class StrategyResolver(IResolver):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def warn_deprecated_setting(strategy: IStrategy, old: str, new: str, error: False):
|
||||||
|
if hasattr(strategy, old):
|
||||||
|
errormsg = f"DEPRECATED: Using '{old}' moved to '{new}'."
|
||||||
|
if error:
|
||||||
|
raise OperationalException(errormsg)
|
||||||
|
logger.warning(errormsg)
|
||||||
|
setattr(strategy, new, getattr(strategy, f'{old}'))
|
||||||
|
|
||||||
|
|
||||||
def check_override(object, parentclass, attribute):
|
def check_override(object, parentclass, attribute):
|
||||||
"""
|
"""
|
||||||
Checks if a object overrides the parent class attribute.
|
Checks if a object overrides the parent class attribute.
|
||||||
|
@ -91,7 +91,7 @@ class IStrategy(ABC, HyperStrategyMixin):
|
|||||||
process_only_new_candles: bool = False
|
process_only_new_candles: bool = False
|
||||||
|
|
||||||
use_sell_signal: bool
|
use_sell_signal: bool
|
||||||
sell_profit_only: bool
|
exit_profit_only: bool
|
||||||
sell_profit_offset: float
|
sell_profit_offset: float
|
||||||
ignore_roi_if_buy_signal: bool
|
ignore_roi_if_buy_signal: bool
|
||||||
|
|
||||||
@ -881,8 +881,8 @@ class IStrategy(ABC, HyperStrategyMixin):
|
|||||||
current_rate = rate
|
current_rate = rate
|
||||||
current_profit = trade.calc_profit_ratio(current_rate)
|
current_profit = trade.calc_profit_ratio(current_rate)
|
||||||
|
|
||||||
if (self.sell_profit_only and current_profit <= self.sell_profit_offset):
|
if (self.exit_profit_only and current_profit <= self.sell_profit_offset):
|
||||||
# sell_profit_only and profit doesn't reach the offset - ignore sell signal
|
# exit_profit_only and profit doesn't reach the offset - ignore sell signal
|
||||||
pass
|
pass
|
||||||
elif self.use_sell_signal and not enter:
|
elif self.use_sell_signal and not enter:
|
||||||
if exit_:
|
if exit_:
|
||||||
|
@ -66,7 +66,7 @@ class {{ strategy }}(IStrategy):
|
|||||||
|
|
||||||
# These values can be overridden in the config.
|
# These values can be overridden in the config.
|
||||||
use_sell_signal = True
|
use_sell_signal = True
|
||||||
sell_profit_only = False
|
exit_profit_only = False
|
||||||
ignore_roi_if_buy_signal = False
|
ignore_roi_if_buy_signal = False
|
||||||
|
|
||||||
# Number of candles the strategy requires before producing valid signals
|
# Number of candles the strategy requires before producing valid signals
|
||||||
|
@ -66,7 +66,7 @@ class SampleStrategy(IStrategy):
|
|||||||
|
|
||||||
# These values can be overridden in the config.
|
# These values can be overridden in the config.
|
||||||
use_sell_signal = True
|
use_sell_signal = True
|
||||||
sell_profit_only = False
|
exit_profit_only = False
|
||||||
ignore_roi_if_buy_signal = False
|
ignore_roi_if_buy_signal = False
|
||||||
|
|
||||||
# Hyperoptable parameters
|
# Hyperoptable parameters
|
||||||
|
@ -1152,7 +1152,7 @@ def test_backtest_start_multi_strat(default_conf, mocker, caplog, testdatadir):
|
|||||||
|
|
||||||
default_conf.update({
|
default_conf.update({
|
||||||
"use_sell_signal": True,
|
"use_sell_signal": True,
|
||||||
"sell_profit_only": False,
|
"exit_profit_only": False,
|
||||||
"sell_profit_offset": 0.0,
|
"sell_profit_offset": 0.0,
|
||||||
"ignore_roi_if_buy_signal": False,
|
"ignore_roi_if_buy_signal": False,
|
||||||
})
|
})
|
||||||
@ -1229,7 +1229,7 @@ def test_backtest_start_multi_strat(default_conf, mocker, caplog, testdatadir):
|
|||||||
def test_backtest_start_multi_strat_nomock(default_conf, mocker, caplog, testdatadir, capsys):
|
def test_backtest_start_multi_strat_nomock(default_conf, mocker, caplog, testdatadir, capsys):
|
||||||
default_conf.update({
|
default_conf.update({
|
||||||
"use_sell_signal": True,
|
"use_sell_signal": True,
|
||||||
"sell_profit_only": False,
|
"exit_profit_only": False,
|
||||||
"sell_profit_offset": 0.0,
|
"sell_profit_offset": 0.0,
|
||||||
"ignore_roi_if_buy_signal": False,
|
"ignore_roi_if_buy_signal": False,
|
||||||
})
|
})
|
||||||
@ -1347,7 +1347,7 @@ def test_backtest_start_nomock_futures(default_conf_usdt, mocker,
|
|||||||
"trading_mode": "futures",
|
"trading_mode": "futures",
|
||||||
"margin_mode": "isolated",
|
"margin_mode": "isolated",
|
||||||
"use_sell_signal": True,
|
"use_sell_signal": True,
|
||||||
"sell_profit_only": False,
|
"exit_profit_only": False,
|
||||||
"sell_profit_offset": 0.0,
|
"sell_profit_offset": 0.0,
|
||||||
"ignore_roi_if_buy_signal": False,
|
"ignore_roi_if_buy_signal": False,
|
||||||
"strategy": CURRENT_TEST_STRATEGY,
|
"strategy": CURRENT_TEST_STRATEGY,
|
||||||
@ -1451,7 +1451,7 @@ def test_backtest_start_multi_strat_nomock_detail(default_conf, mocker,
|
|||||||
# Tests detail-data loading
|
# Tests detail-data loading
|
||||||
default_conf.update({
|
default_conf.update({
|
||||||
"use_sell_signal": True,
|
"use_sell_signal": True,
|
||||||
"sell_profit_only": False,
|
"exit_profit_only": False,
|
||||||
"sell_profit_offset": 0.0,
|
"sell_profit_offset": 0.0,
|
||||||
"ignore_roi_if_buy_signal": False,
|
"ignore_roi_if_buy_signal": False,
|
||||||
})
|
})
|
||||||
@ -1558,7 +1558,7 @@ def test_backtest_start_multi_strat_caching(default_conf, mocker, caplog, testda
|
|||||||
start_delta, cache):
|
start_delta, cache):
|
||||||
default_conf.update({
|
default_conf.update({
|
||||||
"use_sell_signal": True,
|
"use_sell_signal": True,
|
||||||
"sell_profit_only": False,
|
"exit_profit_only": False,
|
||||||
"sell_profit_offset": 0.0,
|
"sell_profit_offset": 0.0,
|
||||||
"ignore_roi_if_buy_signal": False,
|
"ignore_roi_if_buy_signal": False,
|
||||||
})
|
})
|
||||||
|
@ -333,27 +333,27 @@ def test_strategy_override_use_sell_signal(caplog, default_conf):
|
|||||||
assert log_has("Override strategy 'use_sell_signal' with value in config file: False.", caplog)
|
assert log_has("Override strategy 'use_sell_signal' with value in config file: False.", caplog)
|
||||||
|
|
||||||
|
|
||||||
def test_strategy_override_use_sell_profit_only(caplog, default_conf):
|
def test_strategy_override_use_exit_profit_only(caplog, default_conf):
|
||||||
caplog.set_level(logging.INFO)
|
caplog.set_level(logging.INFO)
|
||||||
default_conf.update({
|
default_conf.update({
|
||||||
'strategy': CURRENT_TEST_STRATEGY,
|
'strategy': CURRENT_TEST_STRATEGY,
|
||||||
})
|
})
|
||||||
strategy = StrategyResolver.load_strategy(default_conf)
|
strategy = StrategyResolver.load_strategy(default_conf)
|
||||||
assert not strategy.sell_profit_only
|
assert not strategy.exit_profit_only
|
||||||
assert isinstance(strategy.sell_profit_only, bool)
|
assert isinstance(strategy.exit_profit_only, bool)
|
||||||
# must be inserted to configuration
|
# must be inserted to configuration
|
||||||
assert 'sell_profit_only' in default_conf
|
assert 'exit_profit_only' in default_conf
|
||||||
assert not default_conf['sell_profit_only']
|
assert not default_conf['exit_profit_only']
|
||||||
|
|
||||||
default_conf.update({
|
default_conf.update({
|
||||||
'strategy': CURRENT_TEST_STRATEGY,
|
'strategy': CURRENT_TEST_STRATEGY,
|
||||||
'sell_profit_only': True,
|
'exit_profit_only': True,
|
||||||
})
|
})
|
||||||
strategy = StrategyResolver.load_strategy(default_conf)
|
strategy = StrategyResolver.load_strategy(default_conf)
|
||||||
|
|
||||||
assert strategy.sell_profit_only
|
assert strategy.exit_profit_only
|
||||||
assert isinstance(strategy.sell_profit_only, bool)
|
assert isinstance(strategy.exit_profit_only, bool)
|
||||||
assert log_has("Override strategy 'sell_profit_only' with value in config file: True.", caplog)
|
assert log_has("Override strategy 'exit_profit_only' with value in config file: True.", caplog)
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.filterwarnings("ignore:deprecated")
|
@pytest.mark.filterwarnings("ignore:deprecated")
|
||||||
|
@ -3637,7 +3637,7 @@ def test_execute_trade_exit_insufficient_funds_error(default_conf_usdt, ticker_u
|
|||||||
(False, 0.10, 0.22, True, False, ExitType.EXIT_SIGNAL.value, False),
|
(False, 0.10, 0.22, True, False, ExitType.EXIT_SIGNAL.value, False),
|
||||||
(False, 0.10, 0.22, True, False, ExitType.EXIT_SIGNAL.value, True),
|
(False, 0.10, 0.22, True, False, ExitType.EXIT_SIGNAL.value, True),
|
||||||
])
|
])
|
||||||
def test_sell_profit_only(
|
def test_exit_profit_only(
|
||||||
default_conf_usdt, limit_order, limit_order_open, is_short,
|
default_conf_usdt, limit_order, limit_order_open, is_short,
|
||||||
fee, mocker, profit_only, bid, ask, handle_first, handle_second, exit_type) -> None:
|
fee, mocker, profit_only, bid, ask, handle_first, handle_second, exit_type) -> None:
|
||||||
patch_RPCManager(mocker)
|
patch_RPCManager(mocker)
|
||||||
@ -3658,7 +3658,7 @@ def test_sell_profit_only(
|
|||||||
)
|
)
|
||||||
default_conf_usdt.update({
|
default_conf_usdt.update({
|
||||||
'use_sell_signal': True,
|
'use_sell_signal': True,
|
||||||
'sell_profit_only': profit_only,
|
'exit_profit_only': profit_only,
|
||||||
'sell_profit_offset': 0.1,
|
'sell_profit_offset': 0.1,
|
||||||
})
|
})
|
||||||
freqtrade = FreqtradeBot(default_conf_usdt)
|
freqtrade = FreqtradeBot(default_conf_usdt)
|
||||||
|
File diff suppressed because one or more lines are too long
2
tests/testdata/backtest-result_new.json
vendored
2
tests/testdata/backtest-result_new.json
vendored
File diff suppressed because one or more lines are too long
10
tests/testdata/strategy_SampleStrategy.fthypt
vendored
10
tests/testdata/strategy_SampleStrategy.fthypt
vendored
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user