← 所有文章

工程 · 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 處理。

流程圖:TradingView 策略快訊在訂單成交時發出 webhook,轉發服務驗證後 3 秒內先回 200,把工作丟進 queue,由背景 worker 照目標部位到幣安合約 API 下單、掛停損,停損掛在交易所端,轉發服務離線也有效;每次動作和每日狀態用 Telegram 通知。

對齊部位,停損放交易所

relay 不理會快訊說的是買還是賣,只看 strategy.market_position,也就是策略現在應該是多單還是空手,再把幣安的部位調成一樣:

Python
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 分鐘巡檢一次:有多單沒停損就補掛,部位不見了就清掉紀錄並通知我。

對照表:轉發服務不看快訊說買或賣,只看 strategy.market_position。策略應該是多單、幣安已有多單時不下單,只確認停損還在;幣安沒有部位就開多單,並在成交均價往下 5% 掛 STOP_MARKET;策略應該空手、幣安還有部位就全部平倉,兩邊都空手就不動。

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 對上,才算驗收完成。

這是我自己的小額實驗,不是投資建議。

#webhook#幣安#TradingView#自動交易

留言

載入留言中…

下一篇

工程

對帳告警響了兩次:Bitfinex 放貸部位換邊造成的漏算與重複計息

我用實際付息除以帳面應計的比值監控收益有沒有算錯,這個告警響過兩次,一次漏算、一次重複計息,根因都是 Bitfinex 把同一筆部位分在 credits 與 loans 兩側。