TradingView 策略回測完整教學:五個會騙人的數字
你在 TradingView 圖表上把一支 Pine Script 套上來——Pine Script 也就是 TradingView 內建、用來寫指標與策略的腳本語言。Add Alert 按下去卻找不到 Any alert() function call,Strategy Tester 面板也是灰的。回測跑不起來,看不到勝率也看不到淨利。
沒有人先跟你講的是:只有以 strategy(...) 開頭的腳本才會有 Strategy Tester,indicator(...) 開頭的不會。這件事跟你的方案、跟你付了多少錢無關——是 Pine 官方文件的第 0 條規則,但幾乎沒人講。
這篇不談「策略應該怎麼設計」——那是另一件事,我們寫過[散戶量化的三大陷阱:過擬合、倖存者偏差、未來函數](/blog/quant-for-retail)。這篇只做三件事:把回測跑起來、把面板上的數字看懂、把 strategy() 幾個會偷偷改變結果的預設值攤開來對照官方文件。
strategy() 頁面(查證日期 2026 年 9 月 15 日)。TradingView 平台功能能不能用哪個方案,對照 tradingview.com/pricing 的方案比較表;付費層級隨時可能改,實際動手前建議自己再去看一次當下版本。落差一:你手上寫的是 indicator,還是 strategy?
Pine 腳本只有兩種身分:indicator(...) 只做視覺呈現,strategy(...) 才會下模擬單、產生績效表格。這件事在官方文件寫得非常直白,但 AI 生的 Pine 常常搞混——你跟它說「幫我寫一個 RSI 反轉的策略」,它給你的第一行卻是 indicator("RSI 反轉")。這種腳本連 Strategy Tester 都打不開。
最快的分辨方法是看檔案第一個可執行函式:只有 strategy() 才有 Strategy Tester。同一個腳本裡不會同時有兩個宣告,你只需要看那一行。
| 問題 | 答案 |
|---|---|
| 第一行寫 indicator()? | 沒有 Strategy Tester 面板。想回測必須改寫成 strategy() |
| 第一行寫 strategy()? | 圖表下方會多出 Strategy Tester 分頁;點下去就能看到績效表 |
| 兩種都不是(沒寫)? | Pine v6 要求宣告,會直接編譯錯 |
怎麼判斷這支腳本能不能被回測(查證日期 2026 年 9 月,Pine Script v6)
把 indicator() 改成 strategy() 不是換個字這麼簡單——後者多了一堆跟資金、槓桿、手續費有關的參數(後面第五節會逐個講),但這些**都有預設值**。你什麼都不填,Pine 也會跑,只是跑出來的數字是 TradingView 官方定義的預設情境,不是你自己的實際情境。
落差二:Basic 方案能不能跑回測?可以,但這幾件事會擋住你
免費的 Basic 方案是可以打開 Strategy Tester 的——你可以套自己寫或別人分享的 strategy() 腳本、可以看到 Overview 分頁的績效數字、可以看 List of Trades。這一步不需要付錢。
擋住你的通常不是「打不開」而是這三件事:
| Basic(免費) | Premium 以上 | ||
|---|---|---|---|
| 打開 Strategy Tester、看 Overview 數字 | |||
| Bar Magnifier(用更小時間框架的資料模擬成交) | |||
| Pine 計算時間上限 | 20 秒 | 40~100 秒 | |
| 每張圖同時掛的指標數量 | 2 | 25~50 | |
| webhook 通知(把訊號自動 POST 到別的服務) |
Basic 與 Premium 對回測體驗的差異(截至 2026 年 9 月,來源 tradingview.com/pricing 與 Pine v6 strategy() 官方 reference)
Bar Magnifier 這一項特別有感——官方 strategy() reference 對 use_bar_magnifier 這個參數的原文寫著 「Only Premium and higher-tier plans have access to this feature」。Basic 用戶沒付錢,這個 checkbox 開了也不會生效。
1 小時線的一根 K 棒,內部可能已經觸價止損又拉回,Basic 模式看不到這個過程、只會用開高低收算。想長期做自動化交易,Premium 這一階通常是門檻——webhook 也就是把 alert 觸發時的內容自動 POST 到你自己伺服器或第三方服務的那條通道,Basic 一開始就沒有。我們在[五個方案對回測與 webhook 的實際差異](/blog/tradingview-plans-webhook-comparison)那篇拆開講過,這裡不重複。
Strategy Tester 面板:四個分頁分別在給你什麼
把腳本加上圖表之後,畫面下方的 Strategy Tester 面板會列出幾個分頁,各自服務不同的決策——搞錯要看哪一個,會直接看漏東西。下面這幾個是你多半會用到的核心分頁(實際列出的分頁與名稱可能隨 TradingView 版本微調):
| 分頁 | 在給你的東西 | 什麼時候看它 |
|---|---|---|
| Overview | Net Profit、Percent Profitable、Profit Factor、Max Drawdown 等總結 | 第一眼判斷這支策略值不值得繼續看 |
| Performance Summary | 把每個指標拆成 All / Long / Short 三欄;含 Sharpe、Sortino 等 | 決定要只跑多、只跑空、還是雙向 |
| List of Trades | 每一筆進出場的時間、價位、獲利、run-up、drawdown | 找出讓 Max Drawdown 爆掉的元兇是哪一筆 |
| Properties | 當下這次回測用的所有 strategy() 參數,含沒改的預設值 | 回測完存證;半年後回頭對照當時設定 |
Strategy Tester 核心分頁與用途(Pine Script v6,查證日期 2026 年 9 月)
常見的看漏是 Properties 這一頁。絕大多數人只看 Overview 就下結論,但 Overview 的數字是用當下 Properties 的設定跑出來的結果。你如果沒點進 Properties 對照,就不知道那個 68% 勝率背後預設是什麼——initial_capital 100 萬、每筆固定 1 張、零手續費、零滑價。這些是 Pine 的預設值,不是你的真實情境。第五節會逐個列出來。
Overview 那五個粗體字,每個都可以被造假
Overview 頁面用最大字放五個總結數字。這五個數字有各自的陷阱,順著唸過去很容易被漂亮的曲線帶跑。
Net Profit(淨利):所有已結束交易的損益總和,減去手續費與滑價。絕對金額本身沒有意義——當 default_qty_type 是 percent_of_equity 時,本金越大跑出來的 Net Profit 越大,兩個不同本金的結果不能直接比。這個數字要跟旁邊的 Net Profit % 一起看,或者把 initial_capital 先調到你要真跑的金額再算一次。
Percent Profitable(勝率):獲利交易數 ÷ 總交易數。勝率高不等於賺錢——如果每次贏 10 元、每次輸 100 元,勝率 80% 你還是虧的。這是為什麼下一個數字更重要。
Profit Factor(獲利因子):所有獲利交易的總和 ÷ 所有虧損交易的總和。1 代表打平、大於 1 才有意義。實務判斷標準:1.2 以下通常撐不過真實環境的滑價與手續費,2.0 以上要先懷疑自己是不是沒設 commission 或滑價(第五節)。
Max Drawdown(最大回撤):**回測期間**權益曲線從最高點跌到最低點的最大幅度。這是「歷史上發生過的最壞」,不是「未來可能發生的最壞」——樣本外可能出現更深的回撤。看這個數字要自問:如果我真的在那個時間點看到帳戶跌這麼多,我會不會關掉策略?會的話這支策略在你身上還沒真正被回測過。
Total Closed Trades(總交易次數):策略在這段歷史上完成了幾筆交易。這個數字太小的時候(比如 10 次以下),前面四個數字全部沒有統計意義——一次運氣好的順風就可以讓勝率、Profit Factor 全部漂亮。判斷粗略經驗值:**個位數不看,兩位數存疑,三位數以上才有點依據**。
五個 strategy() 預設值,會直接改變你的回測結果
strategy() 這個宣告函式有三十幾個參數,全部有預設值。你什麼都不填也能編譯過、也能跑出漂亮的績效表——但那些數字是**用官方預設值算出來的**。這是新手最容易被騙的地方。以下五個是影響最大的:
(一)跟資金與部位有關的三個
| 參數 | 官方預設值 | 現實怎麼設 |
|---|---|---|
initial_capital | 1000000 | 改成你要真跑的金額,跟交易所餘額一致 |
default_qty_type | strategy.fixed | 多數人要的是 strategy.percent_of_equity |
pyramiding | 0(拒絕加倉) | 確認你不需要加倉;需要就設 2、3 等數字 |
Pine Script v6 strategy() 的資金/部位預設值(查證日期 2026 年 9 月 15 日)
(二)跟成本有關的兩個
| 參數 | 官方預設值 | 現實怎麼設 |
|---|---|---|
slippage | 0(tick) | 加密永續抓 1~3 tick,波動大的抓更多 |
commission_value | 0 | 抓交易所實際 taker 費率,去該所頁面查 |
Pine Script v6 strategy() 的成本預設值(查證日期 2026 年 9 月 15 日)
strategy() reference 對 pyramiding 的原文寫著 「If the value is 0, only one entry order in the same direction can be opened, and additional entry orders are rejected」——預設 0 是「同方向只允許一筆進場、後續同方向 entry 會被拒絕」。所以你如果在腳本裡呼叫兩次 strategy.entry("Long", strategy.long),第二次不會加倉,而是直接被丟掉。回測結果如果比你預期少了一大半交易,通常就是這個。想加倉必須主動設 pyramiding = 2 之類的具體數字。還有一個容易忽略的參數:risk_free_rate。Pine v6 reference 對它的原文寫著 「It is used to calculate the Sharpe and Sortino ratios. Optional. The default is 2.」——預設 2 意即 2%。這個預設假設的是股票市場常用的年化無風險利率,你如果拿來看加密貨幣的策略,Sharpe 與 Sortino 會偏低。這個值該不該改要看你想跟什麼基準比較,動之前先確認你知道它會影響哪兩個數字。
request.security 的 lookahead 陷阱是另一件事
如果你的策略用到多時間框架(例如小時線腳本裡調用日線資料),還有一組會讓回測數字漂亮到不真實的預設值。這件事已經有專門的文章講:[request.security 的 lookahead 陷阱:回測漂亮實盤對不上](/blog/request-security-lookahead-trap)。
一句話總結:Pine v6 的 request.security 有個參數叫 lookahead,官方 reference 對它的原文寫著 「The default is barmerge.lookahead_off starting from Pine Script® v3.」——**預設本來就是安全的(不會偷未來)**。所以那篇文章解的其實是「有人主動打開了 lookahead_on」或「歷史資料聚合本身的延遲對不上」的變體問題,不是預設值的鍋。這是第五節那個表格沒放進來的第六個參數,因為它的預設值不會造成問題,只有主動去改才會。
Heikin Ashi、Renko 這類非標準圖表:官方明講「不建議」
Strategy Tester 是可以在 Heikin Ashi、Renko、Point & Figure 這些非標準圖表上跑的,但結果會誤導。這句話不是我說的:
strategy() 頁面的 Remarks 段機制原因是這些圖表的 K 棒價格是**合成出來的**。以下對照一下差別:
| 圖表類型 | K 棒價格從哪來 | 回測適不適合 |
|---|---|---|
| 標準蠟燭圖(Candles) | 當根 K 棒真實的 open / high / low / close | 適合 |
| Heikin Ashi | 由上一根與當根的價格平均出來,不是真實成交 | 官方不建議 |
| Renko / Kagi / Line Break | 由價格移動門檻自動堆積出的合成 K 棒 | 官方不建議 |
| Point & Figure | 只在特定價格變化時新增一格,沒有時間軸的 K 棒 | 官方不建議 |
非標準圖表為什麼會給你不真實的回測(Pine Script v6,查證日期 2026 年 9 月)
Pine 的 strategy.entry() 會拿合成價當作進場價,跟你真的在市場上會成交的價格對不上。回測看起來平順,實盤會發現訊號同樣時間出現但成交價差很多。
補救辦法:strategy() 有一個 fill_orders_on_standard_ohlc 參數,設成 true 會強迫用標準 OHLC 價格成交(即使圖表是 Heikin Ashi)。但這個設定只解決成交價,不解決訊號本身是從合成 K 棒判讀來的問題——真要做嚴肅的回測,直接換回標準蠟燭圖比較乾脆。
誠實的一段:回測是回頭看,不是明天
到這裡你已經有能力把面板上的數字看懂,也知道哪些預設值要改。但這件事必須在這裡講清楚——回測本質上是**用過去發生過的事情**,逼近**未來可能發生的事情**,兩者永遠不會完全一致。這不是 TradingView 的技術限制,是回測這件事本身的限制。
所以就算你把上面所有預設值都改到接近實盤、你的 Profit Factor 到 1.8、Max Drawdown 只有 12%——策略上線第一週就爆虧 15% 完全可能發生。那不代表你做錯,只是回測數字從來沒有保證過那件事。
真正該做的是把回測結果紀錄好——期間、標的、參數、初始資金、手續費與滑價假設,全部寫下來——然後把上線後每筆真實交易的結果對回這份紀錄。實盤跟回測差得越遠,代表這支策略對環境的假設越脆弱。這件事沒有捷徑。
每次上線一支新策略之前,把這五件事寫下來存檔,半年後你回頭問「這支怎麼變這樣」時,這份紀錄是唯一能對答案的東西。
- 回測期間——幾年到幾年,橫跨過哪幾種市場(牛、熊、盤整)
- 標的——哪個交易所、哪根 K 棒週期、哪個交易對
- strategy() 的非預設參數——把你主動改過的參數與值列出來
- Bar Magnifier 有沒有開——受限於方案時,明講「沒開」
- 手續費與滑價假設——commission_value 與 slippage 各自設了多少
常見問題
Basic 方案跑回測,數字可以用嗎?
AI 幫我生的 Pine,回測看起來很賺,能直接接自動下單嗎?
Profit Factor 到 3 以上,這是好事嗎?
回測跟實盤差很多,是 TradingView 有問題嗎?
回測結果可以寫進部落格或社群嗎?
Get started
回測跑順了、想把訊號自動接到交易所,TVSBot 用你自己的 API key、先 dry-run、風控自己設——把 Pine 訊號變真實下單這一段,不用另外寫伺服器。
免費開始使用