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

Pine Script(170):用箭头和触发水平线高亮警报

#Pine Script入门教学

如何用向上和向下箭头突出显示TradingView警报

我们在TradingView中通过代码创建的警报,默认不会在图表上留下任何痕迹,测试警报代码颇为繁琐。好在只需添加几行额外代码,就能自己实现警报的可视化。下面看看怎么通过绘制向上和向下的箭头,清晰标注出警报的触发位置。

用箭头高亮TradingView警报

在Pine脚本中,我们用alertcondition()函数定义警报。脚本加载到图表后,还需要手动启用和配置这些警报,之后它们才能在条件满足时,以弹出窗口、短信或邮件的形式通知我们。但alertcondition()有个局限:它创建的警报是“隐形”的,不会在图表上显示。这意味着如果想回溯历史信号,只能靠肉眼去图表上找,不仅排查错误警报困难,也无法直观看到修改参数对警报频率的影响。好在TradingView Pine脚本也允许我们自己高亮警报,需要做的只是添加几行代码。其中一种有效方法,就是在图表上绘制向上或向下的箭头来标记信号。

三步实现用箭头显示警报

要用箭头高亮警报,只需遵循三个步骤。

第一步:把警报逻辑转换为布尔变量。先创建一个布尔(真/假)变量,警报条件满足时为true,否则为false。把警报逻辑封装在这个变量中,可以确保后续的箭头绘制和警报创建都基于完全相同的逻辑,实现完美同步。如果我们有两个警报条件,代码可能像这样:

rsiCrossDown = ta.crossunder(ta.rsi(close, 7), ta.rsi(close, 21))
rsiCrossUp   = ta.crossover(ta.rsi(close, 7), ta.rsi(close, 21))

第二步:基于布尔变量绘制箭头。接下来用这个“开关”变量和plotarrow()函数。plotarrow()可以在图表上绘制向上或向下的箭头,具体画哪个取决于它的第一个参数:为正数时绘制向上箭头,为负数时绘制向下箭头,为na时不绘制任何箭头。因此,可以用条件运算符(?:)把布尔变量映射到箭头的方向上:

plotarrow(rsiCrossDown ? -1 :
     rsiCrossUp ? 1 :
     na)

这个表达式的意思是:如果rsiCrossDown为真,返回-1(绘制向下箭头);否则再判断rsiCrossUp是否为真,是则返回1(绘制向上箭头);两者都不为真则返回na

第三步:用同一布尔变量创建alertcondition()。最后用alertcondition()创建真正的警报,关键在于condition参数必须使用与第二步完全相同的那些布尔变量,这样警报的触发与箭头的绘制就会在同一时刻发生。代码示例如下:

alertcondition(condition=rsiCrossDown,
     message="快线RSI下穿慢线RSI")
alertcondition(condition=rsiCrossUp,
     message="快线RSI上穿慢线RSI")

要注意,实时行情与历史回测中的警报触发机制存在差异。在历史K线上,指标只在每根K线收盘时计算一次;在实时行情中,脚本会对最新K线内的每一次价格跳动都进行计算。这意味着实时行情中K线内部的波动也可能触发警报,实时警报的触发机会比历史回测中显示的要多。因此,图表上的高亮标记数量可能与实际警报触发频率有所不同,具体取决于你在后台的警报触发频率设置。

现在通过一个完整实例,来看看如何把以上三个步骤整合到一个TradingView指标中。

示例:在图表上绘制箭头以高亮警报

下方的示例指标会为两种经典的K线形态——Inside Bar(内包线)和Outside Bar(外包线)——触发警报。Inside Bar指一根K线的最高价和最低价完全被前一根K线所包含;Outside Bar则指一根K线的高低点完全覆盖了前一根K线。我们用向上箭头标记Inside Bar,用向下箭头标记Outside Bar。该指标加载到图表上的效果如下:

这是该指标的完整源代码:

//@version=5
indicator(title="用箭头高亮警报", overlay=true)

// 1. 定义布尔型的警报条件
insideBar = low > low[1] and 
     high < high[1]
outsideBar = low < low[1] and 
     high > high[1]

// 2. 根据警报条件绘制箭头 (实现可视化)
plotarrow(insideBar ? 1 :
         outsideBar ? -1 :
         na,
     colorup=color.fuchsia, colordown=color.yellow,
     maxheight=30)

// 3. 根据同一条件创建警报
alertcondition(condition=insideBar,
     title="Inside Bar",
     message="当前K线为 Inside Bar")
alertcondition(condition=outsideBar,
     title="Outside Bar",
     message="刚刚形成 Outside Bar")

我们来逐步拆解这段代码的逻辑。首先用indicator()设置脚本的基本属性,接着是定义信号的核心部分:

// 定义布尔型的警报条件
insideBar = low > low[1] and 
     high < high[1]
outsideBar = low < low[1] and 
     high > high[1]

我们通过比较当前K线与前一根K线的高低点关系,定义了insideBaroutsideBar这两个布尔“开关”变量。下一步,利用这两个变量,通过plotarrow()实现警报的可视化:

// 绘制箭头
plotarrow(insideBar ? 1 :
         outsideBar ? -1 :
         na,
     colorup=color.fuchsia, colordown=color.yellow,
     maxheight=30)

这里用了一个嵌套的条件运算符,逻辑清晰:如果insideBar为真,就绘制一个向上的箭头(1);否则再判断outsideBar是否为真,是则绘制一个向下的箭头(-1);两者都不为真则不绘制任何箭头(na)。我们还设置了箭头的颜色和最大尺寸。然后,用完全相同的“开关”变量创建真正的警报:

// 创建警报条件
alertcondition(condition=insideBar,
     title="Inside Bar",
     message="当前K线为 Inside Bar")
alertcondition(condition=outsideBar,
     title="Outside Bar",
     message="刚刚形成 Outside Bar")

这段代码为两种K线形态分别创建了警报条件。再次提醒,这些警报需要手动启用后才能生效。

高亮TradingView警报的其他方法

除了绘制箭头,你还可以用其他多种方式实现警报的可视化,甚至可以将它们组合使用:

  • 为图表背景着色(bgcolor()
  • 为K线本身着色(barcolor()
  • 用单个字符高亮警报(plotchar()
  • 绘制不同的形状,或组合形状和文字(plotshape()
  • 只在警报发生时显示文字
  • 在图表上绘制出警报的触发水平线(plot()

以上任何一种可视化警报的方法,都用到了输出函数(如plotarrowplot等)。这是个优势,因为TradingView要求每个指标脚本都必须有某种形式的图表输出,而alertcondition()本身不被视为输出。所以添加可视化元素恰好可以解决script must have at least one output function call这个常见错误。

小结

alertcondition()编写的警报本身不会在图表上留下任何视觉痕迹,测试和修复代码都不方便。好在我们可以通过三个简单步骤自己实现警报的可视化:先为每个警报逻辑创建一个布尔变量;然后用这个变量和plotarrow()在图表上绘制箭头;最后用同一个变量创建alertcondition()警报,确保两者同步。请记住,由于实时行情和历史回测的计算机制不同,图表上的高亮标记数量可能与实际收到的实时警报数量有所不同,具体取决于你的警报触发频率设置。

通过在图表上绘制触发水平来突出显示TradingView警报

我们在TradingView中编写的警报,默认不会在图表上留下任何痕迹,很难验证和校准警报代码。好在只需添加几行额外代码,就能自己在图表上显示警报的触发水平,直观了解警报的潜在触发位置。

使用绘图功能高亮警报的触发水平

在Pine脚本中,我们用alertcondition()函数定义警报。脚本加载到图表后,还需要手动启用和配置这些警报,之后它们才能在条件满足时真正触发。但alertcondition()有个固有的局限:它无法让我们在图表上直观看到警报的触发历史。这使得我们很难验证代码是否准确捕捉到了预期的市场形态,也无法评估不同参数对警报触发频率的影响。好在要在图表上显示警报的触发水平,只需添加少量代码。这样我们就能清晰看到警报的触发阈值在何处,并快速识别出价格触及该阈值的K线。

四步实现在图表上绘制警报触发水平

要在图表上绘制出警报的触发水平,只需遵循四个步骤。

第一步:计算警报的触发水平值。先算出那个能触发警报的价格或指标值,最好把这个值存储在一个变量中,方便后续步骤调用。例如,可以把过去10根K线的最高点作为触发水平:

hiHighs = ta.highest(high, 10)[1]

第二步:基于触发水平,定义警报条件的布尔变量。接下来用上一步计算出的触发水平,定义一个布尔(真/假)变量:警报条件满足时为true,否则为false。把警报逻辑封装在这个变量中,可以确保后续的绘图和警报创建都基于完全相同的逻辑,实现完美同步。例如,可以定义一个在周五突破10周期高点的警报条件:

dayFilter = dayofweek == dayofweek.friday
buyAlert = high > hiHighs and dayFilter

第三步:在警报生效时才绘制出触发水平。现在在图表上绘制警报的触发水平,这要用到plot()函数。如果警报在每根K线上都有效,直接调用plot()即可。但更常见的情况是,警报只在特定条件下(即有过滤条件时)才生效,这时就需要条件绘图:过滤条件满足时才绘制触发水平值,否则用na值“关闭”本次绘图。接着上面的例子,我们只想在周五绘制出触发水平线(10周期高点):

plot(dayFilter ? hiHighs : na)

提示:进行条件绘图时,图表上会出现数据断点。有些绘图样式能很好地处理这些断点(如带断点的线图、圆圈、十字),而另一些则不适合。

第四步:基于布尔变量创建警报。最后用alertcondition()创建真正的警报,关键在于condition参数必须使用与第二步完全相同的那个布尔变量。这样警报触发逻辑就与图表上的绘图逻辑完全一致——图表上出现绘图标记的地方,就是警报会触发的地方。代码示例如下:

alertcondition(condition=buyAlert,
     message="周五创下10周期新高")

要注意,实时行情与历史回测中的警报触发机制存在差异。在历史K线上,指标只在每根K线收盘时计算一次;在实时行情中,脚本会对最新K线内的每一次价格跳动都进行计算。这意味着实时行情中K线内部的波动也可能触发警报,实时警报的触发机会比历史回测中显示的要多。因此,图表上的高亮标记数量可能与实际警报触发频率有所不同,具体取决于你在后台的警报触发频率设置。

现在通过一个完整实例,来看看如何把以上四个步骤整合到一个TradingView指标中。

示例指标:绘制数值以高亮警报触发水平

下方的示例指标会在价格达到当日新高或新低时触发警报。为了直观看到这些触发水平,我们用实心圆点在图表上把它们标记出来。这不仅能让我们看到警报可能在何时触发,还能观察到这些水平在交易日内的演变。为了避免图表过于杂乱,我们只在价格靠近相应边界时才绘制它们;当价格真正触及触发水平时,还会为背景上色,提供更醒目的视觉提醒。该指标加载到图表上的效果如下:

绿色圆点代表当日高点,红色圆点代表当日低点。当K线背景变色时,就表示当日新高或新低警报被触发了。在盘整行情中,红绿圆点可能交替出现;而当上升趋势开始时,我们会看到一系列连续创出新高的警报:

这是该指标的完整代码:

//@version=5
indicator(title="示例:高亮警报触发水平", overlay=true)

// 计算指标值
dayHigh = 0.0
dayLow  = 0.0
newDay  = dayofweek != dayofweek[1]
dayHigh := newDay ? high :
     math.max(high, dayHigh[1])
dayLow := newDay ? low :
     math.min(low, dayLow[1])
midPoint = (dayHigh + dayLow) / 2

// 定义警报逻辑
sameDay = dayofweek == dayofweek[1]
newHigh = high == dayHigh and
     sameDay
newLow = low == dayLow and 
     sameDay

// 创建警报条件
alertcondition(condition=newHigh,
     title="创下日内新高",
     message="创下日内新高!")
alertcondition(condition=newLow,
     title="创下日内新低",
     message="创下日内新低!")

// 绘制最近的警报触发水平
plot(close > midPoint and sameDay ? dayHigh : na,
     color=color.green, style=plot.style_circles, 
     linewidth=4)
plot(close < midPoint and sameDay ? dayLow : na,
     color=color.red, style=plot.style_circles, 
     linewidth=4)

// 当触发水平被触及时高亮背景
backgroundColour = if newHigh
    color.new(color.green, 90)
else if newLow
    color.new(color.red, 90)
bgcolor(backgroundColour)

我们来逐步拆解这段代码的逻辑。首先用indicator()设置脚本的基本属性,接着是计算指标的核心数值:

// 计算指标值
dayHigh = 0.0
dayLow  = 0.0
newDay  = dayofweek != dayofweek[1]
dayHigh := newDay ? high : math.max(high, dayHigh[1])
dayLow := newDay ? low : math.min(low, dayLow[1])
midPoint = (dayHigh + dayLow) / 2

这里先用dayofweek != dayofweek[1]这个技巧判断是否是新的一天,然后动态计算当日的最高价dayHigh和最低价dayLow。这里用了:=操作符,因为它允许变量在计算时引用自身在前一根K线上的值(如dayHigh[1])。逻辑是:如果是新的一天,日内高点就是当前K线的最高价;如果不是,就取当前K线最高价和前一刻日内高点之间的较大值,实现日内高点的滚动更新。日内低点的计算同理。midPoint则是当日高低点的中点,用于后续的绘图逻辑。下一步,定义警报的触发逻辑:

// 定义警报逻辑
sameDay = dayofweek == dayofweek[1]
newHigh = high == dayHigh and sameDay
newLow = low == dayLow and sameDay

我们定义了三个布尔变量。newHigh的条件是当前K线最高价等于我们计算的当日最高价,同时为了排除每日开盘第一根K线(它必然是当日新高/新低),加了一个sameDay过滤条件,要求当前K线必须与前一根K线在同一天。newLow的逻辑类似。然后基于这些逻辑创建警报:

// 创建警报条件
alertcondition(condition=newHigh, title="创下日内新高", message="创下日内新高!")
alertcondition(condition=newLow, title="创下日内新低", message="创下日内新低!")

接着,绘制出警报的触发水平,即当日高点和低点:

// 绘制最近的警报触发水平
plot(close > midPoint and sameDay ? dayHigh : na,
     color=color.green, style=plot.style_circles, linewidth=4)
plot(close < midPoint and sameDay ? dayLow : na,
     color=color.red, style=plot.style_circles, linewidth=4)

这里进行了条件绘图,以避免图表过于杂乱:只有当价格位于当日波动范围的上半区时,才绘制代表当日高点的绿色圆点;只有当价格位于下半区时,才绘制代表当日低点的红色圆点。最后,当价格真正触及这些触发水平时,为背景上色以作强调:

// 当触发水平被触及时高亮背景
backgroundColour = if newHigh
    color.new(color.green, 90)
else if newLow
    color.new(color.red, 90)
bgcolor(backgroundColour)

我们通过一个if...else if语句,在newHigh为真时把背景设为淡绿色,在newLow为真时设为淡红色,并通过bgcolor()应用到图表上。

高亮TradingView警报的更多方法

除了直接绘制警报的触发水平线,还有多种其他方式可以在图表上高亮历史信号,它们也可以与本文的方法结合使用:

  • 为图表背景着色(bgcolor()
  • 为K线本身着色(barcolor()
  • 用单个字符高亮警报(plotchar()
  • 绘制不同的形状,或组合形状和文字(plotshape()
  • 只在警报发生时显示文字
  • 在警报K线上绘制箭头(plotarrow()

以上任何一种可视化警报的方法,都用到了输出函数(如plotbgcolor等)。这是个优势,因为TradingView要求每个指标脚本都必须有某种形式的图表输出,而alertcondition()本身不被视为输出。所以添加可视化元素恰好可以解决script must have at least one output function call这个常见错误。

小结

alertcondition()编写的警报,其触发历史默认不会在图表上留下任何痕迹,验证和参数调试都不方便。好在我们可以通过四个步骤自己绘制出警报的触发水平:先计算出触发警报的数值;再基于该数值创建一个布尔变量来定义警报逻辑;接着在图表上条件性地绘制出这个触发水平;最后用同一个布尔变量创建alertcondition()警报。请记住,由于实时行情和历史回测的计算机制不同,图表上的高亮标记数量可能与实际收到的实时警报数量有所不同,具体取决于你的警报触发频率设置。

赞(0)
未经允许不得转载:图道交易 » Pine Script(170):用箭头和触发水平线高亮警报
分享到

评论 抢沙发

登录

找回密码

注册