Cobertura completa de câmbio: 155 moedas vs BRL com histórico desde 2000
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.
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 (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.
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
/moedaslista tudo, com tabs Moedas/Metais e busca textual./moedas/usd-brlmostra 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.