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

Pine Script(268):输入不匹配与输入语法错误详解

#Pine Script入门教学

如何纠正TradingView中的”输入不匹配”编码错误?

当我们编写TradingView指标和策略脚本时,必须遵守Pine语言的语法规则,这就像我们写作时要遵守语法一样。哪怕只是一个放错位置的字符,都可能触发’mismatched input’(输入不匹配)这个错误。本文将探讨这个错误,并学习如何修复它。

‘mismatched input’错误的特征

Pine Script有一套严谨的规则来指导我们如何编写代码,包括代码的缩进、变量与函数名的大小写,以及在何处使用何种字符。正是因为这些规则,TradingView才能正确地解读我们的代码意图。

通常我们感觉不到TradingView对代码的解读有多么精确,但只要代码中出现一个细微的字符错误,我们就会立刻感受到。在这种情况下,’mismatched input’是最常遇到的错误之一。当这个错误发生时,如果你的脚本已经加载到图表上,你首先会看到一个通用的无法编译脚本的提示:

这个提示本身帮助不大,因为其他几种错误也会显示同样的消息。要深入了解问题所在,我们必须查看Pine编辑器下方的控制台窗口。

在那里,我们会找到一条更详细的错误信息,例如:

Processing script...
line 4: mismatched input ')' expecting ']'
Script 'Error example' has been saved

(第4行:不匹配的输入 ‘)’,应为 ‘]’)

这些信息为我们提供了解决问题的关键线索。

修复TradingView中的’mismatched input’错误

‘mismatched input’错误有时可能有点令人困惑,甚至有时错误信息本身也很抽象。不过幸运的是,修复它通常只需要简单的几步。第一步,仔细阅读完整的错误信息,其中通常包含几条有用的线索:触发错误的语句所在的行号;TradingView收到的、它不期望或无法识别的那个错误字符;通常,错误信息还会提示’expecting …’(应为…),这部分直接告诉了你TradingView期望在此处看到什么字符。第二步,在Pine编辑器中,跳转到提示的行号,找到那个引发问题的字符。第三步,用正确的代码替换掉那个不正确的字符。通常,错误信息中’expecting …’的部分已经给出了正确答案。如果错误信息提示 expecting 'end of line without continuation',那么你需要检查是否存在空格或缩进问题。

提示:有时,’mismatched input’错误也会附带’end of line without continuation’的提示。这使得这两个错误看起来相似,但它们的根本原因不同。’end of line without continuation’错误通常由缩进问题引起,而’mismatched input’错误则由不正确或缺失的字符引起。

另外,’mismatched input’错误中提到的input与 input.int() 这类输入函数无关,它指的是TradingView编译器接收到的源代码输入。

接下来,让我们通过几个具体的例子来看看如何修复’mismatched input’错误。

错误示例:误用圆括号()代替方括号[]

在Pine Script中,圆括号 () 用于函数调用和改变运算优先级,而方括号 [] 则专用于历史引用操作符(即获取前几根K线的数据)。如果混淆了这两者,就会引发’mismatched input’错误。

例如,下面的指标脚本错误地使用了 )

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

plotValue = open != close[1) ? // 错误在此处
     ta.sma(close, 10) :
     ta.ema(close, 12)

plot(plotValue, color=color.orange, linewidth=2)
line 4: mismatched input ')' expecting ']'

错误信息明确指出,在第4行,它收到了一个不匹配的 ),而它期望的是 ]。我们查看代码,发现 close[1) 应该被更正为 close[1]

错误示例:错误地注释掉需要缩进的代码行

注释(//)可以用来暂时禁用某段代码,但如果操作不当,可能会破坏代码的缩进结构,从而引发’mismatched input’错误。

看下面这个例子:

//@version=5
strategy(overlay=true, title="策略示例")

longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 50))

if longCondition
    // strategy.entry("My Long Entry Id", strategy.long)
    strategy.exit("exit", "long", profit=10, loss=5)
line 8: mismatched input 'strategy.exit' expecting 'end of line without line continuation'

这里,我们注释掉了 if 代码块中的 strategy.entry() 这一行。由于被注释掉的代码行被编译器视为空白,导致下一行的 strategy.exit() 在逻辑上成为了 if 语句下的第一行代码,但它却没有被正确地缩进,从而引发了错误。

要修复它,我们可以取消注释,或者将 strategy.exit() 也正确地缩进。

错误示例:函数调用时缺少括号

在调用函数时,尤其是嵌套调用时,很容易遗漏括号。即便是少了一个括号,也会导致’mismatched input’错误。

例如:

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

value = math.max(close, math.min(low, high) // 缺少一个闭合括号

plot(value, color=color.blue, linewidth=3, style=plot.style_circles)
line 4: mismatched input 'end of line without line continuation' expecting ')'

错误信息提示第4行缺少一个 )。我们看到 math.min() 有完整的括号,但外层的 math.max() 缺少了闭合的括号。只需在行尾补上即可:value = math.max(close, math.min(low, high))

提示:在Pine编辑器中,你可以将光标放在一个括号旁,其匹配的另一个括号会被高亮显示。这个功能可以帮助你快速检查括号是否配对。

错误示例:条件运算符的字符错误

条件运算符(?:)是 if/else 语句的一个紧凑替代方案。它的正确格式是一个问号 ? 紧跟一个冒号 :。如果写错了,比如写成了 ??,就会触发’mismatched input’错误。

例如:

plotValue = close != close[1] ? 10 ? 20 // 错误!应该是 :
line 7: mismatched input 'end of line without line continuation' expecting ':'

错误信息已经明确告诉我们,它期望的是一个冒号 :。我们将第二个 ? 改为 : 即可修复。

总结

在TradingView中编程是一项精确的任务,每个字符都有其意义。当我们遗漏或用错一个字符时,就很容易遇到’mismatched input’错误。

尽管这个错误看起来可能很棘手,但修复它并不难。关键在于仔细阅读错误信息,它会告诉你出错的行号、错误的字符以及期望的字符。根据这些线索,我们就能在Pine编辑器中快速定位并修正问题。如果错误信息中提到了’end of line without continuation’,那么通常意味着存在缩进问题。

如何修复TradingView Pine Scripts中的”输入语法错误”错误?

TradingView更臭名昭著的错误之一,便是’syntax error at input’错误。这个错误是少数几个可能由非常多的情况触发的错误之一。幸运的是,这通常是一个容易修复的错误。本文将探讨如何做。

深入了解TradingView的输入处有语法错误

要成功编写TradingView代码,我们必须遵循所谓的语法(syntax)规则。这些规则就像我们日常语言中的语法一样,决定了什么是允许的,什么是不允许的。它们指定了在哪个上下文中可以使用哪些代码元素,以及我们可以在何处使用哪些字符。

和语法一样,代码的语法规则不容忍小错误。哪怕只有一个不正确的字符,我们也会收到’syntax error at input’的错误。更糟糕的是,即使经验再丰富,我们仍然会不时地遇到这个错误,因为它可能仅仅源于一次简单的输入失误。

如果我们的脚本在出现’syntax error at input’错误时,已经加载到了图表上,我们会在品种名称下方看到通用的’cannot compile script’(无法编译脚本)消息。

这个错误提示本身并没有提供太多信息,因为很多其他TradingView错误都使用同样的消息。要获得真正的错误信息,我们必须查看Pine编辑器的控制台窗口。

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

Processing script...
line 16: syntax error at input 'from_entry'
Script 'Error example strategy' has been saved

让我们看看如何利用这条信息来修复错误。

修复TradingView的’syntax error at input’错误

‘syntax error at input’(输入处有语法错误)这条错误信息听起来可能有些神秘,有时也令人困惑,这主要是因为它可能由非常多的情况触发。但幸运的是,修复这个错误通常并不困难。第一步,仔细阅读错误信息,记下行号,同时留意错误末尾单引号(”)中标注的字符。第二步,在Pine编辑器中跳转到该行号,并找到提示的那个字符。如果这一行是一个多行语句,那么实际出错的字符可能在提示行号的下面几行。第三步,用正确的字符替换那个不正确的字符,或者如果它是误添加的,就直接删除它。第四步,保存脚本,如果还有其他的’syntax error at input’错误弹出,重复以上步骤。

请注意,错误中提到的语法(syntax),指的就是决定了在TradingView Pine中什么是允许的、什么是不允许的、类似语法的规则。由于指导我们编写Pine脚本的规则很多,因此能触发’syntax error at input’错误的情形也五花八门,这使得每次修复错误的方式都略有不同。

由于很多情况都会触发这个错误,上述步骤显得有些笼统。要获得如何修复该错误的实用见解,请看下面的错误示例。我们将分四大类来探讨大量的示例及其解决方案:输入错误、缺少字符、函数错误和缩进错误。

产生’syntax error at input’的输入错误

该错误的一个常见原因是简单的输入失误。一次错误的按键,或者一次没有被正确录入的按键,都足以触发这个语法错误。让我们看看如何修复这些情况。

错误示例1:用错误的字符进行变量赋值

要在TradingView中创建一个变量,我们输入其名称,然后是赋值运算符 =,后面跟着我们想赋予变量的任何值。然而,我们只能用 = 来创建变量。如果我们使用了其他字符,就会得到该错误。

例如,这里我们在创建一个变量时,误按了 - 键而不是 =

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

emaValue - ta.ema(hl2, 30) // 错误:应为 =

plotColour = close > open ? color.red : color.green
plot(emaValue, color=plotColour, linewidth=2)

问题分析:由于错误信息指出了行号和错误的字符,修复它非常简单。

解决方案:只需将 - 替换为 = 即可。

emaValue = ta.ema(hl2, 30)

错误示例2:条件运算符的?:顺序错误

TradingView的条件运算符(?:)的作用类似于一个if/else语句,它需要三个值。第一个是布尔值,当为true时,运算符返回第二个值;当为false时,返回第三个值。我们用 ?: 来分隔这三个值,格式为:condition ? value_if_true : value_if_false

如果我们搞乱了这两个符号的顺序,就会触发该错误。例如:

// ... (部分代码省略)
plotValue = close != close[1] : ta.ema(close, 10) ? ta.sma(close, 20) // 错误:顺序反了
// ...

问题分析:这里我们试图使用条件运算符,但错误地将 : 放在了 ? 前面。

解决方案:要修复此错误,:? 需要交换位置。

plotValue = close != close[1] ? ta.ema(close, 10) : ta.sma(close, 20)

这里有一个记住条件运算符正确顺序的小技巧:回想一下,这个运算符是在提问某个值是true还是false,所以我们首先使用问号(?)。然后,运算符要在两个选项之间做选择,我们用冒号(:)来分隔它们。

错误示例3:二元运算符缺少操作数

大多数TradingView运算符都需要一个左操作数和一个右操作数,例如乘法 * 和除法 /。就像代数中的运算一样,一个二元运算符不能缺少任何一方。当缺少一个或两个操作数时,便会触发该错误。

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

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

plotColour = color.green
value = 10 * / close // 错误:两个运算符相连
plot(value, color=plotColour, linewidth=2)

问题分析:这里我们在第6行连续使用了两个算术运算符 */,它们之间缺少一个操作数。

解决方案:我们只需在第6行执行一个正确的数学运算即可修复该错误。例如:

value = 10 * open / close

错误示例4:用=进行逻辑比较

=== 这两个运算符非常相似。我们用 = 来创建变量并为其赋值。而用 == 来检查其左右两边的值是否相等。如果我们混淆了这两个运算符,就会得到该错误。

一个混淆了 === 的示例脚本如下:

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

plotColour = close = open ? color.orange : color.blue // 错误:比较应用 ==
// ...

问题分析:这里,在条件运算符中,我们本想比较 closeopen 是否相等,但错误地使用了赋值运算符 =

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

plotColour = close == open ? color.orange : color.blue

错误示例5:使用了双重括号

在TradingView Pine中,我们使用括号 () 来改变运算顺序或在调用函数时使用。但每一个开括号 ( 都需要一个匹配的闭括号 )。如果我们有多余的或未闭合的括号,便会触发该错误。

一个括号错误的例子是:

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

emaValue   = ta.ema(close, 25)
plotColour = close > emaValue ? color.green : color.red
plot((emaValue, color=plotColour, linewidth=2) // 错误:多了一个开括号

问题分析:这里脚本在第7行触发了错误。我们在调用 plot() 函数时,误用了两个开括号 ((

解决方案:我们只需将多余的开括号移除即可:

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

错误示例6:输入了一个字母而非运算符

有时,触发该错误的可能是一个非常明显的输入失误。但当你沉浸在编码的心流中时,即便是明显的错误也可能溜走。

下方的例子就是一个按键偏离的输入错误——本应是 : 的地方,输入了 L

// ... (部分代码省略)
plotColour = strategy.position_size > 0 ? color.green :
     strategy.position_size < 0 ? color.red L // 错误:应为 :
     color.yellow
// ...

问题分析:第12行的错误显而易见:在 color.red 之后,我们输入了 L 而不是 :

解决方案:我们简单地用冒号(:)替换那个不正确的字符即可:

plotColour = strategy.position_size > 0 ? color.green :
     strategy.position_size < 0 ? color.red :
     color.yellow

错误示例7:使用了双重方括号

我们通过历史引用操作符 [] 来访问之前K线的数据。为此,我们输入一个开方括号 [,然后是回溯的K线数,再是一个闭方括号 ]。我们不能使用多个方括号,否则只会得到’syntax error at input’的错误。

例如,这个示例指标试图使用 [[ 来获取历史价格:

//@version=5
indicator(title="我的SMA脚本", overlay=true, precision=1)

plotColour = close == close[[1] ? color.yellow : color.orange

plot(ta.sma(close, 10), color=plotColour)
plot(ta.sma(close, 50), color=plotColour, linewidth=2)
Processing script...
line 4: syntax error at input '['
(第4行:在输入'['处出现语法错误)
Script 'Error example' has been saved

第4行的错误在于试图使用TradingView的历史引用操作符([])。但为了让这个操作符正常工作,我们需要将那一行中的双重方括号([[)替换为单个方括号 [,像这样:

plotColour = close == close[1] ? color.yellow : color.orange

由缺失字符导致的’syntax error at input’错误

除了意外的键盘敲击和打字错误,另一个引发’syntax error at input’错误的原因是缺失了必要的字符。让我们通过几个例子来探讨这种情况。

错误示例:自定义函数名后缺少圆括号()

在TradingView中定义一个自定义函数时,我们首先写下函数名,然后在圆括号 () 中列出其参数,最后是 => 符号和函数体。

虽然参数是可选的,但函数名后的圆括号不是。即使一个函数没有任何参数,我们也必须在其名称后加上一对空的圆括号 ()。否则,我们就会遇到’syntax error at input’的错误。

下面是一个错误地声明了函数的例子:

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

closeHigh => close - high // 错误:缺少 ()

emaValue   = ta.ema(close, 25)
plotColour = close > emaValue ? color.green : color.red
plot(emaValue, color=plotColour, linewidth=2)
Processing script...
line 4: syntax error at input '=>'
(第4行:在输入'=>'处出现语法错误)
Script 'Error example' has been saved

这里我们试图创建一个名为 closeHigh 的自定义函数,但我们声明它时漏掉了圆括号。这触发了语法错误,因为它本应是 closeHigh()。要修复这个错误,我们将第4行修改为:

closeHigh() => close - high

错误示例:变量名与其值之间缺少=

当我们创建一个TradingView变量时,我们会在变量名和其初始值之间使用 = 运算符。如果我们忽略了这个 =,TradingView就会报出’syntax error at input’的错误。这类错误有时很恼人,因为我们明明知道该怎么做,却只是因为一时的疏忽而漏掉了一个字符。

例如:

//@version=5
indicator(title="我的SMA脚本", overlay=true, precision=1)

quickEMA = ta.ema(close, 10)
slowEMA ta.ema(close, 35) // 错误:缺少 =

plotColour = close == close[1] ? color.yellow : color.orange
plot(quickEMA, color=plotColour)
plot(slowEMA, color=plotColour, linewidth=2)
Processing script...
line 5: syntax error at input 'ema'
(第5行:在输入'ema'处出现语法错误)
Script 'Error example' has been saved

在第5行,我们试图创建 slowEMA 变量,但忘记在变量名和其值之间加上 =。要修复这个错误,我们只需将第5行更正为:

slowEMA = ta.ema(close, 35)

由函数使用不当导致的’syntax error at input’错误

另一类常见的错误源于函数使用不当。让我们来看看一些例子以及如何正确处理它们。

错误示例:使用-而非=来为参数赋值

为函数的命名参数赋值时,正确的格式是 参数名=值。我们必须使用 = 符号。如果不小心按到了旁边的 - 键,就会引发’syntax error at input’错误。

例如:

strategy.exit("Exit Long stop", from_entry-"Enter long", // 错误:使用了 -
     stop=slowMA)
line 16: syntax error at input 'from_entry'

错误发生在 from_entry 参数这里,原因是我们误用了 -。修复方法很简单,只需将其替换为正确的 = 即可。

错误示例:位置参数顺序错误

在调用函数时,我们可以使用位置参数或命名参数。位置参数要求我们严格按照函数预定义的顺序来传递参数值,这样可以省去写参数名的麻烦。但如果顺序搞错了,就会引发’syntax error at input’错误。

例如:

//@version=5
strategy(overlay=true, "Error example strategy") // 错误:位置参数在命名参数之后
line 2: syntax error at input '"Error example strategy"'

这里的问题在于 strategy() 函数的参数顺序。我们先使用了命名参数 overlay=true,然后才使用位置参数 "Error example strategy"。正确的规则是:所有位置参数必须位于所有命名参数之前。

修复这个问题有两种方法。第一种是遵守正确的顺序:

strategy("Error example strategy", overlay=true)

第二种,也是更推荐的方法,是全部使用命名参数,这样就不必担心顺序问题了:

strategy(overlay=true, title="Error example strategy")

错误示例:函数参数列表中缺少逗号,

当向一个函数传递多个参数时,我们必须用逗号 , 将它们隔开。如果忘记了逗号,就会引发’syntax error at input’错误。

例如:

plot(emaValue color=plotColour, linewidth=2) // 错误:缺少逗号
line 7: syntax error at input 'emaValue'

错误信息提示问题出在 emaValue 这里。我们检查代码发现,emaValuecolor=plotColour 这两个参数之间缺少了一个逗号。正确的写法是:

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

由缩进错误导致的’syntax error at input’

‘syntax error at input’错误的另一个常见原因是缩进和空格使用不当。TradingView对代码的缩进有非常严格的规定:函数体内的代码必须用4个空格或1个制表符(或其倍数)进行缩进;如果一条语句过长需要换行,后续行必须用至少5个空格或1个制表符加1个空格来缩进,并且不能是4个空格或1个制表符的整数倍。

许多缩进错误都会导致’syntax error at input’的报错。检查代码缩进的一个快捷方法是观察Pine编辑器中的垂直缩进参考线:

这些细小的垂直标尺不会在代码被正确地缩进1个Tab键或4个空格(或其倍数)时出现。因此,在自定义函数的代码块中,我们不应该看到它们。但对于一个被正确缩进的多行语句的续行,我们则应该能看到一条细小的垂直标尺。

现在,让我们探讨一些因空白和缩进问题而导致’syntax error at input’错误的示例脚本。

错误示例1:if/else语句的缩进错误

当我们在TradingView中编写if/else语句时,ifelse关键字下方的代码块应该用1个Tab键或4个空格(或其倍数)来缩进。如果我们不小心多用了空格(例如,5个),TradingView便会生成’syntax error at input’错误。

一个因缩进错误而导致该错误的示例如下:

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

plotColour = if close > open
     color.green // 错误:此行缩进了5个空格
else
    color.red

plot(ta.sma(close, 10), color=plotColour, linewidth=2)
Processing script...
line 4: syntax error at input 'open'
Script 'Error example' has been saved

问题分析:这里的问题在于 color.green 这一行被错误地缩进了5个空格(1个Tab键+1个空格)。由于if/else语句的代码块不允许这样的缩进,脚本便触发了错误。

请注意,错误信息虽然指向第4行,但实际的问题出在第5行。这是因为第4行开启了一个多行语句,TradingView只报告这个错误语句的起始行号。

解决方案:要修复此错误,我们需要将 color.green 这一行用标准的4个空格或1个Tab键来缩进:

plotColour = if close > open
    color.green
else
    color.red

错误示例2:函数体内的代码行缩进错误

我们按如下方式在TradingView中编写自定义函数:首先输入函数名,然后在括号内列出其参数,接着是函数声明操作符(=>),最后是函数的主体代码。为了让TradingView知道哪些代码属于该函数,我们需要用一个Tab键或4个空格来缩进每一条语句。

如果我们不小心多用了一个空格(即缩进了5个空格),TradingView便会报错。示例如下:

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

plotValue(a, b) =>
    c = a + 0.1 * b
     sum = a + b + c // 错误:此行及以下缩进为5个空格
     sum / 3.21

plot(plotValue(close, low), color=color.orange, linewidth=2)
Processing script...
line 5: syntax error at input 'b'
Script 'Error example' has been saved

问题分析:我们 plotValue() 自定义函数中的最后两行被错误地缩进了5个空格,这不符合TradingView的语法要求。

解决方案:要修复该错误,我们需要确保自定义函数内的每一行都统一使用4个空格或1个Tab键进行缩进:

plotValue(a, b) =>
    c = a + 0.1 * b
    sum = a + b + c
    sum / 3.21

总结

我们编写TradingView指标和策略脚本的方式,是由所谓的语法规则所指导的。这些规则就像语法一样,决定了什么是允许的,什么是不允许的。当出现语法错误时,TradingView可能触发的一个错误便是’syntax error at input’。

虽然这个错误听起来复杂,但修复它很简单(虽然有时找到原因并不容易)。首先仔细阅读错误信息,记下行号和提示的不正确字符。然后跳转到该行,替换或移除不正确的字符。

总的来说,’syntax error at input’错误主要由四类错误引起:输入错误,例如用 - 代替 =,或用 :? 代替 ?:;缺少字符,例如遗漏了赋值运算符 = 或函数调用时的括号 ();函数使用错误,例如位置参数的顺序错误,参数与其值之间缺少 =,或参数之间缺少逗号;缩进和空白处理不当。

赞(0)
未经允许不得转载:图道交易 » Pine Script(268):输入不匹配与输入语法错误详解
分享到

评论 抢沙发

登录

找回密码

注册