條件判斷#
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)