策略警报在每次交易策略模拟订单成交时生成一条消息。通常这些消息每次都相同,但也可以包含有关策略的最新订单或市场持仓的信息。让我们看看如何实现。
持仓占位符是警报消息中的特殊字符串,当警报被触发时,TradingView 会用动态值替换这些占位符。
这些占位符是双括号之间的文本片段({{ 和 }})。例如 {{strategy.position_size}} 和 {{strategy.order.price}}。
持仓占位符返回有关策略的市场持仓和最近执行订单的信息。通过这些持仓占位符策略警报可以包含当前持仓和最近成交订单的相关信息。
一旦策略警报在模拟订单成交后立即触发,订单或持仓的动态数值会被填充到占位符
策略警报的持仓占位符:
接下来介绍如何使用这些持仓占位符。
策略警报可以以三种方式使用持仓占位符:
使用占位符的第一种方法是将它们输入到“创建警报”窗口中。这为策略警报提供了一种无需编写 Pine Script 代码的定制方法。只需要将一个策略脚本添加到图表中。然后打开图表的“创建警报”窗口。首先在“条件”字段中选择交易策略的名称。然后,在“消息”字段中,我们输入带有我们想要使用的占位符的警报消息。假设我们想要使用以下模板与警报消息:
{{strategy.order.action}} {{strategy.order.contracts}}x {{ticker}} @ {{strategy.order.price}}. Position now: {{strategy.market_position}} (previously: {{strategy.prev_market_position}}).
然后我们在“创建警报”窗口的“消息”字段中输入这段文本。然后点击“创建”按钮以启用警报:
当满足策略开平仓条件,策略警报会被触发,占位符被替换为真实的数值:
当在“创建警报”窗口中输入持仓占位符时,TradingView 将在每个警报消息中使用相同的文本模板。如果我们想为不同订单生成不同的消息,我们可以在订单函数中使用 alert_message 参数。我们稍后在本文中讨论这种方法。
使用占位符的第二种方法是在策略代码中使用特殊注释。该注释的值是 TradingView 用作“创建警报”窗口的“消息”字段的默认文本。
假设我们希望每次模拟订单成交时都收到以下模板的警报消息:
New signal: {{strategy.order.action}} {{ticker}} at {{strategy.order.price}}. Current position is {{strategy.market_position}} from {{strategy.prev_market_position}} earlier.
为了使这段文本成为默认的警报消息文本,我们在策略代码中的 //@strategy_alert_message 注释之后。
代码示例如下:
//@version=5
//@strategy_alert_message New signal: {{strategy.order.action}} {{ticker}} at {{strategy.order.price}}. Current position is {{strategy.market_position}} from {{strategy.prev_market_position}} earlier.
strategy(title="Position placeholders with alert comment", overlay=true)
// Other strategy code here...
注意:不能在 //@strategy_alert_message 注释中使用多行文本。这就是为什么示例只有一行文本的原因。
现在保存脚本并将其添加到图表中。然后打开图表的“创建警报”窗口。在这里,我们在“条件”字段中选择策略脚本的名称。随后“消息”字段将自动填充来自 //@strategy_alert_message 注释的文本。
下一步,等待模拟订单成交。TradingView 生成相应的警报时,警报消息将显示如下:
//@version=5
//@strategy_alert_message New signal: {{strategy.order.action}} {{ticker}} at {{strategy.order.price}}. Current position is {{strategy.market_position}} from {{strategy.prev_market_position}} earlier.
strategy(title="Position placeholders with alert comment", overlay=true)
// Calculate Bollinger Bands
[middleLine, upperBand, lowerBand] = ta.bb(close, 20, 2.0)
// Plot Bollinger Bands
plot(upperBand, color=color.teal, title="Upper Band")
plot(middleLine, color=color.gray, title="Middle line")
plot(lowerBand, color=color.teal, title="Lower Band")
// Go long when prices close above the upper Bollinger Band
if ta.crossover(close, upperBand)
strategy.entry("Enter Long", strategy.long)
// Go short when prices close above the upper Bollinger Band
if ta.crossunder(close, lowerBand)
strategy.entry("Enter Short", strategy.short)
// Close position when prices cross the Bollinger Bands' middle line
if ta.cross(close, middleLine)
strategy.close_all(comment="Exit Position")
使用 alert_message 参数是使用占位符的第三种方法。
在 alert_message 中使用位置占位符时,不同的订单函数可以生成不同的警报消息。这是上面讨论的另外两种方法所无法实现的。上述两种方法始终使用相同的警报消息模板来处理每个成交订单。
假设希望为入场订单使用特定的警报消息,而为退出订单使用不同的消息。由于有多头和空头入场订单,将警报消息放在一个变量中,以便轻松重复使用:
// 指定策略入场的警报文本
alertEntryText = "{{strategy.order.action}} {{strategy.position_size}} " +
"{{ticker}} at {{strategy.order.price}}."
这个 alertEntryText 字符串变量包含几个占位符。{{strategy.order.action}} 表示策略采取的订单操作('buy'或'sell')。{{strategy.position_size}} 是策略当前的持仓量。{{ticker}} 代表工具的符号。{{strategy.order.price}} 是订单的模拟成交价格。
为了在入场订单中使用该变量的消息,我们将策略的入场订单函数的 alert_message 参数设置为该变量:
// 生成入场交易
// 当价格穿过 Keltner 通道的上轨时多头进场
if ta.crossover(close, keltUpper)
strategy.entry("Enter Long", strategy.long,
alert_message=alertEntryText)
// 当价格穿过 Keltner 通道的下轨时空头进场
if ta.crossunder(close, keltLower)
strategy.entry("Enter Short", strategy.short,
alert_message=alertEntryText)
第一个 if 语句使用 ta.crossover() 函数查看价格是否穿过了 Keltner 通道的上轨。当价格穿过时,ta.crossover() 返回 true 时调用 strategy.entry() 函数来开启一个多头交易(strategy.long)。函数的 alert_message 参数就是我们刚刚创建的变量(alertEntryText)。
另一个 if 语句使用 ta.crossunder() 函数查看价格是否跌破了 Keltner 通道的下轨。在这种情况下,strategy.entry() 开启一个空头交易(strategy.short)。再次将 alert_message 参数设置为 alertEntryText 变量。
类似地,给退出订单设置一个警报消息。为此,我们设置关闭交易的订单函数的 alert_message 参数:
// 当价格穿过 Keltner 通道移动平均线时退出交易
if ta.cross(close, keltMa)
strategy.close_all(comment="Exit Position", alert_message="Closed " +
"{{strategy.prev_market_position}} {{ticker}} position at " +
"{{strategy.order.price}}.")
这个 if 语句使用 ta.cross() 函数查看收盘价是否穿过了 Keltner 通道的移动平均线。当发生时,strategy.close_all() 函数关闭策略的全部持仓。我们将该函数的 alert_message 参数设置为要使用的警报消息模板。
该文本包括策略的先前持仓({{strategy.prev_market_position}})、工具的符号({{ticker}})以及订单成交价格({{strategy.order.price}})。
为了创建可以触发的警报,我们将策略添加到图表中,然后打开“创建警报”窗口。在该窗口中,我们在“条件”字段中选择策略名称。
然后在“消息”字段中输入 {{strategy.order.alert_message}} 占位符。这告诉 TradingView 警报消息应包含我们在订单函数的 alert_message 参数中使用的文本。点击“创建”按钮以生成警报:
然后等待策略模拟一个订单成交。当发生时,我们会看到如下的警报消息:
//@version=5
//@strategy_alert_message {{strategy.order.alert_message}}
strategy(title="Position placeholders with order message example",
overlay=true)
// Calculate and plot Keltner Channel
[keltMa, keltUpper, keltLower] = ta.kc(close, 20, 1.75)
plot(keltUpper, color=color.blue, title="Upperband")
plot(keltMa, color=color.orange, title="Keltner MA")
plot(keltLower, color=color.blue, title="Lowerband")
// Specify the alert text for strategy entries
alertEntryText = "{{strategy.order.action}} {{strategy.position_size}} " +
"{{ticker}} at {{strategy.order.price}}."
// Go long when prices cross the Keltner Channel upper band
if ta.crossover(close, keltUpper)
strategy.entry("Enter Long", strategy.long,
alert_message=alertEntryText)
// Go short when prices cross the Keltner Channel lower band
if ta.crossunder(close, keltLower)
strategy.entry("Enter Short", strategy.short,
alert_message=alertEntryText)
// Exit trades when prices cross the Keltner Channel moving average
if ta.cross(close, keltMa)
strategy.close_all(comment="Exit Position", alert_message="Closed " +
"{{strategy.prev_market_position}} {{ticker}} position at " +
"{{strategy.order.price}}.")
现在我们知道了使用持仓占位符的三种方式,它们有如下特点
持仓占位符适用于所开仓或平仓交易的订单函数。这些函数包括
一些持仓占位符的名称以 'strategy.order' 开头。这可能会让人误以为这些占位符只适用于 strategy.order() 函数。但这是不正确的。持仓占位符适用于所有开平仓的函数。
由于策略警报触发的性质,持仓占位符包含订单成交后的信息。
当模拟订单在 K 线尚未关闭时成交时,警报消息中的占位符显示来自正在进行中的、尚未完成的价格柱的数据。无论策略的计算设置如何,这种行为都会发生。
持仓占位符可以返回不同于 Pine 脚本内置策略变量的数据。例如,{{strategy.position_size}} 位置占位符和 strategy.position_size 变量并不总是返回相同的信息。
这是由于时间流逝和事件顺序造成的。
默认情况下,策略每个 K 线计算一次,当 K 线关闭时。策略变量(如 strategy.position_size)在 K 线关闭事件期间更新。
但是,策略订单通常不会在关闭的 K 线上成交。相反,它会 K 线形成期间内执行。然而,一旦订单成交,在那一时刻策略的数据与上次 K 线关闭时的数据不同。
由于持仓占位符返回订单成交后的数据,其数据比每个 K 线更新一次的策略变量更为实时。推荐使用持仓占位符。
持仓占位符仅适用于策略警报。除了持仓占位符,策略警报还可以使用标准占位符和绘图占位符。这两种类型的占位符也可以被指标使用。
我们可以将持仓占位符与订单函数的 alert_message 参数一起使用。使得脚本代码生成的警报消息中可以提供实时信息。
如果在 alert_message 参数的文本中没有持仓占位符,订单的警报消息将包含策略创建订单的信息。但是当订单成交时,这些数据可能已经过时。相反,如果在警报消息中包含位置占位符,我们始终可以获得最新的订单和持仓信息。