GUIDE

TradingView Webhook 自动交易:从警报到大单落地的完整链路

约 13 分钟阅读AutoTrading 团队

大多数人的自动交易不是死在策略上,而是死在链路上。回测曲线漂亮,警报也确实响了,账户里却一笔单都没有——因为 TradingView 从设计上就不负责下单,它只做一件事:把你在警报里写的消息,POST 到你填的那个地址。

TradingView 是全球使用最广的行情与策略平台,但它不接触你的资金。要把一条警报变成交易所里真实存在的仓位,中间必须有一层服务负责接收、校验、判断和下单。本文把这条链路的每一环拆开讲清楚:TradingView 侧的硬性限制、信号该怎么写、中间层怎么选,以及上线前必须验证什么。

Webhook 到底做了什么

Webhook 是警报的一种通知方式。在警报里填好 URL 后,一旦触发,TradingView 会向你填写的地址发送一个 HTTP POST 请求,请求体就是你在警报「消息」框里写的内容。它不重试,也不保证送达。

官方文档里有几条硬性限制经常被忽略:

  • 只接受 80 和 443 端口,写到其他端口会被拒绝——自建服务跑在 3000 之类的端口上,必须先做反向代理。
  • 服务器处理一次请求超过约 3 秒,请求会被取消,所以要先把信号落库、立刻返回,再异步下单。
  • 不支持 IPv6。
  • 官方提供了一份发送请求的 IP 列表,需要加白名单时可用;同时明确提示 webhook 可能偶发投递失败,可在警报日志的 Webhook 状态列人工查看。
  • 官方明确建议不要在请求体里放密码等敏感凭证——所以机器人密钥应当是「限定用途的 token」,而不是你的交易所密钥。
信号链路:TradingView 只负责 POST,下单由接收端完成五个环节:策略与警报、TradingView 发起 HTTP POST、接收端校验信号、接收端向交易所下单、交易日志与监控。策略 / 指标Pine 脚本产生信号TradingView 警报替换占位符POST 到你的URL接收端密钥校验解析信号交易所 API查询持仓下单 / 平仓日志与监控执行结果可回溯HTTP POST校验签名请求记录
TradingView 只产生信号,不做任何交易;每一环都可能成为信号丢失点。

信号格式:为什么必须是 JSON

默认的警报消息是纯文本。官方文档说明:如果消息体是合法 JSON,请求头会带上 application/json;否则用 text/plain。 很多接收端只解析 JSON,所以正确的做法是在警报的「消息」框里写一个 JSON 对象。

难点在于值需要动态替换。TradingView 支持在消息里写 {{...}} 占位符,触发时自动替换。策略类警报提供了这几个关键字段:

占位符返回内容用途
{{strategy.order.action}}该笔订单的方向:buy 或 sell映射到信号的 side
{{strategy.order.contracts}}该笔订单的数量映射到 amount
{{strategy.order.price}}订单成交价格映射到 price
{{strategy.market_position}}当前仓位:long / flat / short判断开仓、平仓还是反手
{{strategy.market_position_size}}当前仓位数量(绝对值)计算目标仓位
{{strategy.prev_market_position}}上一状态:long / flat / short识别仓位变化

把这些占位符组织成一个 JSON,就是一个可用的信号。AutoTrading 机器人详情页生成的模板长这样:

AutoTrading 机器人详情页生成的警报消息模板包含 8 个字段:side、amount、now_position_amount、position、pre_position、price、symbol 与机器人专属密钥 bot_sec。{ "bot_sec": "你的机器人密钥",1每个机器人独立的密钥,接收端用它识别信号属于哪个机器人 "symbol": "{{ticker}}",2交易对,由 TradingView 在触发时替换 "side": "{{strategy.order.action}}",3buy 或 sell "amount": "{{strategy.order.contracts}}",4本次订单数量(字符串) "now_position_amount": "{{strategy.market_position_size}}",5操作后的目标仓位数量,反手时用来算新仓大小 "position": "{{strategy.market_position}}",6目标仓位方向 "pre_position": "{{strategy.prev_market_position}}",7操作前方向,与 position 配合可识别开 / 加 / 减 / 平 / 反手 "price": "{{strategy.order.price}}"8由 TradingView 填入的价格,仅作记录}
字段含义对照。实际模板以机器人详情页显示为准。

三种落地方式怎么选

路线形态适合谁代价
交易所官方信号交易在交易所内创建 Webhook 信号,拿专用 URL 与消息模板填进 TradingView 警报只做一家交易所、策略简单、不想碰服务器仓位与风控参数由交易所规定;信号格式固定;各家规则不一致
第三方云平台 / 信号桥注册平台、连接交易所 API、复制平台给的地址已有可用策略,只想解决执行按月订阅;能力边界取决于平台开放程度;密钥交给第三方
自建服务自己接收 webhook、校验密钥、调交易所 API 下单需要自定义风控、多交易所、数据自主服务器、域名、证书、监控、密钥安全全部自己维护

还有一条绕开付费门槛的路线:TradingView 免费档位支持邮件通知,可以自建一个「邮箱 → 解析 → 调 API」的转发服务把它变成 webhook。代价是链路更长、延迟通常数秒,且邮箱轮询有被限流的风险,不适合高频策略。

三条路线的责任边界从 TradingView 警报出发的三条落地路径:交易所官方信号、第三方平台、自建服务,以及绕开付费门槛的邮件转发方案。交易所官方信号零代码规则由交易所固定第三方平台 / 信号桥月费能力看平台开放度自建服务完全自定义维护成本最高邮件转发绕开付费门槛延迟高、易限流
没有普适的最优解,只有与「谁来负责风控」相匹配的选择。

上线前必须验证的四件事

一、端到端延迟,而不是「警报有没有响」

占位符替换发生在 TradingView 侧,之后才是 POST、校验、查询持仓、下单、撮合。这几段时间加起来才是真实延迟,它直接决定滑点。做法很朴素:让警报消息带上触发时间,接收端记录「收到时间 − 触发时间」,跑一周看 P95,而不是看最好的一次。

二、幂等:重复信号会不会变成重复开仓

webhook 可能重发,也可能在条件反复穿越时连续触发。可靠的做法是每次下单前都向交易所查询真实持仓,以实际持仓而不是本地缓存作为决策依据。这样才能把「同一信号到达两次」变成无害的重复请求。

三、API 密钥按最小必要权限配置

只开读取和交易,不要开启提现权限;把服务器出口 IP 加进交易所白名单;密钥只存在于服务端。具体细节与各家差异见 交易所 API 密钥与权限配置。

四、先在测试环境跑通整条链路

主流交易所都提供合约测试网。先跑通「警报 → 信号 → 下单 → 日志」,确认方向、数量、价格都符合预期,再用极小仓位实盘验证一次,最后放大。跳过这步等于用真金白银做联调。

最常见的五个坑

  1. 只验证了警报响了,没验证订单成了。 警报日志和交易日志是两件事,必须查交易所侧的订单记录。
  2. 忽略警报过期。 过期是静默的,不会再发任何消息,包括平仓信号。设置日历提醒,定期检查警报状态。
  3. 把密钥写进警报消息。 官方明确不建议在 webhook 请求体里放敏感凭证;一旦 URL 泄露,任何人都能伪造信号。
  4. 仓位模式不匹配。 交易所的持仓模式、接收端的假设、信号里的仓位字段三者必须一致,否则会出现「想平多结果开出空」。
  5. 没有兜底。 网络抖动、交易所维护、API 限频都会丢信号。平不掉仓比开不了仓危险得多,需要有独立的监控或人工接管方案。
上线前检查清单上线前应当完成(绿色勾选)与必须避免(红色叉号)的事项对照。必须做到✓TradingView 已开通付费档位并启用 2FA✓测试网跑通完整链路,成交方向正确✓密钥只开读取与交易,已配 IP 白名单✓已记录端到端延迟的 P95✓已设置警报到期提醒必须避免✕把 API 密钥写进警报消息或前端✕开启提现权限✕跳过测试直接放大仓位✕只依据本地缓存判断仓位✕完全没有平仓兜底方案
把这张清单过一遍,能排掉大多数上线事故。

AutoTrading 这条链路是怎么做的

AutoTrading 把接收端做成一台量化终端:你在交易所 API 页面录入密钥,为每个机器人配置交易对、市场类型、杠杆和持仓模式,系统为每个机器人生成独立的密钥。把机器人详情页给出的 JSON 模板和 webhook 地址填进 TradingView 警报即可。

  • 支持 8 家交易场所,覆盖现货、U 本位与币本位合约:Binance、OKX、Gate、Bitget、Bybit、HTX、Hyperliquid,以及用于美股与 ETF 的 Charles Schwab。每种市场类型的具体支持情况以交易所 API 页面的可选项为准。
  • 信号里带机器人专属密钥,未知密钥的请求直接拒绝,不会下单。
  • 以交易所的真实持仓为判断依据,可区分开仓、加仓、减仓、平仓与反手,而不是简单翻译成市价单。
  • 每条信号都写入执行日志,成功、被忽略、失败的原因都可回溯。
  • 机器人可以随时暂停:暂停期间收到的信号会被记录为「已忽略」,不会下单。

如果你还没账户,可以先用免费档位跑通链路;需要降低交易成本,先把各交易所的手续费减免配好再开始跑。

按这个顺序推进

  1. 确认 TradingView 套餐与 2FA 是否满足 webhook 条件。
  2. 在测试环境把「警报 → 信号 → 下单」跑通。
  3. 按最小权限配置交易所 API 密钥与手续费减免。
  4. 极小仓位实盘验证,再逐步放大。

常见问题

TradingView 的免费套餐能用 Webhook 吗?

不能。Webhook 是付费功能,免费档位的警报只能通过弹窗、声音、手机推送和邮件通知。免费档位可以直接用邮件通知,再自建一个转发服务把它转成 webhook,代价是链路更长、延迟更高,而且邮箱轮询有被限流的风险。

为什么警报配置好了却一直不触发?

最常见的原因是账户没有开启两步验证(2FA)——即使订阅了付费套餐,未开启 2FA 时警报里的 Webhook URL 字段仍不可用,警报看起来保存成功但不会发出请求。其次是警报已经过期,过期是静默的,不会再发送任何消息。

TradingView 的警报会重试投递吗?

官方说明 webhook 可能偶发投递失败,并建议在警报日志的 Webhook 状态列人工检查投递情况。因此接收端不能假设「每条信号都会到达」,也不能假设「同一条信号只会到达一次」,幂等设计是必需的。

同一条信号重复到达会不会重复开仓?

取决于接收端的实现。可靠的实现是每次处理信号前都向交易所查询真实持仓,基于实际持仓做决策,这样即使收到重复信号也不会把仓位翻倍。单纯依赖本地缓存状态的实现容易出现这个问题。

可以只用交易所自带的 Webhook 信号交易功能吗?

可以,如果只需要一家交易所、策略也很简单。它的限制在于仓位与风控参数由交易所规定、信号格式固定,且不同交易所之间规则不一致;一旦需要跨交易所或自定义逻辑,就需要换成信号桥或自建服务。

把这条链路跑起来

先跑通信号、配好密钥与手续费减免,再用极小仓位实盘验证,最后逐步放大。

参考资料

交易所与平台的规则会调整,以上链接指向官方页面,操作前请以官方最新说明为准。

对内容有疑问或发现错误?欢迎通过 Telegram 告诉我们,我们会核对后更新。