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

Pine Script(264):会话错误与脚本输出函数缺失的修复

#Pine Script入门教学

如何修复TradingView的”错误”或”不正确”会话错误消息?

在我们的TradingView脚本中,我们可以用四种不同的格式来编写自定义的交易时段。但当我们定义交易时段的方式有误时,就会遇到’bad session section’、’bad sessions spec’以及’incorrect sessions syntax’等错误。本文将探讨这些错误的含义以及如何修复它们。

深入了解TradingView的时间时段错误

在我们的TradingView指标和策略脚本代码中,我们可以使用自定义的时间时段。通过这种方式,我们可以检查一根K线是否落在特定的交易时段内,高亮显示不同的外汇交易时段,或者只在某个特定的时间窗口内提交入场订单。

但要让这一切正常工作,我们需要正确地定义这些时段。如果我们定义有误,就会遇到一个TradingView错误,提示我们的自定义时段有误或不正确。在处理交易时段时,我们可能会遇到三种不同的错误。

第一种是’bad session section’错误。当你遇到此错误时,你会在图表区域的右上角看到它,前面是出错脚本的名称:

另一种交易时段错误是’bad sessions spec’。这个错误同样显示在图表的顶部:

还有一种是’incorrect sessions syntax’错误,它也出现在图表交易品种名称的正下方:

让这些错误有些恼人的是,它们并不会像大多数其他错误那样,在Pine编辑器的控制台中打印出详细信息,而详细信息对于定位和修复错误非常有帮助。

这种在代码编辑器中信息的缺失,可能会让你误以为这些交易时段错误并非编程错误。但它们确实是,并且需要我们调整代码来修复。接下来,让我们看看如何操作。

在TradingView Pine中修复时间时段相关的错误

‘bad session section’、’bad sessions spec’和’incorrect sessions syntax’这三个错误,都源于同一个问题:我们在TradingView Pine脚本中错误地编写了时间时段。

要修复这些错误,只需两步。第一步,在你的脚本中,找到所有使用了 time()input.session() 函数的地方。第二步,检查这些函数所使用的时段字符串是否遵循了正确的格式(详见下文)。对于 time() 函数,其第二个参数必须是一个格式正确的时段字符串;对于 input.session() 函数,其 defval(默认值)参数必须是一个格式正确的时段字符串。

定义TradingView时间时段的正确方法是什么?

在我们的TradingView指标或策略脚本中,可以用以下四种方式来定义一个时间时段,每种方式都有其自身的要求和格式。

常规交易时段的格式为 "HHMM-HHMM"。例如 "0930-1600"(从早上9:30到下午4点)。它也可以定义隔夜时段,如 "2100-1000"(从晚上21:00到次日早上10:00),以及完整的24小时时段,如 "1700-1700"(从当日17:00到次日17:00)。

带休市的交易时段格式为 "HHMM-HHMM,HHMM-HHMM"。例如,通过 "0900-1200,1300-1600",我们定义了一个从9:00到16:00,但在12:00到13:00之间有午休的交易时段。

特定日期的交易时段格式为 "HHMM-HHMM:W"。冒号(:)后面的数字 W 指定了该时段在一周的哪几天生效(1 = 周日,2 = 周一,…,7 = 周六)。例如 "0930-1700:23456" 定义了从周一到周五,每天9:30到17:00的交易时段。

带休市的特定日期的交易时段是以上两种格式的结合,格式为 "HHMM-HHMM,HHMM-HHMM:W"。例如,"0900-1200,1300-1600:246" 定义了一个在周一、周三和周五生效的、带午休的交易时段。

请注意:我们脚本中的每一个 input.session()time() 函数,都必须使用以上四种格式中的一种来精确定义时间。即使我们的代码定义与格式有丝毫不同,我们也会遇到其中一种时段错误。

修复’bad session section’错误

其中一个时段错误是’bad session section’错误消息。以下是一个使用 time() 函数并会触发此错误的示例指标:

//@version=5
indicator(title="时段背景颜色", overlay=true)

inSession = time(timeframe.period, "09:00-17:00")[1]

bgcolor(inSession ? color.new(color.orange, 90) : na)

我们在这里试图定义一个从9:00到17:00的交易时段。但是,我们使用的 "09:00-17:00" 格式是不正确的:我们不能在小时和分钟之间使用冒号(:)。

相反,我们需要像这样定义交易时段,才能修复’bad session section’(错误的时段区间)的报错:

inSession = time(timeframe.period, "0900-1700")[1]

同样的错误信息也可能出现在使用 input.session() 函数时。该函数的默认参数用于指定输入项的初始时段值。

下面是一个错误使用 input.session() 函数并引发错误的指标示例:

//@version=5
indicator(title="交易时段背景色", overlay=true)

customSession = input.session("09:00 17:00", title="交易时段")

inSession = time(timeframe.period, customSession)[1]
bgcolor(inSession ? color.new(color.orange, 90) : na)

这里,我们试图用 "09:00 17:00" 作为默认时段,但这个格式存在两个问题。第一,小时和分钟之间不应该有冒号(:)。第二,开始时间和结束时间之间应该用一个减号(-)连接,而不是空格。

因此,要修复这里的’bad session section’错误,我们应将 input.session() 函数的调用修改为:

customSession = input.session("0900-1700", title="交易时段")

修复TradingView的’bad sessions spec’错误

第二种可能遇到的时段相关错误是’bad sessions spec’(错误的会话规范)错误。下面是一个会触发该错误的指标示例:

//@version=5
indicator(title="交易时段背景色", overlay=true)

inSession = time(timeframe.period, "0900:1700")[1]
bgcolor(inSession ? color.new(color.orange, 90) : na)

这里我们想定义一个从9:00到17:00的交易时段。问题在于,我们错误地使用了冒号(:)来分隔开始和结束时间:"0900:1700"

要修复这个错误,我们需要使用一个破折号(-)来连接开始和结束时间,并且使用 HHMM 的格式:

inSession = time(timeframe.period, "0900-1700")[1]

当我们使用 input.session() 函数时,同样可能遇到’bad session spec’错误。例如:

//@version=5
indicator(title="时段背景颜色", overlay=true)

customSession = input.session("0900 1700", title="时段")

inSession = time(timeframe.period, customSession)[1]

bgcolor(inSession ? color.new(color.orange, 90) : na)

这里,我们将时段输入的默认值设为了 "0900 1700"。然而,这个格式并非TradingView所能识别的(如上文所讨论)。

要修复此脚本的错误,我们只需在开始和结束时间之间放置一个破折号(-)即可:

customSession = input.session("0900-1700", title="时段")

修复’incorrect sessions syntax’ TradingView错误

第三种类型的时段错误是’incorrect sessions syntax’(不正确的时段语法)错误消息。一个会触发该错误的TradingView脚本如下:

//@version=5
indicator(title="时段背景颜色", overlay=true)

inSession = time(timeframe.period, "0900-1700 123")[1]

bgcolor(inSession ? color.new(color.orange, 90) : na)

这里的问题在于时间和星期几数字之间的空格:"0900-1700 123"。为了让这个时段应用于第1天(周日)、第2天(周一)和第3天(周二),我们需要用冒号(:)替换那个空格:

inSession = time(timeframe.period, "0900-1700:123")[1]

同样的’incorrect sessions syntax’错误也可能发生在 input.session() 函数上。例如:

//@version=5
indicator(title="时段背景颜色", overlay=true)

customSession = input.session("0900-1700 3435", title="时段")

inSession = time(timeframe.period, customSession)[1]

bgcolor(inSession ? color.new(color.orange, 90) : na)

这里的默认值 "0900-1700 3435" 存在两个问题:一是星期几的数字有重复(两个3),二是用空格代替了冒号。为了修复’incorrect sessions syntax’错误,我们需要将这一行代码修改为:

customSession = input.session("0900-1700:345", title="时段")

总结

在我们的TradingView指标和策略脚本中,有四种定义时间时段的方法。常规日内时段:格式为 "HHMM-HHMM",例如 "0930-1600"。带休市的日内时段:格式为 "HHMM-HHMM,HHMM-HHMM",例如 "0900-1200,1300-1800" 定义了一个带一小时午休的时段。特定日期的时段:我们可以将以上两种格式限制在一周的特定几天,例如 "0930-1600:23456" 定义了从周一到周五的常规交易时段。带休市的特定日期的时段:例如 "0900-1200,1300-1800:234" 为周一、周二和周三定义了带休市的交易时段。

当我们在使用这些时间格式时出现错误,TradingView便会触发相应的错误提示。这些错误可能是’bad session section’、’bad sessions spec’或’incorrect sessions syntax’,具体取决于我们所犯的格式错误类型。

如何修复TradingView的”脚本必须至少有一个输出函数调用”错误?

有时,当我们编写一个小型脚本时,我们可能自认为代码已经完成,但TradingView却并不同意。本文将探讨哪一类函数是我们指标或策略代码中必不可少的,以及当缺少这类函数时,会触发哪种TradingView错误。

探究TradingView中缺少输出函数调用的错误

当我们编写自己的TradingView脚本时,有时可能只需要几行代码。例如,我们可能只想生成一个警报,而完全不需要在图表上绘制任何线条或为背景着色。但在这种我们认为脚本已经完成的情况下,TradingView却会报错。

在这种情况下,我们会看到两种错误提示。第一种错误发生在我们已经将脚本添加到图表上时。此时,我们会在图表品种名称的正下方看到’Error: cannot compile script’(错误:无法编译脚本)的提示:

这个错误信息过于笼统,帮助不大。但幸运的是,还有第二条错误信息。我们可以在Pine编辑器下方的控制台窗口中找到它。在那里,会显示以下内容:

Processing script...
The script must have at least one output function call (e.g. plot, barcolor, etc.). Reason: AST is Empty
Script 'Error example' has been saved

这条TradingView错误明确地告诉我们,我们的脚本缺少了某个东西:一个输出函数(output function)。接下来,让我们看看如何修复这个缺少输出函数相关的错误。

如何修复TradingView中的缺少输出函数调用错误

‘script must have at least one output function call’(脚本必须至少有一个输出函数调用)这个错误提示,有时会让人感到既烦人又困惑。说它烦人,是因为这个错误不一定代表我们犯了错:也许我们的脚本设计初衷就是不需要任何输出函数。说它困惑,则是因为输出函数到底是什么意思?

要修复这个错误,我们需要向代码中添加一个所谓的输出函数。输出函数,指的是那些在执行时能够在图表上创建某种效果或执行某个动作的函数。例如,创建一条绘图线、为图表背景上色、提交一笔交易订单,或者在图表上绘制图形符号等。(下文将详细列出这些函数。)

处理缺少输出函数的错误通常有两种方法。第一种是暂时忽略该错误信息,如果你仍在编写脚本,尚未完成,那么可以先不管它。第二种,如果你的脚本已经编写完成,只需从下面的表格中任选一个输出函数添加到你的代码中即可。

提示:错误信息中提到了函数调用(function call)。当我们执行或运行一个函数时,就构成了一次函数调用。因此,’script must have at least one output function call’的意思很简单,就是我们的脚本必须执行至少一个下文表格中列出的输出函数。

概述:TradingView中的输出函数

要修复这个错误,我们需要在脚本中至少包含一个输出函数。让我们来看看具体有哪些函数属于这一类。

可在指标(indicator)和策略(strategy)脚本中通用的输出函数包括:

函数 描述
barcolor() 为价格K线本身指定颜色。
bgcolor() 为价格K线的背景区域填充特定颜色。
plot() 在图表上将一系列数据绘制成线、柱状图、十字、面积图、列或圆圈。
plotarrow() 在图表上绘制向上和向下的箭头。
plotbar() 在图表上绘制标准的OHLC价格K线。
plotcandle() 在图表上绘制蜡烛图形态的价格K线。
plotchar() 在图表上根据给定的任意Unicode字符绘制可视化图形。
plotshape() 在图表上绘制各种可视化图形,如方块、菱形、箭头和三角形。

以下是专用于策略(strategy)脚本的输出函数:

策略函数 描述
strategy.cancel() 取消并停用特定的待处理策略订单。
strategy.cancel_all() 取消并停用所有待处理的策略订单。
strategy.close() 使用市价单平掉一个指定的入场订单。
strategy.close_all() 使用市价单平掉所有当前持仓。
strategy.entry() 提交市价、限价、止损或止损限价的开仓订单。
strategy.exit() 提交限价、止损或市价的平仓订单。
strategy.order() 提交市价、限价或止损订单,用于开仓或(部分)平仓。
strategy.risk.allow_entry_in() 限制策略的交易方向(只做多、只做空或双向)。
strategy.risk.max_cons_loss_days() 设置策略在停止交易前所能允许的最大连续亏损天数。
strategy.risk.max_drawdown() 定义策略在被停止交易前所能承受的最大资金回撤。
strategy.risk.max_intraday_filled_orders() 指定策略在单个交易时段内可以成交的最大订单数。
strategy.risk.max_intraday_loss() 定义策略在单个交易时段内的最大亏损额。
strategy.risk.max_position_size() 设置策略所允许持有的最大市场头寸规模。

接下来,让我们通过几个具体的例子,看看在何种情况下会触发’script must have at least one output function call’的错误,以及如何修复它。

示例:一个只用于生成警报的TradingView指标

一种常见的情况是,我们编写了一个功能非常专一的脚本,其唯一任务就是创建警报条件。

问题在于,TradingView并不将 alertcondition() 函数视为一个输出函数。因此,下面这个小巧的示例脚本就会引发错误:

//@version=5
indicator(title="我的SMA警报", overlay=true)

alertcondition(condition=close > ta.sma(close,50),
     message="收盘价高于50周期SMA")
Processing script...
The script must have at least one output function call (e.g. plot, barcolor, etc.). Reason: AST is Empty
Script 'Error example' has been saved

这个脚本本身并没有任何编程错误,只是缺少了一个输出函数。为了修复它,我们只需从上面的表格中任选一个函数添加进去即可。

尽管这个脚本的本意并不需要任何绘图,但我们只需添加一个无伤大雅的 plot() 函数,代码就能顺利通过编译,我们也可以正常地使用这个指标来创建警报了:

//@version=5
indicator(title="我的SMA警报", overlay=true)

alertcondition(condition=close > ta.sma(close,50),
     message="收盘价高于50周期SMA")

// 添加一个plot函数来修复错误
plot(ta.sma(close, 50))

示例:在脚本编写完成前保存

‘script must have at least one output function call’的错误也常常发生在我们正在编写指标或策略,但尚未完成时。这种情况下的报错有点烦人,因为我们明知脚本还没写完,而且养成定期保存代码的好习惯又是非常重要的。

假设我们的策略脚本目前只写了这么多:

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

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

此时如果保存脚本,TradingView就会触发错误:

Processing script...
The script must have at least one output function call (e.g. plot, barcolor, etc.). Reason: AST is Empty
Script 'Error example' has been saved

在这种情况下,最好的做法是暂时忽略这个报错。因为它的出现并不意味着你的代码写错了,或者你需要改变你的编程计划,它仅仅是提示你脚本尚未完成。

如果我们继续编写脚本,自然会添加输出函数。例如,在这种情况下,只需加上 strategy.entry() 函数就足以修复这个错误:

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

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

if longCondition
    strategy.entry("Enter Long", strategy.long)

总结

当我们的指标或策略脚本中,没有包含任何一个被TradingView视为输出函数的函数调用时,就会触发’script must have at least one output function call’的错误。如果我们在编写脚本的过程中遇到这个错误,只需忽略它并继续编码即可。

但如果错误是在我们完成脚本后出现的,那么我们就需要在代码中添加一个输出函数。对于指标和策略脚本,我们可以使用 barcolor()bgcolor()plot()plotarrow()plotcandle()plotchar()plotshape()

如果我们正在编写一个策略脚本,那么添加上文表格中列出的任何一个策略函数(如 strategy.entry()strategy.close() 等)都可以修复这个错误。

如何修复TradingView的”脚本必须有一个indicator()或strategy()函数调用”错误?

当我们在编写TradingView指标和策略脚本时,需要在代码本身中定义一些脚本的设置。我们通过 indicator()strategy() 函数来实现这一点。但当我们不止一次地使用这些函数,或者选错了函数时,便会遇到TradingView的错误。本文将探讨该错误的含义以及如何修复它。

探究TradingView中必须有一个indicator()或strategy()的错误

将指标或策略脚本的选项直接编写进代码,是TradingView一个非常实用的功能。它减少了手动设置脚本选项时可能出现的错误,还为我们节省了大量的鼠标点击操作。但有时,我们可能会不小心多次定义了脚本的设置,或者为脚本类型选择了错误的函数。

当你遇到这种情况时,可能会看到两种TradingView错误提示。如果错误发生在脚本被添加到图表上时,那么在图表品种名称的下方,会出现’cannot compile script’(错误:无法编译脚本)的提示:

这个错误信息过于笼统,帮助不大。但幸运的是,还有一个更具体的错误信息会出现在Pine编辑器的控制台中。

在那里,会显示以下信息:

Processing script...
The script must have one indicator() or strategy() function call
Script 'Error example' has been saved

这条TradingView错误明确地告诉我们,我们的脚本要么需要一个 indicator() 函数,要么需要一个 strategy() 函数。接下来,让我们更仔细地看看这个错误以及如何修复它。

修复必须有一个indicator()或strategy()的TradingView错误

当设置函数 indicator()strategy() 在我们的脚本中出现了不止一次时,便会触发’script must have one indicator() or strategy() function call’这条错误。

indicator() 函数用于配置一个指标的默认设置,而 strategy() 函数则用于设置一个TradingView策略的默认设置。但这两个函数都应该在脚本中只出现一次。并且,一个策略不能使用 indicator(),一个指标也不应该执行 strategy()

幸运的是,这意味着修复这个错误非常简单。如果你的脚本是一个指标,请检查代码并移除你找到的任何 strategy() 函数。然后,查看 indicator() 函数是否出现了不止一次。如果是,请将这些 indicator() 行合并成一个 indicator() 声明。如果你的脚本是一个交易策略,请通读代码并移除你找到的任何 indicator() 函数。然后,检查 strategy() 函数是否被使用了不止一次。如果是,请将这些 strategy() 行合并成一个 strategy() 声明。

请注意:错误信息中提到的术语函数调用(function call)指的是执行(或运行)一个函数。因此,当错误提示说我们应该只调用一次 indicator()strategy() 时,它的意思是我们在脚本中应该只执行这两个函数中的一个,且只执行一次。

另外,为了代码的清晰性和工作效率,一个好的习惯是始终对你的TradingView脚本使用相同的结构。并且,始终将 indicator()strategy() 函数放在脚本的顶部是一个好习惯。这也能减少意外地两次使用同一个设置函数或遗漏它的可能性。

接下来,让我们看几个触发’script must have one indicator() or strategy() function call’错误的示例,以及如何修复它们。

错误原因1:在一个TradingView指标中出现了多个indicator()函数

第一种可能触发该错误信息的情况是,当 indicator() 函数在我们的代码中出现了不止一次。例如,我们可能在指标中复制并粘贴了一些代码,结果如下:

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

plotColour = close > open ? color.green :
     close < open ? color.red :
     color.orange
plot(ta.sma(close, 10), color=plotColour)

indicator(title="我的SMA脚本", precision=1) // 第二次调用

plot(ta.sma(close, 50), color=plotColour, linewidth=2)

这个示例脚本以一个 indicator() 函数开始,用于设置脚本的 titleoverlay 选项。但在代码的后面,我们又使用了一次 indicator(),这次是为了再次设置 title 并配置 precision 选项。

要修复该错误,我们需要将这两个 indicator() 语句合并成一个,如下所示:

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

plotColour = close > open ? color.green :
     close < open ? color.red :
     color.orange
plot(ta.sma(close, 10), color=plotColour)

plot(ta.sma(close, 50), color=plotColour, linewidth=2)

错误原因2:在一个TradingView策略中出现了多次strategy()

同样地,当一个TradingView策略重复使用 strategy() 时,也可能出现该错误。假设我们有这样一个策略脚本:

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

longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 50))
shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 50))
if longCondition
    strategy.entry("Enter Long", strategy.long)
if shortCondition
    strategy.entry("Enter Short", strategy.short)

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

strategy(title="错误示例策略 - 2", pyramiding=10) // 第二次调用

plot(ta.sma(close, 10), color=plotColour)

这个策略脚本的问题在于我们使用了两次 strategy()。要修复这个错误,我们必须将这两个 strategy() 语句合并成一个。这样做之后,示例脚本看起来像这样:

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

longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 50))
shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 50))
if longCondition
    strategy.entry("Enter Long", strategy.long)
if shortCondition
    strategy.entry("Enter Short", strategy.short)

plotColour = strategy.position_size > 0 ? color.red :
     strategy.position_size < 0 ? color.green : 
         color.yellow
plot(ta.sma(close, 10), color=plotColour)

错误原因3:同一个脚本中同时出现了indicator()和strategy()

导致该错误的第三种情况是,当 indicator()strategy() 函数出现在同一个脚本中时。通过一些代码的复制粘贴,我们可能最终会得到一个像下面这样的混合脚本:

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

plotColour = color.green

strategy(title="示例脚本", overlay=false)

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

为了修复这里的错误,我们首先必须确定我们想做什么。如果脚本应该是一个指标,我们将使用 indicator()。如果我们打算编写一个交易策略,我们将使用 strategy()

对于一个指标脚本,这意味着我们从代码中去掉 strategy() 函数,只使用 indicator()

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

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

而如果我们决定编写一个策略,我们则移除 indicator() 语句,只使用 strategy()

//@version=5
strategy(title="示例脚本", overlay=false)

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

总结

我们可以在指标或策略代码本身中定义TradingView脚本的设置,这样就不必每次将脚本添加到图表时都手动配置常用选项。

‘script must have one indicator() or strategy() function call’错误可能在三种情况下发生:一是一个指标脚本中使用了不止一次 indicator();二是一个策略脚本中重复执行了 strategy();三是同一个脚本中同时出现了 indicator()strategy()

对于前两种情况,我们必须将多个 indicator()strategy() 行合并成一个。对于第三种情况,我们首先要确定脚本的类型(指标还是策略),然后移除不相干的那个声明函数,确保只保留一个 indicator()strategy() 函数调用。

赞(0)
未经允许不得转载:图道交易 » Pine Script(264):会话错误与脚本输出函数缺失的修复
分享到

评论 抢沙发

登录

找回密码

注册