Pine Script 的執行機制#
逐根 K 棒執行#
Pine Script 的核心執行概念是 逐根 K 棒執行 (Bar-by-bar execution)。
每當腳本被套用到圖表時,TradingView 會從圖表上 最舊的一根 K 棒 開始,依序對每一根 K 棒執行一次完整的腳本,直到 最新的 K 棒 為止。
以一個簡單的例子說明:
//@version=6
indicator("執行機制示範", overlay=true)
plot(close)這段腳本對每一根 K 棒都會執行 plot(close),因此圖表上會畫出所有 K 棒收盤價連成的線——這條線是腳本在每根 K 棒執行後累積的結果。
歷史 K 棒與即時 K 棒#
腳本執行時面對的 K 棒分為兩種:
- 歷史 K 棒 (Historical bars):已經完成的 K 棒,數值固定不變
- 即時 K 棒 (Realtime bar):正在進行的當前 K 棒,每收到一筆成交就更新一次
歷史 K 棒的執行#
對歷史 K 棒,腳本只執行一次(在 K 棒收盤時),執行結果不會改變。
即時 K 棒的執行#
對即時 K 棒,腳本會隨著每一筆成交價格的進入重新執行。這表示:
close在即時 K 棒中代表的是 目前最新成交價,而非收盤價- 腳本執行的結果會不斷變化,直到該 K 棒收盤
K 棒收盤後,最後一次執行的結果會被 確認 (Commit),成為歷史數值,之後不再改變。
可以用內建變數
barstate.isrealtime判斷目前是否在即時 K 棒上執行:if barstate.isrealtime label.new(bar_index, high, "即時 K 棒")
序列 (Series)#
Pine Script 最重要的概念是 序列 (Series)。
序列是一個 隨時間變化的數值集合,每一根 K 棒對應序列中的一個數值。內建的 close、open、high、low、volume 都是序列。
存取序列過去的數值,使用 [] 運算子:
close // 當前 K 棒的收盤價
close[1] // 前一根 K 棒的收盤價
close[2] // 前兩根 K 棒的收盤價
close[10] // 10 根 K 棒前的收盤價這讓計算技術指標變得非常直觀,例如計算 2 日漲跌幅:
//@version=6
indicator("2日漲跌幅")
change2 = close - close[2]
plot(change2)bar_index#
bar_index 是內建變數,代表 當前 K 棒的索引值,從 0 開始計算(最舊的 K 棒為 0,越新的 K 棒索引越大)。
//@version=6
indicator("bar_index 示範")
// 在圖表最右側的 K 棒標記索引值
if barstate.islast
label.new(bar_index, high, str.tostring(bar_index))bar_index 常用於:
- 判斷是否為第一根或最後一根 K 棒
- 計算兩個時間點之間的 K 棒數量
常用的 barstate 變數#
| 變數 | 說明 |
|---|---|
barstate.isfirst | 是否為第一根 K 棒(最舊) |
barstate.islast | 是否為最後一根 K 棒(最新) |
barstate.ishistory | 是否為歷史 K 棒 |
barstate.isrealtime | 是否為即時 K 棒 |
barstate.isconfirmed | 即時 K 棒是否已收盤確認 |
與 MultiCharts 執行機制的比較#
有 MultiCharts/PowerLanguage 背景的讀者可以參考以下對照:
| Pine Script | PowerLanguage (訊號) | |
|---|---|---|
| 歷史 K 棒 | 每根執行一次 | 每根執行一次 (Bar by Bar) |
| 即時 K 棒(未收盤) | 每筆成交執行一次 | 預設不執行(需開 IOG) |
| 即時 K 棒(收盤後) | 執行並確認 | 執行 |
| 存取前 N 根資料 | close[N] | Close[N] |
Pine Script 的即時 K 棒行為等同於 MultiCharts 開啟 IOG 的指標腳本。