今天,我们很高兴地宣布,Pine Script® v6正式发布!这是编程语言的升级版本,它以交易者为中心,包含了各种优化和大家期待已久的增强功能,为Pine Script®程序员提供了更高的效率和实用性,为把语言推向新高度奠定了基础。
这篇文章概述了Pine v6中一些最值得注意的升级。请参阅我们的发行说明,了解有关v6新增功能的更多信息,及时了解未来的改进。
v6转换工具
与之前版本的更改一样,Pine v6中包含的升级,不会影响使用早期Pine版本编写的个人或已发布的脚本。从现在起,所有新功能都将在最新的Pine版本中独家实现。因此,如果您想访问新功能,我们建议您将脚本转换为v6。最简单的方法,是使用我们新的v6转换工具,您可以从Pine编辑器的“管理脚本”菜单,选择“转换代码为v6”,以启用该工具。

请注意,并非所有脚本都可以自动转换为v6,在某些情况下,需要手动编辑以确保转换后的脚本按预期工作。如果您在自动转换时遇到问题,或者希望手动将脚本转换为v6,请参阅我们的便捷迁移指南。
动态请求
TradingView提供对全球数以万计的可交易商品、财务指标和经济指标的访问权限。request.*()函数系列,允许Pine脚本检索不同时间周期内,任何可用商品代码的数据,无论图表使用了什么商品代码和周期。
这些函数是功能强大的实用程序,具有多种用例。但是,它们以前有一个重大限制:它们需要使用“简单字符串”值来指定请求的商品代码和时间周期,这意味着上下文必须在第一根K线上已知,并且之后不能更改。此外,所有request.*()调用都必须严格在脚本的全局范围内执行。换句话说,代码中的任何单个request.*()实例只能获取一个商品代码和时间周期的数据,并且不允许在循环、条件结构或导出的脚本库函数内调用request.*()。
在Pine Script® v6中,我们消除了这些限制。现在,脚本可以使用“系列字符串”值来定义任何request.*()调用的上下文。此外,现在允许在本地范围内调用request.*()。通过这些更改,您可以计算或修改任何历史条上的商品代码,并动态请求其数据,创建商品集合并在循环内获取其数据,以及使用request.*()函数执行许多其他以前不可能完成的事情。请参阅我们的用户手册的动态请求部分,了解更多信息。
要查看动态请求可以做什么的示例,请查看内置表现指标的内部工作原理。它将逗号分隔的商品和时间周期字符串列表拆分为数组,然后在循环内动态调用request.security()以从每个数据集中获取值。过去,这样的脚本需要多次input.symbol()和input.timeframe()调用,并且每个商品-时间周期组合都需要在代码中单独调用request.security():

如需更多参考,请查看TradingView帐户发布的这些脚本,这些脚本也利用动态请求从其他上下文中获取数据。
- 外汇热图。这个指标根据用户指定的货币代码列表,为货币对组合创建代码ID。它在循环内动态请求每个货币对组合的数据,然后使用这些数据填充颜色编码表。
- 报价条。此指标根据用户定义的商品列表,创建一个股票行情ID数组。它在循环中动态地从数组中,请求每个股票行情ID的价格和每日变化信息,然后使用这些数据更新旋转的“报价条”显示。
- LibraryCOT。以前,此库仅提供用于创建股票代码ID的工具,用于请求CFTC交易者承诺(COT)数据,因为库无法导出包含request.*()调用的函数。对于动态请求,此限制不再适用。该库现在导出requestCommitmentOfTraders()函数,该函数在内部调用request.security()以直接检索COT数据,为程序员提供更多便利和多功能性。
此外,所有 CFTC 报告代码之前都保存在switch语句中以返回“简单”值,这大大限制了可供请求的股票代码。使用动态请求,不再需要“简单字符串”股票代码ID,允许库将报告代码存储在map中,并提供对更多商品的支持。
Boolean优化
Pine Script® v6中最值得注意的改进之一,可能表面上并不明显,但您可能会注意到代码效率的差异。我们重新设计了Pine 中“bool”值的内部实施,并引入了短路(或“惰性”)求值,允许and和or操作在不需要确定结果时,停止求值进一步的表达式。
这些更改提高了TradingView上大多数脚本的表现。效率差异对于相对较大的脚本尤其明显,这些脚本严重依赖条件并使用许多“bool”值,正如我们在对一些最受欢迎开源社区脚本的测试中所证实的那样。
作为奖励,惰性“bool”求值通常允许更干净、更简洁的代码。例如,如果您有一个依赖于数组中项目的条件,则可能必须检查数组的大小以确保项目的索引存在,因为如果索引超出范围,脚本将停止并引发错误。 Pine v6具有惰性求值功能,允许您创建一个条件表达式,在尝试访问元素之前检查数组,这在v5中是不可能的。
//@version=6
indicator("Lazy evaluation demo")
//@variable A "bool" array without a fixed size.
array<bool> myArray = array.new<bool>()
// Push a new value into `myArray` when the `close` is above the `open`.
if close > open
myArray.push(true)
// Line 13 causes an error in v5 because `myArray.first()` always executes, even if the first expression is `false`.
// It works in v6 though because `myArray.first()` executes only if the first expression evaluates to `true`.
if myArray.size() != 0 and myArray.first()
label.new(bar_index, high, "Test")
文本大小和格式
现在,所有显示文本的绘图类型(框、标签和表格)都可以使用以排版点指定的文本大小 — 与标准文本编辑器中使用的点相同。以前,您必须在任意size.*常量之间进行选择,例如size.large (24) 和size.huge (36)。现在,使用新的排版点规范,您可以确保文本大小完全符合您的要求。您甚至可以创建以前Pine版本无法实现的超大文本大小。
此外,我们为这些绘图类型引入了一个新的text_formatting参数,您可以使用该参数将文本设为斜体、粗体或两者兼有。

//@version=6
indicator("Text size showcase", overlay = true)
var t = table.new(position.bottom_center, 1, 2, bgcolor = color.yellow, frame_color = color.black, frame_width = 1)
if barstate.islastconfirmedhistory
t.cell(0, 0, "text_size = size.huge", text_size = size.huge)
t.cell(0, 1, "text_size = 60, bold & italicized", text_size = 60, text_formatting = text.format_bold + text.format_italic)
策略订单削减
活跃策略脚本用户可能知道,在Pine v5中,除非您使用深度回测模式,否则策略可以模拟最多9000笔交易,然后停止计算并引发错误。此限制对于模拟频繁交易并创建警报触发器的策略尤其不方便。
在Pine Script® v6中,策略在达到9000笔交易限制后,不再停止计算或引发错误。相反,策略会削减最旧的订单以腾出空间给新订单。削减后的订单不会出现在策略测试器中,但策略会继续计算而不会出现问题。要检查最旧的未削减订单的交易索引,您可以使用新的strategy.closedtrades.first_index变量。该索引可用作strategy.closedtrades.*()函数调用中的trade_num参数。
负数组索引
In Pine v6, the array.get(), array.set(), array.insert(), and array.remove() functions can now accept negative index arguments to reference items starting from the end of an array, offering a more concise, convenient way to reference array elements in reverse order. For example, the call array.get(myArray, -2) retrieves the second to last element in myArray, which is equivalent to array.get(myArray, array.size(myArray) – 2).
To stay updated on the latest improvements to the Pine Script® experience, keep an eye on the User Manual’s Release notes — its v6 section even includes some additional changes that did not make it into this blog post.
We hope you find these features as useful as we think they’ll be, and please do keep sending us your feedback and suggestions so we can make the platform the best it can be. We build TradingView for you, and we’re always keen to hear your thoughts.
— Team TradingView
在Pine v6中,array.get(),array.set(),array.insert()和array.remove()函数,现在可以接受负索引参数来从数组末尾开始引用项,从而提供一种更简洁、更方便的方法来反向引用数组元素。例如,调用array.get(myArray, -2)检索myArray 的倒数第二个元素,这相当于array.get(myArray, array.size(myArray) – 2)。
要随时了解Pine Script®体验的最新改进,请关注用户手册的发行说明 — v6部分甚至有一些未包含在这篇博文中的其他更改。
我们希望大家发现这些功能和我们认为的一样有用,请继续向我们发送您的反馈和建议,以便我们尽可能地完善平台。我们为您打造TradingView,始终渴望听到您的想法。
— TradingView团队