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

Pine Script(169):用文本和形状突出显示警报

#Pine Script入门教学

如何用文本和形状突出显示TradingView警报

我们在代码中用alertcondition()创建的警报,并不会在图表上留下任何痕迹,这让我们很难判断脚本是否成功捕捉到了预想的交易信号。好在我们可以自己动手,通过在图表上同时绘制形状与文本,为警报创建清晰的视觉标记。

用形状和文本在TradingView图表上显示警报

在Pine脚本中,我们通过alertcondition()函数定义警报。脚本加载到图表后,还需要手动启用和配置这些警报,之后它们才能在条件满足时,以弹出窗口、邮件或短信的形式通知我们。但alertcondition()有个显著的局限:它创建的警报是“隐形”的,不会在图表上留下任何标记。这带来几个问题:很难验证代码逻辑是否正确,无法直观看到修改指标参数对警报频率的影响,更无从知晓警报在历史上的具体触发位置。好消息是,只需添加几行额外代码就能自己解决这个问题,为警报条件创建清晰的视觉标记。其中一种有效方法,就是在图表上绘制形状和文本。

三步实现用形状和文本高亮警报

要用形状和文本高亮一个警报,只需遵循三个步骤。

第一步:用一个布尔变量来定义警报条件。先创建一个布尔(真/假)变量,警报条件满足时为true,否则为false。把警报逻辑封装在这个变量中,可以确保后续的形状绘制和警报创建都基于完全相同的逻辑,实现完美同步。例如,可以这样定义一个均线金叉的条件:

emaCross = ta.crossover(ta.ema(close, 10), ta.ema(close, 30))

第二步:结合plotshape()函数与该布尔变量。接下来用这个“开关”变量和plotshape()函数。plotshape()可以在图表上绘制一个形状,并且可以选择性地附带一段文本。它的第一个参数是一个布尔条件,只有当该条件为true时形状和文本才会被绘制出来。因此,把上一步创建的布尔变量作为它的第一个参数。代码示例如下:

plotshape(emaCross, style=shape.flag, text="EMA 金叉")

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

alertcondition(condition=emaCross,
     message="EMA发生金叉!")

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

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

示例:用形状和文本高亮TradingView警报

下方的示例指标会生成两种突破警报:第一种在价格向上突破20周期最高收盘价时触发;第二种是成交量警报,在成交量高于10周期最高成交量时触发。我们会在图表上绘制带文本的形状,直观看到这些警报的触发位置。

这是该指标的完整代码:

//@version=5
indicator(title="用形状和文本高亮警报",
     overlay=true)

// 1. 定义布尔型的警报条件
priceBreakout  = close > ta.highest(close, 20)[1]
volumeBreakout = volume > ta.highest(volume, 10)[1]

// 2. 根据警报条件绘制形状和文本 (实现可视化)
plotshape(priceBreakout, style=shape.flag,
     color=color.green, text="价格\n突破")
plotshape(volumeBreakout, style=shape.diamond,
     color=color.orange, location=location.belowbar,
     text="成交量\n突破", textcolor=color.blue)

// 3. 根据同一条件创建警报
alertcondition(condition=priceBreakout,
     title="价格突破",
     message="收盘价高于20周期最高收盘价")
alertcondition(condition=volumeBreakout,
     title="成交量突破",
     message="成交量高于10周期最高成交量")

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

// 定义布尔型的警报条件
priceBreakout  = close > ta.highest(close, 20)[1]
volumeBreakout = volume > ta.highest(volume, 10)[1]

我们定义了两个布尔“开关”变量:priceBreakout在收盘价高于过去20根K线的最高收盘价时为真,volumeBreakout在成交量高于过去10根K线的最高成交量时为真。这里[1]的作用是取不包含当前K线的历史极值,以确保突破逻辑的有效性。下一步,利用这两个变量实现警报的可视化:

// 在图表上绘制形状
plotshape(priceBreakout, style=shape.flag,
     color=color.green, text="Price\nbreakout")
plotshape(volumeBreakout, style=shape.diamond,
     color=color.orange, location=location.belowbar,
     text="Volume\nbreakout", textcolor=color.blue)

我们调用了两次plotshape()。第一个在priceBreakout为真时,绘制一个绿色的旗帜(shape.flag),并附带说明文本;这里的\n是换行符,能让文本在显示时强制换行。第二个plotshape()volumeBreakout为真时,在K线下方绘制一个橙色的菱形(shape.diamond),并附带蓝色的说明文本。然后,用完全相同的“开关”变量创建真正的警报:

// 创建警报条件
alertcondition(condition=priceBreakout,
     title="价格突破",
     message="收盘价高于20周期最高收盘价")
alertcondition(condition=volumeBreakout,
     title="成交量突破",
     message="成交量高于10周期最高成交量")

这段代码为价格突破和成交量突破分别创建了警报条件。再次提醒,这些警报需要手动启用后才能生效。

高亮TradingView警报的其他选项

在图表上绘制形状和文本只是高亮警报的一种方法,你还可以用其他多种方式实现可视化:

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

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

小结

alertcondition()编写的警报本身不会在图表上留下任何视觉痕迹,测试和验证都不方便。好在我们可以自己动手,通过绘制形状和文本来标注这些警报。这通常需要三个步骤:先用一个布尔变量定义警报逻辑;然后用这个变量和plotshape()在图表上绘制标记;最后用同一个变量创建alertcondition()警报,确保两者同步。请记住,由于实时行情和历史回测的计算机制不同,图表上的高亮标记数量可能与实际收到的实时警报数量有所不同,具体取决于你的警报触发频率设置。

如何用文本标注TradingView图表上的警报

我们在TradingView中通过代码创建的警报,默认不会在图表上留下任何痕迹,很难判断代码是否准确捕捉到了预想的交易信号。好在只需添加几行代码,就能自己实现警报的可视化。下面看看怎么通过在图表上绘制文本,清晰标注出警报的触发位置。

用绘制的文本在TradingView图表上显示警报

在Pine脚本中,我们用alertcondition()函数定义警报。脚本加载到图表后,还需要手动启用和配置这些警报,之后它们才能在条件满足时真正触发。但这种方式有个局限:由alertcondition()触发的警报是“隐形”的,不会在图表上留下任何标记。这给验证警报逻辑带来很大不便——我们当然可以实时盯着盘面等警报弹出,但那太耗时了。好在我们不必如此,通过添加少量代码,就能自己在图表上高亮显示警报的触发点,轻松回溯和验证警报逻辑,并根据触发频率校准指标参数。其中一种有效方法,就是在图表上直接绘制文本。

三步实现用文本高亮警报

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

第一步:用一个布尔变量来定义警报条件。先创建一个布尔(真/假)变量,警报条件满足时为true,否则为false。把警报逻辑封装在这个变量中,可以确保后续的文本绘制和警报创建都基于完全相同的逻辑,实现完美同步。例如,可以这样定义一个放量突破的条件:

highBreakout = high > ta.highest(high, 20)[1] and
     volume > ta.sma(volume, 10)

第二步:结合plotchar()函数与该布尔变量。接下来用这个“开关”变量和plotchar()函数。plotchar()不仅可以在图表上绘制单个字符,它还有一个text参数,可以用来显示一段文本。它的第一个参数是一个布尔条件,只有当该条件为true时函数才会执行绘制,因此把上一步创建的布尔变量作为它的第一个参数。要只显示文本而不显示字符,把char参数设置为空字符串''即可。代码示例如下:

plotchar(highBreakout, char='',
     text="新高突破!")

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

alertcondition(condition=highBreakout,
     message="放量突破新高")

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

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

示例:用文本高亮TradingView警报

下方的示例指标会在价格连续三根K线创出更高的高点(Higher Highs)或更低的低点(Lower Lows)时触发警报。每当这些条件满足时,就在图表上绘制出相应的文本。该指标加载到图表上的效果如下:

该指标的完整代码如下:

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

// 1. 定义布尔型的警报条件
higherHighs = high > high[1] and
     high[1] > high[2] and
     high[2] > high[3]
lowerLows = low < low[1] and
     low[1] < low[2] and 
     low[2] < low[3]

// 2. 根据警报条件绘制文本 (实现可视化)
plotchar(higherHighs, char='',
     text="更高\n高点", textcolor=color.black)
plotchar(lowerLows, char='',
     text="更低\n低点\n警报", textcolor=color.red,
     location=location.belowbar)

// 3. 根据同一条件创建警报
alertcondition(condition=higherHighs,
     title="更高高点",
     message="连续三根K线创出更高高点。")
alertcondition(condition=lowerLows,
     title="更低低点",
     message="连续三根K线创出更低低点。")

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

// 定义布尔型的警报条件
higherHighs = high > high[1] and
     high[1] > high[2] and
     high[2] > high[3]
// ... (更低低点的定义类似)

我们通过比较相邻K线的高点(或低点),用and运算符连接,来判断是否出现了连续三根K线创新高(或新低)的形态。判断结果存储在higherHighslowerLows这两个布尔“开关”变量中。下一步,利用这两个变量实现警报的可视化:

// 当警报条件发生时绘制文本
plotchar(higherHighs, char='',
     text="更高\n高点", textcolor=color.black)
// ... (更低低点的绘制类似)

我们调用plotchar(),当higherHighs为真时,在图表上绘制出黑色的文本。这里的\n是换行符,能让文本在显示时强制换行。然后,用完全相同的“开关”变量创建真正的警报:

// 创建实际的警报条件
alertcondition(condition=higherHighs,
     title="更高高点",
     message="连续三根K线创出更高高点。")
// ... (更低低点的警报创建类似)

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

高亮TradingView警报的更多方法

在图表上绘制文本只是高亮警报的一种方法,你还可以用其他多种方式实现可视化,甚至可以将它们组合使用:

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

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

小结

alertcondition()编写的警报,其触发历史默认不会在图表上留下任何痕迹,开发和验证都不方便。好在只需三个步骤即可自己实现警报的可视化:先用一个布尔变量定义警报逻辑;然后用这个变量和plotchar()在图表上绘制文本标记;最后用同一个变量创建alertcondition()警报,确保两者同步。请记住,由于实时行情和历史回测的计算机制不同,图表上的高亮标记数量可能与实际收到的实时警报数量有所不同,具体取决于你的警报触发频率设置。

赞(0)
未经允许不得转载:图道交易 » Pine Script(169):用文本和形状突出显示警报
分享到

评论 抢沙发

登录

找回密码

注册