龙听期货论坛's Archiver

龙听 发表于 2024-3-29 13:52

【PART 2】算术运算符:使用 TradingView 的加法运算符组合字符串

在 TradingView Pine 中,加法运算符 (+) 经常用于计算数值。但我们也可以将该运算符用于字符串。让我们看看如何操作。

在 TradingView 中使用加法运算符添加字符串

运算符允许我们为 TradingView Pine 脚本增加复杂性。运算符是对一个或多个值执行操作的代码元素(Stephens,2014 年)。我们将运算符 "作用于 "的值称为操作数(Sharp,2013 年)。例如,在 10 - 3.5 这样的表达式中,减号是运算符,而 10 和 3.5 是其操作数。

常用的运算符是算术运算符(+、-、*和/),我们在进行计算时会用到这些运算符(Pine Script Language Tutorial,n.d.)。其中的加法运算符 (+) 不仅可以运算数字(如 3 + 0.39 和 high + low),还可以运算字符串。在讨论这个问题之前,我们先来澄清几个术语。

对于程序员来说,字符串指的是一串文本(Stellman & Greene,2010 年)。TradingView 中有两种类型的字符串(Pine Script Language Tutorial,n.d.):

字面字符串是手动输入到脚本源代码中的文本,用单引号或双引号包围。字符串文字的例子有 "enter long "和 "volume increase"。

字符串变量是保存文本的变量。它可以是一个内置变量(如 syminfo.ticker,返回一个包含工具符号的字符串;TradingView, n.d.),也可以是我们自己创建的变量。后者的例子是 myText = "long signal"。

现在,加法运算符能做的事情(除了将数字相加之外)就是将一个字符串加到另一个字符串的末尾。这种操作称为字符串连接(Stellman & Greene,2010 年)。

在 TradingView 中使用 + 将字符串加在一起具有以下特点:

只有当两个操作数都是字符串时,字符串连接才起作用。这意味着 "买入" + "信号 "有效(返回 "买入信号 "字符串),但 "买入" + 10 + "合同 "无效:返回 "不能调用带参数运算符 + (...)" 的错误信息。

当操作数是数字时,我们首先需要将其转换为字符串,然后才能使用 + 创建组合字符串。这种转换使用 str.tostring() 函数完成(TradingView,注)。因此,虽然 "前收盘价" + close[1]会导致 TradingView 出错,但 "前收盘价" + str.tostring(close[1]) 却能正常工作。

目前,str.tostring() 函数只能用于使用相等比较运算符 (==) 进行比较;str.tostring() 不能用于使用 plotshape() 和 plotchar() 等函数在图表上显示文本。

请注意,当我们用 + 组合字符串时,这个加法运算符只是将字符串相加,因此 "25" + "2" 返回的不是 27,而是一个包含 "252 "文字的字符串。

示例:使用 + 将字符串文字加在一起

下面是一个使用 + 运算符组合字符串字面量的基本示例指标:[code]//@version=5
indicator(title="Example of combining strings", overlay=true)

newHigh = high == ta.highest(high, 30)
newLow  = low == ta.lowest(low, 30)

highText = "New " + "\n" + "high"
lowText  = "New " + "\n" + "30-bar " + "\n" + "low"

plotshape(newHigh, location=location.abovebar,
     style=shape.diamond, color=color.blue, text=highText)

plotshape(newLow, location=location.belowbar,
     style=shape.circle, color=color.purple, text=lowText)[/code]我们首先使用 indicator() 函数定义脚本的属性。然后,我们创建两个变量:[code]newHigh = high == ta.highest(high, 30)
newLow  = low == ta.lowest(low, 30)[/code]其中第一个变量 newHigh 被设置为真/假表达式,用于检查当前条形图的高点(high)是否等于(==)30 条形图的高点(包括当前条形图)。我们使用 ta.highest() 函数获取后一个值,该函数返回一定数量条形图的最高值(TradingView,注)。通过使用 high 和 30 参数计算该函数,它将返回最近 30 个条形图的最高价。

另一个变量 newLow 的赋值方法与此相同,只是现在我们要检查当前条形图的低价是否等于最近 30 个价格条形图的最低低价(ta.west(low, 30))。

接下来,我们创建两个额外的变量:[code]highText = "New " + "\n" + "high"
lowText  = "New " + "\n" + "30-bar " + "\n" + "low"[/code]在这里,我们使用 + 运算符将多个字符串文字组合在一起,从而为 highText 和 lowText 变量赋值。

我们给 highText 变量分配了一个字符串,该字符串由两个单词("New "和 "high")以及它们之间的换行符("\n")组成。该字符用于分隔文本行(Pine Script Language Tutorial, n.d.),其作用与常规输入时的回车键相同。

lowText 变量被设置为一个类似的字符串组合,不过这个文本更长,而且使用了两个换行符。在这里使用"\n "的好处是可以使文本在图表上显示的宽度更小(而不是绘制一条长线)。

然后,我们在图表上绘制这些变量的值:[code]plotshape(newHigh, location=location.abovebar,
     style=shape.diamond, color=color.blue, text=highText)

plotshape(newLow, location=location.belowbar,
     style=shape.circle, color=color.purple, text=lowText)[/code]只要 plotshape() 函数的第一个参数为 true,该函数就会在图表上绘制可视形状(Pine Script Language Tutorial,n.d.)。

在这里,我们将第一次调用 plotshape() 函数时的参数设置为 newHigh,这样函数就会在图表上每出现 30 条高点时绘制一个形状。我们将形状的类型设置为菱形(shape.diamond),并将其置于柱形图的上方(location.upsidebar)。与该菱形相匹配的文本是 highText 变量,我们之前将其设置为字符串字面组合。

第二个 plotshape() 函数调用与此类似:这一次,只要 newLow 变量为真,我们就绘制一个圆形(shape.circle)。该形状的颜色设置为标准 TradingView 颜色 color.purple,并放置在价格条(location.lowderbar)的下方。沿该形状的文字设置为 lowText 变量。

当我们将上述示例添加到图表中时,它看起来像这样:

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

在这里,我们可以看到,每当柱形图出现新的 30 柱极端价格时,图表上就会出现 "新高 "和 "新的 30 柱低点 "文本。

在 TradingView 中使用 + 运算符组合字符串和变量

加法运算符还可以将字符串文字和字符串变量组合在一起,如下所示:[code]//@version=5
indicator(title="Example of combining strings", overlay=true)

beginText = "Closed "

closedHigher = close > open

plotshape(closedHigher, style=shape.arrowup,
     location=location.belowbar, color=color.green,
     text=beginText + "higher")

plotshape(not closedHigher, style=shape.arrowdown,
     location=location.abovebar, color=color.red,
     text=beginText + "lower")[/code]首先,我们在这里使用必要的 indicator() 函数来设置脚本的设置。

然后,我们创建 beginText 字符串变量,并在其中存储 "Closed"(关闭)文本。我们创建的下一个变量是 closedHigher,这个变量根据一个表达式赋值为 true 或 false,该表达式用于评估条形图的收盘价是否大于(>)开盘价。

然后,我们用 plotshape() 在图表上画两个箭头:[code]plotshape(closedHigher, style=shape.arrowup,
     location=location.belowbar, color=color.green,
     text=beginText + "higher")

plotshape(not closedHigher, style=shape.arrowdown,
     location=location.abovebar, color=color.red,
     text=beginText + "lower")[/code]只要 closedHigher 变量为真,第一个 plotshape() 函数调用就会在图表上画出一个向上的箭头(shape.arrowup)。我们将这些标记较高收盘价的箭头放在条形图(location.lowbar)的下方,并用绿色(color.green)作为 TradingView 的基本颜色。

箭头附带的文本是用加法运算符 (+) 生成的,用于将 beginText 字符串变量和 "higher "字符串文字连接在一起。由于 beginText 包含一个空格,因此两个单词合并后显示正确(见下图)。

调用最后一个 plotshape() 函数后,只要 not closedHigher 表达式为真,我们就会在图表上绘制一个红色(color.red)的向下箭头(shape.arrowdown)。由于有 not 逻辑操作符,只要 closedHigher 为假,该表达式就为真(Pine 脚本语言教程,未注明出处)。

这意味着,只要柱形图没有收得更高(收盘价不变或更低),这些红色箭头就会绘制出来。这些箭头的位置在柱状图的上方(location.upperbar),我们在图表上绘制的文本是 beginText 和 "lower "字符串与 + 的组合。

添加到图表中的指标示例如下:

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

总结

一串文本称为字符串,字符串可以是字面字符串(如 "enter long"),也可以是保存文本的字符串变量。加法运算符 (+) 通常用于将数字相加,但也可以将字符串字面量和字符串变量相加。这就要求该运算符左边的值和右边的值都是字符串。

因此,在 + 将一个数字添加到另一个字符串之前,首先需要使用 str.tostring() 函数将其转换为字符串。我们可以使用换行符("\n")在字符串中插入新行。

页: [1]