警报¶
介绍
背景
哪种类型的警报最好?
脚本警报
alert()
函数事件
使用所有 alert()
调用
使用选择性的 alert()
调用
在策略中
订单填写事件
alertcondition()
事件
使用一个条件
使用复合条件
占位符
避免使用警报重绘
简介
TradingView 警报在我们的服务器上运行 24x7小时运行,不需要用户登录即可执行。警报是从图表用户界面 ( UI ) 创建的。可以在帮助中心的关于 TradingView 警报页面中,找到了解警报如何工作,以及如何从图表 创建警报所需的所有信息。
TradingView 上可用的一些警报类型(通用警报、绘图警报和订单执行事件的脚本警报)是从图表上加载的符号或脚本创建的,不需要在 Pine 脚本中进行特定编码。任何用户都可以从图表 创建这些类型的警报。
其他类型的警报(在alert() 函数调用上触发的脚本警报和alertcondition() 警报),需要在脚本中存在特定的 Pine 代码来创建警报事件,然后脚本用户才能使用图表从它们创建警报。此外,脚本用户可以在其图表上加载的任何策略的图表上,创建触发订单执行事件的脚本警报,Pine 编码人员也可以在其脚本中,为经纪人模拟器执行的每种类型的订单,指定明确的订单执行警报消息。
本页介绍了 Pine 程序员编写脚本以创建警报事件的不同方式,脚本用户反过来可以从图表创建警报。
内容:
如何使用alert( )函数,在指标或策略中调用 alert() 函数 ,然后可以将其包含在从图表创建的脚本警报中。
如何添加自定义警报消息以包含在脚本警报中,以触发策略的订单执行事件。
如何使用alertcondition()函数仅在指标中生成alertcondition() 事件,然后可以使用这些事件从图表 UI创建alertcondition() 警报。
请记住:
没有警报相关的 Pine 代码可以在图表 UI 中创建正在运行的警报;它只是创建警报事件,然后脚本用户可以使用这些事件从图表 UI 创建运行警报。
警报仅在实时栏中触发。因此,处理任何类型警报的 Pine 代码的操作范围仅限于实时柱。
在图表 UI 中创建警报时,TradingView 会保存脚本及其输入的镜像,以及图表的主要交易品种和时间范围,以便在其服务器上运行警报。因此,对脚本输入或图表的后续更改不会影响之前从它们创建的运行警报。如果您希望对上下文的任何更改反映在正在运行的警报的行为中,则需要删除警报并在新上下文中创建一个新警报。
背景
如今,Pine 编码人员可以使用不同的方法在其脚本中创建警报事件,这是在 Pine 的整个发展过程中部署的连续增强功能的结果。alertcondition ()函数仅适用于指标,是第一个允许 Pine 程序员创建警报事件的功能。然后是策略的订单填充警报,当经纪人模拟器创建订单填充事件时触发。 订单执行事件不需要脚本用户在其上创建警报的特殊代码,但是通过alert_message订单生成strategy.*()函数的参数,程序员可以自定义触发订单执行事件的警报消息,通过为任意数量的订单履行事件定义不同的警报消息。
alert()函数是 Pine的 最新添加的警报。它或多或少取代 了 alertcondition()函数 ,并且在用于策略时,为订单成交事件的警报提供了有用的补充。
哪种类型的警报最好?
对于 Pine 编码器,alert()函数通常会更容易和更灵活地使用。与alertcondition() 不同,它允许动态警报消息,适用于指标和策略,程序员决定 alert()事件的频率。
虽然可以在 Pine 中可编程的任何逻辑上生成alert()调用,包括在策略中将订单发送到代理模拟器时,但它们不能被编码为在订单执行(或填充)时触发,因为在订单发送到代理模拟器之后, 模拟器控制它们的执行并且不直接将填充事件报告回脚本。
当脚本用户想要针对策略的订单执行事件生成警报时,他必须在“创建警报”对话框中创建有关策略的脚本警报时包含这些事件。用户无需在脚本中编写特殊代码即可执行此操作。但是,程序员可以通过alert_message在订单生成strategy.()函数调用中使用参数来自定义随订单执行事件发送的消息。alert()调用和 alert_message在订单生成调用中使用自定义参数的组合strategy.()应该允许 Pine 编码器在其脚本执行中发生的大多数情况下生成警报事件。
为了向后兼容, alertcondition()函数保留在 Pine 中,但它也可以有利地用于生成不同的警报,以在“创建警报”对话框的“条件”字段中作为单独的项目进行选择。
脚本警报
当脚本用户使用“创建警报”对话框创建脚本警报时,能够触发警报的事件将根据警报是从指标创建还是从策略创建而有所不同。
从指标创建的脚本警报将在以下情况下触发:
该指标包含alert()调用。
代码的逻辑允许执行特定的alert()调用。
在alert()调用中指定的频率允许触发警报。
从策略创建的脚本警报可以在alert() 函数调用、订单执行事件或两者时触发。创建策略警报的脚本用户决定他希望将哪种类型的事件包含在他的脚本警报中。虽然用户可以在订单执行事件上创建脚本警报,而不需要包含特殊代码的策略,但它必须包含alert()调用,以便用户 在其脚本 alert中包含alert() 函数调用。
alert()
函数事件
alert()函数具有以下签名:
alert(message, freq)
message
一个“系列字符串”,表示警报触发时发送的消息文本。因为这个参数允许“系列”形式,所以它可以在运行时生成,并且可以在不同的条形图上生成,使其具有动态性。
freq
一个“输入字符串”,指定警报的触发频率。有效的论点是:
alert.freq_once_per_bar:只有每个实时条的第一次调用会触发警报(默认值)。
alert.freq_once_per_bar_close:仅当实时柱关闭并在该脚本迭代期间执行alert()调用时才会触发警报。
alert.freq_all:实时条中的所有呼叫都会触发警报。
alert()函数可用于指标和策略。对于alert() 调用来触发在alert() 函数调用上配置的脚本警报,脚本的逻辑必须允许执行alert()调用, 并且由参数确定的频率必须允许触发警报。freq
请注意,默认情况下,策略会在柱线收盘时重新计算,因此如果 alert() 函数与频率alert.freq_all或alert.freq_once_per_bar在策略中使用,则在柱线收盘时调用的频率不会超过一次。为了在柱构建过程中启用alert() 函数,您需要启用该calc_on_every_tick选项。
使用所有的 alert()
调用
让我们看一个检测 RSI 中心线交叉的示例:
//@version=5
indicator(“All alert()
calls”)
r = ta.rsi(close, 20)
// Detect crosses.
xUp = ta.crossover( r, 50)
xDn = ta.crossunder(r, 50)
// Trigger an alert on crosses.
if xUp
alert("Go long (RSI is " + str.tostring(r, “#.00)”))
else if xDn
alert("Go short (RSI is " + str.tostring(r, “#.00)”))
plotchar(xUp, “Go Long”, “▲”, location.bottom, color.lime, size = size.tiny)
plotchar(xDn, “Go Short”, “▼”, location.top, color.red, size = size.tiny)
hline(50)
plot®
如果从此脚本创建脚本警报:
当 RSI 向上穿过中心线时,脚本警报将触发“Go long…”消息。当 RSI 向下穿过中心线时,脚本警报将触发“做空…”消息。
freq因为在alert()调用中没有为参数指定参数,所以将使用默认值alert.freq_once_per_bar,因此alert 只会在实时柱期间每个 alert()调用第一次执行时触发。
与警报一起发送的消息由两部分组成:一个常量字符串,然后是 str.tostring()调用的结果,该结果将包括脚本执行alert()调用时的 RSI 值 。交叉向上的警报消息如下所示:“做多(RSI 为 53.41)”。
因为脚本警报总是在调用alert()时触发,只要调用中使用的频率允许,此特定脚本不允许脚本用户将其脚本警报仅限于 long,例如.
注意:
与始终放置在第 0 列(在脚本的全局范围内)的alertcondition()调用相反, alert()调用放置在if分支的本地范围内,因此它仅在满足我们的触发条件时执行。如果将alert()调用放置在脚本的全局范围内的第 0 列,它将在所有柱上执行,这可能不是所需的行为。
alertcondition () 不能接受我们用于警报消息的相同字符串,因为它使用了 str.tostring()调用。 alertcondition()消息必须是常量字符串。
最后,因为alert()消息可以在运行时动态构建,我们可以使用以下代码来生成警报事件:
// Trigger an alert on crosses.
if xUp or xDn
firstPart = (xUp ? “Go long” : “Go short”) + " (RSI is "
alert(firstPart + str.tostring(r, “#.00)”))
使用选择性的 alert()
调用
当用户在alert() 函数调用上创建脚本警报时,只要满足其频率限制,警报就会在脚本对alert()函数的任何调用上触发 。如果您想允许脚本的用户选择脚本中的哪个alert()函数调用将触发脚本 alert,您需要为他们提供在脚本输入中表明其偏好的方法,并在您的脚本中编写适当的逻辑脚本。这样,脚本用户将能够从单个脚本创建多个脚本警报,根据在图表 UI 中创建警报之前在脚本输入中所做的选择,每个脚本的行为都不同。
假设,对于我们的下一个示例,我们希望提供仅针对多头、仅空头或两者触发警报的选项。您可以像这样编写脚本:
//@version=5
indicator(“Selective alert()
calls”)
detectLongsInput = input.bool(true, “Detect Longs”)
detectShortsInput = input.bool(true, “Detect Shorts”)
repaintInput = input.bool(false, “Allow Repainting”)
r = ta.rsi(close, 20)
// Detect crosses.
xUp = ta.crossover( r, 50)
xDn = ta.crossunder(r, 50)
// Only generate entries when the trade’s direction is allowed in inputs.
enterLong = detectLongsInput and xUp and (repaintInput or barstate.isconfirmed)
enterShort = detectShortsInput and xDn and (repaintInput or barstate.isconfirmed)
// Trigger the alerts only when the compound condition is met.
if enterLong
alert("Go long (RSI is " + str.tostring(r, “#.00)”))
else if enterShort
alert("Go short (RSI is " + str.tostring(r, “#.00)”))
plotchar(enterLong, “Go Long”, “▲”, location.bottom, color.lime, size = size.tiny)
plotchar(enterShort, “Go Short”, “▼”, location.top, color.red, size = size.tiny)
hline(50)
plot®
注意如何:
我们创建了一个复合条件,仅当用户的选择允许在该方向上输入时才满足。只有在脚本的输入中启用了长条目时,中心线交叉处的长条目才会触发警报。
我们提供用户表明他的重绘偏好。当他不允许重新绘制计算时,我们等到柱确认触发复合条件。这样,警报和标记仅出现在实时条的末尾。
如果该脚本的用户想要从该脚本创建两个不同的脚本警报,即一个仅在多头上触发,一个仅在空头上触发,那么他将需要:
在输入中仅选择“Detect Longs”并在脚本上创建第一个脚本警报。
在输入中仅选择“检测短裤”并在脚本上创建另一个脚本警报。
在策略中
alert() 函数调用也可用于策略,但默认情况下,策略仅在实时柱线收盘时执行。除非在strategy() 声明语句中使用,否则所有alert()调用都将使用频率,而不管用于.calc_on_every_tick = truealert.freq_once_per_bar_closefreq
虽然关于策略的脚本警报将使用订单执行事件来在代理模拟器执行订单时触发警报,但 alert()可以有利地用于在策略中生成其他警报事件。
当 RSI 连续三个柱线对交易不利时,此策略会创建alert() 函数调用:
//@version=5
strategy(“Strategy with selective alert()
calls”)
r = ta.rsi(close, 20)
// Detect crosses.
xUp = ta.crossover( r, 50)
xDn = ta.crossunder(r, 50)
// Place orders on crosses.
if xUp
strategy.entry(“Long”, strategy.long)
else if xDn
strategy.entry(“Short”, strategy.short)
// Trigger an alert when RSI diverges from our trade’s direction.
divInLongTrade = strategy.position_size > 0 and ta.falling(r, 3)
divInShortTrade = strategy.position_size < 0 and ta.rising( r, 3)
if divInLongTrade
alert(“WARNING: Falling RSI”, alert.freq_once_per_bar_close)
if divInShortTrade
alert(“WARNING: Rising RSI”, alert.freq_once_per_bar_close)
plotchar(xUp, “Go Long”, “▲”, location.bottom, color.lime, size = size.tiny)
plotchar(xDn, “Go Short”, “▼”, location.top, color.red, size = size.tiny)
plotchar(divInLongTrade, “WARNING: Falling RSI”, “•”, location.top, color.red, size = size.tiny)
plotchar(divInShortTrade, “WARNING: Rising RSI”, “•”, location.bottom, color.lime, size = size.tiny)
hline(50)
plot®
如果用户从该策略创建了一个脚本警报,并且在他的警报中包含了订单成交事件和alert() 函数调用,那么只要执行订单,或者当脚本执行其中一个alert()调用时,就会触发警报在实时柱的收盘迭代上,即当 barstate.isrealtime和 barstate.isconfirmed都为真时。脚本中的alert() 函数事件只会在实时柱关闭时触发警报,因为alert.freq_once_per_bar_close 是用于alert()调用freq中的参数的参数。
订单成交事件
从指标创建脚本警报时,它只能在alert() 函数调用时触发。但是,当从策略创建脚本警报时,用户可以指定订单执行事件也触发脚本警报。订单执行事件是由经纪人模拟器生成的任何事件,它会导致模拟订单被执行。它相当于由经纪人/交易所填写的交易订单。订单下达时不一定会执行。在策略中,订单的执行只能通过分析内置变量(例如 strategy.opentrades或 策略.position_size。 因此,在订单执行事件上配置的脚本警报很有用,因为它们允许在订单执行的精确时刻触发警报,然后脚本的逻辑可以检测到它。
Pine 编码员可以自定义执行特定订单时发送的警报消息。虽然这不是触发订单成交事件的先决条件,但自定义警报消息可能很有用,因为它们允许自定义语法包含在警报中,以便将实际订单路由到第三方执行引擎。通过可以生成订单的函数中的参数来 为特定订单执行事件指定自定义警报消息: strategy.close()、 strategy.entry()、 strategy.exit()和 strategy.order()。alert_message
用于参数的alert_message参数是“系列字符串”,因此可以使用脚本可用的任何变量动态构造,只要将其转换为字符串格式即可。
让我们看一下我们在strategy.entry()调用alert_message中都使用参数的 策略:
//@version=5
strategy(“Strategy using alert_message
”)
r = ta.rsi(close, 20)
// Detect crosses.
xUp = ta.crossover( r, 50)
xDn = ta.crossunder(r, 50)
// Place order on crosses using a custom alert message for each.
if xUp
strategy.entry(“Long”, strategy.long, stop = high, alert_message = "Stop-buy executed (stop was " + str.tostring(high) + “)”)
else if xDn
strategy.entry(“Short”, strategy.short, stop = low, alert_message = "Stop-sell executed (stop was " + str.tostring(low) + “)”)
plotchar(xUp, “Go Long”, “▲”, location.bottom, color.lime, size = size.tiny)
plotchar(xDn, “Go Short”, “▼”, location.top, color.red, size = size.tiny)
hline(50)
plot®
注意:
我们在strategy.entry()调用中使用该stop参数,该参数创建止买和止卖订单。这意味着买单只会在价格高于下单的柱的最高价时执行,而卖单只会在价格低于下单的柱的最低价时执行。
我们用plotchar()绘制的向上/向下箭头是在下订单时绘制的。在订单实际执行之前,可能会经过任意数量的柱线,并且在某些情况下,由于价格不符合要求的条件,订单将永远不会被执行。
因为我们id对所有买单使用相同的参数,所以在满足前一个订单的条件之前下的任何新买单都将替换该订单。这同样适用于卖单。
参数中包含的alert_message变量在订单执行时进行评估,因此在警报触发时进行评估。
当该alert_message参数用于策略的订单生成strategy.()函数调用时,脚本用户在创建订单执行事件的脚本警报时,必须{{strategy.order.alert_message}}在“创建警报”对话框的“消息”字段中包含占位符。这是必需的,因此在订单生成函数调用中使用的参数用于在每个订单填写事件触发的警报消息中。当仅在“消息”字段中使用占位符并且该 参数仅出现在您策略中的某些订单生成函数调用中时,空字符串将替换由任何订单生成触发的警报消息中的占位符alert_messagestrategy.(){{strategy.order.alert_message}}alert_messagestrategy.()strategy.()不使用alert_message参数的函数调用。
虽然其他占位符可以在“创建警报”对话框的“消息”字段中由用户创建有关订单执行事件的警报,但它们不能在 的参数中使用alert_message。
alertcondition()
事件
alertcondition ()函数允许程序员在 Pine 指标中创建单独的alertcondition 事件。一个指标可能包含多个alertcondition()调用。脚本中对alertcondition()的每次调用 都会在“创建警报”对话框的“条件”下拉菜单中创建一个可选择的相应警报。
虽然Pine策略脚本中的alertcondition()调用不会导致编译错误,但无法从它们创建警报。
alertcondition ()函数具有以下签名:
alertcondition(condition, title, message)
condition
确定警报何时触发的“系列布尔”值(true或)。false这是一个必需的参数。当值是true警报将触发。当值为false警报不会触发。与alert()函数调用相反, alertcondition()调用必须从行的第 0 列开始,因此不能放在条件块中。
title
一个“const string”可选参数,用于设置警报条件的名称,该名称将出现在图表 UI 中“创建警报”对话框的“条件”字段中。如果没有提供参数,将使用“Alert”。
message
一个“const string”可选参数,指定触发警报时要显示的文本消息。文本将出现在“创建警报”对话框的“消息”字段中,脚本用户可以在创建警报时从中修改它。 由于这个参数必须是一个“常量字符串”,它必须在编译时就知道,因此不能逐条变化。 但是,它可以包含占位符,这些占位符将在运行时被动态值替换,这些动态值可能会从条形变为条形。有关列表,请参阅此页面的占位符部分。
alertcondition ()函数不包含 freq参数。alertcondition() 警报的频率由用户在“创建警报”对话框中确定。
使用一个条件
以下是创建alertcondition() 事件的代码示例:
//@version=5
indicator(“alertcondition()
on single condition”)
r = ta.rsi(close, 20)
xUp = ta.crossover( r, 50)
xDn = ta.crossunder(r, 50)
plot(r, “RSI”)
hline(50)
plotchar(xUp, “Long”, “▲”, location.bottom, color.lime, size = size.tiny)
plotchar(xDn, “Short”, “▼”, location.top, color.red, size = size.tiny)
alertcondition(xUp, “Long Alert”, “Go long”)
alertcondition(xDn, “Short Alert”, "Go short ")
因为我们的脚本中有两个alertcondition()调用,所以“创建警报”对话框的“条件”字段中将提供两个不同的警报:“长警报”和“短警报”。
如果我们想在交叉发生时包含 RSI 的值,我们不能像在alert()调用或策略中的参数中那样简单地message使用 将其值添加到字符串中。但是,我们可以使用占位符来包含它。这显示了两种选择:str.tostring®alert_message
alertcondition(xUp, “Long Alert”, “Go long. RSI is {{plot_0}}”)
alertcondition(xDn, “Short Alert”, ‘Go short. RSI is {{plot(“RSI”)}}’)
注意:
第一行使用{{plot_0}}占位符,其中情节编号对应于脚本中情节的顺序。
第二行使用{{plot(“[plot_title]”)}}占位符的类型,它必须包括我们脚本中用于绘制 RSItitle的plot()调用的类型。双引号用于将绘图的标题包含在{{plot(“RSI”)}}占位符内。这要求我们使用单引号来包裹message字符串。
使用其中一种方法,我们可以包含指标绘制的任何数值,但由于无法绘制字符串,因此无法使用字符串变量。
使用复合条件
如果我们想为脚本用户提供使用多个alertcondition()调用从指标创建单个警报的 可能性,我们将需要在脚本的输入中提供选项,用户将通过这些选项在创建警报之前指示他们想要触发警报的条件.
此脚本演示了一种方法:
//@version=5
indicator(“alertcondition()
on multiple conditions”)
detectLongsInput = input.bool(true, “Detect Longs”)
detectShortsInput = input.bool(true, “Detect Shorts”)
r = ta.rsi(close, 20)
// Detect crosses.
xUp = ta.crossover( r, 50)
xDn = ta.crossunder(r, 50)
// Only generate entries when the trade’s direction is allowed in inputs.
enterLong = detectLongsInput and xUp
enterShort = detectShortsInput and xDn
plot®
plotchar(enterLong, “Go Long”, “▲”, location.bottom, color.lime, size = size.tiny)
plotchar(enterShort, “Go Short”, “▼”, location.top, color.red, size = size.tiny)
hline(50)
// Trigger the alert when one of the conditions is met.
alertcondition(enterLong or enterShort, “Compound alert”, “Entry”)
请注意如何允许alertcondition()调用在两个条件之一上触发。如果用户在创建警报之前在脚本的输入中启用它,则每个条件只能触发警报。
占位符
这些占位符可以在alertcondition()调用的message参数中使用。当警报触发时,它们将被动态值替换。它们是在alertcondition()消息中包含动态值(可以在条与条之间变化的值)的唯一方法 。
请注意,从图表 UI 中的“创建警报”对话框创建alertcondition() 警报的用户也可以在对话框的“消息”字段中使用这些占位符。
{{exchange}}
交换警报中使用的代码(纳斯达克、纽约证券交易所、MOEX 等)。请注意,对于延迟符号,交换将以“_DL”或“_DLY”结束。例如,“NYMEX_DL”。
{{interval}}
返回创建警报的图表的时间范围。请注意,范围图表是根据 1m 数据计算的,因此占位符将始终在范围图表上创建的任何警报上返回“1”。
{{open}}, {{high}}, {{low}}, {{close}},{{volume}}
触发警报的柱的相应值。
{{plot_0}}, {{plot_1}}, […],{{plot_19}}
对应地块编号的值。情节按出现在脚本中的顺序从 0 到 19 编号,因此只能使用前 20 个情节中的一个。例如,内置的“成交量”指标有两个输出系列:成交量和成交量 MA,因此您可以使用以下内容:
alertcondition(volume > sma(volume,20), “Volume alert”, “Volume ({{plot_0}}) > average ({{plot_1}})”)
{{plot(“[plot_title]”)}}
当需要使用plot()调用title中使用的参数 来引用绘图时,可以使用此占位符。请注意,必须在占位符内使用双引号 ( )来包装参数。这要求使用单引号 ( ) 来包装字符串:"title’message
//@version=5
indicator(“”)
r = ta.rsi(close, 14)
xUp = ta.crossover(r, 50)
plot(r, “RSI”, display = display.none)
alertcondition(xUp, “xUp alert”, message = ‘RSI is bullish at: {{plot(“RSI”)}}’)
{{ticker}}
警报中使用的代码(AAPL、BTCUSD 等)的代码。
{{time}}
返回小节开始处的时间。时间为 UTC,格式为yyyy-MM-ddTHH:mm:ssZ,例如:2019-08-27T09:56:00Z.
{{timenow}}
警报触发的当前时间,格式与{{time}}. 无论图表的时间范围如何,精度都精确到秒。
避免使用警报重绘
交易者希望通过警报避免重绘的最常见情况是,他们必须防止警报在实时柱期间的某个时间点触发,而该警报在收盘时不会触发。当满足以下条件时,可能会发生这种情况:
触发警报的条件中使用的计算在实时条中可能会有所不同。任何使用或的计算都会出现这种情况high,例如,它包括几乎所有的内置指标。当更高时间范围的当前柱尚未关闭时,使用比图表更高时间范围的任何request.security()调用的结果也会出现这种情况。lowclose
警报可以在实时柱关闭之前触发,因此以除“每柱关闭一次”之外的任何频率触发。
避免此类重绘的最简单方法是配置警报的触发频率,以便它们仅在实时柱关闭时触发。没有灵丹妙药;避免这种类型的重绘总是需要等待确认的信息,这意味着交易者必须牺牲即时性以实现可靠性。
请注意,其他类型的重绘,例如我们的重绘部分中记录的那些,可能无法通过简单地在实时柱关闭时触发警报来预防警报¶
介绍
背景
哪种类型的警报最好?
脚本警报
alert()
函数事件
使用所有 alert()
调用
使用选择性的 alert()
调用
在策略中
订单填写事件
alertcondition()
事件
使用一个条件
使用复合条件
占位符
避免使用警报重绘
简介
TradingView 警报在我们的服务器上运行 24x7,不需要用户登录即可执行。警报是从图表用户界面 ( UI ) 创建的。您将在帮助中心的关于 TradingView 警报页面中找到了解警报如何工作以及如何从图表 UI 创建警报所需的所有信息。
TradingView 上可用的一些警报类型(通用警报、绘图警报和订单执行事件的脚本警报)是从图表上加载的符号或脚本创建的,不需要在 Pine 脚本中进行特定编码。任何用户都可以从图表 UI 创建这些类型的警报。
其他类型的警报(在alert() 函数调用上触发的脚本警报和alertcondition() 警报)需要在脚本中存在特定的 Pine 代码来创建警报事件,然后脚本用户才能使用图表 UI 从它们创建警报。此外,虽然脚本用户可以在其图表上加载的任何策略的图表 UI 上创建触发订单执行事件的脚本警报,但 Pine 编码人员可以在其脚本中为经纪人模拟器执行的每种类型的订单指定明确的订单执行警报消息。
本页介绍了 Pine 程序员编写脚本以创建警报事件的不同方式,脚本用户反过来可以从图表 UI 创建警报。我们将涵盖:
如何使用alert( )函数在指标或策略中调用 alert() 函数 ,然后可以将其包含在从图表 UI 创建的脚本警报中。
如何添加自定义警报消息以包含在脚本警报中,以触发策略的订单执行事件。
如何使用alertcondition()函数仅在指标中生成alertcondition() 事件,然后可以使用这些事件从图表 UI创建alertcondition() 警报。
请记住:
没有警报相关的 Pine 代码可以在图表 UI 中创建正在运行的警报;它只是创建警报事件,然后脚本用户可以使用这些事件从图表 UI 创建运行警报。
警报仅在实时栏中触发。因此,处理任何类型警报的 Pine 代码的操作范围仅限于实时柱。
在图表 UI 中创建警报时,TradingView 会保存脚本及其输入的镜像,以及图表的主要交易品种和时间范围,以便在其服务器上运行警报。因此,对脚本输入或图表的后续更改不会影响之前从它们创建的运行警报。如果您希望对上下文的任何更改反映在正在运行的警报的行为中,则需要删除警报并在新上下文中创建一个新警报。
背景
如今,Pine 编码人员可以使用不同的方法在其脚本中创建警报事件,这是在 Pine 的整个发展过程中部署的连续增强功能的结果。alertcondition ()函数仅适用于指标,是第一个允许 Pine 程序员创建警报事件的功能。然后是策略的订单填充警报,当经纪人模拟器创建订单填充事件时触发。 订单执行事件不需要脚本用户在其上创建警报的特殊代码,但是通过alert_message订单生成strategy.*()函数的参数,程序员可以自定义触发订单执行事件的警报消息通过为任意数量的订单履行事件定义不同的警报消息。
alert()函数是 Pine的 最新添加。它或多或少取代 了 alertcondition() ,并且在用于策略时,为订单成交事件的警报提供了有用的补充。
哪种类型的警报最好?
对于 Pine 编码器,alert()函数通常会更容易和更灵活地使用。与alertcondition() 不同,它允许动态警报消息,适用于指标和策略,程序员决定 alert()事件的频率。
虽然可以在 Pine 中可编程的任何逻辑上生成alert()调用,包括在策略中将订单发送到代理模拟器时,但它们不能被编码为在订单执行(或填充)时触发,因为在订单发送到代理模拟器之后, 模拟器控制它们的执行并且不直接将填充事件报告回脚本。
当脚本用户想要针对策略的订单执行事件生成警报时,他必须在“创建警报”对话框中创建有关策略的脚本警报时包含这些事件。用户无需在脚本中编写特殊代码即可执行此操作。但是,程序员可以通过alert_message在订单生成strategy.()函数调用中使用参数来自定义随订单执行事件发送的消息。alert()调用和 alert_message在订单生成调用中使用自定义参数的组合strategy.()应该允许 Pine 编码器在其脚本执行中发生的大多数情况下生成警报事件。
为了向后兼容, alertcondition()函数保留在 Pine 中,但它也可以有利地用于生成不同的警报,以在“创建警报”对话框的“条件”字段中作为单独的项目进行选择。
脚本警报
当脚本用户使用“创建警报”对话框创建脚本警报时,能够触发警报的事件将根据警报是从指标创建还是从策略创建而有所不同。
从指标创建的脚本警报将在以下情况下触发:
该指标包含alert()调用。
代码的逻辑允许执行特定的alert()调用。
在alert()调用中指定的频率允许触发警报。
从策略创建的脚本警报可以在alert() 函数调用、订单执行事件或两者时触发。创建策略警报的脚本用户决定他希望将哪种类型的事件包含在他的脚本警报中。虽然用户可以在订单执行事件上创建脚本警报,而不需要包含特殊代码的策略,但它必须包含alert()调用,以便用户 在其脚本 alert中包含alert() 函数调用。
alert()
函数事件
alert()函数具有以下签名:
alert(message, freq)
message
一个“系列字符串”,表示警报触发时发送的消息文本。因为这个参数允许“系列”形式,所以它可以在运行时生成,并且可以在不同的条形图上生成,使其具有动态性。
freq
一个“输入字符串”,指定警报的触发频率。有效的论点是:
alert.freq_once_per_bar:只有每个实时条的第一次调用会触发警报(默认值)。
alert.freq_once_per_bar_close:仅当实时柱关闭并在该脚本迭代期间执行alert()调用时才会触发警报。
alert.freq_all:实时条中的所有呼叫都会触发警报。
alert()函数可用于指标和策略。对于alert() 调用来触发在alert() 函数调用上配置的脚本警报,脚本的逻辑必须允许执行alert()调用, 并且由参数确定的频率必须允许触发警报。freq
请注意,默认情况下,策略会在柱线收盘时重新计算,因此如果 alert() 函数与频率alert.freq_all或alert.freq_once_per_bar在策略中使用,则在柱线收盘时调用的频率不会超过一次。为了在柱构建过程中启用alert() 函数,您需要启用该calc_on_every_tick选项。
使用所有的 alert()
调用
让我们看一个检测 RSI 中心线交叉的示例:
//@version=5
indicator(“All alert()
calls”)
r = ta.rsi(close, 20)
// Detect crosses.
xUp = ta.crossover( r, 50)
xDn = ta.crossunder(r, 50)
// Trigger an alert on crosses.
if xUp
alert("Go long (RSI is " + str.tostring(r, “#.00)”))
else if xDn
alert("Go short (RSI is " + str.tostring(r, “#.00)”))
plotchar(xUp, “Go Long”, “▲”, location.bottom, color.lime, size = size.tiny)
plotchar(xDn, “Go Short”, “▼”, location.top, color.red, size = size.tiny)
hline(50)
plot®
如果从此脚本创建脚本警报:
当 RSI 向上穿过中心线时,脚本警报将触发“Go long…”消息。当 RSI 向下穿过中心线时,脚本警报将触发“做空…”消息。
freq因为在alert()调用中没有为参数指定参数,所以将使用默认值alert.freq_once_per_bar,因此alert 只会在实时柱期间每个 alert()调用第一次执行时触发。
与警报一起发送的消息由两部分组成:一个常量字符串,然后是 str.tostring()调用的结果,该结果将包括脚本执行alert()调用时的 RSI 值 。交叉向上的警报消息如下所示:“做多(RSI 为 53.41)”。
因为脚本警报总是在调用alert()时触发,只要调用中使用的频率允许,此特定脚本不允许脚本用户将其脚本警报仅限于 long,例如.
注意:
与始终放置在第 0 列(在脚本的全局范围内)的alertcondition()调用相反, alert()调用放置在if分支的本地范围内,因此它仅在满足我们的触发条件时执行。如果将alert()调用放置在脚本的全局范围内的第 0 列,它将在所有柱上执行,这可能不是所需的行为。
alertcondition () 不能接受我们用于警报消息的相同字符串,因为它使用了 str.tostring()调用。 alertcondition()消息必须是常量字符串。
最后,因为alert()消息可以在运行时动态构建,我们可以使用以下代码来生成警报事件:
// Trigger an alert on crosses.
if xUp or xDn
firstPart = (xUp ? “Go long” : “Go short”) + " (RSI is "
alert(firstPart + str.tostring(r, “#.00)”))
使用选择性的 alert()
调用
当用户在alert() 函数调用上创建脚本警报时,只要满足其频率限制,警报就会在脚本对alert()函数的任何调用上触发 。如果您想允许脚本的用户选择脚本中的哪个alert()函数调用将触发脚本 alert,您需要为他们提供在脚本输入中表明其偏好的方法,并在您的脚本中编写适当的逻辑脚本。这样,脚本用户将能够从单个脚本创建多个脚本警报,根据在图表 UI 中创建警报之前在脚本输入中所做的选择,每个脚本的行为都不同。
假设,对于我们的下一个示例,我们希望提供仅针对多头、仅空头或两者触发警报的选项。您可以像这样编写脚本:
//@version=5
indicator(“Selective alert()
calls”)
detectLongsInput = input.bool(true, “Detect Longs”)
detectShortsInput = input.bool(true, “Detect Shorts”)
repaintInput = input.bool(false, “Allow Repainting”)
r = ta.rsi(close, 20)
// Detect crosses.
xUp = ta.crossover( r, 50)
xDn = ta.crossunder(r, 50)
// Only generate entries when the trade’s direction is allowed in inputs.
enterLong = detectLongsInput and xUp and (repaintInput or barstate.isconfirmed)
enterShort = detectShortsInput and xDn and (repaintInput or barstate.isconfirmed)
// Trigger the alerts only when the compound condition is met.
if enterLong
alert("Go long (RSI is " + str.tostring(r, “#.00)”))
else if enterShort
alert("Go short (RSI is " + str.tostring(r, “#.00)”))
plotchar(enterLong, “Go Long”, “▲”, location.bottom, color.lime, size = size.tiny)
plotchar(enterShort, “Go Short”, “▼”, location.top, color.red, size = size.tiny)
hline(50)
plot®
注意如何:
我们创建了一个复合条件,仅当用户的选择允许在该方向上输入时才满足。只有在脚本的输入中启用了长条目时,中心线交叉处的长条目才会触发警报。
我们提供用户表明他的重绘偏好。当他不允许重新绘制计算时,我们等到柱确认触发复合条件。这样,警报和标记仅出现在实时条的末尾。
如果该脚本的用户想要从该脚本创建两个不同的脚本警报,即一个仅在多头上触发,一个仅在空头上触发,那么他将需要:
在输入中仅选择“Detect Longs”并在脚本上创建第一个脚本警报。
在输入中仅选择“检测短裤”并在脚本上创建另一个脚本警报。
在策略中
alert() 函数调用也可用于策略,但默认情况下,策略仅在实时柱线收盘时执行。除非在strategy() 声明语句中使用,否则所有alert()调用都将使用频率,而不管用于.calc_on_every_tick = truealert.freq_once_per_bar_closefreq
虽然关于策略的脚本警报将使用订单执行事件来在代理模拟器执行订单时触发警报,但 alert()可以有利地用于在策略中生成其他警报事件。
当 RSI 连续三个柱线对交易不利时,此策略会创建alert() 函数调用:
//@version=5
strategy(“Strategy with selective alert()
calls”)
r = ta.rsi(close, 20)
// Detect crosses.
xUp = ta.crossover( r, 50)
xDn = ta.crossunder(r, 50)
// Place orders on crosses.
if xUp
strategy.entry(“Long”, strategy.long)
else if xDn
strategy.entry(“Short”, strategy.short)
// Trigger an alert when RSI diverges from our trade’s direction.
divInLongTrade = strategy.position_size > 0 and ta.falling(r, 3)
divInShortTrade = strategy.position_size < 0 and ta.rising( r, 3)
if divInLongTrade
alert(“WARNING: Falling RSI”, alert.freq_once_per_bar_close)
if divInShortTrade
alert(“WARNING: Rising RSI”, alert.freq_once_per_bar_close)
plotchar(xUp, “Go Long”, “▲”, location.bottom, color.lime, size = size.tiny)
plotchar(xDn, “Go Short”, “▼”, location.top, color.red, size = size.tiny)
plotchar(divInLongTrade, “WARNING: Falling RSI”, “•”, location.top, color.red, size = size.tiny)
plotchar(divInShortTrade, “WARNING: Rising RSI”, “•”, location.bottom, color.lime, size = size.tiny)
hline(50)
plot®
如果用户从该策略创建了一个脚本警报,并且在他的警报中包含了订单成交事件和alert() 函数调用,那么只要执行订单,或者当脚本执行其中一个alert()调用时,就会触发警报在实时柱的收盘迭代上,即当 barstate.isrealtime和 barstate.isconfirmed都为真时。脚本中的alert() 函数事件只会在实时柱关闭时触发警报,因为alert.freq_once_per_bar_close 是用于alert()调用freq中的参数的参数。
订单成交事件
从指标创建脚本警报时,它只能在alert() 函数调用时触发。但是,当从策略创建脚本警报时,用户可以指定订单执行事件也触发脚本警报。订单执行事件是由经纪人模拟器生成的任何事件,它会导致模拟订单被执行。它相当于由经纪人/交易所填写的交易订单。订单下达时不一定会执行。在策略中,订单的执行只能通过分析内置变量(例如 strategy.opentrades或 策略.position_size。 因此,在订单执行事件上配置的脚本警报很有用,因为它们允许在订单执行的精确时刻触发警报,然后脚本的逻辑可以检测到它。
Pine 编码员可以自定义执行特定订单时发送的警报消息。虽然这不是触发订单成交事件的先决条件,但自定义警报消息可能很有用,因为它们允许自定义语法包含在警报中,以便将实际订单路由到第三方执行引擎。通过可以生成订单的函数中的参数来 为特定订单执行事件指定自定义警报消息: strategy.close()、 strategy.entry()、 strategy.exit()和 strategy.order()。alert_message
用于参数的alert_message参数是“系列字符串”,因此可以使用脚本可用的任何变量动态构造,只要将其转换为字符串格式即可。
让我们看一下我们在strategy.entry()调用alert_message中都使用参数的 策略:
//@version=5
strategy(“Strategy using alert_message
”)
r = ta.rsi(close, 20)
// Detect crosses.
xUp = ta.crossover( r, 50)
xDn = ta.crossunder(r, 50)
// Place order on crosses using a custom alert message for each.
if xUp
strategy.entry(“Long”, strategy.long, stop = high, alert_message = "Stop-buy executed (stop was " + str.tostring(high) + “)”)
else if xDn
strategy.entry(“Short”, strategy.short, stop = low, alert_message = "Stop-sell executed (stop was " + str.tostring(low) + “)”)
plotchar(xUp, “Go Long”, “▲”, location.bottom, color.lime, size = size.tiny)
plotchar(xDn, “Go Short”, “▼”, location.top, color.red, size = size.tiny)
hline(50)
plot®
注意:
我们在strategy.entry()调用中使用该stop参数,该参数创建止买和止卖订单。这意味着买单只会在价格高于下单的柱的最高价时执行,而卖单只会在价格低于下单的柱的最低价时执行。
我们用plotchar()绘制的向上/向下箭头是在下订单时绘制的。在订单实际执行之前,可能会经过任意数量的柱线,并且在某些情况下,由于价格不符合要求的条件,订单将永远不会被执行。
因为我们id对所有买单使用相同的参数,所以在满足前一个订单的条件之前下的任何新买单都将替换该订单。这同样适用于卖单。
参数中包含的alert_message变量在订单执行时进行评估,因此在警报触发时进行评估。
当该alert_message参数用于策略的订单生成strategy.()函数调用时,脚本用户在创建订单执行事件的脚本警报时,必须{{strategy.order.alert_message}}在“创建警报”对话框的“消息”字段中包含占位符。这是必需的,因此在订单生成函数调用中使用的参数用于在每个订单填写事件触发的警报消息中。当仅在“消息”字段中使用占位符并且该 参数仅出现在您策略中的某些订单生成函数调用中时,空字符串将替换由任何订单生成触发的警报消息中的占位符alert_messagestrategy.(){{strategy.order.alert_message}}alert_messagestrategy.()strategy.()不使用alert_message参数的函数调用。
虽然其他占位符可以在“创建警报”对话框的“消息”字段中由用户创建有关订单执行事件的警报,但它们不能在 的参数中使用alert_message。
alertcondition()
事件
alertcondition ()函数允许程序员在 Pine 指标中创建单独的alertcondition 事件。一个指标可能包含多个alertcondition()调用。脚本中对alertcondition()的每次调用 都会在“创建警报”对话框的“条件”下拉菜单中创建一个可选择的相应警报。
虽然Pine策略脚本中的alertcondition()调用不会导致编译错误,但无法从它们创建警报。
alertcondition ()函数具有以下签名:
alertcondition(condition, title, message)
condition
确定警报何时触发的“系列布尔”值(true或)。false这是一个必需的参数。当值是true警报将触发。当值为false警报不会触发。与alert()函数调用相反, alertcondition()调用必须从行的第 0 列开始,因此不能放在条件块中。
title
一个“const string”可选参数,用于设置警报条件的名称,该名称将出现在图表 UI 中“创建警报”对话框的“条件”字段中。如果没有提供参数,将使用“Alert”。
message
一个“const string”可选参数,指定触发警报时要显示的文本消息。文本将出现在“创建警报”对话框的“消息”字段中,脚本用户可以在创建警报时从中修改它。 由于这个参数必须是一个“常量字符串”,它必须在编译时就知道,因此不能逐条变化。 但是,它可以包含占位符,这些占位符将在运行时被动态值替换,这些动态值可能会从条形变为条形。有关列表,请参阅此页面的占位符部分。
alertcondition ()函数不包含 freq参数。alertcondition() 警报的频率由用户在“创建警报”对话框中确定。
使用一个条件
以下是创建alertcondition() 事件的代码示例:
//@version=5
indicator(“alertcondition()
on single condition”)
r = ta.rsi(close, 20)
xUp = ta.crossover( r, 50)
xDn = ta.crossunder(r, 50)
plot(r, “RSI”)
hline(50)
plotchar(xUp, “Long”, “▲”, location.bottom, color.lime, size = size.tiny)
plotchar(xDn, “Short”, “▼”, location.top, color.red, size = size.tiny)
alertcondition(xUp, “Long Alert”, “Go long”)
alertcondition(xDn, “Short Alert”, "Go short ")
因为我们的脚本中有两个alertcondition()调用,所以“创建警报”对话框的“条件”字段中将提供两个不同的警报:“长警报”和“短警报”。
如果我们想在交叉发生时包含 RSI 的值,我们不能像在alert()调用或策略中的参数中那样简单地message使用 将其值添加到字符串中。但是,我们可以使用占位符来包含它。这显示了两种选择:str.tostring®alert_message
alertcondition(xUp, “Long Alert”, “Go long. RSI is {{plot_0}}”)
alertcondition(xDn, “Short Alert”, ‘Go short. RSI is {{plot(“RSI”)}}’)
注意:
第一行使用{{plot_0}}占位符,其中情节编号对应于脚本中情节的顺序。
第二行使用{{plot(“[plot_title]”)}}占位符的类型,它必须包括我们脚本中用于绘制 RSItitle的plot()调用的类型。双引号用于将绘图的标题包含在{{plot(“RSI”)}}占位符内。这要求我们使用单引号来包裹message字符串。
使用其中一种方法,我们可以包含指标绘制的任何数值,但由于无法绘制字符串,因此无法使用字符串变量。
使用复合条件
如果我们想为脚本用户提供使用多个alertcondition()调用从指标创建单个警报的 可能性,我们将需要在脚本的输入中提供选项,用户将通过这些选项在创建警报之前指示他们想要触发警报的条件.
此脚本演示了一种方法:
//@version=5
indicator(“alertcondition()
on multiple conditions”)
detectLongsInput = input.bool(true, “Detect Longs”)
detectShortsInput = input.bool(true, “Detect Shorts”)
r = ta.rsi(close, 20)
// Detect crosses.
xUp = ta.crossover( r, 50)
xDn = ta.crossunder(r, 50)
// Only generate entries when the trade’s direction is allowed in inputs.
enterLong = detectLongsInput and xUp
enterShort = detectShortsInput and xDn
plot®
plotchar(enterLong, “Go Long”, “▲”, location.bottom, color.lime, size = size.tiny)
plotchar(enterShort, “Go Short”, “▼”, location.top, color.red, size = size.tiny)
hline(50)
// Trigger the alert when one of the conditions is met.
alertcondition(enterLong or enterShort, “Compound alert”, “Entry”)
请注意如何允许alertcondition()调用在两个条件之一上触发。如果用户在创建警报之前在脚本的输入中启用它,则每个条件只能触发警报。
占位符
这些占位符可以在alertcondition()调用的message参数中使用。当警报触发时,它们将被动态值替换。它们是在alertcondition()消息中包含动态值(可以在条与条之间变化的值)的唯一方法 。
请注意,从图表 UI 中的“创建警报”对话框创建alertcondition() 警报的用户也可以在对话框的“消息”字段中使用这些占位符。
{{exchange}}
交换警报中使用的代码(纳斯达克、纽约证券交易所、MOEX 等)。请注意,对于延迟符号,交换将以“_DL”或“_DLY”结束。例如,“NYMEX_DL”。
{{interval}}
返回创建警报的图表的时间范围。请注意,范围图表是根据 1m 数据计算的,因此占位符将始终在范围图表上创建的任何警报上返回“1”。
{{open}}, {{high}}, {{low}}, {{close}},{{volume}}
触发警报的柱的相应值。
{{plot_0}}, {{plot_1}}, […],{{plot_19}}
对应地块编号的值。情节按出现在脚本中的顺序从 0 到 19 编号,因此只能使用前 20 个情节中的一个。例如,内置的“成交量”指标有两个输出系列:成交量和成交量 MA,因此您可以使用以下内容:
alertcondition(volume > sma(volume,20), “Volume alert”, “Volume ({{plot_0}}) > average ({{plot_1}})”)
{{plot(“[plot_title]”)}}
当需要使用plot()调用title中使用的参数 来引用绘图时,可以使用此占位符。请注意,必须在占位符内使用双引号 ( )来包装参数。这要求使用单引号 ( ) 来包装字符串:"title’message
//@version=5
indicator(“”)
r = ta.rsi(close, 14)
xUp = ta.crossover(r, 50)
plot(r, “RSI”, display = display.none)
alertcondition(xUp, “xUp alert”, message = ‘RSI is bullish at: {{plot(“RSI”)}}’)
{{ticker}}
警报中使用的代码(AAPL、BTCUSD 等)的代码。
{{time}}
返回小节开始处的时间。时间为 UTC,格式为yyyy-MM-ddTHH:mm:ssZ,例如:2019-08-27T09:56:00Z.
{{timenow}}
警报触发的当前时间,格式与{{time}}. 无论图表的时间范围如何,精度都精确到秒。
避免使用警报重绘
交易者希望通过警报避免重绘的最常见情况是,他们必须防止警报在实时柱期间的某个时间点触发,而该警报在收盘时不会触发。当满足以下条件时,可能会发生这种情况:
触发警报的条件中使用的计算在实时条中可能会有所不同。任何使用或的计算都会出现这种情况high,例如,它包括几乎所有的内置指标。当更高时间范围的当前柱尚未关闭时,使用比图表更高时间范围的任何request.security()调用的结果也会出现这种情况。lowclose
警报可以在实时柱关闭之前触发,因此以除“每柱关闭一次”之外的任何频率触发。
避免此类重绘的最简单方法是配置警报的触发频率,以便它们仅在实时柱关闭时触发。没有灵丹妙药;避免这种类型的重绘总是需要等待确认的信息,这意味着交易者必须牺牲即时性以实现可靠性。
请注意,其他类型的重绘,例如我们的重绘部分中记录的那些,可能无法通过简单地在实时柱关闭时触发警报来预防