diff --git a/docs/configuration.md b/docs/configuration.md index 9ed45fff3..ac63211a7 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -152,8 +152,8 @@ Mandatory parameters are marked as **Required**, which means that they are requi | `webhook.url` | URL for the webhook. Only required if `webhook.enabled` is `true`. See the [webhook documentation](webhook-config.md) for more details.
**Datatype:** String | `webhook.webhookbuy` | Payload to send on buy. Only required if `webhook.enabled` is `true`. See the [webhook documentation](webhook-config.md) for more details.
**Datatype:** String | `webhook.webhookbuycancel` | Payload to send on buy order cancel. Only required if `webhook.enabled` is `true`. See the [webhook documentation](webhook-config.md) for more details.
**Datatype:** String -| `webhook.webhooksell` | Payload to send on sell. Only required if `webhook.enabled` is `true`. See the [webhook documentation](webhook-config.md) for more details.
**Datatype:** String -| `webhook.webhooksellcancel` | Payload to send on sell order cancel. Only required if `webhook.enabled` is `true`. See the [webhook documentation](webhook-config.md) for more details.
**Datatype:** String +| `webhook.webhookexit` | Payload to send on exit. Only required if `webhook.enabled` is `true`. See the [webhook documentation](webhook-config.md) for more details.
**Datatype:** String +| `webhook.webhookexitcancel` | Payload to send on exit order cancel. Only required if `webhook.enabled` is `true`. See the [webhook documentation](webhook-config.md) for more details.
**Datatype:** String | `webhook.webhookstatus` | Payload to send on status calls. Only required if `webhook.enabled` is `true`. See the [webhook documentation](webhook-config.md) for more details.
**Datatype:** String | `api_server.enabled` | Enable usage of API Server. See the [API Server documentation](rest-api.md) for more details.
**Datatype:** Boolean | `api_server.listen_ip_address` | Bind IP address. See the [API Server documentation](rest-api.md) for more details.
**Datatype:** IPv4 diff --git a/docs/deprecated.md b/docs/deprecated.md index b50eab679..1c929a610 100644 --- a/docs/deprecated.md +++ b/docs/deprecated.md @@ -57,7 +57,14 @@ While we may drop support for the current interface sometime in the future, we w Please follow the [Strategy migration](strategy_migration.md) guide to migrate your strategy to the new format to start using the new functionalities. -### webhooks - `buy_tag` has been renamed to `enter_tag` +### webhooks - changes with 2022.4 + +#### `buy_tag` has been renamed to `enter_tag` This should apply only to your strategy and potentially to webhooks. We will keep a compatibility layer for 1-2 versions (so both `buy_tag` and `enter_tag` will still work), but support for this in webhooks will disappear after that. + +#### Naming changes + +All "sell" occurances in webhook context have been replaced with "exit" configurations. +As a result `webhooksell` became `webhookexit`, `webhooksellfill` became `webhookexitfill` and `webhooksellcancel` became `webhookexitcancel` diff --git a/docs/strategy_migration.md b/docs/strategy_migration.md index 5721537c6..3f14fc300 100644 --- a/docs/strategy_migration.md +++ b/docs/strategy_migration.md @@ -41,6 +41,18 @@ You can use the quick summary as checklist. Please refer to the detailed section * `order_time_in_force` buy -> entry, sell -> exit. * `order_types` buy -> entry, sell -> exit. * `unfilledtimeout` buy -> entry, sell -> exit. +* Terminology changes + * Sell reasons changed to reflect the new naming of "exit" instead of sells. Be careful in your strategy if you're using `exit_reason` checks. + * `sell_signal` -> `exit_signal` + * `custom_sell` -> `custom_exit` + * `force_sell` -> `force_exit` + * `emergency_sell` -> `emergency_exit` + * Webhook terminology changed from "sell" to "exit". + * `webhooksell` -> `webhookexit` + * `webhooksellfill` -> `webhookexitfill` + * `webhooksellcancel` -> `webhookexitcancel` + + ## Extensive explanation diff --git a/docs/webhook-config.md b/docs/webhook-config.md index b974e0041..202c63c7e 100644 --- a/docs/webhook-config.md +++ b/docs/webhook-config.md @@ -25,18 +25,18 @@ Sample configuration (tested using IFTTT). "value2": "at {open_rate:8f}", "value3": "" }, - "webhooksell": { - "value1": "Selling {pair}", + "webhookexit": { + "value1": "Exiting {pair}", "value2": "limit {limit:8f}", "value3": "profit: {profit_amount:8f} {stake_currency} ({profit_ratio})" }, - "webhooksellcancel": { - "value1": "Cancelling Open Sell Order for {pair}", + "webhookexitcancel": { + "value1": "Cancelling Open Exit Order for {pair}", "value2": "limit {limit:8f}", "value3": "profit: {profit_amount:8f} {stake_currency} ({profit_ratio})" }, - "webhooksellfill": { - "value1": "Sell Order for {pair} filled", + "webhookexitfill": { + "value1": "Exit Order for {pair} filled", "value2": "at {close_rate:8f}.", "value3": "" }, @@ -160,8 +160,9 @@ Possible parameters are: * `current_rate` * `enter_tag` -### Webhooksell -The fields in `webhook.webhooksell` are filled when the bot sells a trade. Parameters are filled using string.format. +### Webhookexit + +The fields in `webhook.webhookexit` are filled when the bot exits a trade. Parameters are filled using string.format. Possible parameters are: * `trade_id` @@ -183,9 +184,9 @@ Possible parameters are: * `open_date` * `close_date` -### Webhooksellfill +### Webhookexitfill -The fields in `webhook.webhooksellfill` are filled when the bot fills a sell order (closes a Trae). Parameters are filled using string.format. +The fields in `webhook.webhookexitfill` are filled when the bot fills a exit order (closes a Trade). Parameters are filled using string.format. Possible parameters are: * `trade_id` @@ -208,9 +209,9 @@ Possible parameters are: * `open_date` * `close_date` -### Webhooksellcancel +### Webhookexitcancel -The fields in `webhook.webhooksellcancel` are filled when the bot cancels a sell order. Parameters are filled using string.format. +The fields in `webhook.webhookexitcancel` are filled when the bot cancels a exit order. Parameters are filled using string.format. Possible parameters are: * `trade_id` diff --git a/freqtrade/constants.py b/freqtrade/constants.py index fdf117341..234f4472b 100644 --- a/freqtrade/constants.py +++ b/freqtrade/constants.py @@ -330,9 +330,9 @@ CONF_SCHEMA = { 'webhookbuy': {'type': 'object'}, 'webhookbuycancel': {'type': 'object'}, 'webhookbuyfill': {'type': 'object'}, - 'webhooksell': {'type': 'object'}, - 'webhooksellcancel': {'type': 'object'}, - 'webhooksellfill': {'type': 'object'}, + 'webhookexit': {'type': 'object'}, + 'webhookexitcancel': {'type': 'object'}, + 'webhookexitfill': {'type': 'object'}, 'webhookstatus': {'type': 'object'}, }, }, diff --git a/freqtrade/enums/rpcmessagetype.py b/freqtrade/enums/rpcmessagetype.py index 661f9ce5c..39cf1bda5 100644 --- a/freqtrade/enums/rpcmessagetype.py +++ b/freqtrade/enums/rpcmessagetype.py @@ -14,8 +14,6 @@ class RPCMessageType(Enum): SHORT_FILL = 'short_fill' SHORT_CANCEL = 'short_cancel' - # TODO: The below messagetypes should be renamed to "exit"! - # Careful - has an impact on webhooks, therefore needs proper communication SELL = 'sell' SELL_FILL = 'sell_fill' SELL_CANCEL = 'sell_cancel' diff --git a/freqtrade/rpc/webhook.py b/freqtrade/rpc/webhook.py index b0a884a88..5c192377b 100644 --- a/freqtrade/rpc/webhook.py +++ b/freqtrade/rpc/webhook.py @@ -43,23 +43,25 @@ class Webhook(RPCHandler): def send_msg(self, msg: Dict[str, Any]) -> None: """ Send a message to telegram channel """ try: - + whconfig = self._config['webhook'] + # DEPRECATED: Sell terminology if msg['type'] in [RPCMessageType.BUY, RPCMessageType.SHORT]: - valuedict = self._config['webhook'].get('webhookbuy', None) + valuedict = whconfig.get('webhookbuy', None) elif msg['type'] in [RPCMessageType.BUY_CANCEL, RPCMessageType.SHORT_CANCEL]: - valuedict = self._config['webhook'].get('webhookbuycancel', None) + valuedict = whconfig.get('webhookbuycancel', None) elif msg['type'] in [RPCMessageType.BUY_FILL, RPCMessageType.SHORT_FILL]: - valuedict = self._config['webhook'].get('webhookbuyfill', None) + valuedict = whconfig.get('webhookbuyfill', None) elif msg['type'] == RPCMessageType.SELL: - valuedict = self._config['webhook'].get('webhooksell', None) + valuedict = whconfig.get('webhookexit', whconfig.get('webhooksell', None)) elif msg['type'] == RPCMessageType.SELL_FILL: - valuedict = self._config['webhook'].get('webhooksellfill', None) + valuedict = whconfig.get('webhookexitfill', whconfig.get('webhookexitfill', None)) elif msg['type'] == RPCMessageType.SELL_CANCEL: - valuedict = self._config['webhook'].get('webhooksellcancel', None) + valuedict = whconfig.get('webhookexitcancel', + whconfig.get('webhooksellcancel', None)) elif msg['type'] in (RPCMessageType.STATUS, RPCMessageType.STARTUP, RPCMessageType.WARNING): - valuedict = self._config['webhook'].get('webhookstatus', None) + valuedict = whconfig.get('webhookstatus', None) else: raise NotImplementedError('Unknown message type: {}'.format(msg['type'])) if not valuedict: diff --git a/tests/rpc/test_rpc_webhook.py b/tests/rpc/test_rpc_webhook.py index 1d80b58e5..b3c5fee93 100644 --- a/tests/rpc/test_rpc_webhook.py +++ b/tests/rpc/test_rpc_webhook.py @@ -36,17 +36,17 @@ def get_webhook_dict() -> dict: "value4": "leverage {leverage:.1f}", "value5": "direction {direction}" }, - "webhooksell": { + "webhookexit": { "value1": "Selling {pair}", "value2": "limit {limit:8f}", "value3": "profit: {profit_amount:8f} {stake_currency} ({profit_ratio})" }, - "webhooksellcancel": { + "webhookexitcancel": { "value1": "Cancelling Open Sell Order for {pair}", "value2": "limit {limit:8f}", "value3": "profit: {profit_amount:8f} {stake_currency} ({profit_ratio})" }, - "webhooksellfill": { + "webhookexitfill": { "value1": "Sell Order for {pair} filled", "value2": "at {close_rate:8f}", "value3": "" @@ -249,11 +249,11 @@ def test_send_msg_webhook(default_conf, mocker): webhook.send_msg(msg=msg) assert msg_mock.call_count == 1 assert (msg_mock.call_args[0][0]["value1"] == - default_conf["webhook"]["webhooksell"]["value1"].format(**msg)) + default_conf["webhook"]["webhookexit"]["value1"].format(**msg)) assert (msg_mock.call_args[0][0]["value2"] == - default_conf["webhook"]["webhooksell"]["value2"].format(**msg)) + default_conf["webhook"]["webhookexit"]["value2"].format(**msg)) assert (msg_mock.call_args[0][0]["value3"] == - default_conf["webhook"]["webhooksell"]["value3"].format(**msg)) + default_conf["webhook"]["webhookexit"]["value3"].format(**msg)) # Test sell cancel msg_mock.reset_mock() msg = { @@ -299,11 +299,11 @@ def test_send_msg_webhook(default_conf, mocker): webhook.send_msg(msg=msg) assert msg_mock.call_count == 1 assert (msg_mock.call_args[0][0]["value1"] == - default_conf["webhook"]["webhooksellfill"]["value1"].format(**msg)) + default_conf["webhook"]["webhookexitfill"]["value1"].format(**msg)) assert (msg_mock.call_args[0][0]["value2"] == - default_conf["webhook"]["webhooksellfill"]["value2"].format(**msg)) + default_conf["webhook"]["webhookexitfill"]["value2"].format(**msg)) assert (msg_mock.call_args[0][0]["value3"] == - default_conf["webhook"]["webhooksellfill"]["value3"].format(**msg)) + default_conf["webhook"]["webhookexitfill"]["value3"].format(**msg)) for msgtype in [RPCMessageType.STATUS, RPCMessageType.WARNING,