TradingView Webhook 自動交易的部位怎麼抓?
資金比例配置 vs 固定數量的取捨
假設你的回測用 10 萬美元 initial_capital 跑,default_qty_type 設成 strategy.percent_of_equity、 數值 10(即 10%)。你實際的交易所帳戶裡只有 2,000 美元。 當 alert 觸發、webhook 打到你的執行伺服器,實際會送出多少數量?
答案是:TradingView 會用「這根 K 棒當下的 strategy.equity」 的 10% 去算這筆單的數量——而 strategy.equity 是 Pine 策略 完全在 TradingView 伺服器上模擬出來的一個數字。它不知道你真實帳戶裡 只有 2,000 美元。Alert 裡送出的數量,是根據回測的內部模擬餘額算的, 不是你交易所裡的餘額。
策略宣告裡的那一行,就是這件事的關鍵——而它正好是「你不講,AI 就會替你默默決定」 的那種細節。所以這篇不講語法,只講兩件事:怎麼跟 AI 講清楚你要哪一種配置方式, 以及拿到程式碼後、真錢進場前該怎麼驗收。下面有可以直接複製的指令。
default_qty_type 和 strategy.equity怎麼運作。但官方文件從頭到尾沒有任何一處討論這跟你交易所真實餘額的關係 ——因為兩者本來就沒有連動。這個落差,正是把 TradingView alert 接到實盤下單時,部位大小最容易出問題的根本原因。決定你下單大小的,就是那一個設定
宣告策略時,strategy() 函式的 default_qty_type 參數只有三個合法值,而 default_qty_value 在每一種底下的 意思都不一樣。在你拿到的程式碼裡把那一行找出來——它通常就在最上面幾行—— 對著下面這張表看一眼。驗收就這麼一件事。
| default_qty_type | default_qty_value 的單位 | 精確語意 |
|---|---|---|
strategy.fixed | 口數 / 股數 / 手數 | 預設值。每次進場用固定的口數/股數/手數。 |
strategy.cash | 帳戶貨幣現金金額 | 以 strategy.account_currency 的現金金額計算。 口數換算方式是 default_qty_value / 收盤價——TradingView 官方文件給的範例:收盤價 $5、數值設 50, 口數 = 50 / 5 = 10。 |
strategy.percent_of_equity | 百分比(0–100) | 用strategy.equity——策略當下的模擬權益—— 的某個百分比去決定這筆單的大小。 |
來源:Pine Script Language Reference Manual v6,strategy() 與三個 default_qty_type 常數(查證日期 2026 年 7 月)。
還有一個細節值得知道:如果 strategy.entry() 或 strategy.order() 呼叫時明確指定了非 na 的 qty 參數,這個值會完全覆蓋該筆單的 default_qty_type/default_qty_value 設定 ——strategy 層級的預設值只在呼叫本身沒給 qty 時才生效。 TradingView 官方文件用一個範例示範這件事:策略宣告了 default_qty_type = strategy.cash,但 entry 呼叫仍自己 帶了 qty,結果那筆單完全不理會 strategy 層級的預設設定。
這個「覆蓋」規則在驗收 AI 產出時特別重要:最上面那行宣告寫的是一回事, 底下的下單呼叫可能悄悄做另一回事。所以直接問它一句就好:「這支腳本裡有沒有任何 entry 或 order 呼叫自己帶了 qty?列出來。」
為什麼「權益的 10%」不是你錢的 10%
官方定義,逐字引用自 Pine Script 語言參考手冊——放在這裡是讓你看得懂,不是要你背:
strategy.equity = strategy.initial_capital + strategy.netprofit + strategy.openprofitnetprofit 是已平倉交易的累計已實現損益;openprofit 是目前未平倉部位的浮動損益。 兩者都會隨著每筆交易平倉、每次價格變動而改變,這使得 strategy.equity 是一個持續變動的序列——幾乎每根 K 棒 都可能是不同的值。
這也是為什麼 percent_of_equity 這種配置方式在結構上 必然會複利。default_qty_value 設成 10,永遠代表 「這根 K 棒當下 strategy.equity 的 10%」。 連續幾筆獲利平倉之後,equity 變大,同樣的 10% 換算出來的絕對數量 也跟著變大;虧損之後則反過來縮小。TradingView 官方使用手冊裡的 Commission Demo 範例策略,用的正是這個設定(default_qty_value = 2, default_qty_type = strategy.percent_of_equity),就是用來展示「部位大小隨 equity 變動而縮放」這個效果。
strategy.equity 跟你交易所 真實帳戶餘額之間的關係。根據上面的定義——initial_capital 是你自己在 strategy() 宣告裡填的任意數字,而 netprofit/openprofit 完全是在 TradingView 伺服器上模擬出來的——可以合理推得 strategy.equity 跟你 真實帳戶餘額沒有任何連動。這是由官方定義推導出的結論, 不是 TradingView 自己白紙黑字寫出來的一句話。你該指定哪一種,各要付出什麼代價
兩種配置方式都不是「正確答案」,它們優化的目標不一樣。與其猜哪一種 在某次回測裡看起來比較漂亮,不如把取捨攤開來看。這張表可以當菜單看: 你想要哪一欄,就在指令裡把它講出來。
| percent_of_equity | fixed | |
|---|---|---|
| 下單量會隨 equity 變動而縮放 | ||
| 下單量的絕對數字事先就能預測 | ||
| 依賴一個你在執行當下無法控制的內部模擬餘額 | ||
| 帳戶餘額變大或變小時需要自己手動調整數量 | ||
| 模擬餘額跟真實餘額差距大時,回測與實盤下單容易脫鉤 |
這張表要看的是「各自依賴什麼」:percent_of_equity 會縮放, 但縮放的基準是 TradingView 內部模擬的一個數字;fixed 可預測, 代價是不會自己隨帳戶調整。這個依賴關係,決定了你 webhook payload 裡那個數字 是不是真的跟你以為的意思一樣。
兩段指令:一段拿來要、一段拿來驗
要程式碼的時候貼這段
下面這版是「用固定數量、把數量決定權留給執行端」——也就是不依賴模擬餘額的那種配置。 你要的是相反的方向,就把配置那一段換掉;重點是你要講明白你要哪一種、以及為什麼, 而不是讓它替你選:
幫我寫一支 TradingView 用的 Pine Script v6 策略,它會觸發 webhook 到我的實盤交易所帳戶。
策略邏輯:[用白話描述你的進場與出場條件]
倉位配置——這一段沒有商量餘地:
- 用 default_qty_type = strategy.fixed,default_qty_value = 1。
不要用 strategy.percent_of_equity。原因:percent_of_equity 是拿 strategy.equity
去算下單量,而那是回測的模擬餘額,跟我交易所帳戶的實際大小不一樣。
我不要回測算出來的數字跑到我的交易所去。
- 除非我明講,否則任何 strategy.entry() 或 strategy.order() 呼叫都不要自己帶 qty 參數。
如果你哪裡帶了,要主動告訴我。
- Alert message 必須是單行、合法的 JSON,內容包含方向({{strategy.order.action}})
以及以下欄位,多的不要:
[貼上你接收端要求的欄位清單]
不要放 {{strategy.order.contracts}}——數量由我的執行伺服器決定,不是 TradingView。
最後用一行一句告訴我:你用的 default_qty_type 是哪個、在這個設定下 default_qty_value
代表什麼意思、以及有沒有任何下單呼叫覆蓋掉它們。配置那一段要把「原因」寫進去,不是為了客氣——是為了避免它好心地把你換回 percent_of_equity,只因為那樣回測曲線比較好看。
拿到程式碼之後貼這段
把程式碼貼回去,加上這四題。其中三題的答案,你看完上面幾節就已經知道了—— 這正是重點:
這是我的策略。在你動手改任何東西之前,先回答我:
1. default_qty_type 設成什麼?在這個設定下,default_qty_value 代表什麼單位?
2. 有沒有任何 strategy.entry() 或 strategy.order() 呼叫自己帶了 qty?
列出來——那些會覆蓋掉 strategy 層級的預設值。
3. 如果我用 initial_capital = 100000 跑這支策略,但我交易所帳戶裡實際只有 2000,
最後送進 {{strategy.order.contracts}} 的數字是根據哪一個算出來的?
4. 我的 alert message 裡,有哪些欄位是從回測模擬餘額推導出來的、
而不是來自我的真實帳戶?
[把你的腳本貼在這裡]第 3 題是關鍵。會從 initial_capital 一路推給你看數量怎麼來的, 代表它懂這個狀況;回答「策略會用你那 2,000 去算」的,就是不懂—— 那則回覆裡其他內容你都得重新檢查一遍。
怎麼跟 AI 交代 alert message 裡要放什麼
以下是 TradingView 官方文件列出、專屬於 strategy order fill event 的 placeholder——這是唯一能在 alert message 裡取得數量資訊的地方。 你不是要自己手寫這些,而是在指令裡點名你要哪幾個, 再檢查回來的東西有沒有多放、少放:
| Placeholder | 代表的意思 |
|---|---|
{{strategy.order.contracts}} | 該筆成交單的口數/股數 |
{{strategy.position_size}} | 觸發當下的目前倉位大小,帶正負號(+多 / −空) |
{{strategy.market_position_size}} | 目前倉位絕對值大小 |
{{strategy.prev_market_position_size}} | 前一個倉位絕對值大小 |
{{strategy.order.action}} | "buy" 或 "sell" |
{{strategy.order.price}} | 成交價 |
{{strategy.order.alert_message}} | 讀取該筆 strategy.entry()/strategy.exit()/strategy.order() 呼叫的 alert_message 參數值 |
僅限 strategy order fill event 使用——不能用在 alertcondition() 或獨立的 alert() 訊息裡。來源:Pine Script 使用手冊,Strategies / Strategy alerts(查證日期 2026 年 7 月)。
{{strategy.order.alert_message}} 有一點值得特別提醒: 官方文件明確講,這個 placeholder 只有在該筆下單呼叫確實傳了 alert_message 參數時才會被替換成你的自訂文字。 如果策略裡有多個 strategy.entry()/strategy.order() 呼叫,只有部分用了 alert_message,那些沒用到的下單事件 觸發時,這個 placeholder 會變成空字串。
這也可以變成一句具體、可驗收的要求:「如果你在 alert message 裡用到 {{strategy.order.alert_message}}, 請確認這支腳本裡每一個下單呼叫都有傳 alert_message 參數。」JSON payload 裡出現空欄位這種事,通常不會在你檢查的時候爆,會在半夜爆。
一、程式碼裡的
alert() 呼叫——訊息是程式當場組出來的, 你不需要在對話框裡再打一次。二、下單函式的
alert_message= 參數——這段文字只有在成交事件 觸發、且訊息裡用了 {{strategy.order.alert_message}} 時才會被讀出來。三、TradingView「Create Alert」對話框的 Message 欄——這是唯一能用
{{strategy.*}} placeholder 的地方,前提是這個 alert 建立在 strategy 上。介面上的逐步操作(圖表右上時鐘 → Add Alert → Condition 選你的策略 → Notifications 勾 Webhook URL)在 用 Claude 寫 Pine 那篇有完整走過一遍。
唯一一個 AI 沒辦法幫你做的決定
既然 percent_of_equity 是拿模擬餘額去算的,而 fixed/cash 完全不知道你的帳戶大小, 任何 TradingView 接交易所的自動化都會遇到一個實際的設計決定: 最終下單數量,是由 TradingView 端決定,還是執行端決定?
這正是兩層問題交會的地方。以上講的都是 TradingView 怎麼決定 alert 裡要放哪個數字。等這個數字——或只是一個方向訊號——打到執行伺服器之後, 還有第二層、完全獨立的問題:這台伺服器怎麼把它變成一筆真正的交易所 下單,包括槓桿跟保證金、名義倉位大小之間的關係。這第二層我們在 qty_type 語意陷阱那篇文章 裡有詳細拆解——等你想清楚「誰來算數量」之後,值得接著看那篇, 它講的是這個數字送到之後會發生什麼事。
舉例來說,TVSBot 的執行端是在下單當下才解析數量,提供 5 種計算方式 (fixed / usdt / percent / margin_pct / margin_usdt),而不是單純轉發一個 從回測模擬 equity 算出來的數字。其中 percent 與 margin_pct 會在下單當下查詢你交易所真實、當下的可用餘額再換算;usdt 與 margin_usdt 用即時報價把你指定的 USDT 金額換成數量;fixed 則直接照你給的幣數量下單。
要確認實際會解析出什麼數量,可以先用 dry-run 模式跑一次,用虛擬資金看送出的數字對不對。 帳戶層級的風控設定(單筆金額上限、單筆百分比上限、最大持倉數、日虧損熔斷、最大槓桿) 加上一鍵 kill switch,則是不管你用哪種配置邏輯都會生效的一層防護。
常見問題
percent_of_equity 會自動考慮我交易所裡的真實餘額嗎?
strategy.percent_of_equity 是用 strategy.equity 的百分比去算下單量,而官方定義 strategy.equity = initial_capital + netprofit + openprofit——這三個值全部是 Pine 策略內部模擬出來的,不是查詢你交易所 帳戶得到的。TradingView 官方文件沒有描述任何讀取真實帳戶 餘額的機制。我可以直接叫 AI 用我交易所的真實餘額去算倉位嗎?
strategy.equity 算倉位的策略——頂多是把 initial_capital 填成今天跟你帳戶差不多的數字, 但模擬 equity 一開始複利,兩邊又會拉開。 要用「當下的真實餘額」算倉位,這件事只能發生在 alert 之後的執行端。如果我把 default_qty_type 設成 strategy.fixed,數量會自己變嗎?
strategy.fixed 用的是 default_qty_value 定義的固定口數/股數/手數, 不會隨帳戶績效而自動變大或變小,除非你自己去改這個輸入值。我可以在 strategy.entry() 裡直接指定 qty,不靠 default_qty_type 嗎?
strategy.entry() 或 strategy.order() 只要給了非 na 的 qty 參數,這個值會完全優先於 strategy 層級的 default_qty_type/default_qty_value 設定,只作用於那一筆單。哪個 placeholder 能拿到實際成交的數量?
{{strategy.order.contracts}} 對應該筆單實際 成交的口數/股數。這只在 strategy order fill event 的 alert 裡才有,不能用在 alertcondition() 或獨立的 alert() 訊息裡。數量該在 TradingView 端算、還是執行端算比較好?
initial_capital 差得越遠, 這點就越重要。Get started
TVSBot 是非託管的 TradingView → 交易所自動下單橋接,支援 7 家交易所,用你自己的 API key 跟資金。百分比類的計算方式會在下單當下查你真實的即時餘額,並提供 dry-run 測試與帳戶層級風控。
免費開始使用