Update docs and tests for newly deprectated settings

This commit is contained in:
Matthias 2021-06-26 17:11:15 +02:00
parent b7f01a08f3
commit ce69abc06e
2 changed files with 37 additions and 29 deletions

View File

@ -81,11 +81,11 @@ Mandatory parameters are marked as **Required**, which means that they are requi
| `ask_strategy.bid_last_balance` | Interpolate the selling price. More information [below](#sell-price-without-orderbook-enabled). | `ask_strategy.bid_last_balance` | Interpolate the selling price. More information [below](#sell-price-without-orderbook-enabled).
| `ask_strategy.use_order_book` | Enable selling of open trades using [Order Book Asks](#sell-price-with-orderbook-enabled). <br> **Datatype:** Boolean | `ask_strategy.use_order_book` | Enable selling of open trades using [Order Book Asks](#sell-price-with-orderbook-enabled). <br> **Datatype:** Boolean
| `ask_strategy.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 Asks](#sell-price-with-orderbook-enabled)<br>*Defaults to `1`.* <br> **Datatype:** Positive Integer | `ask_strategy.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 Asks](#sell-price-with-orderbook-enabled)<br>*Defaults to `1`.* <br> **Datatype:** Positive Integer
| `ask_strategy.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
| `ask_strategy.sell_profit_only` | Wait until the bot reaches `ask_strategy.sell_profit_offset` before taking a sell decision. [Strategy Override](#parameters-in-the-strategy). <br>*Defaults to `false`.* <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
| `ask_strategy.sell_profit_offset` | Sell-signal is only active above this value. [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. [Strategy Override](#parameters-in-the-strategy). <br>*Defaults to `0.0`.* <br> **Datatype:** Float (as ratio)
| `ask_strategy.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
| `ask_strategy.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 (`"buy"`, `"sell"`, `"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 (`"buy"`, `"sell"`, `"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 buy and sell 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 buy and sell orders. [More information below](#understand-order_time_in_force). [Strategy Override](#parameters-in-the-strategy). <br> **Datatype:** Dict
| `exchange.name` | **Required.** Name of the exchange class to use. [List below](#user-content-what-values-for-exchangename). <br> **Datatype:** String | `exchange.name` | **Required.** Name of the exchange class to use. [List below](#user-content-what-values-for-exchangename). <br> **Datatype:** String
@ -156,11 +156,11 @@ Values set in the configuration file always overwrite values set in the strategy
* `order_time_in_force` * `order_time_in_force`
* `unfilledtimeout` * `unfilledtimeout`
* `disable_dataframe_checks` * `disable_dataframe_checks`
* `use_sell_signal` (ask_strategy) * `use_sell_signal`
* `sell_profit_only` (ask_strategy) * `sell_profit_only`
* `sell_profit_offset` (ask_strategy) * `sell_profit_offset`
* `ignore_roi_if_buy_signal` (ask_strategy) * `ignore_roi_if_buy_signal`
* `ignore_buying_expired_candle_after` (ask_strategy) * `ignore_buying_expired_candle_after`
### Configuring amount per trade ### Configuring amount per trade
@ -291,16 +291,16 @@ See [the telegram documentation](telegram-usage.md) for details on usage.
When working with larger timeframes (for example 1h or more) and using a low `max_open_trades` value, the last candle can be processed as soon as a trade slot becomes available. When processing the last candle, this can lead to a situation where it may not be desirable to use the buy signal on that candle. For example, when using a condition in your strategy where you use a cross-over, that point may have passed too long ago for you to start a trade on it. When working with larger timeframes (for example 1h or more) and using a low `max_open_trades` value, the last candle can be processed as soon as a trade slot becomes available. When processing the last candle, this can lead to a situation where it may not be desirable to use the buy signal on that candle. For example, when using a condition in your strategy where you use a cross-over, that point may have passed too long ago for you to start a trade on it.
In these situations, you can enable the functionality to ignore candles that are beyond a specified period by setting `ask_strategy.ignore_buying_expired_candle_after` to a positive number, indicating the number of seconds after which the buy signal becomes expired. In these situations, you can enable the functionality to ignore candles that are beyond a specified period by setting `ignore_buying_expired_candle_after` to a positive number, indicating the number of seconds after which the buy signal becomes expired.
For example, if your strategy is using a 1h timeframe, and you only want to buy within the first 5 minutes when a new candle comes in, you can add the following configuration to your strategy: For example, if your strategy is using a 1h timeframe, and you only want to buy within the first 5 minutes when a new candle comes in, you can add the following configuration to your strategy:
``` json ``` json
"ask_strategy":{ {
//...
"ignore_buying_expired_candle_after": 300, "ignore_buying_expired_candle_after": 300,
"price_side": "bid",
// ... // ...
}, }
``` ```
!!! Note !!! Note

View File

@ -1128,11 +1128,10 @@ def test_pairlist_resolving_fallback(mocker):
assert config['datadir'] == Path.cwd() / "user_data/data/binance" assert config['datadir'] == Path.cwd() / "user_data/data/binance"
@pytest.mark.skip(reason='Currently no deprecated / moved sections')
# The below is kept as a sample for the future. # The below is kept as a sample for the future.
@pytest.mark.parametrize("setting", [ @pytest.mark.parametrize("setting", [
("ask_strategy", "use_sell_signal", True, ("ask_strategy", "use_sell_signal", True,
"experimental", "use_sell_signal", False), None, "use_sell_signal", False),
]) ])
def test_process_temporary_deprecated_settings(mocker, default_conf, setting, caplog): def test_process_temporary_deprecated_settings(mocker, default_conf, setting, caplog):
patched_configuration_load_config_file(mocker, default_conf) patched_configuration_load_config_file(mocker, default_conf)
@ -1141,10 +1140,14 @@ def test_process_temporary_deprecated_settings(mocker, default_conf, setting, ca
# (they may not exist in the config) # (they may not exist in the config)
default_conf[setting[0]] = {} default_conf[setting[0]] = {}
default_conf[setting[3]] = {} default_conf[setting[3]] = {}
# Assign new setting
default_conf[setting[0]][setting[1]] = setting[2]
# Assign deprecated setting # Assign deprecated setting
default_conf[setting[0]][setting[1]] = setting[2]
# Assign new setting
if setting[3]:
default_conf[setting[3]][setting[4]] = setting[5] default_conf[setting[3]][setting[4]] = setting[5]
else:
default_conf[setting[4]] = setting[5]
# New and deprecated settings are conflicting ones # New and deprecated settings are conflicting ones
with pytest.raises(OperationalException, match=r'DEPRECATED'): with pytest.raises(OperationalException, match=r'DEPRECATED'):
@ -1153,13 +1156,20 @@ def test_process_temporary_deprecated_settings(mocker, default_conf, setting, ca
caplog.clear() caplog.clear()
# Delete new setting # Delete new setting
del default_conf[setting[0]][setting[1]] if setting[3]:
del default_conf[setting[3]][setting[4]]
else:
del default_conf[setting[4]]
process_temporary_deprecated_settings(default_conf) process_temporary_deprecated_settings(default_conf)
assert log_has_re('DEPRECATED', caplog) assert log_has_re('DEPRECATED', caplog)
# The value of the new setting shall have been set to the # The value of the new setting shall have been set to the
# value of the deprecated one # value of the deprecated one
assert default_conf[setting[0]][setting[1]] == setting[5] if setting[3]:
assert default_conf[setting[3]][setting[4]] == setting[2]
else:
assert default_conf[setting[4]] == setting[2]
@pytest.mark.parametrize("setting", [ @pytest.mark.parametrize("setting", [
@ -1209,16 +1219,16 @@ def test_check_conflicting_settings(mocker, default_conf, caplog):
# New and deprecated settings are conflicting ones # New and deprecated settings are conflicting ones
with pytest.raises(OperationalException, match=r'DEPRECATED'): with pytest.raises(OperationalException, match=r'DEPRECATED'):
check_conflicting_settings(default_conf, check_conflicting_settings(default_conf,
'sectionA', 'new_setting', 'sectionB', 'deprecated_setting',
'sectionB', 'deprecated_setting') 'sectionA', 'new_setting')
caplog.clear() caplog.clear()
# Delete new setting (deprecated exists) # Delete new setting (deprecated exists)
del default_conf['sectionA']['new_setting'] del default_conf['sectionA']['new_setting']
check_conflicting_settings(default_conf, check_conflicting_settings(default_conf,
'sectionA', 'new_setting', 'sectionB', 'deprecated_setting',
'sectionB', 'deprecated_setting') 'sectionA', 'new_setting')
assert not log_has_re('DEPRECATED', caplog) assert not log_has_re('DEPRECATED', caplog)
assert 'new_setting' not in default_conf['sectionA'] assert 'new_setting' not in default_conf['sectionA']
@ -1229,8 +1239,8 @@ def test_check_conflicting_settings(mocker, default_conf, caplog):
# Delete deprecated setting # Delete deprecated setting
del default_conf['sectionB']['deprecated_setting'] del default_conf['sectionB']['deprecated_setting']
check_conflicting_settings(default_conf, check_conflicting_settings(default_conf,
'sectionA', 'new_setting', 'sectionB', 'deprecated_setting',
'sectionB', 'deprecated_setting') 'sectionA', 'new_setting')
assert not log_has_re('DEPRECATED', caplog) assert not log_has_re('DEPRECATED', caplog)
assert default_conf['sectionA']['new_setting'] == 'valA' assert default_conf['sectionA']['new_setting'] == 'valA'
@ -1242,8 +1252,6 @@ def test_process_deprecated_setting(mocker, default_conf, caplog):
# (they may not exist in the config) # (they may not exist in the config)
default_conf['sectionA'] = {} default_conf['sectionA'] = {}
default_conf['sectionB'] = {} default_conf['sectionB'] = {}
# Assign new setting
default_conf['sectionA']['new_setting'] = 'valA'
# Assign deprecated setting # Assign deprecated setting
default_conf['sectionB']['deprecated_setting'] = 'valB' default_conf['sectionB']['deprecated_setting'] = 'valB'