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 棒對應序列中的一個數值。內建的 closeopenhighlowvolume 都是序列。

存取序列過去的數值,使用 [] 運算子:

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 ScriptPowerLanguage (訊號)
歷史 K 棒每根執行一次每根執行一次 (Bar by Bar)
即時 K 棒(未收盤)每筆成交執行一次預設不執行(需開 IOG)
即時 K 棒(收盤後)執行並確認執行
存取前 N 根資料close[N]Close[N]

Pine Script 的即時 K 棒行為等同於 MultiCharts 開啟 IOG 的指標腳本。

Reference#