疑難排解 · 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 個月
Essential20 + 202 個月
Plus100 + 1002 個月
Premium400 + 400(另加 2 個 watchlist)可開啟不過期
Ultimate1,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://your-domain.com/webhook/your-token \
  -H "Content-Type: application/json" \
  -d '{"secret":"your-secret","symbol":"BTCUSDT","side":"buy"}'

如果這個 curl 拿到很快的 200,你的伺服器沒問題,問題在上游(IP 白名單、逾時,或 TradingView 那端)。 如果 curl 自己都連不上,那是網路或防火牆問題,跟 TradingView 完全無關。

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

第 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,你的伺服器沒問題,剩下的問題在上游——IP 白名單、逾時, 或是 TradingView 那端的 alert 設定。

Get started

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

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

免費開始