Ichigowa

如果你交易——或者只是持有任何以美元计价的资产——你已经知道:FOMC 决议、CPI 数据和 NFP 发布能在几秒钟内撼动市场,而你唯一能得到的预警就是你恰好留在某个标签页里的信息。本文将带你构建一个小型 n8n 工作流,它每天早上轮询经济日历,并将高影响力的美元事件直接推送到 Telegram。总构建时间:约 15 分钟。总成本:在免费额度下为 $0。

手动查 ForexFactory 的问题

ForexFactory 的日历是散户交易者的实际标准,但它是为人类设计的,而不是为机器设计的:

  • 没有官方 API。 日历是渲染后的 HTML,客户端负责处理时区。有一个非官方的每周 XML 订阅源,但它粗糙、被缓存,且曾无预警地失效。
  • 手动检查无法规模化。 你可能虔诚地检查一周,然后因为那天没看而错过唯一重要的 CPI 数据。
  • 自己抓取很麻烦。 该网站使用 Cloudflare、依赖会话的时区 Cookie,且标记经常变化,以至于简单的抓取器需要定期维护。

你可以为商业经济日历 API 付费——大多数包含预测/前值数据的层级起步价在 $30–100/月。如果你只想“在有大事安排时 ping 我”,这就太贵了。

Actor

提前声明:本文所用的 actor 由我开发,因此在采纳建议时请自行斟酌。

economic-calendar-pro 是一个 Apify actor,它抓取 ForexFactory 日历并返回干净的 JSON。它处理了烦人的部分(时区、会话 Cookie、标记漂移),并提供货币和影响级别的筛选器,以及可选的 webhook 提醒。每个事件输出格式如下:

{
  "title": "CPI m/m",
  "country": "USD",
  "currency": "USD",
  "impact": "High",
  "date_utc": "2026-08-12T12:30:00Z",
  "forecast": "0.2%",
  "previous": "0.3%",
  "actual": "",
  "week": "this",
  "source": "forexfactory"
}

Enter fullscreen mode Exit fullscreen mode

因为它运行在 Apify 上,所以你无需托管任何东西——只需调用一个 HTTP 端点即可同步获取数据集项目。

我们正在构建的内容

Schedule (weekdays 07:00)
  → HTTP Request (run actor, get this week's USD high-impact events)
  → Filter (belt-and-suspenders: impact == high, currency == USD)
  → Telegram (one message per event)

Enter fullscreen mode Exit fullscreen mode

如果没有符合条件的事件,筛选器会丢弃所有内容,不会发送任何消息。平静的日子依然平静。

前置条件

  • 一个 n8n 实例(云端或自托管——docker run -p 5678:5678 n8nio/n8n 即可正常工作)
  • 一个免费的 Apify 账户——在设置 → 集成中获取 API 令牌
  • 一个 Telegram 机器人:向 @BotFather 发送消息,输入 /newbot,保存令牌。然后向你的机器人发送一次消息,并从 https://api.telegram.org/bot<TOKEN>/getUpdates 获取聊天 ID

步骤 1:计划触发器

添加一个 Schedule Trigger 节点,将其切换为 cron 表达式:

0 7 * * 1-5

Enter fullscreen mode Exit fullscreen mode

即每个工作日的 07:00,这比 08:30 ET 的发布(CPI、NFP)和下午的 FOMC 声明早很多。如果尚未设置,请在 n8n 设置中设置实例时区——cron 以实例时间运行。

步骤 2:使用 HTTP Request 节点调用 actor

添加一个 HTTP Request 节点(typeVersion 4.x):

  • 方法: POST
  • URL:
https://api.apify.com/v2/acts/ichigowa~economic-calendar-pro/run-sync-get-dataset-items

Enter fullscreen mode Exit fullscreen mode

  • 请求头:
Authorization: Bearer YOUR_APIFY_TOKEN
Content-Type: application/json

Enter fullscreen mode Exit fullscreen mode

  • 正文(JSON):
{
  "weeks": ["this"],
  "currencies": ["USD"],
  "impacts": ["High"]
}

Enter fullscreen mode Exit fullscreen mode

run-sync-get-dataset-items 端点在这里非常有用:它启动 actor,等待其完成,并直接在响应正文中返回数据集项目。无需轮询运行状态,也无需第二次请求来获取结果。将节点的超时时间提高到约 120 秒,因为冷启动的 actor 运行可能需要 30–60 秒。

点击 Execute step。在有 CPI 数据的日子里,你会得到类似这样的结果:

[
  {
    "title": "CPI m/m",
    "currency": "USD",
    "impact": "High",
    "date_utc": "2026-08-12T12:30:00Z",
    "forecast": "0.2%",
    "previous": "0.3%"
  },
  {
    "title": "Core CPI m/m",
    "currency": "USD",
    "impact": "High",
    "date_utc": "2026-08-12T12:30:00Z",
    "forecast": "0.3%",
    "previous": "0.3%"
  }
]

Enter fullscreen mode Exit fullscreen mode

n8n 会自动将数组拆分为每个事件一个项目,这正是我们下游所需的。

步骤 3:筛选(纵深防御)

actor 已经在服务端进行了筛选,但我还是喜欢在这里添加一个 Filter 节点——如果以后你将 actor 输入扩大到所有货币并忘记此工作流会推送 Telegram,它可以保护你。两个条件,用 AND 组合:

  • {{ $json.impact }} 等于 High
  • {{ $json.currency }} 等于 USD

廉价的保险,零成本。

步骤 4:Telegram 消息

添加一个 Telegram 节点,操作选择 Send Message,使用你创建的机器人凭据。设置聊天 ID,启用 Markdown 解析模式,并使用:

🔔 *{{ $json.title }}*
Currency: {{ $json.currency }} | Impact: {{ $json.impact }}
Time (UTC): {{ $json.date_utc }}
Forecast: {{ $json.forecast || 'n/a' }} | Previous: {{ $json.previous || 'n/a' }}

Enter fullscreen mode Exit fullscreen mode

因为筛选器为每个事件输出一个项目,所以你会收到每个事件一条消息。在 FOMC 日,通常会有两条或三条消息(利率决定、声明、新闻发布会);大多数日子是零条或一条。

运行

手动执行整个工作流一次以进行健全性检查,然后将其切换为 Active。Telegram 中的示例输出:

🔔 Consumer Price Index (CPI) m/m
Currency: USD | Impact: High
Time (UTC): 2026-08-12T12:30:00Z
Forecast: 0.2% | Previous: 0.3%

成本

  • n8n: 自托管免费;云端起步价约为 €20/月,但此工作流适用于任何层级。
  • Apify: 免费计划每月提供 $5 的平台信用额度。此 actor 的每日一次运行只需几分钱的信用额度——工作日早上的计划可以轻松保持在免费额度内。无需信用卡。
  • Telegram: 免费。

故障排除

我见过人们在使用此确切设置时遇到的一些故障模式:

  • 来自 Apify 的 HTTP 401。 请求头必须是字面上的 Authorization: Bearer apify_api_xxx...——一个常见的错误是粘贴令牌时没有 Bearer 前缀,或者使用了账户密码而不是 API 令牌。
  • 同步端点的 HTTP 408 / 超时。 run-sync-get-dataset-items 将等待时间上限设为 300 秒。如果 actor 运行时间超过你的 HTTP 节点超时时间,请先提高节点超时时间;actor 本身很少超过一分钟。
  • 预期有事件时返回空数组。 weeks 参数获取整个日历周(“this”、“next”、“last”),所以空结果通常意味着你的筛选条件过于严格——例如,在只有中影响力的美元事件的周里使用 impacts: ["High"]。影响值首字母大写:HighMediumLowHoliday
  • Telegram 未发送任何内容,也没有错误。 通常是因为机器人之前从未被消息过(机器人无法发起聊天),或者聊天 ID 是一个缺少前导 - 的群组 ID。
  • 编辑后出现重复提醒。 如果你重新激活工作流,n8n 可能会根据你的设置触发追赶执行;如果收到意外的凌晨 2 点消息,请检查 工作流设置 → 时区/执行

值得尝试的变体

  • 更宽的网: 设置 "currencies": ["USD", "EUR", "GBP"] 并删除筛选器的货币条件。
  • 同小时预警: 添加第二个每 30 分钟运行一次的计划,并添加一个筛选条件,如 {{ $json.date_utc }} 在接下来的一小时内,这样你可以在发布前而不是在早餐时收到提醒。
  • 不同的接收端: 将 Telegram 节点替换为 Discord/Slack——actor 的输出不会改变。
  • 推而不是拉: actor 原生支持 webhook 提醒,如果你想完全跳过计划并使用 n8n Webhook 触发器。

链接

如果有问题或损坏的边缘案例,请在评论区留言——此 actor 正在积极维护,问题报告确实有帮助。