← Back to Blog
April 5, 2026programming

ADX, RSI, and MACD: How to Actually Read Them in Crypto Futures

By APIndicators

Open any trading book and you will find the same rules: RSI above 70 is overbought, sell. MACD histogram crosses zero, enter. ADX above 25 means trending. These rules were written for equity markets that close on weekends, have circuit breakers, and trade on half the leverage of crypto.

Crypto futures run 24/7, leverage is 20-50x common, funding rates flip every 8 hours, and perpetual contracts have no expiry. Textbook interpretations break in predictable ways. This guide walks through how ADX, RSI, and MACD actually behave on BTCUSDT and similar pairs, with concrete adjustments.

RSI: The Overbought Myth

Standard rule: RSI > 70 is overbought, short. RSI < 30 is oversold, buy.

What actually happens in crypto: BTCUSDT can sit at RSI 80+ for days during a strong trend. If you short every RSI > 70 reading during the 2023-2024 run-up, you get liquidated repeatedly. RSI extremes in crypto are continuation signals during trends, not reversal signals.

A better framing:

  • RSI 40-60 range, flat market: classic mean reversion works. Buy 40, sell 60.
  • RSI 60-80 in uptrend: do not short. Use pullbacks to 50 as entries.
  • RSI 20-40 in downtrend: do not buy. Use rallies to 50 as short entries.
  • RSI divergence on 4h chart: actually useful. Price makes new high, RSI makes lower high = momentum waning.

The RSI level itself is almost meaningless without regime context. This is why we pair it with ADX.

ADX: The Regime Filter

ADX measures trend strength, not direction. It answers one question: is price trending or chopping?

Standard interpretation:

  • ADX < 20: no trend, chop
  • ADX 20-25: weak trend
  • ADX 25-40: strong trend
  • ADX > 40: very strong trend, often near exhaustion

In crypto, these levels hold up better than RSI rules, but with one adjustment: ADX is slow. By the time ADX crosses 25, 30-40% of the trend is already done. Use ADX as a filter, not a trigger.

Example rule: "Only take momentum entries when ADX(14) > 22 on the 1-hour chart." That single filter cuts out the 40% of time BTCUSDT spends in sideways chop and dramatically improves signal quality on breakout strategies.

Inverse use case: if ADX < 18 for 48 hours, mean-reversion strategies (bollinger band fades, RSI 30/70 pairs) start working because the market is genuinely ranging.

APIndicators exposes ADX directly via the indicators endpoint, along with the component +DI and -DI values for directional context:

import requests
import os

def get_adx(symbol, interval="1h"):
    url = f"https://api.apindicators.com/v1/pairs/{symbol}/indicators"
    headers = {"Authorization": f"Bearer {os.environ['APINDICATORS_API_KEY']}"}
    r = requests.get(url, headers=headers, params={"interval": interval})
    data = r.json()
    return {
        "adx": data["adx_14"],
        "plus_di": data["plus_di_14"],
        "minus_di": data["minus_di_14"],
    }

regime = get_adx("BTCUSDT")
if regime["adx"] > 25 and regime["plus_di"] > regime["minus_di"]:
    print("Trending up, trade with trend")
elif regime["adx"] < 18:
    print("Range-bound, trade mean reversion")

MACD: Signal Line Crosses Are Noisy

Standard rule: buy when MACD line crosses above signal line, sell when it crosses below.

Reality on BTCUSDT 1h: the signal line crosses the MACD line 15-25 times per week. Most crosses are noise during chop. Acting on every cross produces overtrading and dies to fees.

What works better:

  • Histogram slope: the rate of change of the histogram is more informative than the cross itself. Rising histogram = accelerating momentum.
  • Zero-line crosses: MACD crossing above zero is a slower, more meaningful signal than a signal-line cross. Fewer false positives.
  • Divergence: price makes new high while MACD makes lower high. Same as RSI divergence, also useful.
  • Combined with ADX: only trade MACD signal crosses when ADX > 22.

Example combined rule:

def momentum_long_setup(data):
    macd_cross_up = data["macd"] > data["macd_signal"]
    macd_above_zero = data["macd"] > 0
    trend_strong = data["adx_14"] > 22
    direction_up = data["plus_di_14"] > data["minus_di_14"]
    not_overextended = data["rsi_14"] < 75

    return all([
        macd_cross_up,
        macd_above_zero,
        trend_strong,
        direction_up,
        not_overextended,
    ])

Five conditions. Reduces trade frequency dramatically. Increases average win rate.

Timeframe Matters More Than the Indicator

Every indicator lies at some timeframe and tells the truth at another. RSI on the 5m chart is noise. RSI on the 4h chart actually reflects positioning. MACD on the 1m chart is useless. MACD on the daily is meaningful.

Rough guidelines for BTCUSDT:

  • Scalping (5m-15m): VWAP, order flow, orderbook imbalance. Classical indicators lag too much.
  • Intraday (1h-4h): RSI, MACD, Bollinger bands, ADX work here.
  • Swing (1d+): MACD and RSI divergences are reliable.

Running a strategy on the wrong timeframe is the most common retail mistake.

Practical Takeaways

  1. RSI levels are regime-dependent. 70+ is a short signal only in ranges, not trends.
  2. Use ADX as a gate. Do not take momentum trades in chop. Do not take mean-reversion trades in strong trends.
  3. MACD histogram slope beats line crosses. Ignore every cross that is not accompanied by an ADX confirmation.
  4. Divergences on higher timeframes are the most reliable classical signal.
  5. Match the indicator to the timeframe. RSI on 5m is noise.

APIndicators returns all of these values pre-computed for 473 Binance Futures pairs across 1m to 1d intervals. Stop implementing Wilder's smoothing yourself. Pull the numbers, apply the regime filters, and ship the strategy. Docs at apindicators.com/docs.