TickAtlas
Analysis 10 min read · March 28, 2026

Top 10 Technical Indicators Every Trading Bot Needs

A ranked breakdown of the 10 most effective technical indicators for algorithmic trading, with API examples and strategy tips for each one.

CG
By the TickAtlas team

Not all indicators are created equal for automation. Some produce clean, programmable signals. Others require subjective interpretation that only a human can provide. This list ranks the 10 indicators that work best when you hand them to a bot, with real API examples from the TickAtlas API.

1. RSI (Relative Strength Index)

Why it is #1: Clean numerical output (0-100), universally understood thresholds (30/70), and works across all timeframes and instruments. Every bot should start here.

python
# Fetch RSI for any symbol
resp = requests.get("https://tickatlas.com/v1/indicators", params={
    "symbol": "EURUSD", "timeframe": "H1", "indicators": "RSI_14"
}, headers={"X-API-Key": API_KEY})

rsi = resp.json()["data"]["indicators"]["RSI_14"]["value"]
# Returns: 34.7

RSI API Reference

2. MACD (Moving Average Convergence Divergence)

Why it matters: MACD captures both trend direction and momentum in a single indicator. The histogram crossing zero is one of the most reliable programmable signals.

json
// Response: /v1/indicators?indicators=MACD
{
  "MACD": {
    "macd_line": 0.00045,
    "signal_line": 0.00032,
    "histogram": 0.00013
  }
}
// Bot logic: histogram > 0 = bullish momentum

MACD API Reference

3. Bollinger Bands

Why it matters: Provides dynamic support/resistance levels that adapt to volatility. The bandwidth value is excellent for detecting volatility squeezes that precede big moves.

json
// Response: /v1/indicators?indicators=BBANDS_20
{
  "BBANDS_20": {
    "upper": 1.0892,
    "middle": 1.0856,
    "lower": 1.0820,
    "bandwidth": 0.0066
  }
}
// Bot logic: price < lower band + RSI < 30 = mean reversion buy

Bollinger Bands API Reference | Developer Guide

4. ATR (Average True Range)

Why it matters: Not a directional indicator — ATR measures volatility. Use it to set dynamic stop losses and calculate position sizes. Essential for risk management.

# Dynamic stop loss using ATR
atr = resp.json()["data"]["indicators"]["ATR_14"]["value"]
stop_loss = entry_price - (2.0 * atr)  # 2x ATR below entry
take_profit = entry_price + (3.0 * atr)  # 3x ATR above entry

ATR API Reference

5. ADX (Average Directional Index)

Why it matters: Tells you whether the market is trending or ranging. ADX above 25 means a trend is present; below 20 means it is range-bound. This one filter alone prevents your trend-following bot from getting chopped up in sideways markets.

# Only trade trend strategies when ADX confirms a trend
adx = resp.json()["data"]["indicators"]["ADX_14"]["value"]
if adx > 25:
    # Market is trending — use MACD/EMA crossover strategy
    pass
else:
    # Market is ranging — use RSI mean reversion strategy
    pass

ADX Deep Dive | ADX API Reference

6. EMA (Exponential Moving Average)

Why it matters: Faster than SMA, the EMA reacts to recent price changes more quickly. The 9/21 EMA crossover is one of the simplest and most effective trend-following signals.

# EMA crossover detection
ema_9 = indicators["EMA_9"]["value"]
ema_21 = indicators["EMA_21"]["value"]

if ema_9 > ema_21:
    trend = "BULLISH"
elif ema_9 < ema_21:
    trend = "BEARISH"

EMA API Reference

7. Stochastic Oscillator

Why it matters: Similar to RSI but with a signal line crossover component. The %K/%D crossover in oversold/overbought zones produces clean entry signals, especially on higher timeframes.

json
// Response: /v1/indicators?indicators=STOCH_14_3_3
{
  "STOCH_14_3_3": {
    "k_value": 18.5,
    "d_value": 22.1,
    "signal": "oversold"
  }
}
// Bot logic: %K crosses above %D in oversold zone = buy

Stochastic API Reference

8. Ichimoku Cloud

Why it matters: A complete trading system in one indicator. It provides trend direction, support/resistance, and momentum all at once. Complex for humans to read, but perfect for a bot that can parse all five components programmatically.

# Ichimoku trend filter
tenkan = indicators["ICHIMOKU"]["tenkan_sen"]
kijun = indicators["ICHIMOKU"]["kijun_sen"]
senkou_a = indicators["ICHIMOKU"]["senkou_span_a"]
senkou_b = indicators["ICHIMOKU"]["senkou_span_b"]

# Price above the cloud = bullish
cloud_top = max(senkou_a, senkou_b)
if current_price > cloud_top and tenkan > kijun:
    signal = "STRONG_BULLISH"

Ichimoku Automation Guide | API Reference

9. OBV (On-Balance Volume)

Why it matters: Volume confirms price moves. Rising OBV with rising price confirms the trend. Divergence between OBV and price often precedes reversals. Essential for filtering false breakouts.

# OBV divergence detection
obv_rising = indicators["OBV"]["value"] > indicators["OBV"]["prev_value"]
price_rising = current_price > previous_price

if price_rising and not obv_rising:
    print("Warning: bearish OBV divergence — trend may reverse")

OBV API Reference

10. Parabolic SAR

Why it matters: Provides clear trailing stop levels. When the dots flip from below to above price, it signals a trend change. Excellent as a trailing stop mechanism for bots that need to ride trends.

# Parabolic SAR trailing stop
sar = indicators["PSAR"]["value"]
if current_price > sar:
    # Uptrend — SAR is the trailing stop level
    stop_loss = sar
else:
    # Downtrend signal — exit long positions
    signal = "EXIT_LONG"

Parabolic SAR API Reference

How to Combine Them

Do not use all 10 at once. Pick 2-3 indicators from different families for a balanced strategy:

  • Trend + Momentum: EMA crossover + RSI confirmation
  • Volatility + Oscillator: Bollinger Bands + Stochastic
  • Trend filter + Entry: ADX trend filter + MACD signal crossover
  • All-in-one: Ichimoku for direction + ATR for position sizing

Fetch all the indicators you need in a single API call using the indicators parameter with comma-separated values. This minimizes latency and API usage.

Further Reading

Try this with live data

Every account gets $2.50 in free PAYG credits. No card required — paste your API key and run the code above against live broker data.