量化 将 TradingView 的警报转化为交易策略

tradedge · 2024年04月24日 · 8 次阅读

当一个指标的警报识别出盈利的交易设置时,很快就会想知道该指标作为交易策略的表现如何。但是,如何将一个指标及其警报转化为适当的 TradingView 策略呢?

将 TradingView 警报转化为交易策略

TradingView 的警报是一个有用的工具,用于通知交易设置和市场状况。但有时有一个能够准确识别交易设置的警报。如果能够回测这些警报信号甚至进行交易,那该多好呢?

不幸的是,在撰写本文时,无法在 TradingView 策略中以编程方式生成警报。因此,所有代码触发的警报都发生在指标脚本内。但指标无法提交订单和管理市场头寸。(如果尝试在指标脚本中包含策略代码,TradingView 将触发“无法在研究脚本 (indicator script) 中使用策略函数”错误。)

因此,如果想在脚本生成警报的地方提交订单,需要将指标脚本转化为 TradingView 策略脚本。看看如何做到这一点。

从指标到 TradingView 策略的三个步骤

要在 K 线中生成的指标警报执行交易。需遵循以下三步:

  1. 在 TradingView 的 Pine Editor 中创建一个新的策略脚本。将指标代码复制到这个新脚本中。这样的原始代码保持不变,如果出现问题,随时可以返回到原来可执行的副本。
  2. 删除从指标脚本中复制过来的不必要的代码。由于策略无法生成警报条件,可以删除所有 alertcondition() 函数调用。如果不希望策略绘制值或着色图表的背景;在这种情况下,也删除该代码。
  3. 现在进行必要的代码调整,将清理后的指标代码转化为适当的交易策略:
    • strategy() 函数替换 indicator() 函数。
    • 使用 strategy.entry() 函数创建入场订单。由于在警报的条件执行交易,根据与指标代码中先前使用 alertcondition() 触发警报的相同条件执行此函数。
    • 两种方式平仓
      • 使用 strategy.close_all()strategy.close() 函数市价平仓。
      • 使用 TradingView 的 strategy.exit() 函数限价止损。

示例:将 TradingView 指标转化为交易策略

下面的示例指标基于布林带触发警报。在讨论其代码后,将其警报设置转化为策略提交的订单。

示例指标:触发布林带警报

下面的指标使用 20 根 K 线的布林带生成警报。这些带是基于 20 根 K 线的标准差的两倍加或减 20 根柱状图的简单移动平均线(SMA)而来。

该指标有 4 个警报条件:

  • 当 K 线的最低点触及布林带下轨道线但收盘价仍在轨道内时会发出买入信号。可以将这看作是强势,因为价格在布林带内“反击”。
  • 当 K 线的收盘价下穿布林带的中线时会发出多头卖出警报。这是在假设价格展现出足够的强势以突破那条 20 根 K 线移动平均线,但后来经历了弱势并跌破该线的情况。
  • 当 K 线的最高点触及或穿过布林带上轨道线,但 K 线仍在布林带内部收盘时会发出空头警报。可以将这解释为弱势,因为价格未能收盘在上布林带之外。
  • 当价格上穿移动平均线时会发出空头头寸平仓的警报。在这种情况下,价格最初经历了弱势,但后来恢复了足够的强势从下方穿过移动平均线。

这是该示例指标在图表上的样子:
示例指标:触发布林带警报

这段代码是指标的完整代码:

//@version=5
indicator(title="Bollinger bands alerts [indicator]", overlay=true)

// 输入选项
maLen  = input.int(20, title="SMA Length")
stdLen = input.int(20, title="StdDev Length")
offset = input.float(2.0, title="StdDev Offset")

// 计算数值
maValue = ta.sma(close, maLen)
stdValue = ta.stdev(close, stdLen)
upperBand = maValue + (stdValue * offset)
lowerBand = maValue - (stdValue * offset)

// 绘制数值
plot(maValue, color=color.teal)
plot(upperBand, color=color.red, linewidth=2)
plot(lowerBand, color=color.green, linewidth=2)

// 确定警报条件
buySignal = low <= lowerBand and 
     close >= lowerBand

sellSignal = ta.crossunder(close, maValue)

shortSignal = high >= upperBand and 
     close <= upperBand

coverSignal = ta.crossover(close, maValue)

// 创建警报条件
alertcondition(condition=buySignal,
     message="Touched the lower Bollinger band; go long")

alertcondition(condition=shortSignal,
     message="Touched the upper Bollinger band; go short")

alertcondition(condition=sellSignal or coverSignal,
     message="When long or short, close the open position")

// 使用彩色背景突出买入/卖出信号
backgroundColour = if buySignal
    color.new(color.green, 80)
else if shortSignal
    color.new(color.red, 80)

bgcolor(backgroundColour)

// 使用箭头突出退出警报
arrowType = sellSignal ? -1 :
     coverSignal ? 1 :
     na

plotarrow(arrowType, colorup=color.teal,
     colordown=color.orange, maxheight=15)

这段代码首先使用 indicator() 函数定义指标属性,然后设置输入选项。接下来计算指标的值,并在图表上绘制这些值。然后确定警报条件,并使用 alertcondition() 函数创建警报条件。接着通过彩色背景和箭头突出警报信号和退出信号。最后,使用 plotarrow() 函数在图表上显示箭头。

这段代码通过布林带指标的警报条件来触发买入、卖出、空头和平仓信号,以便进行交易。

将示例指标转换为 TradingView 策略

现在将上述示例指标转换为一个合适的 TradingView 策略。将使用之前讨论的相同三个步骤。

步骤 1:将指标代码复制到新的策略脚本

首先,在 Pine Editor 中创建一个新的策略脚本。然后将上面指标脚本的完整代码粘贴到新的策略脚本中。这样可以保留原始指标代码,以防出现问题时需要参考原始代码。

步骤 2:清理复制的代码

接下来,从新的策略脚本中删除任何不适用于策略的指标代码(如 alertcondition() 函数)。因此,可以从新的策略脚本中删除从原始指标复制过来的这些语句:

// 创建警报条件
alertcondition(condition=buySignal,
     message="Touched the lower Bollinger band; go long")

alertcondition(condition=shortSignal,
     message="Touched the upper Bollinger band; go short")

alertcondition(condition=sellSignal or coverSignal,
     message="When long or short, close the open position")

清理代码的第二步对于每个脚本都是不同的。因为还会删除不想在策略中使用的任何指标代码。

假设希望在同一张图表上同时使用新的策略脚本和现有的指标。在这种情况下,会从策略中删除所有绘制值和着色图表的指标代码。这意味着会删除这些 plot() 语句:

// 绘制数值
plot(maValue, color=color.teal)
plot(upperBand, color=color.red, linewidth=2)
plot(lowerBand, color=color.green, linewidth=2)

由于策略不会生成警报,还可以从策略脚本中删除以下代码,该代码在图表上突出显示警报:

// 使用彩色背景突出买入/卖出信号
backgroundColour = if buySignal
    color.new(color.green, 80)
else if shortSignal
    color.new(color.red, 80)

bgcolor(backgroundColour)

// 使用箭头突出退出警报
arrowType = sellSignal ? -1 :
     coverSignal ? 1 :
     na

plotarrow(arrowType, colorup=color.teal,
     colordown=color.orange, maxheight=15)

步骤 3:进行必要的代码调整

现在,必须调整复制的指标代码,使新的策略脚本成为一个合适的 TradingView 策略。需要做几件事情。

首先,将 indicator() 函数替换为 strategy() 函数。这意味着在示例指标中的这行:

//@version=5
indicator(title="Bollinger bands alerts [indicator]", overlay=true)

在策略脚本中变成以下内容:

//@version=5
strategy(title="Bollinger bands [strategy]", overlay=true)

然后用提交订单的代码替换警报条件。这样策略就可以根据警报设置进行交易。回想一下示例指标中编写的这些警报条件:

// 创建警报条件
alertcondition(condition=buySignal,
     message="Touched the lower Bollinger band; go long")

alertcondition(condition=shortSignal,
     message="Touched the upper Bollinger band; go short")

alertcondition(condition=sellSignal or coverSignal,
     message="When long or short, close the open position")

这段代码使用 4 个布尔变量来创建警报条件。为了将这些警报转化为买入和卖出指令,必须用适当的策略订单函数替换这些 alertcondition() 语句。

在指标中,buySignal 和 shortSignal 布尔变量触发了买入或卖出市场的警报。因此,在策略代码中使用相同的变量,但是让策略使用 strategy.entry() 函数开仓这些位置。

同样,sellSignal 和 coverSignal 布尔变量在原始指标中创建了关闭多头或空头头寸的警报。为了让策略执行这种行为,将上述 alertcondition() 语句转换为以下策略代码:

// 提交开仓订单
if buySignal
    strategy.entry("EL", strategy.long)

if shortSignal
    strategy.entry("ES", strategy.short)

// 提交平仓订单
if sellSignal
    strategy.close("EL")

if coverSignal
    strategy.close("ES")

第一个 if 语句检查 buySignal 变量是否为 true。如果使用 strategy.entry() 函数开仓一个名为 'EL' 的多头头寸(strategy.long)。

第二个 if 语句检查 shortSignal 变量是否为 true。如果是,strategy.entry() 函数将发起一个空头交易(strategy.short)。

第三个 if 语句检查 sellSignal 变量。如果为 true,则 strategy.close() 函数关闭所有带有 'EL' 名称持仓。

第四个和最后一个 if 语句评估 coverSignal 变量。如果这个变量为 true,则 strategy.close() 函数退出所有带有 'ES' 名称持仓。由于这是进入空头订单的名称,这将关闭任何持仓的空头头寸。

完整的策略代码

完成上述三个步骤后将得到一个基于指标生成的警报的完整策略。现在,策略可以在出现警报设置时提交订单。通过策略的表现,可以看到这些警报设置有多好地识别了盈利交易。

完整的策略代码如下:

//@version=5
strategy(title="Bollinger bands [strategy]", overlay=true)

// 输入选项
maLen  = input.int(20, title="SMA Length")
stdLen = input.int(20, title="StdDev Length")
offset = input.float(2.0, title="StdDev Offset")

// 计算数值
maValue = ta.sma(close, maLen)
stdValue = ta.stdev(close, stdLen)
upperBand = maValue + (stdValue * offset)
lowerBand = maValue - (stdValue * offset)

// 确定警报条件
buySignal = low <= lowerBand and 
     close >= lowerBand

sellSignal = ta.crossunder(close, maValue)

shortSignal = high >= upperBand and 
     close <= upperBand

coverSignal = ta.crossover(close, maValue)

// 提交开仓订单
if buySignal
    strategy.entry("EL", strategy.long)

if shortSignal
    strategy.entry("ES", strategy.short)

// 提交平仓订单
if sellSignal
    strategy.close("EL")

if coverSignal
    strategy.close("ES")

示例图表:使用 TradingView 策略交易警报条件

现在看看策略是否实际在指标识别的警报触发时进行平仓和平仓。下图是指标:

布林带 TradingView 脚本的示例图表

绿色背景表示买入信号有,红色则表示卖出警报。上箭头表示平仓空头头寸,下箭头表示平仓多头头寸。

将策略脚本添加到同一个图表中:
使用 TradingView 策略交易 Bollinger 带警报

在绿色背景之后,策略开启一个名为 'EL' 的多头头寸订单。当背景变为红色的那根 K 线后,会跟随一个名为 'ES' 的空头头寸订单,该订单在下一根 K 线开盘时成交。

当存在多头头寸时,在第一个下箭头后,策略会平仓。而策略处于空头头寸时,上箭头后会跟随一个平仓空头头寸订单。因此,策略成功地交易了指标识别的警报设置。

正如图表所示,策略订单会在指标条件被触发后的下一根 K 线中成交。这是因为 TradingView 策略是在历史 K 线的收盘价上计算的。然后,当在该计算过程中生成订单时,该订单可能在下一根柱子的开盘价上尽快成交。
换句话说:当一根 K 线收盘后,不能在该 K 线内进行交易。可以开仓的最早时间是下一根 K 线开始时。这种情况不会发生在指标类型的函数:当指标计算时,它可以立即着色图表的背景。它不必等到下一根柱子,因为着色背景不取决于市场活动。

另一个示例,看看指标和策略的行为。这里有一个只有指标的图表:
Bollinger 带警报脚本的示例图表

添加策略后,图表如下所示:

交易 Bollinger 带警报的 TradingView 策略的示例图表

可以看到与之前相同的行为:在绿色背景后多单开仓。在红色背景后空单开仓。在下箭头后多单平仓。看到的 2 份 contract 的 'EL' 订单是因为一份 contract 现有的空头平仓,另一份是用于多头开仓。

总结

当指标触发有利的交易设置警报时,可以将指标转换为策略,以查看警报信号的表现如何。将 TradingView 指标转换为策略有三个步骤。

  1. 首先,在 TradingView 的 Pine Editor 中创建一个新的策略脚本。将指标的代码复制到这个新的策略脚本中。这样可以保持原始代码完整。当策略出现问题并需要参考原始、有效代码时,这将大有帮助。
  2. 在第二步中,从新的策略脚本中删除所有不必要的代码。由于策略目前无法设置警报条件,因此可以删除从指标复制过来的所有 alertcondition() 语句。还可以删除策略中不打算使用的没用指标代码。
  3. 在第三步中,进行必要的调整,将指标的代码转换为策略。将 indicator() 替换为 strategy() 函数。然后使用指标用于触发警报的相同条件来开启和关闭策略头寸。使用 strategy.entry() 函数进行多头或空头开仓。使用 strategy.close_all()strategy.close() 市价平仓。strategy.exit() 函数使用止损或限价订单退出头寸。
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请 注册新账号