# Exponential Moving Average (EMA)

The **Exponential Moving Average** weights recent prices more heavily than a Simple Moving Average, making it more responsive to new price action. It is widely used for trend detection, EMA crossover signals, and dynamic support/resistance levels.

Use EMA with [Aggregates](/docs/aggregates), [Options Chain API](/options-chain-api), [Historical Options Data API](/historical-options-data-api), [Backtesting Data Quality Checklist](/docs/backtesting-data-quality-checklist), and [Stock Aggregates and Indicators](/docs/stock-aggregates-indicators).

<div data-try-url="/v1/options/indicators/ema/O:NFLX260402C00075000/?timespan=day&window=20&limit=10"></div>

## Endpoint

```
GET /v1/options/indicators/ema/{ticker}
```

### Path parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `ticker` | string | Yes | Full options ticker (for example `O:NFLX260402C00075000`). |

### Query parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `timestamp` | string | No | Anchor time: `YYYY-MM-DD` or **millisecond** Unix timestamp. |
| `timestamp.gte` | string | No | Range lower bound (date or ms timestamp). |
| `timestamp.gt` | string | No | Strictly greater. |
| `timestamp.lte` | string | No | Range upper bound. |
| `timestamp.lt` | string | No | Strictly less. |
| `timespan` | string | No | Aggregate bar width: `minute`, `hour`, `day`, `week`, `month`, `quarter`, or `year`. |
| `adjusted` | boolean | No | Use split-adjusted aggregates when `true` (default). `false` uses non-adjusted bars. |
| `window` | integer | No | Number of bars in the moving average window (for example `20` with `timespan=day` → 20-day EMA). |
| `series_type` | string | No | Which aggregate field drives the calculation (commonly `close`). |
| `expand_underlying` | boolean | No | When `true`, `results.underlying` includes an `aggregates` array and a `url` for the matching [aggregates](/docs/aggregates) range. When `false` or omitted, `underlying` is omitted. |
| `order` | string | No | Sort order of points by timestamp (`asc` / `desc`). |
| `limit` | integer | No | Max points returned. Default **10**, maximum **1000**. |
| `page` | string | No | Pagination continuation: use the URL in `next_url`, or pass the `page` query value from that URL here. |

### Response

| Field | Type | Description |
| --- | --- | --- |
| `status` | string | Outcome (for example `OK`). |
| `request_id` | string | Unique identifier for this request, assigned by CuteMarkets. |
| `results` | object | Indicator payload. |
| `next_url` | string | When more values exist, full URL for the next page. |

Use `limit` and timestamp filters per page; follow `next_url` when present.

`results` contains:

| Field | Type | Description |
| --- | --- | --- |
| `values` | array | Objects with `timestamp` (ms) and `value` (EMA at that time). |
| `underlying` | object | **Only when** you pass `expand_underlying=true`. Contains `aggregates` and `url`: an absolute URL to the same contract's aggregates over the inferred date range (for example `https://api.cutemarkets.com/v1/options/aggs/{ticker}/1/day/{from}/{to}/`). |

### Example request

```bash
curl \
  "https://api.cutemarkets.com/v1/options/indicators/ema/O:NFLX260402C00075000/?timespan=day&window=20&limit=10" \
  -H "Authorization: Bearer YOUR_API_KEY"
```

### Sample response

```json
{
  "results": {
    "values": [
      { "timestamp": 1775102400000, "value": 18.49000953885931 },
      { "timestamp": 1775016000000, "value": 18.046852648212923 },
      { "timestamp": 1774929600000, "value": 17.767573979603757 }
    ]
  },
  "status": "OK",
  "request_id": "cm_2de95a6462ce46928c2aabf152f813cf"
}
```

## EMA-specific behavior

EMA gives more weight to recent bars. That makes it faster than SMA when an option price changes quickly around earnings, macro events, or expiration week. The tradeoff is that EMA can react to noisy prints in thin contracts, so it should be paired with liquidity and quote-quality checks.

| Decision | EMA guidance | Why it matters for options |
| --- | --- | --- |
| Responsiveness | Use EMA when recent movement should dominate the signal. | Short-dated options can reprice quickly as delta and IV change. |
| Noise control | Require volume or quote evidence before using a crossover. | One sparse print can move an EMA more than an SMA. |
| Pairing | Compare EMA with SMA or MACD for confirmation. | A single fast line can overreact to microstructure noise. |

## Implementation note

When a dashboard displays EMA beside option chain fields, label the source bar interval clearly. A `20` period EMA on daily bars and a `20` period EMA on five-minute bars are different signals even if the label looks similar.

## Practical interpretation for options

EMA is most useful when the recent bars are more informative than older bars. That is common for contracts near earnings, index events, macro releases, or the final weeks before expiration. In those windows, the option premium can change because the underlying moved, implied volatility moved, time value compressed, or the spread widened. The EMA does not explain which cause drove the move, but it gives a responsive line that can be compared with quotes, trades, IV, and open interest.

Use EMA as an input to a richer decision, not as a standalone signal. A rising EMA on a contract with tight quotes and steady volume means something different from a rising EMA created by one isolated print. For production scanners, store the bar timestamp, `window`, `timespan`, `series_type`, quote age, and spread at the same time as the EMA value.

## EMA quality checks

Before ranking contracts by EMA behavior, apply a few filters:

- Exclude contracts with very few bars in the lookback window.
- Require recent bid/ask evidence when the signal will drive a fill model.
- Compare the EMA slope with underlying movement and IV movement.
- Treat very short-dated contracts separately from longer-dated contracts.

These checks make the indicator easier to defend when a signal looks strong in a chart but weak in a real execution workflow.

EMA calculations should be sourced from [Aggregates](/docs/aggregates), compared with [Stock Aggregates and Indicators](/docs/stock-aggregates-indicators), and logged in the [Backtesting Data Model](/docs/backtesting-data-model). Keep OHLCV, lookback window, smoothing factor, warm-up period, timestamp alignment, and adjusted aggregate policy consistent across research and production.

## EMA implementation notes

EMA output depends on source bars, timespan, adjusted setting, window length, warm-up history, and timestamp alignment. Store those parameters with every EMA value. If a screen later joins EMA state into [Option Chain](/docs/option-chain) or [Contracts](/docs/contracts), pass the stock signal timestamp beside the option request so the option leg can be audited against the underlying signal that created it.

EMA reacts faster than SMA, which makes it useful for watchlists and opening-range context but also easier to overfit. A product screen should label incomplete warm-up windows, split-adjusted bars, extended-hours policy, and stale snapshot state. For cross-product workflows, pair this page with [Stock and Options Data Join Workflow](/docs/stock-options-data-join-workflow), [Stock Aggregates and Indicators](/docs/stock-aggregates-indicators), and [Market Hours, Timestamps, and Timezones](/docs/market-hours-timestamps-timezones).

For backtests, avoid calculating an EMA from bars that were not complete at the signal timestamp. A 5-minute bar can update several times before close, while an indicator value based on the completed bar belongs after the interval ends. Store bar_end, calculation_time, and signal_time separately when the strategy enters options after an EMA cross or pullback.
