量化 概述:常见的 TradingView 警报及如何通过 Pine 脚本编写

tradedge · 2024年04月23日 · 12 次阅读

编写自己的 TradingView 警报可以带来许多可能性和功能。这使得编写警报具有挑战性。因为我们如何将一个警报想法转化为 TradingView 代码,以生成一个 true/false 值来触发我们的警报呢?让我们通过探索常见的警报想法以及如何编写它们来找出答案。

使用不同条件编写 TradingView 警报

TradingView 警报是识别交易设置并生成市场通知的有用工具。为了编写自己的警报,我们必须将警报设置想法转化为 TradingView 的 alertcondition() 函数的真或假值。尽管这些步骤并不复杂,但是将警报想法转化为代码可能具有挑战性。

为了让这个过程变得更容易,本文将探讨数十种警报想法以及如何在TradingView Pine中编写它们。这不仅展示了如何编写特定的警报想法,还指出了我们可能尚未考虑的可能性。在本文中,我们将探讨的警报示例包括以下类别:

  • 大于和小于警报。
  • 交叉警报。
  • 通道警报。
  • 上升和下降移动警报。
  • 极端值警报。
  • 枢轴警报。
  • 基于上升和下降的警报。
  • 基于柱的警报。
  • 基于时间和日期的警报。

本文中的每个警报示例都将单独描述。当然,我们也可以将不同的警报要求组合成单个条件。接下来,我们将演示如何编写这些 TradingView 警报。

大于和小于警报

TradingView 警报中的一组警报是将当前值(如指标读数或收盘价)与预定义的固定值进行比较。这样,我们的代码在生成警报之前会检查数值是否超过了我们的阈值。让我们看看如何编写这些情况。

大于警报

大于警报发生在数据系列的当前值高于某个固定值时。这样我们就会收到一条通知,比如特斯拉的交易价格高于 250 美元,或者两条随机指标线都高于 20。

只要数据系列保持在预定义值以上,这种类型的警报就会触发。因此,当特斯拉保持在 250 美元以上时,我们会持续收到大于警报。这与交叉以上警报不同,后者仅在系列穿过某个值时触发。

我们使用 TradingView 的大于(>)比较运算符来编写大于警报。当我们想查看多个系列当前是否高于某个固定值时,我们使用 and 运算符。使用 or 运算符,我们检查是否发生了几种大于情况。

以下是如何编写大于警报的示例:

// 价格高于250美元的警报代码
priceAlert = close > 250

alertcondition(condition=priceAlert,
     message="价格高于250美元")

// 两条随机指标线均高于20的警报
stochK = ta.sma(ta.stoch(close, high, low, 14), 3)
stochD = ta.sma(stochK, 3)

stochAlert = stochK > 20 and stochD > 20

alertcondition(condition=stochAlert,
     message="随机指标 %K 和 %D 线均高于20")

// 收盘价或EMA高于29的警报
emaValue = ta.ema(close, 10)

alertTrigger = close > 29 or emaValue > 29

alertcondition(condition=alertTrigger,
     message="收盘价或EMA高于29")

小于警报

小于警报发生在数据系列的当前值低于某个固定值时。比如我们就可以为微软交易低于 75 美元或 MACD 柱状图低于 0.35 而同时该标的交易低于 20 美元时生成警报。

只要数据系列保持在预定义值以下,这种类型的警报就会触发。因此,当微软报价低于 75 美元时,我们的警报就会触发。这与交叉以下警报不同,后者仅在系列穿过某个值时触发一次。

我们使用小于(<)比较运算符来编写小于警报。要查看多个值是否低于某个阈值,我们将几个<比较与 and 运算符结合。使用 or 运算符,我们可以检查是否有任何几个值低于固定值。

以下是如何在 TradingView Pine 中编写小于警报的示例:

// 价格低于75美元的警报代码
priceAlert = close < 75

alertcondition(condition=priceAlert,
     message="价格低于75美元")

// 当MACD柱状图低于0.35且价格低于20美元时生成警报
[_, _, macdHistogram] = ta.macd(close, 12, 26, 9)

priceMacdAlert = macdHistogram < 0.35 and close < 20

alertcondition(condition=priceMacdAlert,
     message="MACD柱状图 < 0.35 且价格 < $20")


// 当前或前一个柱低于88美元时生成警报
lowsAlert = low < 88 or low[1] < 88

alertcondition(condition=lowsAlert,
     message="低点或前一低点低于$88")

在 TradingView Pine 中的交叉警报

另一组 TradingView 警报是交叉警报。这些警报发生在数据系列(如收盘价或指标数值)上下穿过某个值时。只有当发生这种交叉时,它们才会生成警报。这使它们比大于和小于警报更精确。

上穿警报

当数据系列的当前值上穿某个固定值时,会触发上穿警报。比如当图表的标的价格上涨到 50 美元以上或当成交量的简单移动平均线高于 10,000 时,我们会触发警报。

我们使用 TradingView 的ta.crossover()函数来编写这些情况。该函数接受两个参数。当前柱的收盘价格大于第二个参数指定价格且前一根 K 柱的收盘价小于第二个参数(形成上穿形态),函数返回 true。否则,如果没有形成上述交叉,ta.crossover() 返回 false。

编写上穿警报通常如下所示:

// 上穿固定值的警报代码
crossOverAlert = ta.crossover(close, 50)

alertcondition(condition=crossOverAlert,
     message="收盘价上穿$50")

// 当成交量上涨到10根柱简单移动平均线以上时触发警报
volSMA = ta.sma(volume, 10)

volAlert = ta.crossover(volSMA, 10000)

alertcondition(condition=volAlert,
     message="成交量简单移动平均线上穿10k")

下穿警报

当数据系列的值下穿某个固定值时,会触发下穿警报。这样,当比特币跌破 8500 美元或当相对强弱指标(RSI)低于 80 时,我们会收到通知。

我们使用ta.crossunder()函数编写这些警报。该函数接受两个参数。即第一个参数是当前 K 线的收盘价,小于第二个参数的指定数值,且前一根 K 线的收盘价大于第一个参数的指定数值,从而形成下穿形态,函数返回 true。如果没有这样的交叉,函数返回 false。

以下是如何在 TradingView 中编写这些警报的示例:

// 低于8500美元的下跌警报代码
priceBasedAlert = ta.crossunder(close, 8500)

alertcondition(condition=priceBasedAlert,
     message="收盘价跌破$8,500")

// 编写RSI下穿警报
rsiBelowAlert = ta.crossunder(ta.rsi(close, 12), 80)

alertcondition(condition=rsiBelowAlert,
     message="12根柱RSI低于80")

固定值的上下穿警报

当数据系列的当前值上涨到某个固定值以上或下跌到某个固定值以下时,会触发上下穿警报。比如当欧元/美元穿过 1.2000 或当相对强弱指标(RSI)穿过 50 时,我们会收到警报。

我们可以使用两个 TradingView 函数编写这样的警报。ta.crossover()函数在第一个参数上穿第二个参数时返回 true。而 ta.crossunder() 函数在第一个参数下跌到第二个参数以下时返回 true。当这些函数没有发生交叉时,返回 false。为了监视这两种类型的交叉,我们将这些函数与 or 运算符结合。

以下是在 TradingView 中编写这些警报的示例:

// 代码用于在穿过1.2000时触发警报
eurUSDcross = ta.crossover(close, 1.2000) or 
     ta.crossunder(close, 1.2000)

alertcondition(condition=eurUSDcross,
     message="收盘价刚刚穿过1.2000")

// 代码用于RSI穿过50水平的警报
rsiValue = ta.rsi(close, 12)
rsiAlert = ta.crossover(rsiValue, 50) or 
     ta.crossunder(rsiValue, 50)

alertcondition(condition=rsiAlert,
     message="RSI穿过50水平")

上穿警报

当一个数据系列上穿另一个数据系列时,会触发上穿警报。比如编写当标的收盘价上穿简单移动平均线或当成交量上涨到交易量指数移动平均线以上时的情况。

我们使用ta.crossover()函数编写这些警报。该函数接受两个参数。第一个参数在当前 K 线,大于第二个参数的指定数值,且在前一个柱上低于第二个参数时,ta.crossover() 返回 true。如果没有这样的交叉,函数返回 false。

以下是两个上穿警报的示例:

// 代码用于上穿简单移动平均线
smaCross = ta.crossover(close, ta.sma(close, 20))

alertcondition(condition=smaCross,
     message="收盘价上穿20根简单移动平均线")

// 代码用于成交量指数移动平均线上穿警报
volumeCross = ta.crossover(volume, ta.ema(volume, 12))

alertcondition(condition=volumeCross,
     message="成交量上穿其12根指数移动平均线")

下穿警报

当一个数据系列下穿另一个数据系列时,会触发下穿警报。比如在收盘价跌破 20 根指数移动平均线或低点跌破 10 根最低低点时触发警报。

我们使用ta.crossunder()函数编写这些警报。该函数同样接受两个参数。为了使该函数返回 true,当前 K 的第一个参数小于第二个参数,且前一根 K 数值大于第二个参数,从而形成下穿形态。如果没有这样的交叉,ta.crossunder() 返回 false。

以下是编写两个下穿警报的代码片段:

// 代码用于下穿指数移动平均线
emaCross = ta.crossunder(close, ta.ema(close, 20))
alertcondition(condition=emaCross,
     message="收盘价跌破20根指数移动平均线")

// 代码用于低点下穿10根最低低点的警报
lowCross = ta.crossunder(low, ta.lowest(low, 10)[1])
alertcondition(condition=lowCross,
     message="低点跌破10根最低低点")

在 TradingView Pine 中的基于通道的警报

基于通道的警报在数值在交易范围内移动、保持在交易区间内或突破范围时生成通知。让我们看看如何编写这些警报设置。

进入通道警报

进入通道警报发生在数据系列移动到由固定上限和下限值定义的通道内时。比如当以太坊进入 440 美元至 490 美元的交易范围时,我们会收到警报。或者当相对强弱指标(RSI)离开超买和超卖水平,进入 20 至 80 范围时,我们会收到警报。

要编写这些情况,我们使用 TradingView 的 ta.crossover()ta.crossunder() 函数。第一个函数在其第一个参数上穿第二个参数时返回 true。第二个函数在其第一个参数下跌到第二个参数以下时返回 true。当这些函数没有发生交叉时,它们返回 false。通过将这些函数与 or 运算符结合,我们监视数值是从上方还是从下方进入范围。

以下是如何编写进入通道警报的示例:

// 当标的价格进入440美元和490美元的交易范围时触发警报
insideRange = ta.crossover(close, 440) or 
     ta.crossunder(close, 490)

alertcondition(condition=insideRange,
     message="价格移动到$440-$490范围内")

// 创建一个警报,当RSI进入20-80范围时触发
rsiValue = ta.rsi(close, 14)
rsiAlert = ta.crossover(rsiValue, 20) or 
     ta.crossunder(rsiValue, 80)

alertcondition(condition=rsiAlert,
     message="RSI进入20-80范围内")

离开通道警报

离开通道警报在数据系列移出由固定上限和下限值定义的通道时触发。比如当比特币离开 8500 美元至 9000 美元的交易范围时,或者当成交量超出 1 万至 2 万的范围时,我们会收到警报。

我们使用 TradingView 的 ta.crossover() 和 ta.crossunder() 函数来编写这些条件。第一个函数在其第一个参数上穿第二个参数时返回 true(否则返回 false)。第二个函数在其第一个参数小于第二个参数时返回 true,否则返回 false。为了检查数值是否接近上限或下限离开通道,我们将这些函数与 or 运算符结合。

我们编写离开通道警报如下:

// 当比特币移出8500美元至9000美元的交易范围时触发警报
outsideRange = ta.crossover(close, 9000) or 
     ta.crossunder(close, 8500)

alertcondition(condition=outsideRange,
     message="交易超出$8,500-$9,000范围")
// 当成交量移出1万至2万范围时触发警报
volumeAlert = ta.crossover(volume, 20000) or
     ta.crossunder(volume, 10000)

alertcondition(condition=volumeAlert,
     message="成交量移出1万-2万范围")

通道内警报

通道内警报在数据系列处于由固定上限和下限值定义的通道内时触发。当数值保持在范围内时,通道内警报会频繁触发。

为了编写通道内警报,我们检查系列的值是否小于等于通道的上限并大于等于下限。由于这两个比较都必须为真,我们将它们与 TradingView 的 and 运算符结合。

以下是在 TradingView 代码中编写通道内警报的示例:

// 当工具在230-250之间交易时触发警报
priceRange = close >= 230 and
     close <= 250

alertcondition(condition=priceRange,
     message="工具在$230-$250之间交易")

// 代码用于在1,500-2,500范围内的移动平均线触发警报
emaValue = ta.ema(close, 50)
emaAlert = emaValue >= 1500 and 
     emaValue <= 2500

alertcondition(condition=emaAlert,
     message="EMA在1,500和2,500之间")

通道外警报

通道外警报在数据系列在由固定上限和下限值定义的通道之外时触发。这样,当微软保持在 250 美元至 330 美元的范围之外时,或者当随机指标%K线超出 20 至 80 的范围时,我们会收到警报。

只要数值保持在通道之外,通道外警报就会触发。这与离开通道警报不同,后者仅在数值离开通道时触发。

我们使用 TradingView 的 or 运算符将一个系列的值是否大于(>)通道的上限或小于(<)通道的下限的检查结合起来,编写通道外警报。

因此,我们在 TradingView 中编写通道外警报如下:

// 创建一个警报,当工具保持在250-330美元范围之外时触发
priceAlert = close > 330 or 
     close < 250

alertcondition(condition=priceAlert,
     message="交易超过$330或低于$250")
// 代码用于当随机指标%K线超出20-80范围时触发警报
stochK = ta.sma(ta.stoch(close, high, low, 14), 3)

stochAlert = stochK > 80 or
     stochK < 20

alertcondition(condition=stochAlert,
     message="随机指标%K线超过80或低于20")

在 TradingView 中的上涨和下跌移动警报

TradingView 中关注价格波动的警报包括上涨和下跌警报。当数值在指定数量的柱中以一定量移动时,这些警报会触发。比如我们可以在以太坊在 10 根柱中下跌 75 美元或 RSI 在 3 根柱中下降 20 点时收到警报。让我们看看如何设置这些警报。

上涨移动警报

当数据系列在指定数量的柱中以一定固定量上涨时,上涨移动警报会触发。比如当比特币在 10 根柱中上涨 100 美元或 EMA 在过去 20 根柱中上涨 10 点时,我们会收到警报。

要编写这些警报,我们首先从最近 n 根柱中的数据系列值中减去其最低值。我们使用 TradingView 的ta.lowest()函数获得后一值。因此,当标的的最近收盘价为 23.98,其 10 根柱中的最低收盘价为 21.43 时,我们知道价格在 10 根柱中移动了 2.55 点。第二步是检查该差值是否大于或等于警报触发水平。

因此,我们像这样编写上涨移动警报:

// 当价格在10根柱中增加$100时触发警报
priceChange = close - ta.lowest(close, 10) >= 100

alertcondition(condition=priceChange,
     message="价格在最近10根柱中增加了$100")

// 代码用于在最近20根柱中EMA增加10点时触发警报
emaValue = ta.ema(close, 30)
emaAlert = emaValue - ta.lowest(emaValue, 20) >= 10

alertcondition(condition=emaAlert,
     message="EMA在最近20根柱中增加了10点")

下跌移动警报

当数据系列在指定数量的柱中以一定固定量下跌时,下跌移动警报会触发。比如在以太坊在 5 根柱中下跌 50 美元或 EMA 在过去 5 根柱中下跌 25 点或更多时收到警报。

要编写这些警报,我们首先需要通过ta.highest()函数获取指定数量的柱中数据系列的最高值。然后我们检查该差值是否大于或等于我们预期的下跌量。例如,以太坊的 10 根柱最高价为 483 美元,当前价格为 430 美元。在这种情况下,价格在 10 根柱中下跌了 53 美元,这会触发我们设置的 10 根柱中价格下跌 50 美元的警报。

以下是如何在正确的 TradingView 代码中编写这些警报:

// 当价格在5根柱中下跌50美元时触发警报
priceChange = ta.highest(close, 5) - close >= 50

alertcondition(condition=priceChange,
     message="价格在5根柱中下跌了$50")

// 当EMA在5根柱中下跌25点时触发警报
emaValue  = ta.ema(close, 12)
emaChange = ta.highest(emaValue, 5) - emaValue >= 25

alertcondition(condition=emaChange,
     message="EMA在5根柱中下跌了25点")

上涨移动百分比警报

当数据系列在指定数量的柱中以一定百分比上涨时,上涨移动百分比警报会触发。例如在苹果股价在 30 根柱中上涨超过 20% 或移动平均线在 15 根柱中上涨 10% 时收到警报。

要设置这些警报,我们首先获取最近柱中的最低值。我们使用 ta.lowest() 函数获取该值。然后,我们将当前值与最低值进行比较,以获取百分比的变化。接下来,我们查看该百分比是否大于或等于警报触发的值。

因此,编写上涨移动百分比警报如下:

// 当价格在30根柱中上涨20%时触发警报
lowClose   = ta.lowest(close, 10)
percChange = ((close - lowClose) / lowClose) * 100
percAlert  = percChange >= 3

alertcondition(condition=percAlert,
     message="价格在最近30根柱中上涨了20%")

// 代码用于在15根柱中移动平均线上涨10%时触发警报
smaValue  = ta.sma(close, 20)
lowestSMA = ta.lowest(smaValue, 15)
smaChange = ((smaValue - lowestSMA) / lowestSMA) >= 0.10

alertcondition(condition=smaChange,
     message="SMA在最近15根柱中上涨了10%")

下跌移动百分比警报

当数据系列在指定数量的柱中以一定百分比下跌时,下跌移动百分比警报会触发。例如瑞波加密货币在 30 根柱中下跌 20% 或成交量的移动平均值在 7 根柱中下跌 35% 时,我们会收到警报。

要设置这些警报,我们首先获取最近柱中的最高值。我们使用 TradingView 的 ta.highest() 函数获取该值。然后,我们将当前值与最高值进行比较,以确定百分比的变化。然后我们检查该百分比是否大于或等于警报触发的预定义值。

以下是在 TradingView 代码中编写下跌移动百分比警报的示例:

// 当价格在30根柱中下跌20%时触发警报
highValue  = ta.highest(close, 30)
percChange = (close - highValue) / highValue <= -0.20

alertcondition(condition=percChange,
     message="价格在最近30根柱中下跌了20%")

// 代码用于平均成交量下降的警报
avgVol    = ta.sma(close, 12)
volHigh   = ta.highest(avgVol, 7)
volChange = (volume - volHigh) / volHigh <= -0.35

alertcondition(condition=volChange,
     message="平均成交量在最近7根柱中下降了35%")

在 TradingView 中的极值警报

另一种 TradingView 警报是基于极值数值触发的警报,例如最高值和最低突破。让我们看看如何在 TradingView 中创建这些警报。

最高值警报

当数据系列达到指定数量的柱中的最高值时,最高值警报会触发。比如当成交量达到 10 根柱的最高值或收盘价在 30 根柱中达到最高值时,我们会收到警报。

我们使用 ta.highest() 来编写这些警报。该函数可以在两个参数上运行:要从中获取最高值的数据系列以及要计算的柱数(TradingView,n.d.)。一旦我们获得了极值,我们就会在触发警报之前检查当前值是否等于该最高值。

以下是如何在 TradingView Pine 中编写最高值警报的代码:

// 创建一个10根柱成交量警报
volumeAlert = volume == ta.highest(volume, 10)

alertcondition(condition=volumeAlert,
     message="达到了10根柱的最高成交量")

// 创建一个30根柱价格警报
priceAlert  = close == ta.highest(close, 30)

alertcondition(condition=priceAlert,
     message="收盘价达到了30根柱的最高值!")

最低值警报

当数据系列达到指定数量的柱中的最低值时,最低值警报会触发。比如在最低价达到新的 20 根柱最低价或商品通道指数(CCI)触及其 30 根柱最低值时收到警报。

我们在 TradingView Pine 中使用 ta.lowest() 函数实现这一点。该函数可以使用两个参数:要从中获取最低值的数值系列以及要计算的柱数(TradingView,n.d.)。一旦我们获得了最低值,我们就会检查当前柱的值是否等于该最低值。

以下是如何在我们的 TradingView 脚本中编写这些代码:

// 创建一个20根柱最低价警报
lowestLow = low == ta.lowest(low, 20)

alertcondition(condition=lowestLow,
     message="达到了20根柱的最低价!")

// 创建一个CCI最低值警报
cciValue  = ta.cci(close, 10)
lowestCCI = cciValue == ta.lowest(cciValue, 30)

alertcondition(condition=lowestCCI,
     message="达到了30根柱的CCI最低值")

最高值突破警报

当数据系列突破了指定数量的柱中的最高值时,最高值突破警报会触发。这样,当收盘价突破了 20 根柱的最高收盘价或成交量创下了 50 根柱的新高时,我们会收到警报。

最高值突破警报仅在数值突破 n 根柱的高点时触发。这与最高值警报不同,后者在数值达到(即匹配)最高值时也会触发。

为了编写最高值突破警报,我们使用 ta.highest() 函数。该函数接受两个参数:从中获取最高值的数值系列以及要计算的柱数(TradingView,n.d.)。我们使用历史引用运算符 ([])将 ta.highest() 返回的值向前偏移一个柱。这样我们就可以得到前几根柱中的最高值,而不包括当前柱的数据。

因此,我们编写这些警报如下:

// 创建一个20根柱最高收盘价警报
closeBreakout = close > ta.highest(close, 20)[1]

alertcondition(condition=closeBreakout,
     message="收盘价突破了20根柱的最高收盘价!")

// 创建一个50根柱成交量突破警报
volumeBreakout = volume > ta.highest(volume, 50)[1]

alertcondition(condition=volumeBreakout,
     message="成交量超过了50根柱的最高值!")

最低值突破警报

当数据系列突破了指定数量的柱中的最低值时,最低值突破警报会触发。这会在价格跌破其 10 根柱最低价或随机指标%K线低于其 10 根柱最低值时触发警报。

与最低值警报相比,最低值突破警报仅在数值明显跌破 n 根柱的最低值时触发 - 仅仅达到最低值并不足以触发最低值突破警报。

我们使用 ta.lowest() 函数编写最低值警报。该函数接收两个参数:从中获取最低值的数值系列以及要计算的柱数(TradingView,n.d.)。为了查看当前柱值是否低于最低值,我们使用历史引用运算符 ([]) 将 ta.lowest() 向过去偏移一个柱。这样我们就可以得到前几根柱中的最低值,而不包括当前柱的数据。

我们编写这些警报如下:

// 创建一个20根柱最低价警报
lowLowAlert = low < ta.lowest(low, 20)[1]

alertcondition(condition=lowLowAlert,
     message="最低价跌破了20根柱的最低价!")

// 触发一个10根柱最低随机指标%K值的警报
stochK    = ta.sma(ta.stoch(close, high, low, 14), 3)
stchAlert = stochK < ta.lowest(stochK, 10)[1]

alertcondition(condition=stchAlert,
     message="随机指标%K线低于10根柱的最低值")

枢纽 Pivot 警报

另一组警报是枢纽警报。这些警报可以基于最近的中间摆动高点或低点触发。

枢纽高点和低点是滞后数值。要查看是否发生了摆动高点或低点,TradingView 会观察中间高点或低点前后的柱是如何发展的。这是有道理的:我们只有在之后的价格下跌时才知道柱形成了新的顶部。而且只有在之后的价格上涨时,柱才能形成底部。
虽然枢纽是考虑最近摆动高点和低点的好方法,但它们的滞后性使它们不适合作为独立的警报。

枢纽高点警报

通过枢纽高点警报,我们可以基于数据系列中的枢纽摆动高点触发警报。这样,我们可以在摆动枢纽高点高于 50 美元或先前的摆动高点高于当前移动平均值时触发警报。

为了编写这些警报,我们使用 ta.pivothigh() 函数,该函数返回最近枢纽高点的值(如果当前柱没有枢纽高点,则函数返回 na)。ta.pivothigh() 函数使用三个参数。第一个是我们要检查摆动高点的数值。第二和第三个参数是枢纽高点之前和之后的柱数(TradingView,n.d.)。

我们可以这样编写枢纽高点警报:

// 编写一个警报,检查最近的摆动
// 枢纽高点是否高于50
pivHigh = ta.pivothigh(high, 3, 3)

priceAlert = pivHigh > 50

alertcondition(condition=priceAlert,
     message="3根柱前的枢纽高点大于50")

// 当摆动枢纽高点高于10根柱SMA时触发警报
smaValue = ta.sma(close, 10)[5]
pivHigh  = ta.pivothigh(high, 5, 5)

smaAlert = pivHigh > smaValue

alertcondition(condition=smaAlert,
     message="SMA穿过了5根柱前的摆动枢纽高点")

枢纽低点警报

枢纽低点警报基于数据系列中的摆动枢纽低点触发。例如在特斯拉的最低价低于 330 美元或商品通道指数(CCI)先前的摆动低点低于 -200 时触发警报。

我们使用ta.pivotlow()来编写这些警报。该函数要么返回一定数量柱之前的最近枢纽低点,要么在当前柱找不到枢纽低点时返回 na。ta.pivotlow() 函数有三个参数。第一个是要检查的数值系列。第二和第三是我们想要在枢纽低点之前和之后看到的柱数(TradingView,n.d.)。

我们可以这样将枢纽低点添加到 TradingView 警报中:

// 当最近的摆动枢纽
// 低点低于330时触发警报
swingLow = ta.pivotlow(low, 5, 5)

swingAlert = swingLow < 330

alertcondition(condition=swingAlert,
     message="最近的枢纽低点低于$330")

// 当CCI中最新的摆动枢纽低点
// 低于-200时触发警报
cciValue = ta.cci(close, 20)
cciLow   = ta.pivotlow(cciValue, 5, 5)

cciSwingAlert = cciLow < -200

alertcondition(condition=cciSwingAlert,
     message="最近的CCI摆动低点低于-200")

在 TradingView 中基于上升和下降的警报

另一组 TradingView 警报是检查数值在几个柱中是如何发展的。例如数值在过去三个柱中是否上升,或者是否有 5 个较低的收盘价。让我们看看如何编写这些代码。

上升警报

上升警报在数据系列在一定数量的柱中上升时通知我们。例如我们可以在过去 3 个柱中标普 500 指数上涨或者在过去 5 个柱中 RSI 上升时生成警报。

通过上升警报,我们寻找数据系列在几个柱中是否上涨,但不要求连续增长的柱。

使用ta.rising()来编写这些警报。该函数有两个参数:要检查的数值系列和要寻找上升值的柱数。当当前值大于指定数量柱的任何值时,ta.rising() 返回 true(TradingView,n.d.)。因此,如果我们对收盘价连续 3 根柱运行此函数,当当前收盘价高于最近 3 根收盘价中的任何一根时,它将返回 true(否则 ta.rising() 返回 false)。

我们可以这样编写上升警报:

// 当图表的工具
// 在最近的3个柱中上涨时触发警报
closeRise = ta.rising(close, 3)

alertcondition(condition=closeRise,
     message="最近3根柱中的收盘价上涨")

// 当RSI高于过去5个柱中的任何RSI值时触发警报
rsiValue = ta.rsi(close, 12)
rsiRise  = ta.rising(rsiValue, 5)

alertcondition(condition=rsiRise,
     message="RSI值高于过去5根柱中的任何值")

下降警报

下降警报是在数据系列在一定数量的柱中下降时触发的。比如我们可以为最近三个柱中的较低收盘价或最近 5 个柱中的 MACD 线下降触发警报。

通过下降警报,我们寻找当前值是否低于过去 n 个柱中的任何值。在这个警报中,我们不要求连续的较低值。

我们使用ta.falling()来编写这些警报。该函数有两个参数:要检查的数值系列和要寻找下降值的柱数。当当前值低于指定数量柱的任何值时,它返回 true(TradingView,n.d.)。否则,它返回 false。

以下是我们如何编写下降警报:

// 触发最近3根K 线中的较低收盘价警报
closeFall = ta.falling(close, 3)

alertcondition(condition=closeFall,
     message="低于最近3根K 线中的任何收盘价")

// 触发当MACD线在最近5根K 线中
// 达到最低值时的警报
[macdLine, _, _ ] = ta.macd(close, 12, 26, 9)

macdFall = ta.falling(macdLine, 5)

alertcondition(condition=macdFall,
     message="MACD线达到了最近5根K 线中的最低值")

连续上升警报

连续上升警报发生在数据系列连续上升一定数量的 K 线时。这样,我们为连续三个较高的收盘价或连续 5 个较高的 RSI 值编写警报。

为了编写连续上升警报,我们使用三个代码元素。第一个是大于(>)运算符,当其左侧的值大于右侧的值时返回 true。另一个是历史引用运算符([]),用于获取以前 K 线的值。然后,我们将这两个元素与 TradingView 的 and 运算符结合使用,以查看是否连续几个 K 线存在大于的模式。

为了更容易编写连续上升,我们也可以使用自定义函数。这样,我们就不必编写长语句来检查每个 K 线的值是否大于其前一个值。

以下是我们如何在 TradingView 中编写连续上升警报:

// 当工具的收盘价连续上涨
// 三根K 线时触发警报
higherCloses = close > close[1] and 
     close[1] > close[2] and 
     close[2] > close[3]

alertcondition(condition=higherCloses,
     message="工具连续三根K 线的收盘价更高")

// 当RSI连续5根K 线上涨时触发警报
rsiValue = ta.rsi(close, 12)

rsiIncreased = ConsecRises(rsiValue, 5)

alertcondition(condition=rsiIncreased,
     message="RSI连续五根K 线上涨")

连续下降警报

连续下降警报发生在数据系列连续下降一定数量的 K 线时。这样,我们为连续 5 个较低的收盘价或连续三根 K 线中下降的成交量触发警报。

我们使用三个代码元素来编写连续下降警报。第一个是小于(<)运算符,当其左侧的值小于右侧的值时返回 true。另一个是历史引用运算符([]),用于从以前的 K 线中检索值。然后,我们将这两个元素与 and 运算符结合使用,以查看连续几个 K 线是否存在小于的模式。

尽管这种方法效果不错,但有时会产生许多比较的长语句。在这种情况下,我们可以通过自定义函数获得更清晰的代码(请参见下面的示例)。

以下是我们如何编写连续下降警报:

// 当系列连续下降
// 一定数量的K 线时返回true
ConsecDrops(series, length) =>
    lower = true
    for i = 0 to length - 1
        lower := lower and (series[i] < series[i + 1])
    lower

// 触发连续5个较低的收盘价警报
lowerCloses = ConsecDrops(close, 5)

alertcondition(condition=lowerCloses,
     message="连续五个较低的收盘价")

// 当标的成交量连续三根K 线下降时触发警报
lowerVolume = volume < volume[1] and 
     volume[1] < volume[2] and 
     volume[2] < volume[3]

alertcondition(condition=lowerVolume,
     message="连续三根K 线的较低成交量")

基于 K 线的 TradingView 警报

另一种触发 TradingView 警报的方式是包含 K 线信息本身,比如仅在几根 K 线之前发生某种情况时触发警报。让我们看看如何创建这些警报。

K 线数自上次警报以来

K 线数自上次警报以来是在特定情况发生后一定数量的 K 线之后触发的警报。这样,我们可以编写在 3 根 K 线之前发生移动平均线交叉时触发的警报,或者在价格达到新的 20 根 K 线高点超过 4 根 K 线之后触发的警报。

使用 K 线数自上次警报以来的警报与其他条件结合时,其优势变得更加明显。通过 K 线数自上次,我们可以要求例如在最近 3 根 K 线中发生价格突破,并且当前 K 线仍高于突破水平之前才生成警报。

我们使用 ta.barssince() 来编写 K 线数自上次警报以来的警报。该函数有一个参数:一个真/假条件。然后返回自上次该条件为真的 K 线数(TradingView,n.d.)。

以下是编写这些警报的样式:

// 当移动平均线交叉发生在3根K 线之前时触发警报
maCross = ta.crossover(ta.sma(close, 10), ta.ema(close, 30))

recentMAcross = ta.barssince(maCross) == 3

alertcondition(condition=recentMAcross,
     message="移动平均线交叉发生在3根K 线之前")

// 编写一个警报,当标的高价达到新的20根K 线高点,且距离当前 K 线至少5根K 线以上
newHigh = high == ta.highest(high, 20)

recentNewHigh = ta.barssince(newHigh) >= 5

alertcondition(condition=recentNewHigh,
     message="标的高价达到新的20根K 线高点,且距离当前 K 线至少5根K 线以上")
### 最高K 线警报
最高K 线警报使用了先前K 线中达到最高值的数据。例如最高收盘价的K 线的RSI高于80时,我们可以触发警报。或者当具有最高EMA值的K 线交易量高于10,000时触发警报。

我们使用**ta.highestbars()**函数编写这些警报,该函数返回指定数据系列和长度的K 线中具有最高值的K 线的偏移量(TradingView,n.d.)。该函数可以使用两个参数:要检查最高值的数据系列和要回溯的K 线数。这样,ta.highestbars(high, 10)回溯到最近的10根价格K 线,并返回高价何时达到最高值的K 线数。然后,我们可以使用该偏移量从发生10根K 线高点的K 线中获取信息。

编写最高K 线警报如下:

```pine
// 编写一个警报,当最近
// 10根K 线的最高收盘价的RSI值超过80时触发
barOffset = ta.highestbars(close, 10)
rsiValue  = ta.rsi(close, 12)[barOffset]

rsiAlert = rsiValue > 80

alertcondition(condition=rsiAlert,
     message="最近10根K 线的最高收盘价的RSI值超过80")

// 触发一个警报,当最高EMA值伴随着超过10k的成交量时
barsAgo = ta.highestbars(ta.ema(close, 10), 5)

volumeAlert = volume[barsAgo] > 10000

alertcondition(condition=volumeAlert,
     message="最近5根K 线的最高EMA的成交量超过10k")

最低 K 线警报

最低 K 线警报使用了先前 K 线中达到最低值的数据。这使得我们可以在最低低价 K 线的成交量低于 10 根 K 线成交量 SMA 时生成警报。或者当最低 10 根 K 线成交量的 K 线收盘价更低时触发警报。

我们使用 ta.lowestbars() 来编写这些警报。该函数返回指定数据系列和长度的 K 线中具有最低值的 K 线的偏移量(TradingView,n.d.)。该函数可以使用两个参数:要检查最低值的数据系列和要回溯的 K 线数。这意味着 ta.lowestbars(close, 10) 回溯到最近的 10 根价格 K 线,并返回何时收盘价达到最低值的 K 线数。有了这个偏移量,我们可以从发生 10 根 K 线最低收盘价的 K 线中获取信息。

以下是我们如何在 TradingView 中编写最低 K 线警报:

// 编写一个警报,当具有最低低价的K 线的成交量低于其10根K 线SMA时触发
barsBack = ta.lowestbars(low, 10)
volSMA   = ta.sma(volume, 10)

lowVolume = volume[barsBack] < volSMA[barsBack]

alertcondition(condition=lowVolume,
     message="最低低价K 线的成交量低于SMA")

// 触发一个警报,过去10根K 线最低成交量K 线也有更低的收盘价时
barsAgo = ta.lowestbars(volume, 10)

lowerClose = close[barsAgo] < close[barsAgo + 1]

alertcondition(condition=lowerClose,
     message="最低成交量K 线也有更低的收盘价!")

偏移警报

偏移警报使用了向右移动一定数量的 K 线的数据(即,向未来价格 K 线)。比如我们可以编写警报,当 K 线的收盘价越过 10 根 K 线前的 EMA 时触发。或者当 10 根 K 线偏移 EMA 上穿常规 20 根 K 线 SMA 时触发警报。

为了编写这些警报,我们使用历史运算符 ([])。在这些方括号([和])之间,我们指定一个整数。这样,我们可以将一系列值向右移动一定数量的 K 线。

以下是我们如何在 TradingView 中编写偏移警报:

// 当收盘价上穿10根K 线前的EMA值时触发警报
emaOff = ta.ema(close, 25)[10]
emaCross = ta.crossover(close, emaOff)
alertcondition(condition=emaCross,
     message="收盘价上穿10根K 线的EMA")

// 为两个偏移移动平均线交叉编写警报
maQuick = ta.ema(close, 10)[5]
maSlow  = ta.sma(close, 20)[5]
maCross = ta.crossover(maQuick, maSlow) or 
     ta.crossunder(maQuick, maSlow)
alertcondition(condition=maCross,
     message="偏移EMA上穿偏移SMA")

基于时间和日期的 TradingView 警报

另一组警报使用时间和日期信息。这使得可以在一天中的特定时刻触发警报。或者过滤掉特定的时间段或日期。让我们看看如何创建这些警报。

时间段警报

时间段警报使用特定的时间范围来触发警报。这样,我们只在 10:00 至 14:00 之间触发 EMA 警报。或者在 17:00 至 21:00 之间触发较低收盘价警报。

为了编写这些警报,我们使用time() 函数。该函数有两个参数:K 线的 timeframe.period 和我们想要检查的时间段。现在,当当前的 K 线位于指定时间段内时,time() 返回 K 线的时间。否则,函数返回 na(TradingView,n.d.)。因此,每当 time() 返回的不是 na,我们就知道当前柱落在我们定义的时间段内。然后我们可以查看警报设置是否也发生在该时间窗口内。

以下是如何将时间过滤添加到我们的 TradingView 警报中:

InSession(sess) => not na(time(timeframe.period, sess)[1])
// 当收盘价在10:00-14:00时间窗口内越过EMA时触发警报
emaValue = ta.ema(close, 20)
emaSessionAlert = ta.crossover(close, emaValue) and
     InSession("1000-1400")

alertcondition(condition=emaSessionAlert,
     message="在10:00-14:00之间收盘价越过EMA")


InSession(sess) => not na(time(timeframe.period, sess)[1])
// 当我们在17:00至21:00之间获得较低收盘价时触发警报
lowerClose = close < close[1] and 
     InSession("1700-2100")

alertcondition(condition=lowerClose,
     message="在17:00至21:00之间较低收盘价")

超出时间段警报

超出时间段警报使用特定的时间范围来排除警报设置。比如在 11:00 至 13:00 午休时间之外为三根成交量较低的柱触发警报。或者在 22:30 至 6:30 的睡眠时间段内不生成 EMA 警报。

我们使用 time() 来编写这些警报。当 time() 返回 na 时,我们知道当前柱落在时间段之外。然后我们可以查看警报设置是否也在该时间段之外发生。

以下是我们如何编写发生在时间窗口之外的 TradingView 警报:

OutSession(sess) => na(time(timeframe.period, sess)[1])
// 在11:00 - 13:00之外的三根成交量较低的连续 K 线触发警报
lowerVolume = volume < volume[1] and 
     volume[1] < volume[2] and
     volume[2] < volume[3]

lowVolumeAlert = lowerVolume and 
     OutSession("1100-1300")

alertcondition(condition=lowVolumeAlert,
     message="午休时间之外的低成交量警报")

OutSession(sess) => na(time(timeframe.period, sess)[1])
// 仅在22:30 - 6:30之外触发EMA警报
emaCross = ta.cross(ta.ema(close, 10), ta.ema(close, 45))

emaAlert = emaCross and 
     OutSession("2230-0630")

alertcondition(condition=emaAlert,
     message="22:30 - 6:30之外的EMA交叉警报")

星期几警报

星期几警报仅在一周的某些天触发。比如在星期一触发 20 根柱高点突破警报。或者利用星期五的三根成交量较低来平仓。

为了编写这些警报,我们使用dayofweek 变量,该变量返回交易所时区当前柱的星期几(TradingView,n.d.)。我们可以将该变量与整数进行比较,或检查它是否等于(==)dayofweek.monday、dayofweek.tuesday、dayofweek.wednesday、dayofweek.thursday、dayofweek.friday、dayofweek.saturday 和/或 dayofweek.sunday。

以下是星期几警报的示例:

// 仅在星期一触发20根K线高点突破警报
hiHighs = ta.highest(high, 20)[1]

highBreakout = high > hiHighs and 
     dayofweek == dayofweek.monday

alertcondition(condition=highBreakout,
     message="星期一的20根柱高点突破")

// 在星期五触发较低成交量警报
lowVolume = volume < volume[1] and 
     volume[1] < volume[2] and
     volume[2] < volume[3]

volumeAlert = lowVolume and 
     dayofweek == dayofweek.friday

alertcondition(condition=volumeAlert,
     message="星期五的三根成交量较低")

排除星期几警报

排除星期几警报在除了我们排除的那些天之外的所有天触发。比如可以防止星期五发出突破信号,以免在周末前开仓。或者排除星期一和星期二发生 RSI 警报。

排除星期几警报的条件如下:

// 触发高点和低点突破警报,但不包括星期五
highBreakout = high == ta.highest(high, 20)
lowBreakout  = low == ta.lowest(low, 20)

breakoutAlert = (highBreakout or lowBreakout) and
     dayofweek != dayofweek.friday

alertcondition(condition=breakoutAlert,
     message="价格突破20根柱极值")

// 不在星期一和星期二触发RSI警报
rsiValue = ta.rsi(close, 12)
rsiSetup = rsiValue > 80 or rsiValue < 20
rsiAlert = rsiSetup and 
     dayofweek != dayofweek.monday and
     dayofweek != dayofweek.tuesday

alertcondition(condition=rsiAlert,
     message="星期一或星期二不触发RSI警报")

一天中的第一个 K 线警报

一天中的第一个 K 线警报在当前 K 线是一天中的开盘价。这样,当交易以向下跳空开始时触发警报。或者当当天开盘价高于 20 根柱 EMA 时触发警报。

我们使用 TradingView 的dayofmonth 变量编写此类警报,该变量返回交易所时区当前 K 线的日期(TradingView,n.d.)。当该变量的当前值与(!=)其前一个柱的值不同时,我们知道当前柱标志着新开盘价

我们制作一天中的第一个 K 线警报如下:

// 当交易以向下跳空开始时触发警报
gapDown     = open < close[1]
firstBarDay = dayofmonth != dayofmonth[1]
gapAlert = gapDown and 
     firstBarDay

alertcondition(condition=gapAlert,
     message="当天的第一根 K 线向下跳空")

// 当 K 线开盘价高于20根 K线EMA时触发警报
emaValue = ta.ema(close, 20)
startDay = dayofmonth != dayofmonth[1]

emaAlert = open > emaValue and 
     startDay

alertcondition(condition=emaAlert,
     message="当日开盘价高于20根柱EMA")

一周中的第一个 K 线警报

一周中的第一个 K 线警报仅在当前柱恰好是一周的第第一天时触发。例如我们可以在星期一跳空开盘时触发警报。或者当周末过夜交易将价格推低至 30 根柱 EMA 以下时触发警报。

我们在脚本中使用 dayofweek 来实现这些警报,该变量返回交易所时区当前柱的星期几(TradingView,n.d.)。为了检查该柱是否是一周的第一天,我们进行两次比较。首先,我们评估 dayofweek 是否等于(==)dayofweek.monday。然后,我们查看 dayofweek 是否与其前一个 K 线的值(dayofweek[1])不同,表示新的一天的开始。

以下是如何在 TradingView Pine 中编写这些警报:

// 当星期一跳高开盘时触发警报
gapUp = open > close[1]
startWeek = dayofweek == dayofweek.monday and
     dayofweek != dayofweek[1]

gapAlert = gapUp and 
     startWeek

alertcondition(condition=gapAlert,
     message="星期一早晨跳空开盘")

// 创建周末过夜交易将价格推低至30根柱EMA以下的警报
emaValue = ta.ema(close, 30)
newWeek = dayofweek == dayofweek.monday and
     dayofweek != dayofweek[1]

emaAlert = newWeek and 
     open < emaValue and
     close[1] > emaValue[1]

alertcondition(condition=emaAlert,
     message="星期一早晨开盘低于EMA")

总结

要使用我们的脚本生成警报,我们使用 alertcondition() 函数。然后我们手动启用警报,以便警报条件实际触发。我们如何编写这些警报完全取决于我们。

我们可以编写大于和小于警报,当某个值高于或低于另一个值时触发。通过交叉警报,我们可以监视某个值是否高于或低于另一个值。通过通道警报,我们可以在值进入或离开由上限和下限定义的通道时触发警报。

上升和下降警报让我们在指定数量的柱内值移动一定量时触发警报。极值组的警报可以让我们的代码监视最高值和最低值以及突破情况。为了在警报条件中包含摆动高点和低点,我们使用枢轴警报。

另一种编写警报的方式是使用上升和下降警报,当值在一定数量的柱内增加或减少时触发。然后是基于 K 线的警报,从发生特定条件的价格 K 线中获取数据。最后但同样重要的是时间和日期警报,它在生成警报之前以编程方式包含 K 线的时间、周期或日期。

英文原文:https://www.tradingcode.net/tradingview/alert-situations-examples/

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请 注册新账号