龙听期货论坛's Archiver

龙听 发表于 2024-3-29 14:31

【PART 2】If/else 运算符:TradingView 的条件三元运算符说明

TradingView 的条件三元运算符说明

TradingView 中的比较运算符和逻辑运算符要么返回 "真",要么返回 "假"。但是我们如何在 TradingView Pine 中用这些布尔值模拟 if/else 逻辑呢?

TradingView Pine 中的条件三元运算符说明

很难找到不使用单一运算符的 TradingView 脚本。运算符是对一个或多个值执行特定操作的代码元素,其作用的值称为操作数(Sharp,2013;Stephens,2014)。

大多数 TradingView 运算符需要两个操作数,但有一个需要三个操作数:条件三元运算符(这也是它被称为三元运算符的原因)。条件运算符(?:)会评估一个条件,并根据条件的真假返回两个值中的一个(Pine Script Language Tutorial, n.d.)。它的工作原理类似于 if/else 语句,而 TradingView 脚本语言中没有这种语句。

条件运算符的语法如下(Pine Script Language Tutorial, n.d.):[code]condition ? result1 : result2[/code]当条件求值为真时,返回结果 1;否则返回结果 2(《Pine 脚本语言教程》,未注明出处)。其逻辑是 "当条件为真时,返回第一个值;否则返回第二个值"。

条件运算符可以返回的值必须具有相同的类型。因此,当结果 1 是整数时,结果 2 也必须是整数类型。当 result1 设置为字符串时,result2 不能是颜色。

该运算符评估的条件可以是布尔真/假表达式(如 close > open)或数字表达式(如 high - high[1])。在后一种情况下,数值 0、NaN、+Infinity 和 -Infinity 被视为假,而其他数值被视为真(TradingView,注)。

为了帮助记忆,请记住条件运算符会问 "这是真的吗?",然后从两个选项中选择一个。因此,问号(?)在冒号(:)之前。因为我们先问,然后从两个选项中选择一个。

使用条件运算符设置变量值

由于条件运算符总是返回两个值中的一个,因此在 Pine 脚本中常用它来设置变量的值。例如[code]barColour = close > open ? color.blue : color.red[/code]这里的条件运算符会评估条形图的收盘价(close)是否大于(>)开盘价(open)。如果大于,则返回蓝色(color.blue)并存储在 barColour 变量中。否则,红色 (color.red) 将分配给该变量。

使用条件运算符为 TradingView 图表着色

使用条件运算符的示例指标是:[code]//@version=5
indicator(title="Conditional operator - example 1", overlay=true)

background = volume > volume[1] ? color.green : color.yellow

bgcolor(color.new(background, 85))[/code]我们首先使用强制性 indicator() 函数来设置脚本的特征(TradingView,注)。通过标题参数,我们可以指定指标的名称。当覆盖设置为 true 时,指标将显示在价格图表上,而不是单独的图表窗格中(TradingView, n.d.)。

然后,我们创建一个变量(background),其值由条件操作符设置。该运算符的评估条件是当前条形图的成交量(交易量)是否大于上一条形图的成交量,我们使用交易量和历史参考运算符设置为 1(volume[1])来检索上一条形图。

如果该条件为真,条件运算符将返回绿色(color.green),然后将该颜色存储到背景变量中。如果当前条形图的成交量不大于上一条形图的成交量,即条件为假时,黄色(color.yellow)将被分配给该变量。

最后一条语句使用 bgcolor() 设置图表背景(TradingView,注)。该函数的第一个参数指定了颜色,我们将其设置为背景变量。我们将该变量封装在 color.new() 函数中,使颜色的透明度达到 85%。这样我们就得到了一个高度透明的背景。

添加到微软 60 分钟图表中的示例指标如下(底部的柱状图是默认的 "成交量 "指标):

[img]http://p.algo2.net/2024/0329/c6739ea493daa.png[/img]

在 TradingView 中嵌套条件三元运算符

条件运算符还可用于测试多个条件,如本示例脚本所示:[code]//@version=5
indicator(title="Conditional operator - example 2", overlay=true)

height = input.int(20, title="Arrow height")

arrowPlot =
     close > close[1] and close[1] > close[2] ? 1 :
     high > high[1] and high[1] > high[2] ? 1 :
     close < close[1] and close[1] < close[2] ? -1 :
     low < low[1] and low[1] < low[2] ? -1 :
     na

plotarrow(arrowPlot, colordown=color.red, colorup=color.lime,
     maxheight=height, minheight=height)[/code]我们首先用 indicator() 设置脚本的特征。该必要函数的标题参数定义了指标名称,当叠加设置为 "true "时,指标将绘制在数据序列上,而不是在单独的图表窗格中(TradingView,注)。

然后,input.int() 函数将手动整数输入添加到脚本中(TradingView,注)。输入的名称设置为 "箭头高度",默认值为 20。高度变量的值是该函数返回的值,也就是输入值设置的值 (TradingView, n.d.)。

然后结合几个条件运算符来确定 arrowPlot 变量的值,我们稍后将用它来绘制箭头。第一个运算会评估两个表达式:当前条形图的收盘价(close)是否大于(>)前一个条形图的收盘价(close[1]),这是一个历史值,可以通过历史引用运算符([ ])来访问(Pine Script Language Tutorial,n.d.)。第二个表达式检查前一栏的收盘价(close[1])是否大于前一栏的收盘价(close[2])。通过两个表达式之间的逻辑和运算符,两个表达式都必须为真,条件才为真(Pine Script Language Tutorial, n.d.)。当两个条件都为真时,条件运算符返回值为 1;否则,将对下一个条件运算符进行求值。

第二个条件运算符的计算条件是:当前条形图的最高点是否高于上一条形图的最高点(high > high[1]),以及该最高点是否也大于两个条形图前的最高点(high[1] > high[2])。在这种情况下,该条件运算符的返回值为 1;否则,将对第三个条件运算符进行评估。该条件运算符会检查当前条形图的收盘价是否低于前一个条形图的收盘价(close < close[1]),以及前一个条形图的收盘价是否低于前一个条形图的收盘价(close[1] < close[2])。当评估结果为真时,第三个条件运算符返回-1,否则执行第四个也是最后一个条件运算符。

最后一个条件运算符也返回-1,但这次是当当前低点低于前一个低点(低点 < 低点[1]),而前一个条形图的低点小于它之前的条形图(低点[1] < 低点[2])时。否则,此条件运算符返回 na。意思是 "不是数字",简称 NaN(TradingView,注),即没有数值(Pine Script Language Tutorial,注)。

当多个条件运算符串联在一起时,最后一个参数将作为默认值,以备所有条件都不成立时使用。

条件运算符求值后,arrowPlot 变量的值为 1、-1 或 na。然后,该变量将用于 plotarrow()。该函数根据其第一个参数的值绘制箭头:正数为向上的箭头,负数为向下的箭头,na 表示不绘制箭头(TradingView,n.d.)。因此,条件箭头决定了价格条上绘制的箭头类型(如果有的话)。

我们用 colordown 和 colorup 参数指定箭头颜色,它们分别设置为红色(color.red)和石灰色(color.lime)。通常,箭头的长度基于第一个参数的绝对值(TradingView,注),但在这里,我们将最小高度和最大高度都设置为高度输入变量的值。这将使所有箭头具有相同的大小,然后我们可以通过指标的 "输入 "设置轻松更改。

添加到 Microsoft 60 分钟图表后,上述 TradingView 示例看起来就像这样:

[img]http://p.algo2.net/2024/0329/116e2f7bb3a01.png[/img]

如果我们将 "箭头高度 "输入选项改为 10,箭头就会变成这样:

[img]http://p.algo2.net/2024/0329/424fa958aeaa5.png[/img]
将它们设置为 50 会产生很大的箭头:
[img]http://p.algo2.net/2024/0329/18437fafbc2b4.png[/img]

总结

条件运算符是一个紧凑的 if/else 语句,用于评估条件,当条件为真时返回第一个值,当条件为假时返回第二个值。因此,这个运算符的逻辑是 "当条件为真时,返回第一个值;否则,返回第二个值"。这个运算符所评估的条件可以是一个真/假布尔表达式,也可以是一个数值。在组合条件运算符时,最后一个条件运算符的最后一个参数是一个默认值,当所有条件都不为真时,将返回默认值。

页: [1]