疑難排解 · Webhook

TradingView Webhook 沒反應?
完整除錯流程圖,一層一層查

2026-07-08·9 分鐘

Alert 設好了,圖表上條件明明滿足,結果下游什麼反應都沒有——或是有反應,但交易所沒有真的下單。TradingView webhook 沒反應這件事可能卡在五個不同的層次,亂猜是哪一層只會浪費你好幾個小時。

這篇文章是一套分層診斷流程:方案資不資格、Alert 到底有沒有觸發、TradingView 有沒有真的送出去、你的伺服器有沒有真的收到、 交易所有沒有真的接受下單。從最上面開始一層一層查——大部分人其實卡在第 0 層或第 1 層,只是自己還不知道。

多數人卡關的地方,其實是最後才想到查的
實務上兩個最常見的卡點,反而是大家最後才會想到去查的:Alert 過期(第 0 層)、觸發頻率設定搞混(第 1 層)。 這兩種問題從外觀看起來一模一樣——「我設好了,它就是不觸發」——但其實跟你的伺服器、跟交易所帳號完全無關。

五層診斷流程

從上到下照著走,每一步都會告訴你要繼續往下查,還是問題已經找到了。

1
第 0a 層——你的 TradingView 方案本身有沒有 webhook 功能?
免費(Basic)方案 →Basic 方案完全不提供 webhook 通知功能——這不是 bug,是方案本身就沒有這個功能。需要升級到 Essential 以上。
Essential / Plus / Premium / Ultimate 方案 →你的方案有 webhook 功能,繼續下一項檢查。
2
第 0b 層——Alert Manager 裡這個 alert 的狀態顯示什麼?
紅色「Stopped — Expired」 →Alert 有存活期限上限(預設 2 個月,Premium/Ultimate 可開啟不過期選項)。過期的 alert 就是停了——直接刪除重建,編輯過期的 alert 沒辦法讓它復活。
綠色「Active」 →繼續下一項檢查。
3
第 1 層——圖表上條件明明滿足,但 Alert Manager 完全沒有任何觸發紀錄?
從來沒觸發過 →先檢查 Frequency 設定與 repainting 問題——碰任何其他東西之前先看下面第 1 層的說明。
至少觸發過一次(去查紀錄) →Alert 本身運作正常,繼續往下查送出這一層。
4
第 2 層——這個 alert 有沒有出現 webhook 送出錯誤訊息?
有錯誤訊息 →直接看錯誤文字內容,通常會直接寫出原因(port 不對、私有 IP、非 HTTPS、訊息過大)。見下方第 2 層檢查清單。
沒有錯誤訊息 →TradingView 那端沒有標示任何失敗,問題比較可能在你的伺服器或網路端。
5
第 3 層——從外部能不能連到你自己的 webhook URL?
從另一台機器用 curl 完全連不上 →這是網路問題,不是 TradingView 的問題——防火牆、tunnel 掛了、port 錯、DNS 沒設好,先修這個。
curl 打得到,但 TradingView 送來的 request 就是收不到 →很可能是 IP 白名單擋住了 TradingView 的來源 IP,或伺服器回應超過 3 秒被 TradingView 判定逾時取消。
伺服器 log 顯示 request 有進來且回了 200 →送達這一段全程確認無誤,剩下的問題出在交易所那一端。
6
第 4 層——伺服器收到訊號了,但交易所端沒有出現任何下單
交易所拒單或悄悄忽略 →檢查 API key 交易權限、數量精度/步階、最小下單量、倉位模式(單向 vs 雙向)——見下方第 4 層說明。
3 秒
伺服器必須在此時限內回應
80 / 443
唯二接受的 port
2 個月
Alert 預設存活上限
15 次 / 3 分鐘
超過就自動停用

第 0 層——這個 alert 本身有沒有資格送 webhook?

在動你的伺服器或 Pine 腳本之前,先確認這個 alert 在結構上根本就有能力送 webhook。這裡有兩道獨立的關卡, 任何一道卡住都足以解釋「怎麼設都沒反應」。

方案資格

Webhook 通知功能是依訂閱方案分級的。免費的 Basic 方案完全沒有 webhook 通知功能——不是被限制,是這功能本身就不存在於這個方案裡。 截至 2026 年 7 月查證,TradingView 的方案比較表如下:

方案WebhookPrice + Technical alert 數Alert 存活期限
Basic(免費)無3 + 01 個月
Essential有20 + 202 個月
Plus有100 + 1002 個月
Premium有400 + 400(另加 2 個 watchlist)可開啟不過期
Ultimate有1,000 + 1,000(另加 15 個 watchlist)可開啟不過期

TradingView 方案比較表,截至 2026 年 7 月查證,實際數字請以 tradingview.com/pricing 當下顯示為準。

還有一道獨立的帳號層級關卡
Webhook alert 還需要你的 TradingView 帳號開啟兩步驟驗證(2FA)——這跟方案高低是兩件事。 Basic 方案開了 2FA 也不會因此解鎖 webhook(因為這功能本身方案就不給),但在付費方案上,忘記開 2FA 會是另一個讓 webhook alert 被擋住的獨立原因。

Alert 到期與休眠機制

Alert 不是永久有效的。預設最長存活期限是兩個月;Premium 和 Ultimate 方案可以開啟「不過期」選項讓 alert 永久存活。 過期的 alert 會在 Alert Manager 顯示紅色Stopped — Expired狀態,之後就不會再觸發——你只能刪除重建。

還有一條獨立的規則值得知道:如果同時符合以下三個條件,alert 會被自動停用——建立超過一年、超過一年沒觸發過、而且超過一年沒被編輯過。如果你的 alert 已經放著很久沒動過,在懷疑是技術問題之前先檢查這一點。

  • 已確認方案是 Essential 以上(Basic 沒有 webhook 通知功能)
  • 已檢查 Alert Manager,狀態是綠色 Active,不是紅色 Stopped — Expired
  • TradingView 帳號已開啟 2FA
  • 如果 alert 已建立超過一年,已確認沒有因為一年沒動而被自動停用

第 1 層——Alert 到底有沒有真的觸發?

這一層最容易搞混,因為 TradingView 有兩套完全不同的觸發頻率系統,很多人會誤把兩者當成同一件事: Alert 建立對話框裡的Frequency下拉選單,跟 Pine alert() 函式的 freq 參數。這兩者的選項並不相同。

設定出現在哪裡意思
Once only(只觸發一次)僅 UI 下拉選單條件完全符合設定參數時只觸發一次
Once per bar(每根 K 棒一次)UI 下拉選單,或程式碼 alert.freq_once_per_bar每根 K 棒都檢查,條件符合就觸發——不等 K 棒收盤
Once per bar close(K 棒收盤才觸發)UI 下拉選單,或程式碼 alert.freq_once_per_bar_close同樣的檢查,但要等 K 棒真的收盤才觸發
Once per minute / every time僅 UI 下拉選單每分鐘重新檢查一次條件
alert.freq_all僅 alert() 函式alert() 每次被呼叫都觸發,沒有每根 K 棒的次數限制

alert() 函式的 freq 參數只接受三個值(once_per_bar / once_per_bar_close / all)——程式碼層級沒有對應「Once only」或「Once per minute」的選項。

如果你的 Pine 腳本用的是 alert() 函式,觸發頻率是在程式碼裡決定的,只有三個可能值。 沒有辦法讓 alert() 呼叫表現得像「Once only」或「Once per minute」——這兩個選項只存在於 UI 設定、以 alertcondition() 為基礎的 indicator alert。把這兩套心智模型搞混, 是「webhook 應該要觸發卻沒觸發」最常見的原因之一。

Repainting 會讓一個正常運作的 alert 看起來像壞掉

依賴當前 K 棒 high/low/close、或跨週期抓資料的腳本,在即時 K 棒還在形成時數值可能會浮動。 如果你的 Frequency 沒設成Once Per Bar Close,alert 可能會在一個之後會變動的數值上觸發, 結果看起來像誤觸發,或是像「應該觸發卻沒觸發」但其實跟你事後看到的畫面對不上。 把 Frequency 設成 Once Per Bar Close 是這類問題的標準解法。

Strategy alert 有自己的規則

如果 alert 是掛在 strategy 而不是 indicator 上,還有幾條額外規則。Strategy 預設只在 K 棒收盤時才重新計算—— 所以就算 alert() 在 strategy 裡填 alert.freq_all 或 alert.freq_once_per_bar,實際上也只會在收盤時觸發一次,除非你明確開啟 calc_on_every_tick = true。另外,strategy 的下單觸發 alert 只會在即時成交時通知—— 歷史 K 棒上原本會成交的單子完全不會產生通知,所以只用歷史資料測試,永遠看不到即時 alert 觸發的畫面。

還有一個容易犯的錯:alertcondition() 只能在 indicator 裡用。放進 strategy 一樣能編譯過, 但完全不會有任何效果,也不會報錯告訴你原因。

  • Alert Manager 的觸發紀錄裡至少有一次過去的觸發
  • Frequency 設定符合你真正想要的行為(Once per bar vs. Once per bar close vs. Once per minute)
  • 如果程式碼裡用 alert(),已確認 freq 值是三個合法選項之一
  • 如果是 strategy alert,已確認 calc_on_every_tick 的設定符合你想要的觸發時機
  • 已用 Once Per Bar Close 排除 repainting 的可能性

第 2 層——Request 有沒有真的離開 TradingView 的伺服器?

如果 Alert Manager 確認 alert 有觸發,下一個問題是 TradingView 有沒有成功把 webhook request 送出去。 URL 和 payload 有幾個嚴格的技術規格要求:

規格內容
Port只接受 80 和 443——其他 port 一律直接拒絕
協定非 HTTPS / TLS 設定錯誤會被列為明確的送出失敗原因
IPv6目前 webhook URL 不支援 IPv6
訊息大小手動輸入在 Message 欄位的訊息上限 4,000 字元;透過 alert() 或 alert_message 參數上限 40,960 字元——request body 大小限制與此相同
Content-Type自動判斷:訊息若為合法 JSON 則為 application/json,否則為 text/plain

送達機制不是大家常以為的那樣「全部都會重試」。如果你的伺服器回5xx錯誤, TradingView 會在 5 秒後重送,最多重送 3 次(總共最多送 4 次)。但4xx回應或逾時, 會被視為已送達直接丟棄——這兩種情況都不會自動重試。另外還有一條硬性頻率限制: 同一個 alert 在 3 分鐘內觸發超過 15 次,系統會自動停用它。

  • Webhook URL 用的是 port 80 或 443(沒用自訂 port)
  • URL 是 HTTPS 且憑證有效
  • URL 指向公開的 IPv4 主機名稱,不是 IPv6
  • Alert 訊息在對應的大小上限內(4,000 或 40,960 字元)
  • 沒有不小心在 3 分鐘內觸發超過 15 次

第 3 層——你的伺服器有沒有真的收到?

大部分真正的「webhook 沒反應」案例其實卡在這裡:alert 觸發了、TradingView 送出了 request, 但這個 request 從來沒有抵達你的應用程式。這裡有兩個 TradingView 端的限制要注意。

第一,你的伺服器必須在3 秒內回應,否則 request 會被取消——而且依照上面的送達規則, 逾時不會被重試。如果你的端點在回應之前先做了很慢的同步工作(下單、等交易所 API 回應), 這是在高負載下悄悄漏掉訊號的常見原因。正確做法是立刻回應 webhook,實際下單邏輯改成背景非同步處理。

第二,如果你有設 IP 白名單,TradingView 目前送 webhook 用的是一組固定 IP——截至 2026 年 7 月查證:

text
52.89.214.238
34.212.75.30
54.218.53.128
52.32.178.7
不要把這份清單當成永久不變
TradingView 並沒有公開承諾這 4 個 IP 永遠不會改變。更穩妥的做法是驗證 TradingView 每次 HTTPS webhook request 附帶的 SSL 憑證,憑證上的 CN = webhook-server@tradingview.com 可以確認請求來源。 如果你的框架能檢查用戶端憑證,這會比寫死 IP 更可靠。

URL 指向 localhost 或任何私有/內部 IP,是官方明確記載的失敗案例——TradingView 的伺服器沒辦法 直接連到你的筆電。本機開發階段需要用公開 tunnel(例如 ngrok)架在伺服器前面。

實際怎麼測試

先直接打你自己的端點,把「我的伺服器到底有沒有在聽」跟「TradingView 的 request 有沒有送到」這兩件事分開驗證:

bash
curl -X POST https://api.tvsbot.com/webhook/<your-webhook-token> \
  -H "Content-Type: application/json" \
  -d '{"secret":"INVALID-SECRET-DO-NOT-USE","strategy":"<TVSBot 策略名稱>","action":"buy","symbol":"BTCUSDT","exchange":"binance","market_type":"futures","qty_type":"margin_usdt","qty":10}'

上面以 TVSBot 的 webhook 為例(網址最後一段是策略頁的 webhook token;自架接收端就換成你自己的 URL 與 payload)。 secret 是故意填的無效值,所以這則 curl 只測「連得到、認得 token、payload 合法」,不會下單;請不要換成你真的 secret 來測。 真正的 webhook secret 只在 TradingView 的 alert 視窗填,不要寫進 Pine 原始碼,也不要貼到公開的地方。

看回應就知道卡在哪一層(TVSBot 先驗 payload 格式、再比 secret,所以格式錯時會先看到 400):

curl 結果代表什麼
401,內容是「secret 錯誤」最理想:路由通了、token 找得到、payload 格式合法;secret 是故意填錯的,所以沒有執行任何下單。
401,內容是「invalid webhook token」網址最後一段的 webhook token 不對(複製錯,或已經重新產生)。
400payload 格式不對:不是合法 JSON,或缺必填欄位、欄位值不合法;回應的 issues 會列出前幾個出錯的欄位。
429打太頻繁被限流,等 Retry-After 秒後再試。
連不上/逾時網路或防火牆問題,跟 TradingView 完全無關。

能拿到 401「secret 錯誤」代表你的伺服器沒問題,問題在上游(IP 白名單、逾時,或 TradingView 那端)。

  • 伺服器在遠低於 3 秒的時間內回應(任何狀態碼皆可)——重的工作放在回應之後,不是之前
  • 防火牆或安全群組允許 TradingView 來源 IP 的連入流量,或改用 SSL 憑證驗證取代 IP 白名單
  • Webhook URL 指向公開位址,不是 localhost 或私有 IP
  • 直接對自己端點的 curl 測試很快有回應(自架端點回 200;打 TVSBot 並故意帶無效 secret 則是 401)

第 4 層——收到了,但交易所端沒出現任何下單

如果伺服器 log 確認 payload 有進來、程式碼也處理過了,最後一層就是交易所本身拒單或忽略了這筆下單。 這一段 TradingView 完全管不到——純粹是你的伺服器跟交易所 API 之間的事。手上沒有具體錯誤碼的情況下, 常見嫌疑犯是:

原因要檢查什麼
API key 權限key 需要開啟交易權限;唯讀 key 或沒開期貨交易權限的 key 會讓每一筆單都被拒
數量精度交易所要求下單數量符合該商品的特定步階;原始訊號數量沒對齊精度就會被拒
最小下單量每個商品都有最小名目金額或最小數量,小額測試訊號常常低於這個門檻
倉位模式不對帳號設成雙向持倉(hedge mode),但自動化程式假設是單向持倉(one-way)時,反向/平倉單可能行為異常
交易所端 IP 白名單如果你在交易所端把 API key 限制到特定 IP,你的自動化伺服器 IP 也要在清單上——這跟 TradingView 端的白名單是兩件事

如果下單成交的名目金額跟你預期不一樣,而不是直接被拒單,那通常不是這一層的問題——可以看 qty_type 語意陷阱 這篇,那是另一個很常見的特定案例。如果懷疑的是 API key 本身,我們的 Binance API key 安全指南 有詳細列出該開哪些權限、哪些絕對不要開。

TVSBot 怎麼幫你把問題定位出來
TVSBot 收到 webhook 會立刻回應,實際下單邏輯改成背景非同步處理,就是為了避免交易所端較慢的來回 拖到 TradingView 的 3 秒逾時。每一筆訊號——原始 payload、處理 log、交易所回應——都會被記錄下來 並可在 dashboard 上重播,讓你直接看到某筆訊號是卡在哪一層,而不用用猜的。Dry-run 模式可以讓你 在真的動用資金之前,用模擬成交先把整條鏈路測過一遍。
  • API key 已開啟交易權限(不是唯讀)
  • 下單數量符合該交易所該商品的精度/步階
  • 下單量高於該交易所該商品的最小名目金額/數量
  • 帳號倉位模式(單向 vs 雙向)符合自動化程式的假設
  • 交易所端 API key 的 IP 限制(如果有設)已包含你伺服器的 IP

如果還是查不出來

把這五層都查過一遍之後,你至少已經把問題縮小到某一側——TradingView 的 alert 設定、網路路徑,或是交易所帳號。 光是這樣就能把「反正就是不會動」變成一個具體、可以修的問題。如果需要從零開始的完整設定教學, 可以參考我們的 TradingView webhook 完整教學。

圖表上 alert 觸發了,但我的伺服器什麼都沒收到,該從哪裡查起?
先從第 2 層開始:檢查這個 alert 有沒有出現 webhook 送出錯誤訊息。 如果顯示沒有錯誤,再到第 3 層用 curl 直接測試你的端點,確認 request 到底有沒有送到你的伺服器。
為什麼 webhook 用了一陣子之後就突然不動了?
先檢查 Alert Manager 有沒有顯示紅色Stopped — Expired狀態。Alert 預設最長存活 兩個月(只有 Premium 和 Ultimate 能開不過期),另外還有一條規則會自動停用超過一年沒觸發、 也沒被編輯過的 alert。
Once Per Bar 跟 Once Per Bar Close 到底差在哪?
Once Per Bar 一符合條件就馬上觸發,不等 K 棒結束——這讓它容易受 repainting 影響, 因為腳本數值在 K 棒收盤前可能還會變動。Once Per Bar Close 會等 K 棒真的收盤才觸發, 對大多數交易邏輯來說是比較安全的預設選擇。
TradingView 會自動重試送失敗的 webhook 嗎?
只有 5xx 伺服器錯誤才會重試——5 秒後重送,最多重送 3 次(總共最多 4 次)。4xx 回應或逾時都會被 視為已送達,完全不會重試,所以反應慢的端點可能會悄悄漏掉訊號。
要怎麼測試我的 webhook URL 到底連不連得到?
從外部機器用 curl,照 TradingView 會送的方式與 payload 結構直接打過去。 如果 curl 很快拿到回應(自架端點是 200;打 TVSBot 並故意帶無效 secret 則是 401),你的伺服器沒問題,剩下的問題在上游——IP 白名單、逾時, 或是 TradingView 那端的 alert 設定。

Get started

想把今天學到的東西自動化跑起來?

TVSBot 把一個正常運作的 TradingView webhook 轉成跨 7 家交易所的即時下單——非託管、背景非同步處理訊號、支援 dry-run 測試,每一筆訊號都能在 dashboard 完整重播,清楚看到發生了什麼事。

免費開始