在PineScript里,我们怎么表达“如果条件A成立,就做B;否则,就做C”这种最常见的逻辑呢?
其他编程语言里可能有长长的if/else
语句,但在PineScript里,我们有一个更简洁、更高效的工具:条件三元运算符?:
。它是PineScript里唯一一个需要三个操作数的“大块头”,但用法却异常简单清晰。
它的语法结构就像一个问答句:
条件 ? 结果1 : 结果2
你可以这么理解:先判断“条件”是否成立,打个问号?
;如果成立,就选择冒号:
左边的“结果1”;如果不成立,就选择冒号:
右边的“结果2”。
在使用时,有两条规则必须遵守:
- 返回类型要统一:“结果1”和“结果2”的“数据类型”必须一样。比如,如果
结果1
是一个颜色,那结果2
也必须是颜色,你不能让它返回一个数字,否则程序会“精神分裂”,直接报错。 - 条件的判断:前面的“条件”部分,通常就是一个返回
true
或false
的表达式,比如close > open
。但它也可以是一个数字,这时候你要记住,只有0
和NaN
等少数特殊值会被当成false
,其他所有非零数字都会被当成true
。
由于这个运算符总是会返回一个值,因此它最常见的用途就是给变量赋值。比如,一行代码就能决定K线的颜色:
barColour = close > open ? color.blue : color.red
这行代码判断K线收盘价是否高于开盘价,如果是,barColour
变量就是蓝色,否则就是红色。
案例一:根据成交量变化为背景上色
下面的指标展示了条件运算符的实际应用,我们可以根据成交量的变化,动态地改变图表背景色。
//@version=6
indicator(title="三元运算符 - 案例1", overlay=true)
// 1. 定义颜色逻辑
background = volume > volume[1] ? color.green : color.yellow
// 2. 将颜色应用到图表背景
bgcolor(color.new(background, 85))
将此示例指标添加到图表后,效果如下(图表下方的柱状图为默认的“成交量”指标):
案例二:嵌套使用实现复杂逻辑
单个?:
只能处理“二选一”的场景。那如果我想实现更复杂的“多选一”逻辑,比如“如果条件A成立,就做X;否则,如果条件B成立,就做Y;再否则,就做Z”呢?
答案就是把多个?:
嵌套起来,形成一个“逻辑链”。程序会从上到下依次判断,一旦某个条件满足,就立刻返回值,不再继续往下判断。下面这个例子就完美展示了这种用法,它会根据一系列的看涨看跌信号,来绘制不同方向的箭头。
//@version=6
indicator(title="三元运算符 - 案例2 (嵌套)", overlay=true)
height = input.int(20, title="箭头高度")
// 嵌套三元运算符
arrowPlot =
// 条件1
close > close[1] and close[1] > close[2] ? 1 :
// 条件2
high > high[1] and high[1] > high[2] ? 1 :
// 条件3
close < close[1] and close[1] < close[2] ? -1 :
// 条件4
low < low[1] and low[1] < low[2] ? -1 :
// 如果以上所有条件都不满足,则返回na
na
// 根据arrowPlot的值来绘制箭头
plotarrow(arrowPlot, colordown=color.red, colorup=color.lime,
maxheight=height, minheight=height)
这段代码的核心在于arrowPlot
变量的赋值。我们建立了一个有优先级的判断序列: 首先,判断最强的看涨信号(连续两根K线收高),如果满足,arrowPlot
就被赋值为1
,整个判断结束。 如果不满足,才继续判断下一个看涨信号(连续创出新高),如果满足,arrowPlot
也被赋值为1
。 以此类推,接着判断两个看跌信号(赋值为-1
)。
在这个逻辑链的最后,我们放了一个na
值。它就像一个“保底”的默认选项:如果前面的所有条件都没能满足,那么arrowPlot
变量最终就会被赋予na
值。plotarrow
函数在拿到na
时,就知道这里不需要画任何箭头。
将此示例指标添加到图表后,效果如下:
我们还通过input.int()
函数,允许用户在指标设置里手动调整箭头的高度。如果我们将“箭头高度”输入选项更改为10,则箭头将更改为:
将其设置为50会创建大箭头:
总结
条件运算符?:
是PineScript里实现if/else
条件逻辑的紧凑形式,可以理解为“提问-二选一”结构。它返回的两个结果(结果1
和结果2
)必须是相同的数据类型。通过嵌套多个条件运算符,可以构建出复杂的“if/else if/else
”逻辑链,程序会按顺序进行判断。逻辑链的最后一个值,会成为所有条件都不满足时的“默认值”。