---
title: "自定义警报消息与使用 Webhook"
slug: "webhooks-and-messages"
kind: "HELP_ARTICLE"
category: "alerts"
locale: "zh-Hans"
canonical: "https://app.forecastcity.com/zh-Hans/help/alerts/webhooks-and-messages"
published: "2026-09-08T17:58:35.210Z"
updated: "2026-10-27T23:57:10.869Z"
description: "了解警报消息的内容，添加您自己的文字和变量，并通过 Webhook 将警报发送到您自己的软件、Discord 或 Slack。"
---

# 自定义警报消息与使用 Webhook

每个警报都会向您勾选的所有接收位置发送同一条消息。默认情况下，消息会说明发生了什么、当时的价格以及警报是否继续开启。您还可以附上一条关于交易计划的备注，这样在打开图表前就能看到原定计划。设置警报及其消息既简单、快速又准确：您可以在编辑器中直接输入，也可以通过语音或文字告诉或询问 **AI Trading Assistant**。

如果您使用自己的软件、Discord 或 Slack，Webhook 还能自动将每次触发的警报发送到这些地方，无需手动复制。本指南将同时介绍这两项功能。

示例：一个 EURUSD 警报，当 5m 图表上的价格上穿 1.09 时触发。

## 自动消息的内容

当 **Message** 字段为空时，警报会在触发时自动生成消息。以本例而言，消息内容如下：

```
EURUSD crossed above 1.09
Price 1.0901.
This alert is now off. It was set to fire once.
```

第一行用警报编辑器的措辞说明发生了什么。第二行给出触发那一刻的数值。最后一行说明警报是否继续开启。本例使用了 **Once only**，因此警报现已关闭。如果选择其他触发方式，最后一行会显示 “This alert stays on.”（此警报保持开启）。

其他类型的警报也遵循相同的顺序。以下是几个首行示例及其下方的数值行：

-   线条警报：“GBPJPY touched 1h Resistance R1” 以及 “Price 210.16, line at 210.20.”
    
-   线条突破警报：“GBPJPY broke above 1h Resistance R1” 以及 “The 1h candle closed at 210.32, above the line at 210.20.”
    
-   指标警报：“BTCUSD: 1h RSI(14) crossed above 70” 以及 “RSI(14) was 71.4 when the 1h candle closed at 105240.50.”
    
-   预测变化警报：“GBPJPY: 1h forecast turned bearish” 以及 “Before: bullish above 209.80. Now: bearish below 209.40.”
    

包含多个条件的警报会先说明满足了几个条件，然后为每个已满足的条件单独列出一行：

```
BTCUSD: both conditions met
• Price crossed above 105000: the 1h candle closed at 105240.50
• 1h RSI(14) is above 55 (now 58.2)
This alert stays on.
```

如果条件更多，第一行会显示如 “all 3 conditions met”（全部 3 个条件均已满足）或 “2 of 3 conditions met”（3 个条件中已满足 2 个）。如果只满足了一个条件（例如使用 **or** 连接词时），第一行会直接写出该条件，并在下方列出相应数值。

## 编写自定义消息

1.  打开警报编辑器，切换到 **Options** 标签页。
    
2.  点击 **Message** 行。留空时该行显示为 Auto，点击后下方会展开一个文本输入框。
    
3.  输入您的消息。输入框最多可容纳 400 个字符。
    
4.  如需插入实时数值，请展开输入框下方的 **Available variables** 列表，连同双花括号一起完整复制所需变量。
    

![Options 标签页中展开的 Message 行，显示空白输入框、下方说明文字以及 Available variables。](https://m.forecastcity.com/t/tnt_forecastcity/media/b4/b480142e20ce43cec05e3313cedc9941ceea0b334c3b3dda3ae8680099c0f69b.png)

展开且仍为空的 Message 字段，此时警报会发送自动消息。

1.  **Automatic message**：空白输入框。可在此输入您自己的文字，也可留空。
    
2.  输入框下方的说明：“Leave it blank and the alert says what happened and at what price. A message of your own is sent first, with that under it.”（留空时，警报会说明发生了什么以及当时的价格。如果输入自定义消息，您的文字会排在最前面，自动文本附在下方。）
    
3.  **Available variables**：可添加到消息中的实时数值变量。
    

您输入的文字会成为第一行，自动生成的文本则跟在下方。以本例而言，以下消息：

```
{{symbol}} on {{timeframe}}: check the 1h trend before entering.
```

送达时显示如下：

```
EURUSD on 5m: check the 1h trend before entering.
EURUSD crossed above 1.09. Price 1.0901.
This alert is now off. It was set to fire once.
```

价格和条件已经包含在您文字下方的几行中。建议在自定义消息中写下自动文本无法涵盖的内容，例如您的交易计划。

您输入的消息还会作为该警报在警报列表中的名称。如果不输入消息，列表会显示由条件生成的名称。对于价格水平警报，名称很简短，例如 “EURUSD crossing up 1.09”；对于线条警报或多条件警报，名称则按编辑器的表述显示，例如 “GBPJPY: 1h Price touches 1h Resistance R1”。当您修改条件时，该名称也会随之更新。再次打开该警报时，**Message** 字段仍为空。您此前保存的未填写消息的警报也会以此格式显示名称。

## 各接收位置的显示方式

每个勾选的位置都会收到相同的消息，并按该位置的格式进行排版：

<table><thead><tr><th>接收位置</th><th>显示内容</th></tr></thead><tbody><tr><td>应用内提示</td><td>第一行加粗显示，下方列出数值行。</td></tr><tr><td><strong>Notify my devices</strong></td><td>第一行作为标题，其余各行显示在下方。</td></tr><tr><td><strong>Send to MetaTrader</strong></td><td>第一行作为标题，其余各行显示在下方。MetaTrader 会在消息旁显示其自身的时间。</td></tr><tr><td><strong>Telegram</strong></td><td>警报消息、您所在时区的时间，以及指向图表的链接。</td></tr><tr><td><strong>Send email</strong></td><td>警报消息，以及您所在时区的日期和时间。</td></tr><tr><td><strong>Webhook URL</strong></td><td>Discord 和 Slack 会收到带有 UTC 时间的消息。选择 <strong>Raw JSON</strong> 时，您的软件会收到下表中的各个变量。</td></tr></tbody></table>

Telegram 会以 “24 Sep, 11:02 London time” 这样的格式显示时间。如果时区不对，请在 **Your profile** 页面的 **Timezone** 设置中选择您的时区。当 ForecastCity 无法识别您的时区时，时间会以 UTC 显示。

点击 Telegram 消息、电子邮件、手机通知或 MetaTrader 弹出窗口中的链接，即可打开对应代码的图表及 Alerts 面板。对于大多数 4CM-AI 警报，该链接会打开图表并显示当次触发的 **Alert observation**。

## 使用变量添加实时数值

警报触发时，变量会被替换为对应的实时数值。以下是 **Available variables** 中的可用变量：

<table><thead><tr><th>变量</th><th>输出内容</th><th>示例</th></tr></thead><tbody><tr><td><code>{{symbol}}</code></td><td>代码</td><td>EURUSD</td></tr><tr><td><code>{{price}}</code> 和 <code>{{close}}</code></td><td>警报触发时的价格</td><td>1.0901</td></tr><tr><td><code>{{condition_text}}</code></td><td>发生的事件（不含代码）</td><td>Price crossed above 1.09</td></tr><tr><td><code>{{condition}}</code></td><td>条件的简短代码</td><td>CROSSING_UP 1.09</td></tr><tr><td><code>{{timeframe}}</code></td><td>警报的时间周期</td><td>5m</td></tr><tr><td><code>{{time_iso}}</code></td><td>UTC 日期和时间</td><td>2026-09-24 10:02 UTC</td></tr><tr><td><code>{{time}}</code></td><td>以秒数表示的同一时间，供软件读取</td><td>1790244120</td></tr><tr><td><code>{{time_now}}</code></td><td>消息发送时刻的秒数时间戳</td><td>1790244121</td></tr><tr><td><code>{{exchange}}</code></td><td>价格数据源</td><td>TwelveData</td></tr><tr><td><code>{{status}}</code></td><td>警报是否继续开启</td><td>This alert stays on.</td></tr><tr><td><code>{{alert_url}}</code></td><td>指向该代码图表及警报列表的链接</td><td>网址链接</td></tr><tr><td><code>{{name}}</code></td><td>替换所有变量后的自定义消息，或警报列表中显示的名称</td><td>EURUSD crossing up 1.09</td></tr></tbody></table>

对于线条警报，`{{condition_text}}` 会显示为类似 “Price touched 1h Resistance R1” 的内容。如果有多个条件，它会用单词 and 将已满足的条件连接起来。当设为 **Once only** 的警报触发后，`{{status}}` 会显示 “This alert is now off. It was set to fire once.”。对于包含多个条件、线条或指标的警报，`{{condition}}` 会显示为 `TREE`，该变量是供软件读取的代码。

对于 4CM-AI 警报，`{{forecast_summary}}` 会汇总预测的变化情况，`{{forecast_symbol}}` 会写出预测对应的代码，而 `{{forecast_cycle}}` 则是一个计数器，每当警报重新开始监控时就会加一。包含 `{{forecast_summary}}` 的消息下方不会再附加自动文本，因为该摘要已经说明了发生的情况。

大多数 4CM-AI 警报没有单一触发价格，因此 `{{price}}` 和 `{{close}}` 会保持为空。`{{time_iso}}` 使用 UTC 时间，因此可能与您屏幕上的时钟不同。不存在的变量会原样保留：例如拼写错误的 `{{prices}}` 送达时仍显示为 `{{prices}}`。

## 将警报发送到 Webhook

Webhook 会将每次触发的警报发送到一个网址，由您自己的软件、Discord 频道或 Slack 频道接收。您的订阅套餐必须包含 Webhook 功能。

1.  在 Options 标签页的 Notifications 下方，勾选 **Webhook URL** 复选框。随后会出现地址输入框、Format 选择器以及正文输入框。
    
2.  粘贴您的接收方所监听的网址。网址必须以 `http://` 或 `https://` 开头。
    
3.  将 **Format** 设为 **Raw JSON**，并将正文输入框留空。
    
4.  点击 **Create** 按钮（如果是编辑现有警报，则点击 **Save** 按钮）。
    

![已勾选 Webhook URL 行，填有接收地址，Format 设为 Raw JSON，正文输入框为空。](https://m.forecastcity.com/t/tnt_forecastcity/media/9e/9e711afc65b24ebfe70a8e091cc4006b5f9d7d57d50d61b67e5ee920f8ab4877.png)

已勾选 Webhook URL，填好地址并将 Format 设为 Raw JSON。留空正文输入框会发送默认数据。

1.  您的接收方所监听的网址。请使用标准端口 80 或 443。
    
2.  **Format**：如果是发送给您自己的软件，请选择 Raw JSON；如果是发送给对应平台，请选择 Discord 或 Slack。
    

当正文输入框留空时，接收方会收到一个 JSON 对象，其中包含上表中的所有变量以及 `alertId` 和 `triggerId`。这两个字段分别用于标识该警报和当次触发。在编写依赖这些字段的程序之前，建议先查看一次实际收到的请求。

在输入框下方，编辑器会显示我们发送请求所用的服务器地址。如果您的接收方只接受已知地址的请求，请将该地址加入白名单。

### Webhook 地址的要求

-   使用标准端口的公网地址：http 为 80 端口，https 为 443 端口。系统不会向其他端口、localhost 或私有网络地址发送消息。
    
-   网址中不得包含用户名或密码。
    
-   该地址本身必须在 3 秒内返回响应。重定向到其他地址会被视为发送失败。
    

编辑器仅检查地址是否以 `http://` 或 `https://` 开头。其余要求会在实际发送消息时进行验证，因此请使用真实警报测试您的地址。对于价格警报和技术警报，如果接收方出现临时错误，系统最多会再重试两次。对于 4CM-AI 警报，如果出现超时或服务器错误，消息不会重新发送，因为您的接收方可能已经根据该消息执行了操作。

## 编写自定义 Webhook 正文

正文输入框支持使用与警报消息相同的变量编写模板，最多可容纳 2000 个字符。输入框允许输入更多字符，但超过长度限制的正文在保存时会被拒绝。

当格式设为 **Raw JSON** 时，如果接收方只需要一个精简对象，可以使用如下正文：

```
{"symbol":"{{symbol}}","condition":"{{condition_text}}","time":"{{time_iso}}","source":"ForecastCity"}
```

变量会以纯文本形式填入。如果某个变量的值包含引号或换行符，可能会破坏 JSON 格式。不是有效 JSON 的正文会作为纯文本发送。

如果发送到 Discord 频道，请将 **Format** 设为 **Discord** 并填入该频道的 Webhook 地址，然后在正文输入框中写一行简短文字，例如：

```
{{symbol}}: {{condition_text}}. Open your alerts: {{alert_url}}
```

如果使用 Slack，请选择 **Slack** 并以同样方式编写。ForecastCity 会将您的文本包装成对应服务所需的格式。如果正文输入框留空，这两个平台都会收到如上所示的警报消息，并在最后一行附上 UTC 时间。

## 检查发送结果

1.  等待警报触发后，打开 Alerts 面板的 **Log** 标签页。
    
2.  将接收方收到的内容与触发日志中的记录进行核对：发生的事件、代码以及触发时间。
    

触发日志只表明警报已经触发，并不显示接收方是否成功接收了消息，因此请同时检查接收方自身的日志。如果看到类似 `{{prices}}` 的花括号，说明变量名拼写有误。如果接收方拒绝了请求正文，请检查 JSON 格式是否正确。

## 实用提示

-   警报消息会发送到您勾选的每一个位置，而 Webhook 正文仅发送给 Webhook。
    
-   Discord 最多显示 1900 个字符，Slack 最多显示 3000 个字符，超出部分会被截断。
    

## 相关指南

-   [选择警报通知的发送位置](<https://app.forecastcity.com/zh-Hans/help/alerts/notification-delivery>)
    
-   [排查警报未送达的原因](<https://app.forecastcity.com/zh-Hans/help/alerts/trigger-log-and-troubleshooting>)
    
-   [创建第一个价格警报](<https://app.forecastcity.com/zh-Hans/help/alerts/first-price-alert>)
