TradingView中带有标准占位符的动态策略警报
标准占位符是被双大括号{{...}}包裹的特殊文本。我们把它插入到警报消息中,当警报触发时,TradingView会自动将它们替换为相应的动态数据。这是在警报中包含当前价格、时间、成交量等信息的有效方法之一。本文我们专门探讨如何在策略警报中运用这些标准占位符。
常用的标准占位符速查
在策略警报消息中,可以使用以下标准占位符:
{{ticker}}:插入触发警报的交易品种代码。{{exchange}}:插入交易品种的交易所或数据源。{{interval}}:插入图表的时间周期。{{close}}:插入触发警报时K线的最新价格。{{open}}:插入触发警报时K线的开盘价。{{high}}:插入触发警报时K线的最高价。{{low}}:插入触发警报时K线的最低价。{{volume}}:插入触发警报时K线的成交量。{{time}}:插入触发警报时K线的开盘时间(UTC)。{{timenow}}:插入警报触发的确切时刻(UTC)。
在策略警报中使用标准占位符的三种方式
在策略警报中使用标准占位符,主要有以下三种途径:
- 在创建警报窗口的消息文本框中手动输入。
- 在代码中使用
//@strategy_alert_message特殊注释来预设全局消息。 - 在代码中为具体的订单函数,使用
alert_message参数来设置专属消息。
我们来逐一探索这三种方法。
方法一:在创建警报窗口中手动输入
第一种方法最为直接,它适用于任何策略且无需修改代码。只需把策略加载到图表,然后打开创建警报窗口即可。假设我们希望策略在每一次订单成交时,都能发出像下面这样的警报消息:
新的 {{strategy.order.action}} 信号,品种 {{exchange}}:{{ticker}},最新价格 {{close}}。
要实现这个效果,我们把策略加载到图表后,打开创建警报窗口。在该窗口中,先在条件下拉菜单里选择我们的策略名称,然后在消息文本框中输入上面设计好的、包含占位符的文本,最后点击创建按钮启用警报即可。

之后,当策略在实时行情中模拟成交了一笔订单,TradingView就会生成一条警报消息,其中所有的占位符都已被替换为最新的动态数据:


用这种方式创建的策略警报,缺点是每一次订单成交(无论开仓还是平仓)都会使用完全相同的消息文本(尽管占位符的值会动态变化)。如果希望不同的订单(例如开多仓和开空仓)能产生不同的警报消息,就需要用到订单函数中的alert_message参数了。不过在讨论那个方法之前,先来看看如何通过代码定制一个全局的默认警报消息。
方法二:用//@strategy_alert_message预设全局消息
第二种方法是在代码中直接使用//@strategy_alert_message这个特殊注释。它的作用是为整个策略定义一个默认的警报消息:当我们在创建警报窗口中选择该策略时,这个默认消息会自动填充到消息文本框中。这让配置警报更简单快捷,特别是当你需要在多个不同的品种或时间周期上使用相同的警报消息格式时。为了演示其工作原理,假设我们希望使用以下警报消息:
超级趋势(SuperTrend) {{strategy.order.action}} 信号,品种 {{exchange}}:{{ticker}},价格 {{close}}。
要把这段文本设为策略的默认警报消息,只需把//@strategy_alert_message注释以及其后的消息文本,添加到策略代码的任意位置即可(一个比较好的放置位置是在版本声明和strategy()函数之间)。我们需要在策略脚本中加入的这行代码是:
//@strategy_alert_message 超级趋势(SuperTrend) {{strategy.order.action}} 信号,品种 {{exchange}}:{{ticker}},价格 {{close}}。
除此之外,无需对策略代码做任何其他修改。完成代码修改并保存后,把策略加载到图表上,然后打开创建警报窗口,在条件下拉菜单中选择我们的策略。你会发现,消息文本框已经自动填充了我们在代码中通过//@strategy_alert_message预设好的文本。现在剩下的工作就只是点击创建按钮来启用警报了:

之后,一旦策略模拟成交了一笔订单,TradingView就会生成一条警报消息,其中所有的占位符都已被替换为最新的动态数据。这些消息看起来会是这个样子:


如果你对包含//@strategy_alert_message注释的完整策略代码感到好奇,可以参考下方的代码。(也可以跳过这部分,它不影响理解策略警报的工作原理。)
//@version=5
//@strategy_alert_message 超级趋势(SuperTrend) {{strategy.order.action}} 信号,品种 {{exchange}}:{{ticker}},价格 {{close}}。
strategy(title="带警报注释的标准占位符",
overlay=true, default_qty_type=strategy.percent_of_equity,
default_qty_value=15)
// 获取14周期的超级趋势指标值(ATR乘数为2.75)
[supertrend, stDirection] = ta.supertrend(2.75, 14)
// 绘制超级趋势线
plot(stDirection < 0 ? supertrend : na, color=color.green,
style=plot.style_linebr, linewidth=2, title="Up Trend")
plot(stDirection < 0 ? na : supertrend, color=color.red,
style=plot.style_linebr, linewidth=2, title="Down Trend")
// 当超级趋势方向改变时,提交做多和做空订单
if stDirection < 0 and stDirection[1] > 0
strategy.entry("Enter Long", strategy.long)
if stDirection > 0 and stDirection[1] < 0
strategy.entry("Enter Short", strategy.short)
我们来逐步拆解这段代码的逻辑。首先,脚本以//@version=5版本声明和我们刚刚讨论过的全局警报消息注释开始。接着,strategy()函数对策略做了一系列配置:title为策略命名;overlay=true使其直接叠加在主图上;default_qty_type和default_qty_value则设定了默认的订单数量为总权益的15%。
然后,我们通过ta.supertrend()函数计算超级趋势指标。该函数返回两个值:supertrend是指标线本身的价格,stDirection用于追踪趋势的方向(小于0代表上升趋势,大于0代表下降趋势)。
下一步是绘图。我们调用了两次plot(),通过条件运算符?:决定何时绘制绿色上涨趋势线、何时绘制红色下跌趋势线。当stDirection < 0(即处于上升趋势)时,绘制绿色的supertrend值,反之则不绘制;红色下跌趋势线的逻辑正好相反。
由于这种条件性绘图会产生不连续的数据,我们把绘图样式style设为plot.style_linebr(带断点的线图)。
最后是交易逻辑部分。我们用两个if语句来生成交易订单。第一个if语句判断超级趋势是否由下降转为上升(即stDirection从正数变为负数),条件满足时调用strategy.entry()建立多头仓位。第二个if语句的逻辑相反,用于捕捉趋势由上升转为下降的时刻并建立空头仓位。该策略加载到图表上的效果如下:

方法三:为具体订单设置专属的alert_message
这是在策略警报中使用标准占位符的第三种,也是最后一种方法:为具体的订单函数,使用alert_message参数来设置专属消息。这可以说是功能最强大、最灵活的策略警报生成方式,因为它允许我们为每一笔订单都指定独一无二的警报消息。通过这种方式,可以轻松让入场订单和出场订单显示完全不同的提示信息。要了解alert_message参数如何与标准占位符协同工作,我们分三步走:
- 先为入场订单创建一个包含占位符的警报消息字符串,并将其应用于所有的开仓订单。
- 然后为出场订单创建另一个不同的消息字符串,并将其应用于所有的平仓订单。
- 最后,在全局的
//@strategy_alert_message注释中嵌入一个特殊的{{strategy.order.alert_message}}占位符,把具体订单的消息拉取到最终的警报中。
为入场订单设置警报消息
首先,用一个字符串变量来定义所有入场订单共享的警报文本:
// 为所有新开仓的交易指定警报文本
alertEntryMessage = "新的MACD {{strategy.order.action}} 信号,品种 " +
"{{ticker}}。价格 {{close}},成交量 {{volume}}。"
这个alertEntryMessage变量的值包含了多个标准占位符。现在把它应用到策略的开仓订单中。为此,只需在调用strategy.entry()时,把alert_message参数赋值为刚刚创建的变量即可。假设我们的开仓逻辑如下:
// 当MACD在零轴上方金叉时,做多
if ta.crossover(macdLine, signalLine) and macdHist > 0
strategy.entry("Enter Long", strategy.long,
alert_message=alertEntryMessage)
// 当MACD在零轴下方死叉时,做空
if ta.crossunder(macdLine, signalLine) and macdHist < 0
strategy.entry("Enter Short", strategy.short,
alert_message=alertEntryMessage)
在第一个if语句中,当MACD快线(macdLine)上穿信号线(signalLine)并且MACD柱状图(macdHist)大于0时,条件成立,strategy.entry()会建立一个多头仓位。我们把它的alert_message参数设置为alertEntryMessage变量,这样每一笔多头开仓订单都会使用这条预设的消息。第二个if语句的逻辑类似,用于建立空头仓位,它也使用了相同的alertEntryMessage变量作为警报消息。
为出场订单设置警报消息
我们已经为入场订单设置好了警报消息,现在为出场订单也做同样的操作。首先,定义一个不同的消息字符串:
// 为所有平仓订单定义警报文本
alertExitMessage = "MACD平仓信号。在价格 {{close}} 平掉 {{ticker}} 的仓位。"
这个alertExitMessage变量包含了{{ticker}}和{{close}}这两个标准占位符。接下来把它应用于平仓订单。为此,编写如下的平仓逻辑代码:
// 当MACD柱状图连续三根K线下跌时,平掉多头仓位
if ta.falling(macdHist, 3)
strategy.close("Enter Long", comment="Exit Long",
alert_message=alertExitMessage)
// 当MACD柱状图连续三根K线上涨时,平掉空头仓位
if ta.rising(macdHist, 3)
strategy.close("Enter Short", comment="Exit Short",
alert_message=alertExitMessage)
在第一个if语句中,我们用ta.falling()判断MACD柱状图是否连续三根K线下跌。条件满足时,strategy.close()会平掉ID为”Enter Long”的订单,并且它的alert_message参数被设置为刚定义的alertExitMessage变量。第二个if语句的逻辑类似,用于平掉空头仓位,同样使用alertExitMessage变量。
为创建警报窗口创建模板
现在,我们已经为所有的开仓和平仓订单都设置了专属的alert_message,来添加最后一个能极大提升便利性的功能。使用alert_message参数有一个前提条件:当我们在创建警报窗口中为策略创建警报时,必须手动在消息文本框中输入{{strategy.order.alert_message}}这个特殊的占位符。它就像一个指令,告诉TradingView:不要使用全局消息,而是去拉取具体订单函数里alert_message参数定义的专属消息。如果不输入这个占位符,我们为每个订单精心设置的专属消息都会被忽略。然而,每次都手动输入这么一长串文本,不仅麻烦,而且非常容易被遗忘。为了避免这个麻烦,也为了方便策略的分享和使用,我们可以让策略自动完成这一步。为此,利用//@strategy_alert_message这个特殊注释,为策略创建一个全局的警报模板。只需把下面这行代码添加到策略中即可(比较好的放置位置是在版本声明和strategy()函数之间):
//@strategy_alert_message {{strategy.order.alert_message}}
这就告诉TradingView,这个策略的默认警报消息就是{{strategy.order.alert_message}}这个占位符本身。它的作用是,在警报触发时,自动拉取并显示我们在具体订单的alert_message参数中定义的专属消息。
启用策略警报
完成所有代码编写后,保存策略并将其加载到图表上,然后打开创建警报窗口,在条件下拉菜单中选择我们的策略名称。你会发现,消息文本框已经自动填充了{{strategy.order.alert_message}}这个占位符——这正是我们刚才通过//@strategy_alert_message注释实现的效果。现在剩下的工作就只是点击创建按钮,激活这个策略警报了:

完成这一切后,只需等待策略模拟成交一笔订单。届时,我们收到的警报消息,就会是之前为具体订单函数所定义的专属文本了:

完整的策略代码
如果你对前一个例子的策略实现细节感兴趣,可以参考下方的完整代码:
//@version=5
//@strategy_alert_message {{strategy.order.alert_message}}
strategy(title="带订单消息的标准占位符")
// 计算MACD指标值
[macdLine, signalLine, macdHist] = ta.macd(close, 12, 26, 9)
// 绘制MACD指标线
plot(macdLine, color=color.blue, title="MACD快线")
plot(signalLine, color=color.orange, title="信号慢线")
plot(macdHist, color=color.new(color.blue, 60),
style=plot.style_columns, title="MACD柱状图")
// 1. 为入场订单定义专属警报消息
alertEntryMessage = "新的MACD {{strategy.order.action}} 信号,品种 " +
"{{ticker}}。价格 {{close}},成交量 {{volume}}。"
// 2. 编写入场逻辑,并应用专属消息
// 当MACD在零轴上方金叉时,做多
if ta.crossover(macdLine, signalLine) and macdHist > 0
strategy.entry("Enter Long", strategy.long,
alert_message=alertEntryMessage)
// 当MACD在零轴下方死叉时,做空
if ta.crossunder(macdLine, signalLine) and macdHist < 0
strategy.entry("Enter Short", strategy.short,
alert_message=alertEntryMessage)
// 3. 为出场订单定义专属警报消息
alertExitMessage = "MACD平仓信号。在价格 {{close}} 平掉 {{ticker}} 的仓位。"
// 4. 编写出场逻辑,并应用专属消息
// 当MACD柱状图连续三根K线下跌时,平掉多头仓位
if ta.falling(macdHist, 3)
strategy.close("Enter Long", comment="Exit Long",
alert_message=alertExitMessage)
// 当MACD柱状图连续三根K线上涨时,平掉空头仓位
if ta.rising(macdHist, 3)
strategy.close("Enter Short", comment="Exit Short",
alert_message=alertExitMessage)
该策略代码的开头,在版本声明之后,是我们之前讨论过的//@strategy_alert_message注释,它为策略设定了全局的警报消息模板。这里它的值被设为{{strategy.order.alert_message}},这个特殊的占位符会告诉TradingView去拉取具体订单函数中alert_message参数所定义的专属消息。
接着,strategy()函数对策略进行了基本配置。ta.macd()函数负责计算MACD指标,一次性返回快线、慢线和柱状图三个值。我们用plot()把这三个值绘制到图表上,方便直观观察。
然后,我们定义了alertEntryMessage这个字符串变量,用于存放所有入场订单的专属警报消息。在随后的两个if语句中,定义了基于MACD金叉和死叉的开仓逻辑,并通过alert_message参数,把alertEntryMessage应用到了所有的strategy.entry()订单上。
之后,又定义了另一个字符串变量alertExitMessage,用于存放所有平仓订单的专属消息。在最后的两个if语句中,基于MACD柱状图的连续涨跌定义平仓逻辑,并通过alert_message参数,把alertExitMessage应用到了所有的strategy.close()订单上。
该策略加载到图表上的效果如下:

小结
标准占位符是我们可以插入到警报消息中的、被{{...}}包裹的特殊文本。当警报触发时,TradingView会自动把这些占位符替换为相应的动态值,例如{{ticker}}(品种代码)、{{volume}}(成交量)、{{close}}(价格)等。
在策略警报中,我们有三种方式可以使用这些标准占位符:
- 手动输入:在创建警报窗口的消息文本框中直接输入,最为灵活。
- 全局预设:在代码中使用
//@strategy_alert_message注释,设定一个全局的、包含占位符的默认警报消息。 - 专属消息:在具体的订单函数(如
strategy.entry())中使用alert_message参数,为不同类型的订单设置独有的、包含占位符的警报消息。这是功能最强大、最推荐的方式。


