你好,Pine脚本v5

Oct 7, 2021

今天,Pine升級到v5!我们的指标和策略编程语言的新版本带来了许多令人兴奋的新功能和改进。Pine现在比以往任何时候都更强大,v5中的变化将帮助我们将语言提升到新的水平。这篇文章仅介绍了一些可用的最新功能;请务必阅读我们的发行说明迁移指南

V4V5转换器

使用先前版本Pine的现有Pine脚本将继续保持不变,但我们在Pine编辑器中提供了一个转换工具来帮助编码人员将他们的v4脚本转换为v5。未来对Pine的改进将专门针对v5推出,因此如果您希望从新功能中受益,我们建议您转换您的指标和策略。当在编辑器中加载v4脚本时,从更多下拉菜单中可以使用v4到v5转换工具:

请注意,并非所有v4代码都可以自动转换。如果您遇到转换问题或更喜欢手动转换脚本,我们的迁移指南记录了v4和v5之间的所有更改,将为您提供指导。

脚本库

Pine V5附带的一个关键补充是脚本库。脚本库是一种新型出版物,允许您创建要在其他脚本中重用的自定义函数。发布脚本库后,其他脚本(指标、策略甚至其他库)可以导入它并使用其功能。您可以使用脚本库来包含复杂的算法或常用函数,以便您或整个Pine社区可以轻松地重用它们。

要开始使用脚本库,请参阅我们关于脚本库的用户手册页面。在本文的末尾,您将找到我们PineCoders团队成员发布的脚本库示例。您可以从此处的脚本提要中查看已发布的脚本库。

用户定义函数的默认值

与脚本库相辅相成的改进:可以为用户定义函数中的参数定义默认值,这有效地使它们成为可选的。在下面的示例中,我们说明了一个自定义函数customPow(),它将base提升到exp的幂。如果调用函数时未指定exp,则使用2:

//@version=5
indicator("")
customPow(base, exp = 2) =>
    result = 1
    for i = 1 to exp
        result *= base
plot(customPow(11)) // 11^2
plot(customPow(11, 4)) // 11^4

SWITCH

新的switch语句是对熟悉的if语句的一个转折。如果您曾经不得不创建一棵if-else语句的大树,您就会意识到使用switch实现所需的结果是多么方便。您可以在我们的参考手册中了解更多信息。在下面的代码中查看它的实际效果。它是我们内置的平均真实范围指标,它现在使用switch语句在其计算中提供不同的平滑算法:

//@version=5
indicator(title="Average True Range", shorttitle="ATR", timeframe="")
lengthInput = input.int(title="Length", defval=14, minval=1)
smoothingInput = input.string(title="Smoothing", defval="RMA", options = ["RMA", "SMA", "EMA", "WMA"])

maFunction(source, length) =>
    switch smoothingInput
        "RMA" => ta.rma(source, length)
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        => ta.wma(source, length)

plot(maFunction(ta.tr(true), lengthInput), title = "ATR", color=#B71C1C)

绘图集

使用Pine绘图的生活质量的重大改进:新的line.alllabel.allbox.alltable.all内置阵列变量始终包含脚本绘制的所有指定类型图形的ID。

例如,您可以使用它根据用户定义的值修剪图表上显示的绘图数量。在下面的脚本中,我们在每个新的每日开盘价上画一条线(根据脚本的默认线限制,上限为~50)。然后我们检查是否超过了脚本输入允许的行数,如果是,则删除最旧的行:

//@version=5
indicator("Daily Open", overlay = true)

qtyOfLinesInput = input.int(10, "Draw only last n lines", minval = 0, maxval = 50)

if ta.change(time("1D"))
    line.new(bar_index, open, bar_index + 1, open, extend = extend.right)
    if array.size(line.all) > qtyOfLinesInput
        line.delete(array.get(line.all, 0))

While

v5附带的另一个期待已久的Pine功能是while循环。while语句创建一个循环,当条件为假或在循环中使用break命令时,该循环将停止。

例如,这里有一个指标,它计算我们需要回顾的平均距离之间的差异,以找到等于最后n根K线总成交量的上涨和下跌成交量。我们需要进一步回顾以找到上涨或下跌的量,其价值越看跌或看涨:

//@version=5
var int MAX_BARS_BACK = 500
indicator("Volume bias", max_bars_back = MAX_BARS_BACK)

int lookBackInput = input.int(20, "Volume Look Back (bars)", minval = 2, maxval = int(MAX_BARS_BACK / 4))

// Stop the script if the chart does not contain volume data.
bool noVol = na(volume) and nz(math.sum(nz(volume), 200) == 0, true)
if noVol
    runtime.error("No volume data.")

volumeBias(lookBack, maxLookBack) =>
    bool  barUp = ta.rising(close, 1)
    bool  barDn = ta.falling(close, 1)
    float upVolume = 0.
    float dnVolume = 0.
    float avgVolume = math.sum(nz(volume), lookBack)
    int[] upBarNos = array.new_int(0)
    int[] dnBarNos = array.new_int(0)
    int   bar = 1
    bool  volumeFound = false
    while (not volumeFound) and bar < maxLookBack
        if barUp[bar] and upVolume < avgVolume
            upVolume += nz(volume[bar])
            array.push(upBarNos, bar)
        else if barDn[bar] and dnVolume < avgVolume
            dnVolume += nz(volume[bar])
            array.push(dnBarNos, bar)
        bar += 1
        volumeFound := upVolume >= avgVolume and dnVolume >= avgVolume
    float volumeBias = bar >= maxLookBack ? na : array.avg(dnBarNos) - array.avg(upBarNos)

float bias = volumeBias(lookBackInput, MAX_BARS_BACK)
plot(bias, "Volume Bias", bias > 0 ? color.lime : color.fuchsia)
hline(0)

脚本的while循环会一直执行,直到在上涨和下跌交易量中都找到所需的交易量,而且我们还没有回过头来超过允许的最大K线数。该脚本还展示了添加到Pine v5的另一个功能:runtime.error()

runtime.error()

runtime.error()函数现在可以停止脚本的执行并在您可以在 Pine中定义的任何条件下显示错误消息。这对于想要防止用户错误使用指标的脚本创建者会派上用场。它还可以用作非正统的调试工具,例如在循环期间或从函数内部停止执行。

要使用新函数,只需在满足条件时调用runtime.error()函数即可。当它执行时,它将停止脚本并在指标名称旁边显示熟悉的感叹号。当用户点击感叹号图标时,将出现您在函数调用中使用的消息。

下面的代码是一个带有两个自定义错误的准系统VWAP指标。当交易品种没有任何成交量数据时出现第一个:VWAP是根据成交量计算的,因此如果没有成交量,脚本将无法运行。当图表上的时间周期为1D或更高时,会出现第二个。基本VWAP计算在每个新K线上累积成交量加权移动平均数据,并在新一天开始时重置,因此该指标仅在日内时间周期内有用。

//@version=5
indicator("VWAP with custom errors")
if na(volume) // Will be true on symbols with no volume data e.g. TVC:SPX
    runtime.error("There is no volume data for this symbol.")
else if timeframe.isdwm // Will be true on 1D and higher timeframes
    runtime.error("Session-based VWAP does not show meaningful data on timeframes >= 1D.
     Please switch to a lower timeframe.")
plot(ta.vwap)

新的策略参数

策略编码人员的好消息!我们添加了一大堆新变量和函数,让您可以了解交易属性、统计数据和指标。它们的值会随着经纪商模拟器执行您的订单而更新,因此您可以随着策略的进展跟踪值。

点击此处查看Pine参考手册,了解每一项的详细信息

strategy.closedtrades.entry_price() / strategy.opentrades.entry_price()

strategy.closedtrades.entry_bar_index() / strategy.opentrades.entry_bar_index()

strategy.closedtrades.entry_time() / strategy.opentrades.entry_time()

strategy.closedtrades.size() / strategy.opentrades.size()

strategy.closedtrades.profit() / strategy.opentrades.profit()

strategy.closedtrades.commission() / strategy.opentrades.commission()

strategy.closedtrades.max_runup() / strategy.opentrades.max_runup()

strategy.closedtrades.max_drawdown() / strategy.opentrades.max_drawdown()

strategy.closedtrades.exit_price()

strategy.closedtrades.exit_bar_index()

strategy.closedtrades.exit_time()

strategy.convert_to_account()

strategy.convert_to_symbol()

strategy.account_currency

 

新命名空间

Pine程序员社区告诉我们,他们感谢我们在过去几年中对Pine进行的前所未有的添加速度,我们打算在未来保持同样的速度。然而,这会创建一个源源不断的新Pine函数和内置变量。为了支持这种疯狂的增长,我们需要更好地组织语言中使用的约600个当前名称。我们通过添加新的命名空间来实现这一点,以便以更好地反映其用途的方式对函数进行分组。许多函数参数名称也被重命名以使其更易于理解。

新命名空间的一个示例是ta.,它现在包括与技术分析相关的所有变量和函数。这使您可以更轻松地浏览参考手册并找到所有返回常用指标值的变量和函数。因此,sma()现在是ta.sma()。没有必要记住新的命名空间;如果您在编辑器中键入没有命名空间的函数的旧名称并按自动完成快捷键(Ctrl + Space,或MacOS上的Cmd + Space),则会出现一个显示匹配建议的弹出窗口:

搜索参考手册时也是如此;键入一个熟悉的函数名而不带它的命名空间将调出它的新名称。您可以在我们的迁移指南中查看v5的完整更改列表。

已发表脚本库

以下出版物是帮助我们测试Pine新功能的PineCoders在TradingView上发布的脚本库示例:

ColorScheme by RicardoSantos

Matrix_Functions_Lib_JD by Duyck

Enchanced_ta by HeWhoMustNotBeNamed

我们希望您发现新功能很有用。请继续向我们提供反馈和建议 — 我们正在为您构建 TradingView,我们总是渴望知道您对我们平台更新的看法。


 

还没有关注我们的中文微信公众号?快来扫二维码吧!

Look first Then leap

TradingView专门为您而打造,请确保您充分利用我们出色的功能
开启图表