保持敬畏之心
交易是一场持久战

Pine Script(269):函数调用与参数使用错误排查

#Pine Script入门教学

是什么导致TradingView出现”无法使用参数调用”的错误?

我们经常在TradingView的指标和策略脚本中使用大量的函数。但有时,这些函数的参数会触发’cannot call with arguments’(无法用此参数组合调用)的错误。这个错误究竟意味着什么,我们又该如何修复它呢?

分析TradingView的’cannot call with arguments’错误

每个TradingView脚本都通过调用各种函数来实现其功能。这些函数是代码的核心元素,它们让我们可以绘制数值、为图表背景上色以及提交交易订单。

我们通过参数来配置一个函数的具体行为。但如果我们在使用参数时犯了错,就可能遇到’cannot call with arguments’的错误。当这个错误发生时,图表上首先会显示一个通用的无法编译脚本的提示:

这个提示本身帮助不大,因为其他几种错误也会显示同样的消息。幸运的是,Pine编辑器的控制台窗口中提供了更详细的信息,例如:

Processing script...
line 11: Cannot call `strategy.entry` with arguments (id=literal string, buy=const bool); available overloads: strategy.entry(const string, series[bool], series, series, series, string, const string, string, series[bool]) => void
Script 'Error example strategy' has been saved

(第11行:无法用参数(id=字面字符串, buy=常量布尔值)来调用strategy.entry;可用的重载有:…)

让我们来仔细解析这个错误,并学习如何修复它。

修复TradingView的’cannot call with arguments’错误

‘cannot call with arguments’的错误信息可能看起来很吓人,因为它罗列了各种技术术语。幸运的是,我们通常不需要理解甚至读完整个错误信息就能修复这类问题。第一步,仔细阅读错误信息的第一行,记下它提示的行号和函数名称。第二步,在Pine编辑器中定位到指定的行号,找到那个被提及的函数。第三步,逐一检查该函数调用的每一个参数,查找可能存在的错误。’cannot call with arguments’的常见原因包括:参数名称拼写错误,例如将 linewidth 错写成 linewith,或将 from_entry 错写成 fromentry;位置参数的顺序不正确;函数所必需的参数被遗漏。

在看具体示例之前,让我们先了解一下在TradingView中如何使用参数。

理解TradingView函数中参数的工作原理

TradingView的函数让我们的代码能够执行特定操作。我们通过向函数传递参数来配置其行为。参数是我们传给函数的值,函数会利用这些值来完成任务。

在Pine Script中,使用参数主要有两种方式,每一种都有可能引发’cannot call with arguments’错误。一种是命名参数(named arguments):我们明确地写出参数的名称,后跟 = 和它的值,例如 plot(series=ta.ema(close, 10), color=color.orange)。它的优点是非常灵活,可以按任意顺序书写,且代码可读性好;缺点是如果参数名称拼写错误,就会引发错误。另一种是位置参数(positional arguments):我们按照函数预定义的顺序来传递参数值,省略参数名,例如 plot(ta.ema(close, 10), "EMA", color.orange)。它的优点是代码更简洁;缺点是必须严格遵守顺序,且不能跳过任何一个中间的参数,顺序错误会引发错误。

提示:这两种方式可以结合使用。例如:plot(ta.ema(close, 10), color=color.orange)。我们首先使用位置参数(因为series是第一个参数),然后使用命名参数。

提示:拼写错误的命名参数有时会触发’cannot call with arguments’错误,有时则会触发’unknown argument’(未知参数)错误。虽然同一个问题会引发两种不同的错误有点奇怪,但解决方法是相同的:修正参数名称。

高效技巧:快速查看函数的参数

那么,我们如何知道一个函数正确的参数名称和顺序呢?最快的方法是直接在Pine编辑器中操作。

只需将鼠标指针悬停在编辑器中的任何一个函数名上,就会弹出一个窗口,详细列出该函数接受的所有参数及其顺序:

现在,让我们通过几个具体的例子来看看如何修复’cannot call with arguments’错误。

错误示例1:使用了错误的参数名称

使用命名参数时,必须确保名称完全正确。一个微小的拼写错误就会导致报错。

例如:

// ...
if longCondition
    strategy.entry("Enter long", buy=strategy.long) // 错误!'buy'不是有效参数
// ...
line 11: Cannot call `strategy.entry` with arguments (id=literal string, buy=const bool)...

这里,我们试图用 buy 参数来指定一个多头开仓订单。但 strategy.entry() 函数并没有 buy 这个参数。正确的参数名应该是 long。因此,修复方法是:

strategy.entry("Enter long", long=strategy.long)

错误示例2:位置参数的顺序不正确

如果我们选择使用位置参数,就必须严格遵守函数定义的顺序。

例如:

//@version=5
indicator(true, "Error example", 3) // 错误!参数顺序不正确
line 2: Cannot call `indicator` with arguments (literal bool, literal string, literal integer)...

通过将鼠标悬停在 indicator() 函数上,我们知道其正确的参数顺序是 titleshorttitleoverlayprecision等。而我们的代码将 overlay(一个布尔值 true)放在了第一位,这是错误的。

有三种方法可以修复这个问题。第一种是全部使用命名参数(最推荐,最清晰):

indicator(overlay=true, title="Error example", precision=3)

第二种是严格遵守位置顺序(有时需要提供我们本不想设置的参数):

indicator("Error example", "Example", true, 3)

第三种是混合使用(位置参数在前,命名参数在后):

indicator("Error example", overlay=true, precision=3)

错误示例3:遗漏了必需的参数

大多数函数参数都是可选的,但每个函数至少有一个必需的参数。如果遗漏了,就会报错。

例如:

//@version=5
strategy(overlay=true, pyramiding=10, currency=currency.EUR) // 错误!缺少'title'参数
line 2: Cannot call `strategy` with arguments (overlay=literal bool...

这里的 strategy() 函数调用看起来没有问题,但它遗漏了唯一一个必需的参数:title。因此,要修复这个错误,我们只需添加上 title 参数即可:

strategy(title="Example strategy", overlay=true, pyramiding=10, currency=currency.EUR)

总结

‘cannot call with arguments’错误发生在我们调用函数时,其参数使用不当。常见的原因包括:参数名称拼写错误、位置参数顺序错误,或遗漏了必需的参数。

这个错误虽然看起来吓人,但修复起来并不难。只需定位到出错的行,仔细检查函数的参数即可。要快速查看一个函数的正确用法,最便捷的方法就是将鼠标悬停在Pine编辑器中的函数名上。

如何修复TradingView的”无法找到函数或函数引用”错误?

函数定义了我们TradingView指标或策略的行为方式。它们能做各种各样的事情,比如绘制数值、为图表着色、提交订单以及限制风险。但如果函数名使用不当,我们便会遇到’could not find function or function reference’(找不到函数或函数引用)的错误。本文将探讨如何修复这个错误。

探究TradingView的找不到函数错误

在编写指标或策略时,TradingView的函数是必不可少的一部分。变量负责追踪数据,而函数则负责执行脚本的动作(如提交订单和绘制数值)和定义属性(如指标或策略的设置)。因此,函数既强大又重要,但使用起来也并非总是那么容易,它们可能会触发多种TradingView错误。

其中一种错误便是’could not find function or function reference’错误。当这个错误发生时,可能会出现两种情况。如果脚本已经在图表上运行,我们会在品种名称下方看到’cannot compile script’(无法编译脚本)的提示:

这个提示信息帮助不大,因为其他几种TradingView错误也使用同样的消息。但幸运的是,我们有更多可用的信息。

因为在Pine编辑器的控制台窗口中,我们会看到类似以下内容:

Processing script...
line 7: Could not find function or function reference pdlot
Script 'Error example' has been saved

现在,我们就得到了一些可以着手处理的有用信息。让我们看看这个错误的含义以及如何修复它。

修复TradingView的找不到函数错误

当我们为一个内置函数使用了不正确的名称时,便会发生’could not find function or function reference’错误。TradingView中的这些名称非常精确:不仅名称本身要正确,其大小写也必须完全匹配。

以下是我们修复该错误的方法。第一步,仔细阅读错误信息,记下行号,错误信息的最后一部分会告诉我们是哪个函数名使用错误。第二步,在Pine编辑器中跳转到该行号,在那里你会找到出错的函数。第三步,用正确的函数名替换那个不正确的函数名。

所以,只要我们使用正确的函数名,就能修复这个错误。但这是否意味着我们需要背下所有TradingView的函数呢?幸运的是,不必如此。

技巧:使用TradingView的自动完成窗口查找正确的函数名

一个简单快捷地查看TradingView Pine中有哪些函数名的方法,就是在Pine编辑器内部操作。当我们在编辑器中按下 Ctrl + Space 时,一个自动完成窗口便会弹出。这个窗口会显示所有的TradingView变量和函数。如果我们输入几个字母,这个窗口还会搜索所有包含这些字母的代码元素。

例如,这里我输入了pl然后按下了Ctrl + Space,它便显示了所有名字中包含pl的函数和变量:

请注意,自动完成窗口会显示所有TradingView函数。但一个指标脚本不能使用策略函数,即使它们显示在窗口中。当我们在指标脚本中使用策略函数时,会得到’can’t use strategy functions in study script’的错误。

错误示例1:函数名拼写错误

最常见的一种导致该错误的情境,是函数名中的一个简单拼写错误。这也可能是最恼人的情况之一:我们明明知道正确的函数名是什么,只是不小心打错了。

一个因拼写错误而触发该错误的示例如下:

//@version=5
indicator(title="错误示例", overlay=true)

emaValue   = ta.ema(close, 25)
plotColour = close > emaValue ? color.green : color.red

pdlot(emaValue, color=plotColour, linewidth=2) // 错误:应为 plot

问题分析:这里我们试图执行 pdlot() 函数,但TradingView并没有这个函数。我们可能想在图表上绘制数值,为此,我们需要使用 plot() 函数,而非 pdlot()

解决方案:要修复该错误,我们将 pdlot 更改为 plot

plot(emaValue, color=plotColour, linewidth=2)

错误示例2:函数名大小写错误

当我们想执行一个TradingView函数时,必须使用其确切的名称——包括完全相同的大小写。这意味着我们不能将 strategy.entry() 执行为 Strategy.entry() 或使用 strategy.Entry()。当我们在函数名中犯了大小写错误时,TradingView便会生成该错误。

一个因大小写错误而导致的示例指标如下:

//@version=5
indicator(title="错误示例", overlay=true)

emaValue   = ta.ema(close, 25)
plotColour = close > emaValue ? color.green : color.red

Plot(emaValue, color=plotColour, linewidth=2) // 错误:应为 plot

问题分析:这里在第7行我们执行了 Plot() 函数。但要在图表上绘制数据,我们必须使用 plot()。因此,虽然名字很接近,但由于大小写敏感,TradingView将 Plot()plot() 视为两个不同的函数。

解决方案:我们只需将P改为小写来修复该错误:

plot(emaValue, color=plotColour, linewidth=2)

错误示例3:函数名中缺少点(.)

TradingView的函数不仅大小写敏感,它们还需要精确的标点匹配。对于TradingView来说,strategy.exit()strategyexit() 是两个不同的函数。

因此,函数的另一个命名错误是我们漏掉了所需的点(.)。当我们这样做时,会再次得到’could not find function or function reference’的错误消息。

一个漏掉 . 的错误示例如下:

//@version=5
strategy(title="示例策略", overlay=true)
// ... (部分代码省略)
if longCondition
    strategyentry("Enter long", strategy.long) // 错误:应为 strategy.entry
// ...

问题分析:这里在第12行我们使用了 strategyentry() 作为一个函数。但TradingView并没有这个名字的函数,而 strategy.entry() 是一个有效的函数。

解决方案:我们在这里通过在函数名中添加所需的点来修复错误消息:

strategy.entry("Enter long", strategy.long)

总结

TradingView的函数使各种行为成为可能。它们可以为图表背景着色、绘制数值、提交订单以及限制交易风险。要执行一个函数,我们只需输入其名称并通过参数配置其行为。

但TradingView对函数名非常精确:当一个函数的名字不是完全匹配时(包括大小写和标点符号),我们便会得到’could not find function or function reference’的错误消息。

虽然令人沮丧,但这个错误不难修复。首先仔细阅读错误信息,记下行号和不正确的函数名。然后跳转到该行,用正确的函数名替换有问题的函数名。

Pine编辑器的自动完成窗口(Ctrl + Space)是查找TradingView函数正确名称的一个快捷方法。

如何修复TradingView Pine中的”未知参数”错误?

函数能让我们的指标或策略执行特定的动作。我们可以通过命名参数(named arguments)来传递数据,从而配置它们的行为。但如果我们使用了错误的参数名,便会得到’unknown argument’(未知参数)的错误。本文将探讨如何修复这个错误。

深入了解TradingView的未知参数错误

TradingView的函数使得我们能在指标和策略脚本中实现各种各样的行为。例如,plot() 函数可以将数据显示为线图、直方图、面积图等等;而 strategy.entry()strategy.exit() 函数则负责开仓和平仓。

当我们在执行函数的方式上出错时,很可能会遇到’unknown argument’错误。如果出错的脚本已经加载到了图表上,我们同样会看到通用的’cannot compile script’(无法编译脚本)消息:

由于很多其他TradingView错误也使用相同的提示,这条信息本身对修复’unknown argument’错误帮助不大。但幸运的是,我们有更详细的错误信息,它位于Pine编辑器的控制台窗口中。

在那里,我们会发现一条像下面这样的错误消息:

Processing script...
line 6: Unknown argument `from_entry` of type literal string;
line 6: Cannot call `bgcolor` with arguments (color=series[color], transp=literal integer, from_entry=literal string); available overloads: bgcolor(series[color], integer, series[integer], const bool, const integer, const string, string) => void; bgcolor(fun_arg__<arg_color_type>, integer, series[integer], const bool, const integer, const string, string) => void
Script 'Error example' has been saved

这条错误信息提供了大量可以着手处理的信息。让我们看看如何利用它来修复代码问题。

修复TradingView的未知参数错误

虽然遇到编码错误总是有些烦人,但’unknown argument’错误至少提供了大量有用的信息。我们可以按以下步骤来修复这类错误。第一步,仔细阅读错误信息的前两行,这里有3条关键信息:出错的行号、我们使用的不正确的参数名,以及发生错误的函数。第二步,在Pine编辑器中滚动到该行号,找到TradingView不认识的那个参数。第三步,用正确的参数名替换掉那个不正确的参数。常见的参数错误包括:拼写错误,例如将 linewidth 误写为 linewithcurrency 误写为 curencyseries 误写为 seris;使用相似但错误的参数名,例如用 fromentry 代替 from_entry,用英式拼写 colour 代替美式拼写 color,或用 len 代替 length;使用了该函数不支持的参数,例如在 indicator() 函数中使用了 currency 参数,而该参数实际上属于 strategy() 函数。

请注意,参数(argument)是我们传递给函数的值。参数可以向函数发送数据,或改变函数的行为方式。例如,plot(series=ta.ema(close, 10), color=color.orange) 使用了两个参数:seriescolor。通过第一个参数,我们指定 plot() 函数在图表上显示什么数据;第二个参数则改变了默认的绘图颜色。

另外,’unknown argument’错误信息看起来可能有点吓人,因为它常常伴随着’cannot call with arguments’(无法用此参数调用)的错误。但其实不必担心:一旦你修复了’unknown argument’错误,由它引起的’cannot call with arguments’错误也会随之消失。因此,我们只需专注于解决’unknown argument’即可。

技巧:快速查看TradingView函数的参数

当我们遇到’unknown argument’错误时,说明我们用了一个不正确的参数来调用函数。但我们如何知道一个特定的函数到底有哪些可用的参数呢?

我们可以查阅TradingView的官方参考手册,或浏览相关的教程文章。但一个更快的方法是,在Pine编辑器中,将鼠标悬停在函数名上。当我们这样做时,一个信息窗口便会弹出,显示该函数的相关信息。

例如,这里我错误地在 bgcolor() 函数中使用了 ofset 参数,这触发了错误。当我们把鼠标悬停在该函数上时,便能很快发现问题所在:

这个弹出窗口显示,bgcolor() 有6个参数:colortranspoffseteditableshow_lasttitle。因此,参数应该是 offset 而非 ofset

现在,让我们来看几个’unknown argument’错误的具体示例以及如何修复它们。

错误示例1:使用了相似但不正确的参数名

导致该错误的一个常见情况是,我们输错了一个参数。通常,我们输入的参数名会很接近,但并非完全正确。例如,我们可能输入了 colour 而不是 color,或者输入了 off_set 而它本应是 offset

一个犯了此错误的指标示例如下:

//@version=5
indicator(title="错误示例", overlay=true)

plot(ta.sma(close, 10), color=color.black, plotwidth=2) // 错误:应为 linewidth

问题分析:这里的问题是我们对 plot() 函数使用了 plotwidth 参数,而这个参数并不存在。但 plot() 函数确实有一个 linewidth 参数用于设置线条的宽度。因此,我们很可能是想使用 linewidth

解决方案:我们只需将 plotwidth 修正为 linewidth,即可修复此错误:

plot(ta.sma(close, 10), color=color.black, linewidth=2)

错误示例2:输错了参数名(拼写错误)

该错误的另一个常见原因是参数名的拼写错误。这种错误很容易犯,不幸的是,即使我们对TradingView编程更有经验,也仍然会时常遇到。

幸运的是,拼写错误通常很容易发现。但有些则比较微妙,例如,使用英式拼写 colour 而非美式拼写 color

//@version=5
indicator(title="错误示例", overlay=true)

plot(ta.sma(close, 10), colour=color.black, linewidth=2) // 错误:应为 color

问题分析:虽然我们可以用 plot() 函数设置绘图的颜色,但该函数并没有 colour 这个参数,它只有 color 参数。

解决方案:要修复这个错误,我们将第4行更改为:

plot(ta.sma(close, 10), color=color.black, linewidth=2)

总结

TradingView的函数使各种行为成为可能,它们可以为图表背景着色、绘制数据、提交订单以及限制交易风险。要改变函数做什么以及如何做,我们通过将参数设置为某个值来向它们发送数据。

当我们使用了一个不正确的参数名时,便会发生’unknown argument’错误。这个错误可能看起来复杂且吓人,因为它常常伴随着’cannot call with arguments’错误。但要修复它,我们只需仔细阅读错误信息,跳转到有问题的代码行,并将不正确的参数替换为正确的即可。

要快速查看一个函数支持哪些参数名,一个便捷的方法是在Pine编辑器中将鼠标悬停在该函数上。

赞(0)
未经允许不得转载:图道交易 » Pine Script(269):函数调用与参数使用错误排查
分享到

评论 抢沙发

登录

找回密码

注册