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

Pine Script(161):常见警报条件及其编程方法

#Pine Script入门教学

常见的TradingView警报条件及其编程方法

编写具有不同条件的TradingView警报

TradingView的警报功能是一个强大的工具,能帮助我们识别交易机会并接收市场动态通知。要编写自己的警报,核心在于将我们的想法转换成一个true(真)或false(假)的布尔值,并传递给TradingView的 alertcondition() 函数。虽然这个过程不复杂,但如何将一个具体的交易想法翻译成代码,有时却颇具挑战。

为了简化这一过程,本文将深入探讨数十种警报思路,并详细展示如何在TradingView的Pine脚本中实现它们。这不仅能让你学会如何编写特定的警报,还可能启发你一些从未考虑过的监控角度。本文将要探索的警报示例涵盖以下几大类别:

  • 大于/小于警报
  • 交叉警报
  • 通道警报
  • 涨跌幅警报
  • 极值警报
  • 枢轴点(Pivot)警报
  • 涨跌速率警报
  • K线形态警报
  • 时间与日期警报

本文中的每个警报示例都将独立讲解。当然,在实际应用中,我们可以将多个警报条件组合成一个更复杂的单一条件,后面讲多重条件警报时会展开。

大于与小于警报

这类警报主要用于比较一个动态值(例如指标读数或收盘价)与一个预设的固定值。通过这种方式,我们的代码可以检查某个数值是否突破了我们设定的阈值,从而发出提醒。下面我们来看看如何用代码实现。

大于警报

当一个数据序列的当前值持续高于某个固定值时,就会触发“大于”警报。例如,我们可以设置当特斯拉(Tesla)股价高于250美元,或随机指标(Stochastics)的两条线都高于20时收到通知。 这类警报的特点是,只要条件(大于某个值)一直满足,警报就会持续触发。这与“向上穿越”警报不同,后者仅在穿越发生的那一刻触发一次。 在代码中,我们使用大于号(>)来实现“大于”警报。如果需要判断多个条件是否同时满足,就使用逻辑与(and)运算符。如果只需满足其中一个条件,则使用逻辑或(or)运算符。 以下是“大于”警报的几种代码实现方式:

// 范例1:价格高于$250
priceAlert = close > 250
alertcondition(condition=priceAlert,
     message="价格已超过 $250")

// 范例2:Stochastics指标的%K和%D线同时高于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="Stochastics指标的%K和%D线均高于20")

// 范例3:收盘价或10周期EMA任意一个高于29
emaValue = ta.ema(close, 10)

alertTrigger = close > 29 or emaValue > 29
alertcondition(condition=alertTrigger,
     message="收盘价或EMA已高于29")

小于警报

当一个数据序列的当前值持续低于某个固定值时,就会触发“小于”警报。例如,我们可以设置当微软(Microsoft)股价低于75美元,或者在价格低于20美元的同时MACD柱状图也低于0.35时发出警报。 与“大于”警报类似,只要条件(小于某个值)持续满足,警报就会不断触发。这与仅触发一次的“向下穿越”警报有所不同。 在代码中,我们使用小于号(<)来实现。同样,可以使用and来组合多个必须同时满足的“小于”条件,或使用or来检查多个条件中是否至少有一个满足。 以下是“小于”警报的代码范例:

// 范例1:价格低于$75
priceAlert = close < 75
alertcondition(condition=priceAlert,
     message="价格已低于 $75")

// 范例2: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")

// 范例3:当前K线或上一根K线的最低价低于$88
lowsAlert = low < 88 or low[1] < 88
alertcondition(condition=lowsAlert,
     message="最低价或前一根K线最低价低于 $88")

TradingView Pine中的交叉警报

另一大类警报是“交叉”警报。当一个数据序列(如收盘价、指标值)向上或向下穿越另一个值时触发。这类警报只在交叉发生的那一刻触发一次,因此比“大于/小于”警报更为精确。

向上穿越(Crossing Above)固定值

当一个数据序列的值向上穿越某个固定值时触发。例如,当价格突破50美元,或成交量均线(SMA)向上突破10,000手时,就可以用这类警报来捕捉信号。 我们使用TradingView内置的 ta.crossover() 函数来实现。该函数接收两个参数,当第一个参数的值在当前K线上大于第二个参数,而在上一根K线上小于第二个参数时,函数返回true,否则返回false。 代码示例如下:

// 范例1:收盘价上穿$50
crossOverAlert = ta.crossover(close, 50)
alertcondition(condition=crossOverAlert,
     message="收盘价上穿 $50")

// 范例2:成交量的10周期SMA上穿10000
volSMA = ta.sma(volume, 10)

volAlert = ta.crossover(volSMA, 10000)
alertcondition(condition=volAlert,
     message="成交量SMA上穿 10k")

向下穿越(Crossing Below)固定值

当一个数据序列的值向下穿越某个固定值时触发。例如,当比特币(Bitcoin)价格跌破8500美元,或RSI指标值从上方回落到80以下时。 我们使用 ta.crossunder() 函数。它的逻辑与 ta.crossover() 相反:当第一个参数的值在当前K线上小于第二个参数,而在上一根K线上大于第二个参数时,返回true。 代码示例如下:

// 范例1:收盘价下穿$8500
priceBasedAlert = ta.crossunder(close, 8500)
alertcondition(condition=priceBasedAlert,
     message="收盘价跌破 $8,500")

// 范例2:12周期RSI下穿80
rsiBelowAlert = ta.crossunder(ta.rsi(close, 12), 80)
alertcondition(condition=rsiBelowAlert,
     message="12周期RSI跌破 80")

双向穿越(Crossing Above or Below)固定值

当一个数据序列向上或向下穿越某个固定值时触发。例如,当欧元/美元(EUR/USD)价格穿越1.2000这一关键价位(无论上穿还是下穿),或RSI指标穿越50中轴线时。 我们可以组合使用 ta.crossover()ta.crossunder() 函数,并通过 or 逻辑运算符连接,以监控两种穿越情况。 代码示例如下:

// 范例1:价格穿越1.2000(双向)
eurUSDcross = ta.crossover(close, 1.2000) or 
     ta.crossunder(close, 1.2000)
alertcondition(condition=eurUSDcross,
     message="价格刚刚穿越 1.2000")

// 范例2:RSI穿越50中轴线(双向)
rsiValue = ta.rsi(close, 12)
rsiAlert = ta.crossover(rsiValue, 50) or 
     ta.crossunder(rsiValue, 50)
alertcondition(condition=rsiAlert,
     message="RSI穿越 50 水平线")

上穿(Crossing Over)另一序列

当一个数据序列向上穿越另一个动态的数据序列时触发。例如,收盘价上穿移动平均线(SMA),或成交量上穿其自身的指数移动平均线(EMA)。 我们同样使用 ta.crossover() 函数来实现。 代码示例如下:

// 范例1:收盘价上穿20周期SMA
smaCross = ta.crossover(close, ta.sma(close, 20))
alertcondition(condition=smaCross,
     message="收盘价上穿20周期SMA")

// 范例2:成交量上穿其12周期EMA
volumeCross = ta.crossover(volume, ta.ema(volume, 12))
alertcondition(condition=volumeCross,
     message="成交量上穿其12周期EMA")

下穿(Crossing Under)另一序列

当一个数据序列向下穿越另一个动态的数据序列时触发。例如,收盘价跌破20周期EMA,或最低价跌破10周期内的最低点。 我们使用 ta.crossunder() 函数来实现。 代码示例如下:

// 范例1:收盘价下穿20周期EMA
emaCross = ta.crossunder(close, ta.ema(close, 20))
alertcondition(condition=emaCross,
     message="收盘价下穿20周期EMA")

// 范例2:最低价下穿10周期内的最低点
lowCross = ta.crossunder(low, ta.lowest(low, 10)[1])
alertcondition(condition=lowCross,
     message="最低价跌破10周期最低点")

TradingView Pine中的通道警报

通道警报用于监控价格或指标值与某个区间的关系,例如进入区间、停留在区间内或突破区间。

进入通道警报

当一个数据序列进入一个由固定上下轨构成的通道时触发。例如,当以太坊(Ethereum)价格进入440-490美元的交易区间,或RSI指标值从超买/超卖区回到20-80的正常范围。 我们可以组合使用 ta.crossover()(向上进入)和 ta.crossunder()(向下进入),并通过 or 连接。 代码示例如下:

// 范例1:价格进入$440-$490交易区间
insideRange = ta.crossover(close, 440) or 
     ta.crossunder(close, 490)
alertcondition(condition=insideRange,
     message="价格已进入 $440-$490 区间")

// 范例2: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 区间")

离开通道警报

当一个数据序列从一个由固定上下轨构成的通道中突破出去时触发。例如,当比特币价格突破8,500-9,000美元的盘整区间,或成交量超出1万-2万手的范围。 我们组合使用 ta.crossover()(向上突破)和 ta.crossunder()(向下突破),并通过 or 连接。 代码示例如下:

// 范例1:比特币价格离开$8,500-$9,000交易区间
outsideRange = ta.crossover(close, 9000) or 
     ta.crossunder(close, 8500)
alertcondition(condition=outsideRange,
     message="现已在 $8,500-$9,000 区间外交易")

// 范例2:成交量移出1万-2万区间
volumeAlert = ta.crossover(volume, 20000) or
     ta.crossunder(volume, 10000)
alertcondition(condition=volumeAlert,
     message="成交量已移出 10k-20k 区间")

通道内警报

当一个数据序列持续位于一个由固定上下轨构成的通道内时触发。例如,特斯拉股价保持在230-250美元的区间内。与“进入通道”警报不同,只要条件满足,“通道内”警报会持续触发。实现方法是检查数值是否同时小于等于(<=)上轨且大于等于(>=)下轨,使用and连接。 代码示例如下:

// 范例1:价格在$230-$250之间交易
priceRange = close >= 230 and
     close <= 250
alertcondition(condition=priceRange,
     message="价格在 $230-$250 之间交易")

// 范例2:EMA值在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美元区间之外,或Stochastics指标的%K线处于20-80范围之外。与“离开通道”警报不同,只要数值在通道外,它就会持续触发。实现方法是检查数值是否大于(>)上轨或小于(<)下轨,使用or连接。 代码示例如下:

// 范例1:价格在$250-$330区间之外交易
priceAlert = close > 330 or 
     close < 250
alertcondition(condition=priceAlert,
     message="价格高于 $330 或低于 $250")

// 范例2:Stochastics %K线在20-80范围之外
stochK = ta.sma(ta.stoch(close, high, low, 14), 3)

stochAlert = stochK > 80 or
     stochK < 20
alertcondition(condition=stochAlert,
     message="Stochastics %K 高于 80 或低于 20")

TradingView中的涨跌幅警报

这类警报关注价格在特定时间内的移动幅度。当数值在指定的K线数量内上涨或下跌了某个特定量时,警报就会触发。例如,当以太坊在10根K线内下跌了75美元,或RSI在3根K线内下跌了20点时,我们就可以收到提醒。接下来让我们看看如何编写这类警报。

固定值上涨警报

当一个数据序列在指定数量的K线内,上涨超过一个固定的数额时,就会触发“固定值上涨”警报。例如,我们可以设置当比特币(Bitcoin)在10根K线内上涨100美元,或EMA均线在过去20根K线内上涨了10个点时收到通知。 要编写这类警报,我们首先用当前值减去它在过去n根K线内的最低值。这个最低值可以通过ta.lowest()函数获得。例如,如果当前收盘价是23.98,而过去10根K线的最低收盘价是21.43,我们就知道价格在10根K线内上涨了2.55个点。第二步就是检查这个差值是否大于或等于(>=)我们设定的警报触发值。 这类警报的代码实现如下:

// 范例1:价格在10根K线内上涨$100
priceChange = close - ta.lowest(close, 10) >= 100
alertcondition(condition=priceChange,
     message="价格在过去10根K线内上涨了$100")

// 范例2:EMA在过去20根K线内上涨10个点
emaValue = ta.ema(close, 30)
emaAlert = emaValue - ta.lowest(emaValue, 20) >= 10
alertcondition(condition=emaAlert,
     message="EMA在过去20根K线内上涨了10个点")

固定值下跌警报

当一个数据序列在指定数量的K线内,下跌超过一个固定的数额时,就会触发“固定值下跌”警报。例如,当以太坊(Ethereum)在5根K线内下跌了50美元,或EMA均线在5根K线内下跌超过25个点时。 要实现这类警报,我们首先需要找到该数据在指定周期内的最高值,这可以通过ta.highest()函数实现。然后,我们用这个最高值减去当前值,并检查差值是否大于或等于(>=)我们预期的下跌幅度。 代码实现如下:

// 范例1:价格在5根K线内下跌$50
priceChange = ta.highest(close, 5) - close >= 50
alertcondition(condition=priceChange,
     message="价格在5根K线内下跌了$50")

// 范例2:EMA在5根K线内下跌25个点
emaValue  = ta.ema(close, 12)
emaChange = ta.highest(emaValue, 5) - emaValue >= 25
alertcondition(condition=emaChange,
     message="EMA在5根K线内下跌了25个点")

百分比上涨警报

当一个数据序列在指定数量的K线内,上涨超过一个固定的百分比时,就会触发“百分比上涨”警报。例如,当苹果(Apple)股价在30根K线内上涨超过20%,或移动平均线在15根K线内上涨了10%时。 其逻辑是:首先用ta.lowest()函数找到周期内的最低值,然后用(当前值 - 最低值) / 最低值来计算涨幅百分比。最后,检查这个百分比是否大于或等于(>=)预设的警报触发阈值。 代码实现如下:

// 范例1:价格在30根K线内上涨20%
lowClose   = ta.lowest(close, 30)
percChange = ((close - lowClose) / lowClose) * 100
percAlert  = percChange >= 20
alertcondition(condition=percAlert,
     message="价格在过去30根K线内上涨了20%")

// 范例2:SMA在15根K线内上涨10%
smaValue  = ta.sma(close, 20)
lowestSMA = ta.lowest(smaValue, 15)
smaChange = ((smaValue - lowestSMA) / lowestSMA) >= 0.10 // 0.10代表10%
alertcondition(condition=smaChange,
     message="SMA在15根K线内上涨了10%")

百分比下跌警报

当一个数据序列在指定数量的K线内,下跌超过一个固定的百分比时,就会触发“百分比下跌”警报。例如,当瑞波币(Ripple)在30根K线内下跌20%,或成交量均线在7根K线内萎缩了35%时。 其逻辑是:首先用ta.highest()函数找到周期内的最高值,然后用(当前值 - 最高值) / 最高值来计算跌幅百分比(结果为负数)。最后,检查这个百分比是否小于或等于(<=)预设的负数阈值。 代码实现如下:

// 范例1:价格在30根K线内下跌20%
highValue  = ta.highest(close, 30)
percChange = (close - highValue) / highValue <= -0.20 // -0.20代表-20%
alertcondition(condition=percChange,
     message="价格在30根K线内下跌了20%")

// 范例2:平均成交量在7根K线内下跌35%
avgVol    = ta.sma(volume, 12)
volHigh   = ta.highest(avgVol, 7)
volChange = (avgVol - volHigh) / volHigh <= -0.35
alertcondition(condition=volChange,
     message="平均成交量在7根K线内下跌了35%")

极值警报

另一类警报基于极值,例如触及阶段新高或突破阶段新低。

触及最高点警报

当一个数据序列的值等于其在指定周期内的最高值时,触发此警报。这可以用来监控成交量是否达到10周期新高,或收盘价是否创下30周期新高。 我们使用ta.highest()函数找到周期内的最高值,然后用等于号(==)判断当前值是否与其相等。 代码实现如下:

// 范例1:成交量触及10周期最高点
volumeAlert = volume == ta.highest(volume, 10)
alertcondition(condition=volumeAlert,
     message="成交量触及10周期高点")

// 范例2:收盘价触及30周期最高点
priceAlert  = close == ta.highest(close, 30)
alertcondition(condition=priceAlert,
     message="创下30周期最高收盘价!")

触及最低点警报

当一个数据序列的值等于其在指定周期内的最低值时,触发此警报。例如,K线最低价触及20周期新低,或CCI指标触及30周期新低。 我们使用ta.lowest()函数找到周期内的最低值,然后用等于号(==)进行判断。 代码实现如下:

// 范例1:最低价触及20周期最低点
lowestLow = low == ta.lowest(low, 20)
alertcondition(condition=lowestLow,
     message="触及20周期最低点!")

// 范例2:CCI指标触及30周期最低点
cciValue  = ta.cci(close, 10)
lowestCCI = cciValue == ta.lowest(cciValue, 30)
alertcondition(condition=lowestCCI,
     message="CCI触及30周期低点")

突破最高点警报

当一个数据序列的值上穿其在指定周期内的最高值时,触发此警报。这比“触及”更进一步,表示一个有效的向上突破。它与“触及最高点”警报的关键区别在于:突破警报只在价格明确穿越最高点时触发一次,而“触及”警报可能在价格等于最高点时持续触发。实现方法是:使用ta.highest()函数,并通过历史引用操作符[1]来获取不包含当前K线的、过去N根K线的最高值,然后判断当前值是否大于(>)这个历史最高值。代码实现如下:

// 范例1:收盘价突破20周期最高收盘价
closeBreakout = close > ta.highest(close, 20)[1]
alertcondition(condition=closeBreakout,
     message="收盘价突破20周期最高点!")

// 范例2:成交量突破50周期高点
volumeBreakout = volume > ta.highest(volume, 50)[1]
alertcondition(condition=volumeBreakout,
     message="成交量突破50周期高点!")

跌破最低点警报

当一个数据序列的值下穿其在指定周期内的最低值时,触发此警报。这表示一个有效的向下跌破。与“触及最低点”警报相比,“跌破”警报要求价格明确地低于过去的最低值,仅仅等于最低值是不会触发的。实现方法是:使用ta.lowest()函数,并通过历史引用操作符[1]来获取不包含当前K线的、过去N根K线的最低值,然后判断当前值是否小于(<)这个历史最低值。代码实现如下:

// 范例1:最低价跌破20周期最低点
lowLowAlert = low < ta.lowest(low, 20)[1]
alertcondition(condition=lowLowAlert,
     message="最低价跌破20周期最低点!")

// 范例2:Stochastics %K线跌破10周期最低值
stochK    = ta.sma(ta.stoch(close, high, low, 14), 3)
stchAlert = stochK < ta.lowest(stochK, 10)[1]
alertcondition(condition=stchAlert,
     message="Stoch %K线跌破10周期低点")

枢轴点(Pivot)警报

另一类警报是枢轴点警报,它可以让我们基于最近形成的波段高点或低点来触发警报。

注意

枢轴点的高低点具有滞后性。要确认一个波段高点或低点是否形成,TradingView需要观察其前后K线的走势。这很容易理解:只有当一根K线之后的价格开始回落,我们才能确认这根K线形成了一个顶部;同理,只有当一根K线之后的价格开始上涨,我们才能确认它形成了一个底部。 虽然枢轴点是识别近期波段高低点的好方法,但其固有的滞后性使其不适合作为独立的、及时的警报信号。

枢轴高点(Pivot High)警报

这类警报基于价格序列中形成的波段高点来触发。例如,当最近形成的一个波段高点超过50美元,或者上一个波段高点高于当前的移动平均线时,我们就可以发出提醒。 我们使用 ta.pivothigh() 函数来实现。该函数会返回最近的枢轴高点价格;如果当前K线上没有形成枢轴高点,则返回 na(非数字)。它有三个参数:要检查的数据序列、高点左侧需要多少根较低的K线、高点右侧需要多少根较低的K线。 代码实现如下:

// 范例1:检查最近的波段高点(左右各3根K线确认)是否高于50
pivHigh = ta.pivothigh(high, 3, 3)

priceAlert = pivHigh > 50
alertcondition(condition=priceAlert,
     message="3根K线前形成的枢轴高点高于50")

// 范例2:当一个波段高点(左右各5根K线确认)高于5根K线前的10周期SMA时
smaValue = ta.sma(close, 10)[5]
pivHigh  = ta.pivothigh(high, 5, 5)

smaAlert = pivHigh > smaValue
alertcondition(condition=smaAlert,
     message="5根K线前形成的枢轴高点高于当时的SMA")

枢轴低点(Pivot Low)警报

这类警报基于价格序列中形成的波段低点来触发。例如,当特斯拉(Tesla)的某个波段低点低于330美元,或CCI指标的上一个波段低点低于-200时。 我们使用 ta.pivotlow() 函数来实现,其用法与 ta.pivothigh() 类似,只是它寻找的是低点。 代码实现如下:

// 范例1:最近的波段低点(左右各5根K线确认)低于330
swingLow = ta.pivotlow(low, 5, 5)

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

// 范例2:CCI最新的波段低点(左右各5根K线确认)低于-200
cciValue = ta.cci(close, 20)
cciLow   = ta.pivotlow(cciValue, 5, 5)

cciSwingAlert = cciLow < -200
alertcondition(condition=cciSwingAlert,
     message="最近的CCI波段低点低于-200")

TradingView中基于涨跌趋势的警报

另一类警报关注的是数值在一段时间内的演变趋势,例如是否在过去几根K线内持续上涨或下跌。

上涨趋势警报

当一个数据序列在指定的周期内呈现上涨时,触发此警报。例如,标普500指数在过去3根K线内有所上涨,或RSI在过去5根K线内创出新高。 注意,这种警报不要求连续上涨,只要当前值高于过去n根K线内的任何一个值即可。 我们使用 ta.rising() 函数,它接收两个参数:数据序列和周期长度。当当前值大于周期内任何一个过去的值时,函数返回true。 代码实现如下:

// 范例1:收盘价在过去3根K线内有所上涨
closeRise = ta.rising(close, 3)
alertcondition(condition=closeRise,
     message="收盘价在过去3根K线内出现上涨")

// 范例2:RSI值高于过去5根K线中的任何一个值
rsiValue = ta.rsi(close, 12)
rsiRise  = ta.rising(rsiValue, 5)
alertcondition(condition=rsiRise,
     message="RSI值高于过去5根K线中的任一值")

下跌趋势警报

当一个数据序列在指定的周期内呈现下跌时,触发此警报。例如,收盘价低于过去3根K线内的任一收盘价。 与上涨趋势警报类似,它不要求连续下跌,只要当前值低于过去n根K线内的任何一个值即可。 我们使用 ta.falling() 函数,其逻辑与 ta.rising() 相反。 代码实现如下:

// 范例1:收盘价低于过去3根K线中的任一收盘价
closeFall = ta.falling(close, 3)
alertcondition(condition=closeFall,
     message="收盘价低于过去3根K线中的任一根")

// 范例2:MACD线达到过去5根K线中的最低值
[macdLine, _, _ ] = ta.macd(close, 12, 26, 9)

macdFall = ta.falling(macdLine, 5)
alertcondition(condition=macdFall,
     message="MACD线达到5根K线内最低点")

连续上涨警报

当一个数据序列连续上涨了指定数量的K线时,触发此警报。例如,收盘价实现三连阳,或RSI值连续5根K线上升。 实现方式是通过历史引用操作符[]和大于号>来比较相邻K线的值,并用and连接起来。对于更长的周期,可以编写一个自定义函数来简化代码。 代码实现如下:

// 范例1:收盘价实现三连阳
higherCloses = close > close[1] and 
     close[1] > close[2] and 
     close[2] > close[3]
alertcondition(condition=higherCloses,
     message="价格已连续三根K线收高")

// 自定义函数:检查序列是否连续上涨N个周期
ConsecRises(series, length) =>
    higher = true
    for i = 0 to length - 1
        higher := higher and (series[i] > series[i + 1])
    higher

// 范例2:RSI值连续5根K线上涨
rsiValue = ta.rsi(close, 12)
rsiIncreased = ConsecRises(rsiValue, 5)
alertcondition(condition=rsiIncreased,
     message="RSI已连续5根K线上涨")

连续下跌警报

当一个数据序列连续下跌了指定数量的K线时,触发此警报。例如,收盘价五连阴,或成交量连续三根K线萎缩。 实现逻辑与连续上涨类似,只是将大于号>换成小于号<。同样,可以使用自定义函数来简化。 代码实现如下:

// 自定义函数:检查序列是否连续下跌N个周期
ConsecDrops(series, length) =>
    lower = true
    for i = 0 to length - 1
        lower := lower and (series[i] < series[i + 1])
    lower

// 范例1:收盘价五连阴
lowerCloses = ConsecDrops(close, 5)
alertcondition(condition=lowerCloses,
     message="已连续5根K线收低")

// 范例2:成交量连续三根K线萎缩
lowerVolume = volume < volume[1] and 
     volume[1] < volume[2] and 
     volume[2] < volume[3]
alertcondition(condition=lowerVolume,
     message="成交量已连续三根K线萎缩")

基于K线位置的TradingView警报

还有一类警报结合了K线本身的时间信息,例如,在某个条件发生之后的第N根K线才触发警报。

“事件发生后N根K线”警报

在某个特定事件发生了一定数量的K线之后,触发此警报。例如,我们可以在均线金叉发生后的第3根K线,或者在价格创下20周期新高后的第5根K线及以后,发出提醒。 这类警报的强大之处在于可以与其他条件结合。例如,我们可以要求:一个突破必须发生在过去3根K线内,并且当前价格仍然维持在突破位之上,才真正触发警报。 我们使用 ta.barssince() 函数,它接收一个布尔条件作为参数,并返回从该条件上一次为true到现在的K线数量。 代码实现如下:

// 范例1:均线金叉发生后的第3根K线触发
maCross = ta.crossover(ta.sma(close, 10), ta.ema(close, 30))

recentMAcross = ta.barssince(maCross) == 3
alertcondition(condition=recentMAcross,
     message="均线交叉发生在3根K线前")

// 范例2:创下20周期新高后,已过去5根或更多K线
newHigh = high == ta.highest(high, 20)

recentNewHigh = ta.barssince(newHigh) >= 5
alertcondition(condition=recentNewHigh,
     message="创下20周期新高后已过去5根或更多K线!")

最高点所在K线警报

这类警报利用了创下最高点的那根K线上的其他数据。例如,当创下近期最高收盘价的那根K线,其当时的RSI值高于80时,触发警报。 我们使用 ta.highestbars() 函数,它会返回一个偏移量,告诉我们最高值出现在多少根K线之前。然后我们可以利用这个偏移量,通过历史引用操作符[],去获取那根“最高点K线”上的任何其他数据(如RSI、成交量等)。

“最高点所在K线”警报的代码实现如下:

// 范例1:当过去10根K线中,创下最高收盘价的那根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")

// 范例2:当过去5根K线中,创下最高EMA值的那根K线的成交量超过1万时,触发警报
barsAgo = ta.highestbars(ta.ema(close, 10), 5)

volumeAlert = volume[barsAgo] > 10000
alertcondition(condition=volumeAlert,
     message="5周期最高EMA所在K线的成交量超过1万")

最低点所在K线警报

“最低点所在K线”警报利用的是创下最低点的那根K线上的其他数据。这让我们可以实现更复杂的逻辑,例如:当创下近期最低价的那根K线,其成交量低于10周期成交量均线时,发出警报;或者当近期成交量最低的那根K线,其收盘价也同时下跌时,触发警报。 我们使用 ta.lowestbars() 函数来实现。它会返回一个偏移量,告诉我们最低值出现在多少根K线之前。然后我们可以利用这个偏移量来获取那根“最低点K线”上的其他数据。 代码实现如下:

// 范例1:当创下10周期最低价的那根K线,其成交量低于当时的10周期成交量SMA时
barsBack = ta.lowestbars(low, 10)
volSMA   = ta.sma(volume, 10)

lowVolume = volume[barsBack] < volSMA[barsBack]
alertcondition(condition=lowVolume,
     message="最低价K线的成交量低于SMA")

// 范例2:当过去10根K线中成交量最低的那根K线,其收盘价也同时下跌时
barsAgo = ta.lowestbars(volume, 10)

lowerClose = close[barsAgo] < close[barsAgo + 1]
alertcondition(condition=lowerClose,
     message="成交量最低K线的收盘价也下跌了!")

数据偏移警报

“数据偏移”警报使用的是被向后(在图表上是向右)平移了指定K线数量的数据。这可以帮我们实现一些特殊的比较,例如,用当前收盘价与10根K线前的EMA进行交叉判断;或者判断两条都被向后平移了的均线是否发生交叉。 我们使用历史引用操作符([])来实现数据偏移。 代码实现如下:

// 范例1:当前收盘价上穿10根K线前的EMA值
emaOff = ta.ema(close, 25)[10]

emaCross = ta.crossover(close, emaOff)
alertcondition(condition=emaCross,
     message="收盘价上穿了10周期前的EMA")

// 范例2:两条都被向后平移了5根K线的均线发生交叉
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="两条偏移均线发生交叉")

基于时间与日期的TradingView警报

另一大类警报是利用时间与日期信息进行过滤。这使得我们可以在一天中的特定时间段触发或屏蔽警报,或者按周内天数来筛选信号。

特定时间段内警报

这类警报只在一天中的某个特定时间范围内生效。例如,我们可以设置只在上午10点到下午2点之间接收EMA金叉警报,或者只关注下午5点到晚上9点之间发生的收盘价下跌信号。 我们使用 time() 函数来实现。它能判断当前K线是否处于我们设定的时间段内。如果处于,它会返回一个时间值;如果不处于,则返回na(非数字)。所以,我们只需判断 time() 的返回值是否为 na,就可以确定是否在指定的时间段内。 代码实现如下(这里的 InSession 是一个自定义的辅助函数,用于判断是否在时间段内):

// 辅助函数:判断是否在指定的时间段(sess)内
InSession(sess) => not na(time(timeframe.period, sess)[1])

// 范例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")

// 范例2:仅在17:00-21:00之间,当收盘价下跌时触发
lowerClose = close < close[1] and InSession("1700-2100")
alertcondition(condition=lowerClose,
     message="在 17:00-21:00 之间收盘价下跌")

特定时间段外警报

这类警报与上一类正好相反,它在某个特定的时间范围之外生效。例如,我们可以设置在上午11点到下午1点的午休时间之外,监控成交量连续萎缩的信号;或者在晚上22:30到次日早上6:30的休息时间不接收任何EMA交叉警报。 我们同样使用 time() 函数,但这次我们利用它返回 na 的特性。当 time() 返回 na 时,就表示当前时间在指定范围之外。 代码实现如下(这里的 OutSession 是一个自定义的辅助函数):

// 辅助函数:判断是否在指定的时间段(sess)外
OutSession(sess) => na(time(timeframe.period, sess)[1])

// 范例1:在11:00-13:00午休时间之外,触发成交量连续三连阴的警报
lowerVolume = volume < volume[1] and volume[1] < volume[2] and volume[2] < volume[3]
lowVolumeAlert = lowerVolume and OutSession("1100-1300")
alertcondition(condition=lowVolumeAlert,
     message="午休时间外出现成交量萎缩警报")

// 范例2:仅在22:30 - 06: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 - 06:30 之外发生EMA交叉")

按星期筛选警报

这类警报只在一周中的特定某一天或几天触发。例如,我们可以设置只在星期一接收20周期高点突破的警报,或者只在星期五利用成交量萎缩的信号来作为平仓参考。 我们使用内置变量 dayofweek 来实现,它会返回当前K线是星期几(在交易所的时区下)。我们可以将它与 dayofweek.monday (周一)、dayofweek.tuesday (周二)等进行比较。 代码示例如下:

// 范例1:仅在星期一触发20周期高点突破警报
hiHighs = ta.highest(high, 20)[1]

highBreakout = high > hiHighs and dayofweek == dayofweek.monday
alertcondition(condition=highBreakout,
     message="周一发生20周期高点突破")

// 范例2:在星期五触发成交量连续萎缩的警报
lowVolume = volume < volume[1] and volume[1] < volume[2] and volume[2] < volume[3]
volumeAlert = lowVolume and dayofweek == dayofweek.friday
alertcondition(condition=volumeAlert,
     message="周五出现连续3根K线成交量萎缩")

排除特定星期警报

这类警报会在除了我们指定的日子外的所有交易日触发。例如,我们可以设置在星期五屏蔽所有的突破信号,以避免在周末前开仓;或者屏蔽掉星期一和星期二的RSI警报。

要编写这类警报,我们同样使用dayofweek变量,它能返回当前K线是星期几。我们可以通过判断它是否不等于(!=dayofweek.friday(周五)等值,来达到排除的目的。 排除特定星期的警报代码实现如下:

// 范例1:触发高低点突破警报,但在周五除外
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周期极值(周五除外)")

// 范例2:不在周一和周二触发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线上触发。我们可以利用它来监控开盘跳空,或判断开盘价与某个指标(如20周期EMA)的关系。 我们通过dayofmonth(月份中的日期)变量来实现。其诀窍在于,通过判断当前K线的日期dayofmonth是否与上一根K线的日期dayofmonth[1]不相等,我们就能准确地捕捉到新的一天开始的那根K线。 代码实现如下:

// 范例1:当日内第一根K线向下跳空时触发
gapDown     = open < close[1]
firstBarDay = dayofmonth != dayofmonth[1] // 判断是否为每日第一根K线

gapAlert = gapDown and firstBarDay
alertcondition(condition=gapAlert,
     message="日内开盘第一根K线向下跳空")

// 范例2:当开盘价高于20周期EMA时触发
emaValue = ta.ema(close, 20)
startDay = dayofmonth != dayofmonth[1] // 判断是否为每日第一根K线

emaAlert = open > emaValue and startDay
alertcondition(condition=emaAlert,
     message="开盘价高于20周期EMA")

每周开盘第一根K线警报

这类警报仅在一周的第一个交易日(通常是星期一)的第一根K线上触发。我们可以用它来监控周一的开盘跳空情况,或判断周末行情对开盘价的影响。 要实现它,我们结合使用dayofweek变量。判断逻辑是:首先,当前K线必须是星期一(dayofweek == dayofweek.monday);其次,为了确保是周一的第一根K线,我们还需判断当前K线的星期几与上一根K线不相同(dayofweek != dayofweek[1])。 代码实现如下:

// 范例1:当周一开盘向上跳空时触发
gapUp = open > close[1]
startWeek = dayofweek == dayofweek.monday and dayofweek != dayofweek[1] // 判断是否为周一第一根K线

gapAlert = gapUp and startWeek
alertcondition(condition=gapAlert,
     message="周一早盘向上跳空")

// 范例2:当周一开盘价跌破30周期EMA时(意味着周末行情走弱)
emaValue = ta.ema(close, 30)
newWeek = dayofweek == dayofweek.monday and dayofweek != dayofweek[1]

// 条件:是周一开盘 & 开盘价低于EMA & 上周收盘价高于EMA
emaAlert = newWeek and open < emaValue and close[1] > emaValue[1]
alertcondition(condition=emaAlert,
     message="周一开盘价跌破EMA")

全文总结

在TradingView中,我们使用 alertcondition() 函数来定义警报的触发逻辑,然后手动在图表上创建并启用它,才能让警报真正生效。如何定义这些逻辑,完全取决于我们的想象力。 回顾全文,我们可以编写的警报类型丰富多样:

  • 比较类警报:如“大于”和“小于”警报,用于判断数值是否超越某个阈值。
  • 交叉类警报:监控一个值“上穿”或“下穿”另一个值的一次性事件。
  • 通道类警报:判断价格是“进入”、“离开”、“停留在内”还是“停留在外”某个价格区间。
  • 涨跌幅警报:判断价格在特定周期内是否达到了某个固定的“上涨/下跌数额”或“上涨/下跌百分比”。
  • 极值类警报:监控价格是否“触及”或“突破”了阶段性的最高/最低点。
  • 枢轴点(Pivot)警报:利用滞后的波段高低点来进行判断。
  • 趋势类警报:判断价格是否呈现“上涨趋势”(不要求连续)或“连续上涨”等状态。
  • K线位置类警报:利用特定事件(如最高点)所在的K线位置,来获取该K线上的其他数据进行分析。
  • 时间与日期类警报:在上述所有逻辑的基础上,增加一层时间或日期过滤器,让警报只在特定的时间段或星期几生效。
赞(0)
未经允许不得转载:图道交易 » Pine Script(161):常见警报条件及其编程方法
分享到

评论 抢沙发

登录

找回密码

注册