: | : | :期货量化学习 | :期货量化 |
返回列表 发帖

【PART 2】变量操作符:TradingView 中的赋值运算符 (=)

【PART 2】变量操作符:TradingView 中的赋值运算符 (=)

TradingView 中的赋值运算符 (=)

赋值运算符的使用频率高于其他任何运算符。该运算符是如何工作的?

TradingView 中的赋值运算符

运算符是脚本 "工作 "的重要组成部分。运算符是对一个或多个值执行操作并返回结果的代码元素(Stephens,2014 年)。我们将操作符 "操作 "的值称为操作数(Sharp,2013 年)。

TradingView 中使用最多的运算符是赋值运算符 (=)。该运算符需要两个操作数,并将 = 右边的值赋值给左边的变量。我们在给函数参数赋值时也会用到这个运算符(Pine Script Language Tutorial,注释)。让我们来仔细看看这两种用法。

使用赋值操作符为变量赋值

我们使用赋值操作符为变量赋值,如下所示:
  1. closingPrice = 100
  2. prevVolume   = volume[1]
  3. emaValue     = ta.ema(low, 20)
复制代码
这里首先为 closingPrice 变量赋值 100。然后使用历史引用运算符([ ])检索前一栏的成交量(volume[1]),并使用赋值运算符将该值放入 prevVolume 中。最后,我们将 ta.ema() 函数(用于计算指数移动平均线;TradingView, n.d.)返回的值存储到 emaValue 变量系列中。

使用带有函数参数的赋值操作符

赋值运算符也可在注释函数的参数列表中使用(参见《Pine 脚本语言教程》,注释)。注释函数是一种内置函数,它接受关键字参数,用于将特定参数设置为某个值(Pine Script Language Tutorial, n.d.)。这听起来很专业,我们来看一个例子来说明一下:
  1. indicator(title="Example script", overlay=true)
复制代码
在这里,我们使用了每个脚本中都包含的注释函数:indicator()。我们设置了它的两个关键字参数:title 和 overlay。通过赋值运算符,我们将标题参数设置为 "示例脚本",同时使用等号将覆盖设置为 true。

为变量赋值:TradingView 的限制

TradingView Pine 中的赋值运算符有一个与其他编程和脚本语言不同的限制:一旦变量被赋值运算符赋值,它就不能再被赋予其他值(Pine 脚本语言教程,未注明日期)。具有讽刺意味的是,变量之所以被命名为 "变量",是因为它的值是变化的(Stellman & Greene,2010 年)。

举例来说,这是不允许的:
  1. //@version=5
  2. indicator(title="Assignment operator - example 1", overlay=true)

  3. averageClose = (close + close[1]) / 2
  4. averageClose = ta.sma(close, 10)

  5. plot(averageClose, linewidth=3)
复制代码
在这里,我们首先将当前收盘价与前收盘价之和除以 2 赋值给 averageClose 变量。然而,这会引发 TradingView 错误:



我们通常可以通过创建多个变量来解决这一限制:
  1. //@version=5
  2. indicator(title="Assignment operator - example 1", overlay=true)

  3. averageClose = (close + close[1]) / 2

  4. smaClose = ta.sma(close, 10)

  5. plot(smaClose, linewidth=3)
复制代码
我们没有两次为 averageClose 变量赋值,而是用一个新变量(smaClose)取代了第二次使用的 averageClose。现在脚本保存成功,可以在图表上绘制了:



提示:不要混淆赋值运算符 (=) 和等号运算符 (==)

赋值操作符 (=) 使用一个等号,而相等比较操作符 (==) 使用两个等号。两者的区别在于,赋值操作符将右边的值赋给左边的变量。而相等运算符则测试右边的值是否与左边的值相同(Pine Script Language Tutorial,n.d.)。即使是经验丰富的程序员也时常会犯的一个错误就是混淆这两者(Liberty & MacDonald, 2009)。

下面是一个使用赋值运算符(=)而本应使用相等运算符(==)的示例指标:
  1. //@version=5
  2. indicator(title="Assignment operator - example 2", overlay=true)

  3. colour = high = ta.highest(high, 20) ? color.green : color.red

  4. barcolor(colour)
复制代码
在这里,colour 变量被分配了一个值,该值由条件三元运算符(?:)返回。该运算符评估一个条件,当条件为真时,返回其第二个操作数(此处为 color.green)。否则,返回第三个操作数(color.red)(TradingView,注)。

该运算符评估的条件是 high = ta.highest(high,20),当当前条形图的高点(high)是最近 20 个条形图的最高点(ta.highest(high,20))时,该条件通常为真。

但这里的问题是,我们使用了赋值运算符 (=),而它本应是相等运算符 (==)。毕竟,我们是在测试相等性,而不是赋值。因此 TradingView 生成了 "无可行替代方案 "错误:



同样,我们可能会错误地使用 ==(相等运算符),而我们的意思是 =(赋值运算符),就像这样:
  1. //@version=5
  2. indicator(title="Assignment operator - example 2", overlay=true)

  3. colour == high == ta.highest(high, 20) ? color.green : color.red

  4. barcolor(colour)
复制代码
这里修正了之前的错误:条件 (high == ta.highest(high, 20)) 现在使用了相等运算符。

但我们没有使用 = 操作符将条件操作符 (?:) 返回的值赋值给颜色变量,而是使用了相等比较操作符 (==)。这也会在保存脚本时引发 "无可行替代方案 "错误:



正确的代码示例当然是使用赋值运算符 (=) 给颜色变量赋值,并使用相等运算符 (==) 检查高点是否是过去 20 个条形图中的最高点:
  1. //@version=5
  2. indicator(title="Assignment operator - example 2", overlay=true)

  3. colour = high == ta.highest(high, 20) ? color.green : color.red

  4. barcolor(colour)
复制代码
该版本的脚本不会出现 TradingView 错误:

添加到图表中的脚本看起来是这样的:


除赋值运算符外,其他常用的运算符包括:进行数学运算的算术运算符、相互比较数值的比较运算符,以及组合多个真假表达式的逻辑运算符。

小结

赋值运算符 (=) 赋予变量一个值,并将关键字参数设置为一个值。它的左操作数被设置为等号右边的值。使用赋值运算符时,我们不能为现有变量赋值。

论坛官方微信、群(期货热点、量化探讨、开户与绑定实盘)
 
期货论坛 - 版权/免责声明   1.本站发布源码(包括函数、指标、策略等)均属开放源码,用意在于让使用者学习程序化语法撰写,使用者可以任意修改语法內容并调整参数。仅限用于个人学习使用,请勿转载、滥用,严禁私自连接实盘账户交易
  2.本站发布资讯(包括文章、视频、历史记录、教材、评论、资讯、交易方案等)均系转载自网络主流媒体,内容仅为作者当日个人观点,本网转载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。本网不对该类信息或数据做任何保证。不对您构成任何投资建议,不能依靠信息而取代自身独立判断,不对因使用本篇文章所诉信息或观点等导致的损失承担任何责任。
  3.本站发布资源(包括书籍、杂志、文档、软件等)均从互联网搜索而来,仅供个人免费交流学习,不可用作商业用途,本站不对显示的内容承担任何责任。请在下载后24小时内删除。如果喜欢,请购买正版,谢谢合作!
  4.龙听期货论坛原创文章属本网版权作品,转载须注明来源“龙听期货论坛”,违者本网将保留追究其相关法律责任的权力。本论坛除发布原创文章外,亦致力于优秀财经文章的交流分享,部分文章推送时若未能及时与原作者取得联系并涉及版权问题时,请及时联系删除。联系方式:http://www.qhlt.cn/thread-262-1-1.html
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

返回列表