想將腦中的交易策略轉化為可以自動執行的程式,卻不知從何下手?這份 Pine Script教學 全攻略就是為您準備的。我們將帶您深入 TradingView 的心臟地帶,從最基礎的 Pine Script 語法 開始,一步步教您如何撰寫、測試並優化您的交易腳本。無論您是程式新手,還是希望系統化驗證交易想法的投資者,本文都將成為您在 TradingView 程式交易 之路上的最佳嚮導,讓您學會如何進行有效的策略回測,告別憑感覺交易的時代。
在開始之前,強烈建議您使用電腦操作,因為編寫程式碼在較大的螢幕上會更加順暢與高效。
Pine Script 是什麼?為何交易者都該學習?
Pine Script 是由全球知名的圖表分析平台 TradingView 專為交易者設計的程式語言。它的存在,就是為了讓您能與 TradingView 的圖表進行深度溝通。您可以把它想像成一種「魔法咒語」,學會它,您就能在圖表上創造出專屬於您的技術指標,或是設計一套能夠自動捕捉買賣訊號的交易策略。
簡單來說,透過 TradingView 內建的「Pine編輯器」,您可以撰寫 Pine Script 腳本,並利用強大的「策略測試器」功能,對您的交易策略進行歷史數據回測。這意味著您可以在投入真實資金前,客觀地評估一個策略的歷史績效、勝率、最大虧損等關鍵指標,從而做出更明智的決策。最棒的是,這一切都在網頁上完成,無需安裝任何複雜的軟體。
推薦閱讀
Pine Script 核心語法深度剖析:從零打造您的交易腳本
要掌握 Pine Script,首先必須熟悉其基礎語法。這就像學語言要先懂字母和文法一樣。別擔心,Pine Script 的設計相對直觀,以下我們將拆解最重要的幾個構成要素。
📜 第一步:版本與屬性宣告 (Version & Declaration)
每一份 Pine Script 腳本的開頭,都必須有兩項「身份證明」,告訴 TradingView 該如何解讀您的程式碼。
- 版本 (Version):Pine Script 會不斷更新迭代,目前已進入 v6 版本。不同版本間可能存在語法差異。因此,在第一行就宣告版本是至關重要的。
//@version=6
💡 專家提示:如果忘記宣告版本,Pine編輯器會顯示錯誤訊息:「
Error: Pine version must be explicitly specified.
」,提醒您補上這一行。
屬性 (Property):您需要明確告訴 TradingView,這個腳本的「用途」是什麼。它是一個「指標 (Indicator)」還是「策略 (Strategy)」?這決定了腳本的執行方式與可用的功能。
- 指標 (Indicator):用於計算並在圖表上繪製技術指標,如均線、RSI等。它專注於「視覺化分析」,不涉及實際的買賣模擬。宣告時使用
indicator()
函數。indicator("我的指標", overlay=true)
其中,overlay=true
表示指標將直接疊加在主圖表上;若為false
,則會顯示在下方的獨立窗格中。 - 策略 (Strategy):除了包含指標計算,更核心的是定義了進出場條件、倉位大小等交易邏輯,可以用於回測和績效分析。宣告時使用
strategy()
函數。strategy("我的策略", overlay=true)
🧮 運算子的奧秘:算術與邏輯的基石
交易策略的本質就是一連串的數學運算和邏輯判斷。運算子(Operator)就是執行這些操作的符號。
算術運算子
用於基本的數學計算,與我們日常所學無異。
運算子 | 用途 | 範例寫法 | 意義 |
---|---|---|---|
+ | 加法 | 5 + 3 | 5 加 3 |
- | 減法 | 5 - 3 | 5 減 3 |
* | 乘法 | 5 * 3 | 5 乘以 3 |
/ | 除法 | 5 / 3 | 5 除以 3 |
% | 取餘數 | 5 % 3 | 5 除以 3 的餘數,結果為 2 |
比較運算子
用於比較兩個值之間的關係,其結果只會有兩種:true
(成立) 或 false
(不成立)。這是構成交易條件的核心。
運算子 | 用途 | 範例寫法 | 意義 | 結果 |
---|---|---|---|---|
== | 判斷相等 | close == open | 收盤價是否等於開盤價? | True / False |
!= | 判斷不相等 | close != open | 收盤價是否不等於開盤價? | True / False |
> | 判斷大於 | close > open | 收盤價是否大於開盤價? | True / False |
< | 判斷小於 | close < open | 收盤價是否小於開盤價? | True / False |
>= | 判斷大於或等於 | high >= close | 最高價是否大於或等於收盤價? | True / False |
<= | 判斷小於或等於 | low <= close | 最低價是否小於或等於收盤價? | True / False |
🤔 決策的大腦:條件判斷語法
「如果A條件成立,就執行B動作」,這就是交易策略的靈魂。Pine Script 提供了幾種語法來實現這種邏輯判斷。
?: (三元條件運算子) – 簡單的二選一
當您需要處理「非A即B」的簡單情況時,三元運算子是最高效的選擇。它的結構是:條件 ? 成立時的值 : 不成立時的值
。
情境模擬: 假設一個策略,當收盤價站上10日均線時,目標價設為收盤價+5點;反之,則設為收盤價-5點。
// 1. 計算10日簡單移動平均線(SMA)
ma10 = ta.sma(close, 10)
// 2. 使用三元運算子判斷目標價
targetPrice = close > ma10 ? close + 5 : close - 5
💡 專家提示:可以將
?:
想像成 Excel 中的IF
函數,但它主要用於賦值,無法執行繪圖等多行複雜操作。
if 語句 – 處理複雜的多重條件
當您的判斷邏輯更複雜,或需要執行的動作不只是賦值(例如繪圖、下單)時,if
語句就是您的首選。它可以搭配 else if
和 else
構建出完整的多層次判斷結構。
情境模擬: 我們想在圖表上標示出不同市場趨勢。站上10日均線標示「Uptrend」,跌破則標示「Downtrend」,不大不小則標示「Neutral」。
ma10 = ta.sma(close, 10)
// 判斷條件1:收盤價 > 10日均線
if (close > ma10)
label.new(bar_index, high, "Uptrend", color=color.green, style=label.style_label_down)
// 判斷條件2:收盤價 < 10日均線
else if (close < ma10)
label.new(bar_index, low, "Downtrend", color=color.red, style=label.style_label_up)
// 上述條件都不成立時
else
label.new(bar_index, close, "Neutral", color=color.blue, style=label.style_label_left)
⚠️ 注意:
if
,else if
,else
下一行的程式碼必須「縮排」(通常是4個空格或1個Tab鍵),這是 Pine Script 的語法規定,用來表示程式碼的層級關係。
switch 語句 – 清晰的多條件分支
當您有多個互斥的條件需要判斷時(例如,根據RSI數值劃分不同市場區間),switch
語句能讓您的程式碼比使用一長串的 if-else if
更簡潔、更易於閱讀和維護。
情境模擬: 根據14日RSI的值,判斷市場處於「極度超買」、「超買」、「超賣」、「極度超賣」還是「中性」區間。
rsiValue = ta.rsi(close, 14)
marketStatus = switch
rsiValue > 80 => "極度超買"
rsiValue > 70 => "超買"
rsiValue "極度超賣"
rsiValue "超賣"
=> "中性"
// 在圖表上標示出當前的市場狀態
label.new(bar_index, close, marketStatus)
switch
會由上至下檢查條件,一旦找到第一個成立的條件,就會回傳對應的值 (=>
右側的內容),並結束判斷。如果所有條件都不成立,則會回傳最後一行 =>
後的預設值。
📊 K棒的密碼:內建變數全攻略
Pine Script 預先定義了許多方便的變數,讓您可以直接取用圖表上的關鍵資訊,無需自行計算。
類別 | 內建變數 | 代表意義 |
---|---|---|
K棒價格 | open | 當前K棒的開盤價 |
high | 當前K棒的最高價 | |
low | 當前K棒的最低價 | |
close | 當前K棒的收盤價 | |
K棒時間 | time | 當前K棒的開始時間 (UNIX時間戳) |
dayofweek | 當前K棒是星期幾 (星期日為1,星期一為2…星期六為7) | |
K棒序號 | bar_index | 當前K棒在圖表上的序號 (從0開始) |
🚀 效率加速器:不可不知的內建函數
函數(Function)是一段可重複使用的程式碼,能幫我們完成特定任務。Pine Script 提供了海量的內建函數,尤其是技術分析相關的,大大簡化了我們的編寫工作。
技術分析函數 (ta 模組)
幾乎所有常見的技術指標,都可以透過 ta.
開頭的函數輕鬆調用。
- 均線 (Moving Average):
ta.sma(source, length)
: 計算簡單移動平均線。例如ta.sma(close, 20)
就是計算20期收盤價的簡單均線。ta.ema(source, length)
: 計算指數移動平均線,對近期價格更敏感。
- 相對強弱指標 (RSI):
ta.rsi(source, length)
: 計算RSI值。例如ta.rsi(close, 14)
就是最常用的14期RSI。
- 指標交叉判斷:
ta.crossover(series1, series2)
: 判斷 series1 是否從下方向上穿越 series2 (黃金交叉)。回傳true
或false
。ta.crossunder(series1, series2)
: 判斷 series1 是否從上方向下穿越 series2 (死亡交叉)。
視覺化繪圖/標記函數
計算完指標後,我們需要將它們畫在圖表上。
plot(series, title, color)
: 繪製一條線圖。series
是要繪製的數據(如均線值),title
是圖例名稱,color
是線條顏色。label.new(x, y, text, color, style)
: 在特定位置新增一個標籤。x
是水平位置(常用bar_index
),y
是垂直位置(常用high
或low
),text
是標籤顯示的文字。
策略執行函數
這是策略腳本(Strategy Script)的專屬核心,用來模擬真實的交易行為。
函數 | 主要用途 | 核心特點 |
---|---|---|
strategy.entry() | 建立新倉位 (進場) | 若有反向倉位,會先自動平倉再反手開倉 (翻倉)。適合單純的進場訊號。 |
strategy.order() | 下達訂單 | 最靈活的函數,可用於加倉、減倉、開倉、平倉。根據當前持倉和訂單方向決定行為。 |
strategy.exit() | 設定出場條件 | 專門為某個進場訂單 (entry) 設定停利(limit)和停損(stop)。可部分平倉。 |
strategy.close() | 強制平倉 | 根據條件,立即將指定的進場訂單全部平倉。功能單純,無法設定停利損。 |
💡 實戰辨析:
strategy.entry
vsstrategy.order
想像您已持有多單,此時出現做空訊號。
– 如果您用strategy.entry("Short", strategy.short)
,系統會自動幫您賣出所有多單,然後再建立新的空單。
– 如果您用strategy.order("Short", strategy.short, qty=1)
,系統只會賣出1單位,如果您的多單超過1單位,結果會是多單減倉;如果剛好1單位,則是平倉。
Pine Script 的獨特心法:理解「序列執行模型」
這可能是 Pine Script 與傳統程式語言最大的不同點,也是初學者最容易混淆的地方。請想像一下電影膠卷,圖表上的每一根K棒就是一格膠卷。Pine Script 的執行方式,就是拿著您的腳本程式,從圖表上第一根K棒開始,一格一格地向右播放(執行),直到最後一根即時K棒。
這意味著什麼?當您在程式碼中寫下 close
這個變數時,它並不是一個單一的數值,而是一個「數值序列 (Series)」。在第一根K棒上執行時,close
代表第一根K棒的收盤價;在第二根K棒上執行時,它代表第二根的收盤價,以此類推。這就是為什麼我們不需要自己寫迴圈 (for loop) 去遍歷所有K棒,Pine Script 已經為我們內建了這個機制。
理解這一點至關重要,因為它解釋了為何像 ta.sma(close, 20)
這樣的函數能夠運作。在每一根K棒上,它都會自動回溯前20根K棒的 close
序列值來進行計算,從而形成一條連續的均線。
實戰演練:從概念到程式碼,一步步撰寫您的第一個均線交叉策略
理論學完了,讓我們動手實踐吧!一個完整的交易策略腳本,通常遵循以下四個步驟,就像搭建積木一樣清晰。
🧩 第一步:宣告策略 (Declaration)
告訴 Pine 編輯器,這是一個v6版本的策略腳本,並且要疊加在主圖表上。
//@version=6
strategy("我的第一個均線交叉策略", overlay=true)
📊 第二步:定義指標 (Define Indicators)
我們的策略基於快慢兩條均線。我們定義一條10期的短期均線 (快線) 和一條30期的長期均線 (慢線)。
shortMA = ta.sma(close, 10)
longMA = ta.sma(close, 30)
// 順便把它們畫出來,方便觀察
plot(shortMA, "10MA", color=color.blue)
plot(longMA, "30MA", color=color.orange)
🚥 第三步:設定進出場條件 (Conditions)
策略的核心邏輯:
- 進場條件 (做多):當10期均線由下往上穿越30期均線時(黃金交叉)。
- 出場條件 (平倉):當10期均線由上往下穿越30期均線時(死亡交叉)。
// 使用 ta.crossover 偵測黃金交叉
longCondition = ta.crossover(shortMA, longMA)
// 使用 ta.crossunder 偵測死亡交叉
exitCondition = ta.crossunder(shortMA, longMA)
📈 第四步:執行交易 (Trade)
將條件與交易指令結合起來。
// 如果黃金交叉條件成立,則進場做多
if (longCondition)
strategy.entry("Enter Long", strategy.long)
// 如果死亡交叉條件成立,則平倉所有名為 "Enter Long" 的倉位
if (exitCondition)
strategy.close("Enter Long", comment="Exit Long")
恭喜!您已經完成了第一個完整的交易策略腳本。將這四部分的程式碼組合起來,貼到 Pine 編輯器中並「添加到圖表」,您就可以在下方的「策略測試器」中看到回測結果了。
結論
學習 Pine Script 並非程式設計師的專利。正如本文所示,只要您具備清晰的交易邏輯和基本的數學概念,就能透過 Pine Script 這項強大的工具,將您的交易想法轉化為可被驗證、可被執行的系統化策略。從語法基礎到實戰演練,您已經掌握了開啟量化交易大門的鑰匙。
TradingView 的魅力在於它極大地降低了策略回測的門檻。本文介紹的均線交叉策略僅是一個起點,真正的價值在於您可以基於此框架,不斷替換指標、修改條件、增加濾網(如波動率、交易量),去創造和打磨真正屬於您自己的、獨一無二的交易聖杯。現在就動手嘗試,讓數據和回測結果為您的交易決策提供堅實的後盾吧!
FAQ 常見問題列表
1. 學習 Pine Script 需要有程式基礎嗎?
完全不需要。Pine Script 被設計得比通用程式語言(如Python)更為簡單直觀,專為交易場景服務。只要您理解交易策略的邏輯(例如「如果…那麼…」),並願意花時間熟悉本文介紹的基礎語法和函數,就可以上手。它是一個非常適合程式初學者的入門語言。
2. 我的 Pine Script 腳本一直出現錯誤,該如何除錯 (debug)?
除錯是程式編寫的必經之路。首先,仔細閱讀 Pine 編輯器控制臺顯示的錯誤訊息,它通常會指出錯誤的行號和原因(如語法錯誤、變數未定義等)。其次,善用 plot()
和 label.new()
函數,將您懷疑有問題的變數值或條件判斷結果直接打印在圖表上,進行「視覺化除錯」,這能幫助您快速定位問題所在。
推薦閱讀
3. indicator()
和 strategy()
腳本可以互相轉換嗎?
基本上是可以的。您可以將一個 indicator()
腳本的指標計算部分複製出來,貼到一個 strategy()
腳本中,然後基於這些指標增加交易邏輯(進出場條件和交易指令)。反之,如果您只想觀察策略中的指標而不進行回測,也可以將 strategy()
函數和所有 strategy.*
指令移除或註解掉,並將開頭的宣告改為 indicator()
。
4. Pine Script 和 Python 哪個更適合做量化交易?
這取決於您的需求。Pine Script 的優勢在於快速開發與回測,它與 TradingView 圖表無縫整合,回測框架完善,非常適合策略的快速驗證與優化。Python 則更為強大和靈活,它可以連接各種交易所API進行實盤交易、進行複雜的數據分析、機器學習建模等。一個常見的工作流程是:先在 TradingView 上用 Pine Script 快速測試大量策略原型,找到有潛力的策略後,再用 Python 進行更深入的開發與實盤部署。
*本文內容僅代表作者個人觀點,僅供參考,不構成任何專業建議。