Triggers (Conditions + Indicators)
In Auto, a trigger is a condition tree that evaluates continuously. When the tree resolves to true, configured actions run.
Market Coverage
Auto monitors the full Elfa symbol universe — crypto spot and perps, plus tokenised equities, commodities, and FX listed as HIP-3 markets on Hyperliquid. See Symbols for asset classes, examples, and how to verify a specific ticker.
price and ta conditions select their data venue via the required exchange arg (hyperliquid or gmx). See Exchange Argument (price / ta).
Trigger Shape
All triggers are expressed as conditions with a root boolean group:
{
"conditions": {
"AND": [
{
"source": "ta",
"method": "rsi",
"args": { "symbol": "BTC", "timeframe": "1h", "period": 14 },
"operator": "<",
"value": 30
}
]
}
}
Rules:
- Root group must be
ANDorOR. - Groups can be nested.
- Max condition tree depth:
3. - Max leaf conditions per query:
10.
Supported Condition Sources
Price Source (price)
| Method | Arguments | Returns | Description |
|---|---|---|---|
current | symbol, exchange | number | Current market price |
change | symbol, period, exchange | number | Percent price change over period |
high | symbol, period, exchange | number | Highest price in period |
low | symbol, period, exchange | number | Lowest price in period |
volume | symbol, period, exchange | number | Volume in USD over period |
exchange is required on all price methods — see Exchange Argument (price / ta).
TA Source (ta) - Indicator Methods
| Indicator method | Arguments | Returns | Description |
|---|---|---|---|
rsi | symbol, timeframe, period?, exchange | number | RSI (0-100), default period=14 |
macd_value | symbol, timeframe, exchange | number | MACD line value |
macd_signal | symbol, timeframe, exchange | number | MACD signal line |
macd_histogram | symbol, timeframe, exchange | number | MACD histogram |
bbands_upper | symbol, timeframe, period?, exchange | number | Upper Bollinger Band |
bbands_middle | symbol, timeframe, period?, exchange | number | Middle Bollinger Band |
bbands_lower | symbol, timeframe, period?, exchange | number | Lower Bollinger Band |
ema | symbol, timeframe, period, exchange | number | Exponential moving average |
sma | symbol, timeframe, period, exchange | number | Simple moving average |
atr | symbol, timeframe, period?, exchange | number | Average true range |
stoch_k | symbol, timeframe, exchange | number | Stochastic %K |
stoch_d | symbol, timeframe, exchange | number | Stochastic %D |
cci | symbol, timeframe, period?, exchange | number | Commodity Channel Index |
willr | symbol, timeframe, period?, exchange | number | Williams %R |
exchange is required on all ta methods — see Exchange Argument (price / ta).
Signal Source: X/Twitter Post (tweet)
In the builder catalog, this appears in the Signal category as X/Twitter Post.
| Method | Arguments | Returns | Description |
|---|---|---|---|
semantic | username, text, minConfidence | boolean | Matches posts from a specific X/Twitter account when semantic confidence meets threshold |
Notes:
usernameshould be passed without@(for examplecz_binance).usernamemust resolve to an active monitored account, otherwise validation/create fails.minConfidencemust be an integer from0to100.
Default condition shape:
{
"source": "tweet",
"args": {
"username": "cz_binance",
"text": "Binance Alpha is listing a new token",
"minConfidence": 80
}
}
Signal Source: Event (news)
In the builder catalog, this appears in the Signal category as Event.
| Method | Arguments | Returns | Description |
|---|---|---|---|
semantic | text, minConfidence | boolean | Matches event-like mentions from news-tagged sources when semantic confidence meets threshold |
Notes:
- Event matching is based on
news-tagged sources. minConfidencemust be an integer from0to100.
Default condition shape:
{
"source": "news",
"args": {
"text": "SEC approves a spot ETH ETF",
"minConfidence": 80
}
}
TA Args Contract
This is the exact args contract validated by Athena for TA methods.
Every method below also requires an exchange:string arg (hyperliquid or gmx). It is listed under required args for each method — see Exchange Argument (price / ta).
| Method | Required args | Optional args | Notes |
|---|---|---|---|
rsi | symbol:string, timeframe:string, exchange:string | period:number (default 14) | period is optional. |
macd_value | symbol:string, timeframe:string, exchange:string | None | Uses MACD defaults internally. |
macd_signal | symbol:string, timeframe:string, exchange:string | None | Uses MACD defaults internally. |
macd_histogram | symbol:string, timeframe:string, exchange:string | None | Uses MACD defaults internally. |
bbands_upper | symbol:string, timeframe:string, exchange:string | period:number (default 20) | period is optional. |
bbands_middle | symbol:string, timeframe:string, exchange:string | period:number (default 20) | period is optional. |
bbands_lower | symbol:string, timeframe:string, exchange:string | period:number (default 20) | period is optional. |
ema | symbol:string, timeframe:string, period:number, exchange:string | None | period is required. |
sma | symbol:string, timeframe:string, period:number, exchange:string | None | period is required. |
atr | symbol:string, timeframe:string, exchange:string | period:number (default 14) | period is optional. |
stoch_k | symbol:string, timeframe:string, exchange:string | None | No period argument in EQL. |
stoch_d | symbol:string, timeframe:string, exchange:string | None | No period argument in EQL. |
cci | symbol:string, timeframe:string, exchange:string | period:number (default 20) | period is optional. |
willr | symbol:string, timeframe:string, exchange:string | period:number (default 14) | period is optional. |
Exchange Argument (price / ta)
Both price and ta conditions require an exchange arg that selects which venue's market data backs the condition.
| Property | Value |
|---|---|
| Arg name | exchange |
| Type | string |
| Required | Yes |
| Allowed values | hyperliquid, gmx |
Use it to read the same indicator from a different venue — for example, evaluate RSI on gmx rather than hyperliquid.
{
"source": "price",
"method": "low",
"args": { "symbol": "BTC", "period": "1h", "exchange": "gmx" },
"operator": "<",
"value": 98000
}
{
"source": "ta",
"method": "rsi",
"args": { "symbol": "BTC", "timeframe": "1h", "period": 14, "exchange": "hyperliquid" },
"operator": "<",
"value": 30
}
Notes:
exchangeonly affects the data source of aprice/tacondition. It is independent of wheremarket_order/limit_orderactions execute (those carry their own requiredexchangeparam — see Trading Execution).- Use the exact lowercase enum values (
hyperliquidorgmx).
Validation Errors → Next Action
When Validate Query or Create rejects a query, the error is almost always a phrasing issue — not a capability gap. Iterate on Validate instead of abandoning the query.
| Error signal | What it means | Next action |
|---|---|---|
EQL_MISSING_ARG | A required arg is absent (e.g. period on ema/sma). | Check TA Args Contract, add the missing arg, re-validate. |
EQL_INVALID_ARG / type errors | Wrong type (e.g. "14" instead of 14) or unrecognized key (e.g. length vs period). | Use the exact key names and JSON numeric types from the contract table. |
Unknown method | Indicator name not supported. | Pick the nearest supported method from TA Source; ask Builder Chat to substitute. |
Unsupported timeframe / period | Value outside the enum. | Snap to the nearest allowed value — see Timeframe and Period Enums. |
Unsupported symbol / source | Asset not indexed or DEX pair unsupported. | Skip that symbol and report it; proceed with the supported subset (see capabilities prompt pack for the "skip unsupported" pattern). |
Unmonitored tweet username | tweet.semantic account is not in monitored active account set. | Replace with a monitored active handle and re-validate. |
Invalid minConfidence (tweet/news) | Confidence is non-integer or outside 0..100. | Use an integer between 0 and 100 (start with 80). |
| Depth / leaf-count exceeded | More than depth 3 or 10 leaves. | Split into two queries joined by your runner, or factor shared conditions out. |
cron / llm period too short | Below 1h minimum. | Raise to 1h or higher — see Scheduling Period. |
| Dynamic value in action params | Dynamic values only allowed in condition value. | Move the dynamic reference into a condition; keep action params literal. |
General rule: if Validate returns an error, reshape and re-validate in a loop — do not create your own monitoring stack. See also If /auto doesn't fit.
Common TA Arg Errors
emaandsmarequireperiod;lengthis not a recognized alias.periodmust be a JSON number (for example14), not a string ("14").timeframeis required for all TA methods.
Invalid EMA example (length used, period missing):
{
"source": "ta",
"method": "ema",
"args": { "symbol": "BTC", "timeframe": "1h", "length": 20 },
"operator": ">",
"value": 100000
}
Expected validation failure:
EQL_MISSING_ARGforperiodon methodema
Valid EMA example:
{
"source": "ta",
"method": "ema",
"args": { "symbol": "BTC", "timeframe": "1h", "period": 20 },
"operator": ">",
"value": 100000
}
Cron Source (cron)
| Method | Arguments | Returns | Description |
|---|---|---|---|
once | period | boolean | True on first due evaluation at/after createdAt + period |
onceRemainTrue | period | boolean | True on first due evaluation and remains true afterward |
every | period | boolean | True at each period interval from query creation |
LLM Source (llm)
| Method | Arguments | Returns | Description |
|---|---|---|---|
athena_condition | query, period, speed? | boolean | LLM-evaluated condition |
Note:
cron,llm,tweet, andnewssupport shorthand forms and are expanded server-side.periodforcronandllmsources has a minimum of1h. See Scheduling Period (cron / llm) for the allowed set.- For clearer runtime semantics and easier debugging, prefer separate queries for event-driven Signal intents (
tweet/news) and recurring schedule intents (cron.every).
Supported Operators
><>=<===!=crosses_abovecrosses_below
Cross operators use previous-state tracking and evaluate transitions:
crosses_above: previous<threshold and current>=thresholdcrosses_below: previous>threshold and current<=threshold
Dynamic Comparisons (Dynamic Values)
value does not need to be a static literal. It can also reference another
data source result at evaluation time.
This lets you compare one live metric against another live metric, for example current price vs. an indicator band.
Example: trigger when ETH price crosses above the current 4h upper Bollinger Band.
{
"conditions": {
"AND": [
{
"source": "price",
"method": "current",
"args": { "symbol": "ETH" },
"operator": "crosses_above",
"value": {
"source": "ta",
"method": "bbands_upper",
"args": { "symbol": "ETH", "timeframe": "4h" }
}
}
]
}
}
Important:
- Dynamic values are supported only in condition
value. - Dynamic values are not supported in action parameters.
Timeframe and Period Enums
TA timeframe values:
1m,5m,15m,30m,1h,2h,4h,8h,12h,1d
period values for price args and TA indicator lookbacks:
1h,2h,4h,8h,12h,24h,1d,7d
Scheduling Period (cron / llm)
For cron and llm sources, period is a scheduling interval with a minimum of 1h.
Allowed values:
1h,2h,4h,8h,12h,24h,1d,7d
Signal Match-Description Guidance
For X/Twitter Post and Event, write args.text as a short factual claim.
X/Twitter Post examples:
- bad:
Bearish vibes-> good:Opens a short position on oil - bad:
Something bullish-> good:Announces a new stake in TSLA - bad:
Bullish on a coin-> good:Posts that they're bullish on $HYPE and $SOL
Event examples:
- bad:
Market crash-> good:Major DeFi protocol suffers a $200M exploit - bad:
War conflict-> good:US imposes new sanctions on Russia - bad:
Big news-> good:SEC approves a spot ETH ETF