前面我们讲了三元运算符?:
,它擅长根据条件“返回一个值”。但如果我们的需求不是返回值,而是“执行一个或一系列动作”呢?
比如,“如果金叉发生,就提交一笔买入订单”,或者“如果满足某个条件,就画一条趋势线”。这种时候,就需要请出PineScript里进行条件判断的另一个主角——if
语句。
if
语句的核心功能就是:根据一个条件的真假,来决定是否执行某一段代码。它是你策略的“执行官”,负责在特定情况发生时,采取相应的行动。
if
语句的语法结构
它的基本结构非常像我们在说英语:if 条件
… 然后呢?然后另起一行,向右缩进(标准是4个空格),写下当条件为true
时要执行的所有动作。
// 代码结构
if 布尔条件
// 当“布尔条件”为true时,
// 这里的代码块才会被执行
// (注意:此代码块必须缩进)
这个缩进至关重要,它告诉PineScript哪些代码是归if
管的,哪些不是。搞错缩进,程序就会报错或者乱套。
这里有一个PineScript和其他语言(比如Python)非常不同的地方,是新手的重点“避坑区”:if
后面的条件必须是一个明确的true
或false
布尔值。你不能像在其他语言里那样写if 1
或者if some_variable
,程序会不认。你必须写成类似if some_variable > 10
这种能明确返回true
或false
的表达式。
在if
语句块里,我们可以执行各种动作,比如最常见的下单操作strategy.entry()
,或者修改一个已经存在的变量的值。注意,在if
块里修改变量值时,我们用的是“重新赋值运算符”:=
,而不是声明变量时用的=
。
案例一:使用if
语句计算条件平均值
这个例子展示了如何使用if
语句进行筛选,计算一个特殊的平均值:只统计那些“放量”K线的收盘价,而忽略“缩量”K线。
//@version=6
indicator(title="if语句 - 案例1", overlay=true)
// 1. 初始化变量
closeSum = 0.0 // 用于累加“合格”K线的收盘价
count = 0 // 用于计算“合格”K线的数量
// 2. 计算成交量的“及格线”
averageVolume = ta.sma(volume, 20)
// 3. 循环遍历过去10根K线
for i = 0 to 9
// 4. 如果这根K线的成交量 > 它的20均量
if volume[i] > averageVolume[i]
closeSum := closeSum + close[i]
count := count + 1
// 5. 计算最终的“条件平均价”
avgClose = count > 0 ? closeSum / count : na
// 6. 绘制结果
plot(avgClose, color=color.fuchsia, linewidth=2, title="条件成交量均线")
该自定义均线的图表效果如下:
案例二:使用if
语句提交策略订单
如果说前面的例子还有点绕,那下面这个均线交叉策略,就是if
语句在实盘交易中最直接、最核心的应用:监测交易信号,执行开平仓指令。
//@version=6
strategy(title="if语句 - 均线交叉策略", overlay=true)
// 1. 计算快慢两条均线
quickMA = ta.sma(close, 20)
slowMA = ta.sma(close, 60)
// 2. 绘制均线,方便观察
plot(quickMA, color=color.blue, title="快线SMA20")
plot(slowMA, color=color.orange, linewidth=2, title="慢线SMA60")
// 3. 使用if语句
// 如果快线上穿慢线
if ta.crossover(quickMA, slowMA)
// 执行“进入多头”的动作
strategy.entry("Enter Long", strategy.long, qty=5)
// 如果快线下穿慢线
if ta.crossunder(quickMA, slowMA)
// 执行“进入空头”的动作
strategy.entry("Enter Short", strategy.short, qty=5)
这段代码完美地诠释了if
语句的“执行官”角色。它使用内置函数ta.crossover()
和ta.crossunder()
来判断金叉和死叉。这两个函数在交叉发生的那一根K线上会返回true
。if
语句捕获到这个true
信号后,就立刻执行内部的strategy.entry()
函数来下单。
由于这两个if
语句会在每次均线交叉时都提交订单,因此该策略会根据均线交叉信号进行交易,效果如下:
总结
if
语句是你策略的“执行官”,它用于判断一个布尔(true
/false
)条件。如果条件为true
,则执行if
关键字下方缩进的代码块;如果条件为false
,则跳过该缩进代码块。代码缩进至关重要:if
下方的代码块必须相对于if
关键字所在行,额外缩Git indent4个空格(或1个制表符)。if
语句使得我们的指标或策略能够根据不同情况做出决策和执行动作,是实现交易自动化的关键。