條件判斷#

if / else#

Pine Script 的條件判斷語法與大多數程式語言相似:

if 條件
    // 條件成立時執行
else if 另一個條件
    // 另一個條件成立時執行
else
    // 以上條件都不成立時執行

注意:Pine Script 使用 縮排(空格或 Tab) 來區分程式碼區塊,類似 Python。縮排必須一致,建議使用 4 個空格。

範例:根據收盤價與均線的關係,在圖表上標記多空訊號:

//@version=6
indicator("均線多空判斷", overlay=true)

maLength = input.int(20, "均線週期")
ma = ta.sma(close, maLength)

plot(ma, "均線", color=color.orange)

if close > ma
    label.new(bar_index, low, "▲", color=color.green, textcolor=color.white, style=label.style_label_up)
else if close < ma
    label.new(bar_index, high, "▼", color=color.red, textcolor=color.white, style=label.style_label_down)

if 作為表達式#

在 Pine Script 中,if 可以像表達式一樣使用,直接回傳一個值:

// 傳統寫法
var color barColor = na
if close > open
    barColor := color.green
else
    barColor := color.red

// 使用 if 表達式(更簡潔)
barColor = if close > open
    color.green
else
    color.red

barcolor(barColor)

三元運算子#

三元運算子 ? :if/else 的簡化版,適合簡單的二選一條件:

// 語法:條件 ? 成立時的值 : 不成立時的值

barColor = close > open ? color.green : color.red
barcolor(barColor)

三元運算子可以巢狀使用,但層數過多會降低可讀性:

// 三種顏色:上漲為綠、下跌為紅、平盤為灰
barColor = close > open ? color.green :
           close < open ? color.red :
           color.gray
barcolor(barColor)

比較運算子#

運算子說明範例
==等於close == open
!=不等於close != close[1]
>大於close > ma
>=大於等於rsi >= 70
<小於close < ma
<=小於等於rsi <= 30

邏輯運算子#

運算子說明範例
and且(兩個條件都成立)close > ma and rsi > 50
or或(任一條件成立)close > high[1] or volume > avgVolume
not非(條件取反)not na(rsiValue)

實用範例:黃金交叉訊號#

短期均線向上穿越長期均線(黃金交叉) 為例,展示條件判斷的完整應用:

//@version=6
indicator("黃金交叉 / 死亡交叉", overlay=true)

fastLength = input.int(5,  "短期均線")
slowLength = input.int(20, "長期均線")

fastMA = ta.sma(close, fastLength)
slowMA = ta.sma(close, slowLength)

plot(fastMA, "短期均線", color=color.blue)
plot(slowMA, "長期均線", color=color.orange)

// ta.crossover(a, b):a 從下方穿越 b(黃金交叉)
// ta.crossunder(a, b):a 從上方穿越 b(死亡交叉)
goldenCross = ta.crossover(fastMA, slowMA)
deathCross  = ta.crossunder(fastMA, slowMA)

if goldenCross
    label.new(bar_index, low, "金叉", color=color.green, textcolor=color.white, style=label.style_label_up)

if deathCross
    label.new(bar_index, high, "死叉", color=color.red, textcolor=color.white, style=label.style_label_down)

switch 語句#

當條件分支較多時,switch 比多層 if/else if 更清晰:

//@version=6
indicator("趨勢判斷")

maFast  = ta.sma(close, 5)
maMid   = ta.sma(close, 20)
maSlow  = ta.sma(close, 60)

// 多頭排列:短 > 中 > 長
// 空頭排列:短 < 中 < 長
// 其他:整理

trendLabel = switch
    maFast > maMid and maMid > maSlow => "多頭排列"
    maFast < maMid and maMid < maSlow => "空頭排列"
    => "整理"

// 在圖表右側顯示當前趨勢
if barstate.islast
    label.new(bar_index, high, trendLabel, style=label.style_label_left)

Reference#