Pine Script v6 Alerts: alertcondition(), alert(), and Reliable Triggers
Everything you need to ship dependable TradingView alerts: indicator vs strategy alerts, once-per-bar vs once-per-bar-close, MTF confirmations, and test workflows.
The alert toolbox in Pine v6
alertcondition(cond, title, message)declares alert-able conditions for indicators.alert(message)fires a one-off alert in code when the script is used in an alert.- Strategies can trigger alerts when you set the alert on the strategy and select execution options.
- Alert frequency is set in the UI: once, once-per-bar, once-per-bar-close.
Core example: clean indicator alerts
//@version=6
indicator("EMA Crossover Alerts", overlay=true)
fastLen = input.int(20, "Fast EMA")
slowLen = input.int(50, "Slow EMA")
emaFast = ta.ema(close, fastLen)
emaSlow = ta.ema(close, slowLen)
longCond = ta.crossover(emaFast, emaSlow)
shortCond = ta.crossunder(emaFast, emaSlow)
plot(emaFast, color=color.new(color.teal, 0))
plot(emaSlow, color=color.new(color.orange, 0))
// Declare alert-able conditions with templated message tokens
alertcondition(longCond, title="Bullish Cross", message="{{ticker}} {{interval}} Bullish cross @ {{close}}")
alertcondition(shortCond, title="Bearish Cross", message="{{ticker}} {{interval}} Bearish cross @ {{close}}")
// Optional: UI previews using plotshape
plotshape(longCond, title="Long", style=shape.triangleup, color=color.new(color.teal, 0), location=location.belowbar)
plotshape(shortCond, title="Short", style=shape.triangledown, color=color.new(color.orange, 0), location=location.abovebar)
Create the alert from the chart: “Add alert” → Condition: this indicator → choose title → set frequency. Messages can use TradingView placeholders like {{ticker}}, {{interval}}, {{close}}.
Strategy alerts and order fills
Strategies don’t use alertcondition(). Instead, you set alerts on the strategy instance and let entries/exits generate signals. For webhook workflows, encode order side/size in the message template.
//@version=6
strategy("Strategy Alerts Template", overlay=true)
long = ta.crossover(ta.ema(close, 20), ta.ema(close, 50))
short = ta.crossunder(ta.ema(close, 20), ta.ema(close, 50))
if long
strategy.entry("L", strategy.long)
if short
strategy.entry("S", strategy.short)
// In the alert dialog for this strategy, set the webhook URL and a JSON message template
// Example JSON: {"symbol":"{{ticker}}","tf":"{{interval}}","side":"{{strategy.order.action}}","price":"{{close}}"}
Frequency: once-per-bar vs once-per-bar-close
- Once-per-bar-close is the safest: no intra-bar flicker; signal evaluated on the final bar state.
- Once-per-bar triggers on the first time the condition becomes true during a bar; can fire earlier and then reverse.
- For MTF filters, prefer bar-close alerts or explicit
barstate.isconfirmedgating to avoid repaint-like behavior.
MTF alert pitfalls and fixes
- Use
request.security()withbarmerge.lookahead_offand gate actions on confirmed HTF bars. - Label and plot the HTF state on your LTF to visually verify timing before enabling alerts.
- Avoid conflicting frequency settings; prefer bar-close when in doubt.
Deep dive: MTF Strategy Design andRepaint Pitfalls.
Using alert() for custom one-offs and webhooks
alert() emits a message immediately from code when the script is attached to an active alert. Useful for multi-signal payloads or complex routing. Avoid spamming by guarding with edge detection.
//@version=6
indicator("Custom Alert() Example", overlay=false)
cond = ta.crossover(ta.rsi(close, 14), 50)
fired = ta.barssince(cond) == 0
if fired
alert("RSI crossed 50 on {{ticker}}/{{interval}} @ {{close}}")
Testing workflow
- Validate visually with
plotshape()where alerts should occur. - Use bar replay to confirm the alert would have fired at the intended bar timing.
- Send alerts to a test webhook endpoint to inspect payloads before going live.
FAQ
Ensure the condition actually becomes true on new bars, the alert is attached to the correct indicator/strategy instance, and the frequency (bar vs bar-close) matches your signal logic.
No, alerts notify in real time going forward. Use bar replay and visual markers to validate expected historical triggers.