---
title: "Cobertura completa de câmbio: 155 moedas vs BRL com histórico desde 2000"
description: "OBM agora tem todas as moedas oficiais publicadas em BRL — USD, EUR, ARS, CNY, JPY e mais 150 — com close diário, gráfico histórico e cross-pairs (USD/JPY, EUR/USD) computados no servidor."
slug: cobertura-completa-de-cambio
pilar: cambio
date: 2026-05-05
author: Felipe Bossolani
tags:
  - cambio
  - ptax
  - moedas
relatedTerms:
  - ptax
  - cross-pair
  - tipo-a-tipo-b
  - boletim-de-fechamento-bcb
relatedPosts:
  - 11-benchmarks-macro-brasileiros
---

Lançamos hoje a cobertura completa de câmbio do OBM. Toda moeda com publicação oficial em algum dia útil agora tem ficha própria no OBM, com close diário, gráfico histórico e cross-pairs computados.

## O que mudou

Até ontem, quem queria PTAX/USD consultava um painel oficial, copiava número e pulava para outro site para ver se a cotação havia mexido na semana. Pesos argentinos, rúpias indianas, renminbis chineses — moedas relevantes para hedge ou para acompanhar viagens — não tinham um lugar limpo no Brasil. A partir de hoje:

- **155 moedas vs BRL** ao vivo em `/moedas`, com filtros por moeda comum e metal precioso.
- **Detalhe por moeda** com close, variação do dia, gráfico Recharts e histórico desde 2000-01-01 nos casos com PTAX strict.
- **Cross-pairs** (USD/JPY, EUR/USD, GBP/CHF) calculados a partir das duas pernas vs BRL — derivação 100% server-side, gráfico idêntico ao de um par direto.

## Cadência

Atualização automática às 19:30 BRT em todo dia útil — reaproveita o mesmo pipeline Procrastinate que já roda CDI, IPCA e o resto do M1.

Para o **histórico longo** das 10 moedas do [PTAX strict](/glossario/ptax) (USD, EUR, GBP, JPY, CHF, CAD, AUD, DKK, NOK, SEK), há série completa desde 2000. Para as ~145 moedas restantes (ARS, CNY, INR, MXN, ZAR, …), o histórico no OBM começa hoje e cresce um dia útil a cada cron.

## Cross-pairs computados no backend

`USD/JPY = (USD/BRL) ÷ (JPY/BRL)`. O cálculo acontece em SQL no Postgres — a gente carrega as duas pernas em CTEs, faz `INNER JOIN` por data e divide com `NULLIF` para garantir que nenhuma divisão por zero ou NaN escape para o frontend.

```sql
WITH base AS (
    SELECT date, value FROM asset_prices
    WHERE asset_id = :usd_asset AND value IS NOT NULL
),
quote AS (
    SELECT date, value FROM asset_prices
    WHERE asset_id = :jpy_asset
      AND value IS NOT NULL AND value > 0
)
SELECT b.date, b.value / NULLIF(q.value, 0) AS value
FROM base b INNER JOIN quote q USING (date);
```

Por que no backend? Porque o frontend deveria ser quase burro: API responde `[{date, value}]`, o gráfico desenha. Múltiplos clientes (web, futura mobile, MCP, exports) consomem a mesma rota. Replicar o `÷` em cada um seria divergência garantida.

## E como você usa

* `/moedas` lista tudo, com tabs Moedas/Metais e busca textual.
* `/moedas/usd-brl` mostra o close direto.
* `/moedas/usd-jpy` é o cross — slug é `<base>-<quote>` em ISO-4217 lowercase, sempre.

Próximo passo do roadmap de câmbio: **portfolio com exposição cambial**. Você define percentuais USD/EUR/JPY no seu portfolio e a gente mostra retorno consolidado — em BRL e na moeda de cada perna. Já está em planejamento.
