Alerts let a script notify you when something happens on the chart: a crossover, a level break, a regime change. You define the condition; the engine fires when it's met and delivers the message. There are two ways to raise one:
alert(...): fire inline with a dynamic, formatted message. Use it when you want to build the alert text from live values.alertcondition(...): declare a named condition the chart can wire up to its alert system. Use it for reusable, user-configurable alerts.
Fire when X crosses Y
The most common alert is a crossover. Build the boolean condition, then pass it to alert along with the message and how often it may fire:
//@version=2
define(title="MA cross alert", position="onchart", axis=true)
timeseries trade = ohlcv(symbol=currentSymbol, exchange=currentExchange)
timeseries fast = sma(source=trade.close, period=9)
timeseries slow = sma(source=trade.close, period=21)
// Fire once per bar when the fast MA crosses above the slow MA.
var goldenCross = crossover(seriesA=fast, seriesB=slow)
alert(message=format("Golden cross at {0}", trade.close), condition=goldenCross, freq="once_per_bar")
plotLine(value=fast, colors=["#16a34a"], width=2, label=["Fast"], desc=["9-bar SMA"])
plotLine(value=slow, colors=["#dc2626"], width=2, label=["Slow"], desc=["21-bar SMA"])alert()
alert(message, condition, freq) fires whenever condition is true on a bar.
| Argument | Type | Description |
|---|---|---|
message | string | The alert text. Build it dynamically with format(...) to include live values. |
condition | boolean | The alert fires on bars where this is true. |
freq | string | How often it may re-fire, e.g. "once_per_bar". |
alertcondition()
alertcondition(condition, title, message) declares a named alert the chart can attach to. Instead of firing directly, it exposes a condition users can select when creating an alert on your indicator.
| Argument | Type | Description |
|---|---|---|
condition | boolean | When the alert is eligible to fire. |
title | string | The name shown in the alert dropdown. |
message | string | Default message for the alert. |
//@version=2
define(title="RSI overbought", position="offchart", axis=true)
timeseries trade = ohlcv(symbol=currentSymbol, exchange=currentExchange)
var r = rsi(source=trade.close, period=14)
// Exposes "Overbought" as a selectable alert condition on this script.
alertcondition(condition=r > 70, title="Overbought", message="RSI above 70")
plotLine(value=r, colors=["#7c3aed"], width=2, label=["RSI"], desc=["14-bar RSI"])Both, side by side
This script fires a direct alert on one bar and declares an alertcondition on another, so you can see how each is wired.
//@version=2
define(title="Verified Alerts", position="offchart", axis=true)
timeseries trade = ohlcv(symbol=currentSymbol, exchange=currentExchange)
var directTrigger = barIndex == 10
var conditionTrigger = barIndex == 11
alert(message=format("direct alert at bar {0}", barIndex), condition=directTrigger, freq="once_per_bar")
alertcondition(condition=conditionTrigger, title="Condition Alert", message="alertcondition payload")
plotLine(value=trade.close, colors=["#2563eb"], width=2, label=["Close"], desc=["close series for alert probe"])When this runs, the direct alert fires on bar 10 and the condition fires on bar 11, each carrying its message and once_per_bar frequency.