Technical Analysis
The calculateIndicator tool lets you compute technical indicators using an Excel-like formula syntax. It works across equities, crypto, and currencies with the same syntax.
Basic Usage
You: What's the 50-day moving average of AAPL?
Alice: [calls calculateIndicator(asset="equity", formula="SMA(CLOSE('AAPL', '1d'), 50)")]
AAPL 50-day SMA: $189.42
The asset parameter determines which data source to use:
equity— Stocks (e.g. AAPL, MSFT, NVDA)crypto— Cryptocurrencies (e.g. BTCUSD, ETHUSD)currency— Forex pairs (e.g. EURUSD, GBPUSD)commodity— Commodities by canonical id (e.g.gold,crude_oil,copper)
Formula Syntax
Data Access Functions
| Function | Description |
|---|---|
CLOSE(symbol, interval) | Closing prices |
OPEN(symbol, interval) | Opening prices |
HIGH(symbol, interval) | High prices |
LOW(symbol, interval) | Low prices |
VOLUME(symbol, interval) | Volume data |
Intervals: 1d (daily), 1w (weekly), 1h (hourly), 5m (5-minute), etc.
Statistical Functions
| Function | Description |
|---|---|
SMA(data, period) | Simple Moving Average |
EMA(data, period) | Exponential Moving Average |
STDEV(data, period) | Standard Deviation |
MAX(data, period) | Rolling Maximum |
MIN(data, period) | Rolling Minimum |
SUM(data, period) | Rolling Sum |
AVERAGE(data, period) | Rolling Average |
Technical Indicators
| Function | Description |
|---|---|
RSI(data, period) | Relative Strength Index |
BBANDS(data, period, stddev) | Bollinger Bands (returns upper, middle, lower) |
MACD(data, fast, slow, signal) | MACD (returns macd, signal, histogram) |
ATR(highs, lows, closes, period) | Average True Range |
Array Access
Use bracket notation to get specific values from price series:
CLOSE('AAPL', '1d')[-1] // Most recent close
CLOSE('AAPL', '1d')[-2] // Previous close
Important: Statistical and technical functions return a single number (or object), not an array. Do not append [-1] to SMA, RSI, BBANDS, MACD, or ATR results:
SMA(CLOSE('AAPL', '1d'), 50) // ✓ returns a single scalar
RSI(CLOSE('AAPL', '1d'), 14) // ✓ returns a single scalar
BBANDS(CLOSE('AAPL', '1d'), 20, 2) // ✓ returns { upper, middle, lower }
SMA(CLOSE('AAPL', '1d'), 50)[-1] // ✗ not needed — already a scalar
Operators
Formulas support arithmetic: +, -, *, /
CLOSE('AAPL', '1d')[-1] / SMA(CLOSE('AAPL', '1d'), 200)[-1]
Examples
Moving average crossover check:
SMA(CLOSE('AAPL', '1d'), 50)
SMA(CLOSE('AAPL', '1d'), 200)
RSI overbought/oversold:
RSI(CLOSE('NVDA', '1d'), 14)
Bollinger Bands:
BBANDS(CLOSE('AAPL', '1d'), 20, 2)
MACD:
MACD(CLOSE('AAPL', '1d'), 12, 26, 9)
Crypto RSI on hourly chart:
RSI(CLOSE('BTCUSD', '1h'), 14)
ATR for volatility:
ATR(HIGH('AAPL', '1d'), LOW('AAPL', '1d'), CLOSE('AAPL', '1d'), 14)
Data Ranges
Historical OHLCV data is fetched automatically based on the interval:
| Interval | Data Range |
|---|---|
Minutes (5m, 15m) | ~30 days |
Hourly (1h) | ~90 days |
Daily (1d) | ~2 years |
Weekly (1w) | ~5 years |
Response Shape
Every call returns { value, dataRange }. value is the computed result; dataRange carries the actual OHLCV time span used (symbol, from-date, to-date, bar count) so you can tell whether enough history was available for the indicator to be meaningful.
Precision
Results default to 4 decimal places. Use the precision parameter to adjust:
calculateIndicator(asset="equity", formula="RSI(CLOSE('AAPL', '1d'), 14)", precision=2)