工程 · 2026.10.06 · 4 min · 更新於 2026.10.26
TradingView webhook 串幣安自動下單:BTC 日線策略的 relay 與交易所端停損
一套 BTC 日線策略從回測調參做到幣安自動下單:只有日線樣本夠、調回測殼比調指標有用,relay 照目標部位對齊而不是照指令下單,停損掛在交易所端。
閱讀設定
用 TradingView 的 webhook 串幣安自動下單,要處理快訊重複或漏掉,也要防 relay 掛掉時部位沒有停損。
我把一套 BTC 日線趨勢策略從回測一路做到幣安自動下單,下單這邊最值得照抄的是兩件事。
一是 relay(接收 webhook、轉成下單的轉發程式)照策略的目標部位對齊,不照快訊的買賣指令下單。
二是停損直接掛在交易所,不依賴 relay 在線。
回測這邊,只有日線的樣本夠,而且調回測殼比調指標有用。
策略是 TradingView 上一套邀請制的趨勢指標,配自己寫的回測殼,跑 BTCUSDT 永續合約。
只信樣本夠的日線
我當時是 TradingView 的 Basic 方案,只能用圖表上可載入的範圍回測,短週期的歷史很短。
名義上獲利因子(PF,總獲利除以總虧損)最高的是 15 分 K 的 6.90,但只有 2 輪交易。
日線從 2020 年起有 23 輪,PF 3.20,是唯一樣本夠的週期。其他週期的 PF 亂跳,主要是樣本太少。
指標本身的參數我試了 32 種單一改動,日線上全部變差,所以不動。有效的是回測殼的三個參數,BTCUSDT 永續日線回測的前後對比:
| 原設定 | 調整後 | |
|---|---|---|
| 分批進場 | 5 批 | 1 批 |
| 停損 | 10% | 5% |
| 槓桿 | 3 倍 | 2 倍 |
| PF | 3.20 | 3.56 |
| 總報酬 | 1,966% | 10,618% |
| 最大回撤 | 62.1% | 47.6% |
怕過度最佳化,我把資料拆成 2020 到 2023 年、2024 年以後兩段分別看,兩段都比原設定好。
開空、固定停利、移動停利、ATR 停損(用平均真實波幅決定停損距離)測出來都更差。這套的獲利集中在少數幾段大趨勢,讓你提早出場的規則都會砍到那幾段。
最大回撤是用收盤權益重算的,原設定下報表只寫 28.7%。指標看不到原始碼,我也用 Bar Replay 確認過沒有重繪,這兩件事寫在回測方法的坑。
webhook 經 Tunnel 進 relay
TradingView 的策略快訊在訂單成交時打 webhook,經 Cloudflare Tunnel 進到一支只用 Python 標準庫寫的 relay。
relay 只聽本機,呼叫幣安 USDⓈ-M 合約 API 下單、掛停損,每次動作和每日狀態用 Telegram 通知我。
TradingView 的 Basic 方案沒有 webhook,要升到 Essential。Essential 的快訊最多 2 個月就到期,我選擇每兩個月重建一次。
webhook 的回應時間也有上限:
If a remote server takes longer than three seconds to process a request, the request will be cancelled.
出自 TradingView 的 webhook 說明。3 秒內下單不一定來得及,所以 relay 驗完就先回 200,把工作丟進 queue,由背景 worker 處理。

對齊部位,停損放交易所
relay 不理會快訊說的是買還是賣,只看 strategy.market_position,也就是策略現在應該是多單還是空手,再把幣安的部位調成一樣:
amt, entry = binance.position("BTCUSDT")
if target == "long":
if amt > 0:
ensure_stop(amt, entry) # 已經有多單,只確認停損還在
else:
open_long() # 空手才開
elif amt != 0:
close_all(amt, entry) # 策略空手,交易所還有部位就全平
重複的快訊不會重複下單,哪一次漏了,下一則也會把狀態拉回來。
relay 另外擋掉 10 分鐘內內容完全相同的 webhook。
開倉成交後,relay 用實際成交均價往下 5% 掛 STOP_MARKET,帶 closePosition(觸發時整個部位平倉)。relay 掛了、網路斷了,停損一樣有效。
relay 每 5 分鐘巡檢一次:有多單沒停損就補掛,部位不見了就清掉紀錄並通知我。

Demo Trading 抓到的坑
上線前先用模擬模式只發通知,再切到幣安的 Demo Trading,把開倉、重複訊號、補掛停損、平倉、停損觸發都跑過一次。抓到的坑:
- 市價單的下單回應常常不帶
avgPrice,停損價會算錯。改成成交後再查一次訂單,拿實際均價。 - 持倉中重啟 relay,設定全倉會被幣安拒絕(-4067),就算本來就是全倉也一樣。改成先查設定,不同才改。
- 幣安的條件單從 2025 年 12 月起要走
/fapi/v1/algoOrder,舊端點會直接拒絕,見幣安合約 API 的 change log。 - 用工具列出 TradingView 快訊時,輸出會把整段訊息連同 webhook secret 印出來,我因此換了兩次 secret。
會印出設定內容的工具,輸出就要當成已經外洩。
安全設定與風險
這個服務能動到真錢,入口收得很緊。
快訊帶 webhook secret,relay 和 Cloudflare WAF 都只放行 TradingView 公布的 webhook IP,幣安 API key 綁伺服器 IP、不開提幣權限。
開倉會用掉合約錢包全部可用餘額,所以錢包裡只放要跑這個策略的錢。
回測最大回撤 47.6%,這個數字要先吞得下去。
2 倍全倉永續有強平風險,不過 5% 停損離強平價還很遠。資金費(永續合約多空之間定期互付的費用)是長抱多單的固定成本,急殺時停損也可能滑價。
資金小的時候,下單量會被最小單位 0.001 BTC 無條件捨去,實際槓桿會比 2 倍低一些。
寫這篇時策略還沒有真實訊號,要等第一筆真實進出場跟 TradingView 對上,才算驗收完成。
這是我自己的小額實驗,不是投資建議。

工程
對帳告警響了兩次:Bitfinex 放貸部位換邊造成的漏算與重複計息
我用實際付息除以帳面應計的比值監控收益有沒有算錯,這個告警響過兩次,一次漏算、一次重複計息,根因都是 Bitfinex 把同一筆部位分在 credits 與 loans 兩側。
留言
載入留言中…