前面我们讲了比较运算符,它们就像策略的“眼睛”,负责观察市场并返回一个true
或false
的答案。但一个完整的交易决策,往往需要综合多个条件。
比如,“价格突破前高” 并且 “成交量放大”,我们才认为是一个有效的买入信号。要把这些零散的true
/false
答案,组合成一个最终的、可执行的交易决策,就需要用到我们策略的“大脑”——逻辑运算符。
PineScript里的逻辑运算符主要就三个:“与”and
、“或”or
、以及“非”not
。它们的规则如下:
下方的这个表能让你更直观地看到它们在所有可能情况下的输出结果:
案例一:使用and
和or
构建动态均线
这个例子非常巧妙,它在一个指标里同时用到了or
和and
,实现了一个能根据不同图表周期自动调整参数,并根据价格位置动态变色的智能均线。
//@version=6
indicator(title="逻辑运算符 - 案例1", overlay=true)
// 步骤一:如果是日线或者周线,EMA设为30;其他周期设为50
emaPeriod = timeframe.isdaily or timeframe.isweekly ? 30 : 50
// 步骤二:计算EMA
emaValues = ta.ema(close, emaPeriod)
// 步骤三:用 and 来判断价格与均线的相对位置,实现动态颜色
emaColour =
// 条件1:如果连续两根K线都收在EMA之上,均线变绿
close > emaValues and close[1] > emaValues[1] ? color.green :
// 条件2:如果连续两根K线都收在EMA之下,均线变红
close < emaValues and close[1] < emaValues[1] ? color.red :
// 其他情况均线为蓝色
color.blue
// 步骤四:绘制EMA线
plot(emaValues, color=emaColour, linewidth=2)
将此指标添加到日内图表(例如60分钟图)后,EMA周期为50,效果如下:
而在周线图上,根据我们的逻辑,EMA周期被自动设为30,其图表效果如下:
案例二:使用not
实现反向选择
and
和or
用来组合条件,而not
则用于“取反”。它的应用场景通常是:当你想要寻找“A条件不成立”的情况时,这个工具就非常方便。
比如,我们想标记出所有“没有发生跳空”的普通K线。直接定义“没有跳空”比较麻烦,但定义“有跳空”(向上跳空 or
向下跳空)则很简单。这时我们就可以先定义出“有跳空”,然后用not
把它整个反过来。
//@version=6
indicator(title="逻辑运算符 - 案例2", overlay=true)
// 步骤一:定义跳空
gapUp = low > high[1]
gapDown = high < low[1]
// 步骤二:用背景色高亮显示所有发生跳空的区域
backgroundColour = gapUp ? color.green : gapDown ? color.red : na
bgColor = gapUp ? color.new(color.green, 60) :
gapDown ? color.new(color.red, 60) :
na
bgcolor(bgColor, title="跳空背景色")
// 步骤三:使用 not 运算符找到“没有跳空”的K线
noGap = not(gapUp or gapDown)
// 步骤四:在没有跳空的K线上方绘制一个'x'标记
plotshape(noGap, style=shape.xcross,
location=location.abovebar)
将此指标添加到图表后,它会用彩色背景高亮所有发生跳空的K线,并在没有跳空的K线上方放置一个“x”标记:
总结
好了,学长带你把三大逻辑运算符都过了一遍。现在我们把思路串起来:
- 我们用比较运算符(
>
、<
、==
等)作为“眼睛”来观察市场,得到一堆true/false
的初步判断。 - 然后用逻辑运算符(
and
、or
、not
)作为“大脑”,把这些初步判断组合成一个最终的、唯一的true/false
决策。 - 最后,我们用条件运算符(
?:
)或if
语句,根据这个最终决策去执行具体的操作(比如上色、画箭头、下单等)。
这就是一套完整的交易逻辑的构建过程。掌握了它们,你就能把任何复杂的交易思想,清晰地翻译成PineScript代码。