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

Pine Script(160):用alertcondition()编写自定义警报

#Pine Script入门教学

如何在Pine Script中编写警报

在编写TradingView脚本时,我们有多种方法在图表上高亮特定市场情况。但有时,想追踪市场行情,最简单的办法莫过于直接在电脑或手机上收到一条提醒消息。接下来,让我们看看如何通过代码实现自定义的警报条件。

使用alertcondition()函数编写TradingView警报

无论是移动平均线交叉,还是价格突破盘整区间,TradingView的警报功能都能及时通知我们。警报一旦触发,屏幕上就会弹出窗口、播放提示音,我们甚至可以收到短信或邮件提醒。

当然,在实现这一切之前,我们必须先在代码中整合警报功能。这需要用到alertcondition()函数,它能根据我们设定的逻辑创建一个警报条件。当脚本加载到图表上后,我们就可以手动开启并配置这个警报条件。

alertcondition()函数的基础用法如下:

alertcondition(condition, title, message)

这三个参数的含义分别是:

参数 说明
condition 必需参数。它是一个布尔值(truefalse),用来判断是否触发警报。我们需要根据自己的交易逻辑,为condition编写一个返回truefalse的条件。请注意,警报的实际触发频率还受用户在“创建警报”窗口中的设置影响(例如“每分钟一次”),所以就算condition的值是true,警报也未必在每根K线上都触发。
title 可选参数。一个固定的文本字符串,用作警报的标题,会显示在“创建警报”窗口中。一个清晰的标题能帮你轻松区分不同的警报。
message 可选参数。一个固定的文本字符串,作为警报触发时显示的默认消息。我们可以在“创建警报”窗口中修改这个消息,所以这里设置的message只是一个预设的模板。

我们可以在一个脚本里反复调用alertcondition()函数来创建多个不同的警报条件。不过,每一个警报条件都需要我们单独去手动启用和配置。

请注意,alertcondition()本身并不是一个输出函数。但在TradingView中,每个脚本都必须至少包含一个输出函数,否则系统会提示‘script must have at least one output function call’的错误。这意味着,我们的脚本不能只含有alertcondition()函数,还必须搭配plot()(绘制线条)或bgcolor()(修改背景色)这类函数,确保脚本至少在图表上输出一些可见内容。

本文后续会提供一些使用alertcondition()的实例代码。在此之前,我们先来解答几个关于该函数的常见疑问。

alertcondition()常见问题解答

为了帮你更透彻地理解alertcondition()的工作方式和功能限制,以下整理了一些常见问题与解答。

问:如何在TradingView的策略中触发警报?

答:指标的警报功能很适合用来监控市场变化,但我们更希望在策略的交易行为(如开平仓)发生时收到通知。遗憾的是,alertcondition()函数在策略脚本中是无效的。虽然在策略代码中使用它不会报错,但在“创建警报”窗口里根本找不到这个警报选项,自然也无法激活。如果想在策略中实现警报,我们必须改用alert()函数。

问:alertcondition()函数会自动触发警报吗?

答:alertcondition()有个容易让人混淆的地方:它本身并不直接触发警报。它的作用是:当你把一个含有alertcondition()的脚本添加到图表时,它只是在“创建警报”的窗口里为你生成一个可供选择的警报条件。也就是说,alertcondition()只负责创建选项,我们还必须手动去配置和启用这个警报,它才能真正开始工作。如果不进行手动设置,即使代码中的条件满足了,警报也绝不会触发。

问:修改代码后,alertcondition()创建的警报会同步更新吗?

答:警报的另一个特性也可能让你感到奇怪。比如,你先设置好了一个警报,然后又去修改了脚本代码,让alertcondition()在新的条件下触发。然而,这个改动并不会应用到你已经创建好的那个警报上。简单来说,即使你的指标代码更新了,已有的警报依然沿用你创建它那一刻的旧版指标逻辑。这样做的好处是灵活性高:警报一旦创建,你就可以随意调整脚本的参数、修改代码、更改图表设置,甚至把脚本从图表上删除,这些操作都不会影响到那个已经存在的警报。但缺点也很明显:如果你确实想让警报逻辑更新,就必须先手动删除旧的警报,然后再根据新版指标的代码或设置,重新创建并配置一个全新的警报。

问:如何验证alertcondition()的触发条件是否正确?

答:我们无法直接通过alertcondition()函数在图表上看到警报会在何时何地触发,因为它不会在图表上留下任何可见的标记。好在我们可以曲线救国:在代码里加几行,让它在警报条件满足(true)的时候,顺便把图表背景染个色,或者在K线上画个小图形。这样一来,历史上哪些K线满足了触发条件,就一目了然了。

问:警报消息可以包含动态内容吗?(比如当前价格)

答:alertcondition()函数的title(标题)和message(消息)参数只接受固定的常量字符串。这一点确实比较受限,意味着我们无法创建动态的警报消息。用alertcondition()发出的消息内容每次都必须一模一样。例如,下面这种写法是错误的:

//@version=5
indicator(title="警报示例", overlay=true)

// 错误示范:message参数中包含了动态变化的close价格
alertcondition(condition=open > close,
     message="收盘价位于 " + str.tostring(close))

plot(close)

这段代码试图将动态变化的close(收盘价)拼接到消息文本中,但TradingView不允许这样做,并会返回‘cannot call with arguments’错误。因此,alertcondition()message参数必须使用写死的静态文本。如果需要发送包含动态内容的警报,请改用alert()函数。

生成TradingView警报的脚本示例

接下来,让我们通过几个实际的指标脚本,看看alertcondition()是如何生成警报的。第一个指标会创建基于成交量的警报,第二个则基于阶段最高价和最低价来触发警报。

示例:使用移动平均线生成成交量警报

下方的示例指标利用alertcondition()函数编写成交量警报。当一个品种的当前成交量超过其20周期成交量指数移动平均线(EMA)时,脚本便可以触发警报。

该指标在图表上的效果如下:

这个指标的完整代码如下:

//@version=5
indicator(title="成交量警报示例", overlay=false)

emaLength = input.int(20, title="EMA 周期")

volEMA = ta.ema(volume, emaLength)

// 创建警报条件
alertcondition(condition=volume > volEMA,
     message="成交量高于其EMA均线")

// 绘制指标值
plot(volume, style=plot.style_histogram, color=color.teal,
     linewidth=3)
plot(volEMA, style=plot.style_line, color=color.orange)

下面我们来逐一拆解代码,理解其功能。首先,我们配置指标的基本信息:

//@version=5
indicator(title="成交量警报示例", overlay=false)

我们先用一行注释声明Pine脚本的版本。然后,通过indicator()函数来设定指标的属性。我们用title为指标命名,并将overlay设置为false,这能让指标显示在主图下方的独立面板中。

接着,我们用input.int()函数创建一个可供用户自定义的参数:

emaLength = input.int(20, title="EMA 周期")

我们创建了一个名为“EMA周期”的整数输入选项,并将其默认值设为20。用户输入的值会保存在emaLength这个变量里。这样,在代码后续部分需要用到这个周期值时,直接调用该变量即可。

然后,我们计算EMA均线并设置警报条件:

volEMA = ta.ema(volume, emaLength)

// 创建警报条件
alertcondition(condition=volume > volEMA,
     message="成交量高于其EMA均线")

我们调用ta.ema()函数,基于内置变量volume(成交量)和用户设定的周期emaLength来计算成交量的EMA值。紧接着,我们使用alertcondition()函数来创建成交量警报。我们将condition参数的触发条件设置为volume > volEMA,即当实时成交量大于它的EMA均线时,条件成立(返回true)。同时,我们通过message参数,将默认的警报消息设置为“成交量高于其EMA均线”。

代码的最后一部分,负责将数值绘制到图表上:

// 绘制指标值
plot(volume, style=plot.style_histogram, color=color.teal,
     linewidth=3)
plot(volEMA, style=plot.style_line, color=color.orange)

我们使用plot()函数来显示指标的数值。第一行代码将volume(成交量)以蓝绿色的柱状图形式画出来,并将linewidth(线宽)设为3,使其比默认的柱子更粗。第二行plot()代码则将成交量的EMA值(volEMA)以橙色实线图的形式绘制出来。这样,我们就能直观地在图表上验证警报触发的条件是否正确。

请注意,当我们将这个指标添加到图表后,还需要手动启用并配置它的警报,否则脚本本身不会自动发出任何提醒。正确设置后,收到的警报消息会是这个样子:

接下来,我们再看另一个创建了多个警报条件的示例脚本。

示例:基于20周期内的高点和低点生成TradingView警报

实际上,alertcondition()函数的使用次数不受限制,你可以用它为你想要追踪的任何市场情况创建警报。下方的示例指标就创建了两个独立的警报条件:一个在收盘价突破20周期内的最高点时触发,另一个则在收盘价跌破20周期内的最低点时触发。该指标加载到图表上的效果如下:

该指标的完整代码如下:

//@version=5
indicator(title="高低点 - 警报示例", overlay=true)

// 输入选项
highLen = input.int(20, title="高点周期")
lowLen  = input.int(20, title="低点周期")

// 计算数值
highs = ta.highest(high, highLen)[1]
lows  = ta.lowest(low, lowLen)[1]

// 创建警报条件
alertcondition(condition=ta.crossover(close, highs),
     title="向上突破",
     message="收盘价上穿阶段高点")

alertcondition(condition=ta.crossunder(close, lows),
     title="向下跌破",
     message="收盘价下穿阶段低点")

// 绘制数值
plot(highs, color=color.green, linewidth=2)
plot(lows, color=color.red, linewidth=2)

我们来解析一下这段代码。与之前一样,先从指标的基础设置开始:

//@version=5
indicator(title="高低点 - 警报示例", overlay=true)

我们先声明Pine脚本的版本,然后用indicator()函数设定指标属性。title用来为指标命名,而overlay=true则让指标直接叠加显示在主图上,而不是在下方的独立面板中。

接着,我们创建两个可供用户调节的整数输入项:

// 输入选项
highLen = input.int(20, title="高点周期")
lowLen  = input.int(20, title="低点周期")

我们将这两个选项分别命名为“高点周期”和“低点周期”,并都设置了20作为默认值。用户设定的数值会分别储存在highLenlowLen变量中,方便后续代码调用。

然后,我们来计算指标的核心数值:

// 计算数值
highs = ta.highest(high, highLen)[1]
lows  = ta.lowest(low, lowLen)[1]

我们使用ta.highest()函数来获取过去highLen根K线内的最高价,计算结果存入highs变量。同理,我们使用ta.lowest()函数来获取过去lowLen根K线内的最低价,并将结果存入lows变量。请注意,我们在ta.highest()ta.lowest()函数后面都加上了[1]。这是Pine脚本中的历史引用操作符,代表上一根K线的数据。这么做的原因很简单:如果我们在计算最高点或最低点时把当前这根K线也包含在内,那么当前价格就永远不可能突破这个极值。因此,我们必须获取不包含当前K线的、过去N根K线的极值来进行比较。

接下来,我们编写指标的警报条件:

// 创建警报条件
alertcondition(condition=ta.crossover(close, highs),
     title="向上突破",
     message="收盘价上穿阶段高点")

alertcondition(condition=ta.crossunder(close, lows),
     title="向下跌破",
     message="收盘价下穿阶段低点")

这里我们调用了两次alertcondition()函数,创建了两个警报。第一个警报的condition参数是ta.crossover(close, highs)ta.crossover()是一个内置函数,当它的第一个参数(收盘价close)从下向上穿越第二个参数(阶段高点highs)时,它会返回true,否则返回false。当这个条件满足时,警报会发出内容为“收盘价上穿阶段高点”的消息。第二个警报的条件是ta.crossunder(close, lows)ta.crossunder()函数的功能正好相反,它判断第一个参数是否从上向下穿越第二个参数。当收盘价close跌破阶段低点lows时,条件成立,警报触发,并发出“收盘价下穿阶段低点”的消息。再次提醒,这两行代码仅仅是创建了警报的菜单选项,我们仍然需要去手动创建并启用警报,否则指标的突破和跌破提醒是不会生效的。

脚本的最后,我们用两行绘图代码来收尾:

// 绘制数值
plot(highs, color=color.green, linewidth=2)
plot(lows, color=color.red, linewidth=2)

我们使用plot()函数将计算出的阶段高点和低点绘制在图表上。第一行代码用绿色绘制highs值,第二行用红色绘制lows值。通过linewidth参数,我们把两条线的宽度都设为2,让它们看起来更清晰。

现在,我们将这个指标添加到图表,然后手动启用并配置它的警报。脚本生成的警报消息会是这个样子:

如果在我们关闭通知前,警报被反复触发,那么通知窗口也会随之变化,告诉我们警报触发的总次数:

总结

要想让TradingView脚本发出警报,我们首先需要用alertcondition()函数来定义一个警报条件。这个函数有一个必需参数和两个可选参数。

  • condition:这是必需参数,它接受一个布尔值(truefalse)。当值为true时,满足警报触发条件。
  • title:可选参数,用于为警报命名。一个有描述性的标题能帮助我们在手动设置时快速找到它。
  • message:可选参数,用于设置警报触发时显示的文本内容。美中不足的是,message只能接受固定的常量字符串,这让我们无法创建包含动态信息(如当前价格)的警报消息。

关于alertcondition(),有几个关键点需要牢记:

  1. 它不能用于策略(strategy)脚本中。
  2. 它本身不直接触发警报,只是创建了一个警报选项,我们必须手动启用和配置它。
  3. 一旦警报创建完成,后续对脚本代码、参数或图表的任何修改,都不会影响到已有的警报。若要更新警报逻辑,必须先删除旧警报,再重新创建。
  4. 我们无法在图表上直观地看到alertcondition()的触发点。如果需要验证,必须额外编写代码,在条件满足时通过改变颜色或绘制图形等方式来标记。
赞(0)
未经允许不得转载:图道交易 » Pine Script(160):用alertcondition()编写自定义警报
分享到

评论 抢沙发

登录

找回密码

注册