For the complete documentation index, see llms.txt. This page is also available as Markdown.

Portfólio e estado da conta

Estado consolidado da conta, saldo disponível para saque, tabela de taxas, posições enriquecidas e a série temporal do portfólio, nos SDKs e na CLI.

Os endpoints de portfólio respondem a quatro perguntas sobre uma conta: quanto ela vale agora, o que pode ser sacado, quanto ela paga em taxas e como foi seu desempenho ao longo do tempo. Eles são um pequeno conjunto de endpoints REST autenticados, mais campos de risco enriquecidos por posição. Toda interface (os SDKs Rust, TypeScript e Python e a CLI) acessa as mesmas rotas no gateway documentado em APIs e limites.

Se você está construindo uma visão de portfólio, leia Ler esses valores com segurança antes de renderizar qualquer coisa. Vários campos são anuláveis de propósito, uma convenção de sinal é fácil de inverter, e uma implementação ingênua com duas chamadas vai esbarrar em uma condição de corrida em produção.

Como obter

npm install @nexus-xyz/exchange-ts    # TypeScript
cargo add nexus-exchange              # Rust
pip install nexus-exchange            # Python

A CLI é distribuída pelos releases de nexus-exchange-cli. Consulte SDKs e ferramentas para todos os clientes.

Autenticação

Toda rota desta página tem escopo de conta e exige uma chave de API HMAC. Não existe variante pública ou sem autenticação. As requisições carregam X-API-Key, X-Timestamp e X-Signature, e o timestamp precisa estar a até 30 segundos do horário do servidor. Os SDKs e a CLI assinam por você. O fluxo completo, com cURL executável, está no Guia rápido.

Mantenha o segredo da API fora do código-fonte e fora do histórico do shell. Ele é exibido uma única vez na criação e não pode ser recuperado depois. Os exemplos abaixo o leem do ambiente.

Escolher uma rede

A Exchange roda hoje na Nexus Testnet, e a mainnet virá depois. Selecione a rede quando construir o cliente. Consulte Redes para ver como cada interface faz isso e como as chaves de API se vinculam a uma rede, e APIs e limites para a URL base atual. A chave HMAC que essas rotas exigem fica restrita à rede em que foi criada.

Referência

Método
Caminho
Autenticação
Descrição

GET

/account/state

HMAC

Resumo do portfólio e todas as posições abertas, a partir de uma leitura coerente

GET

/account/summary

HMAC

Apenas o resumo do portfólio, o mesmo objeto incorporado em /account/state

GET

/account/fees

HMAC

Tabela de taxas efetiva da conta

GET

/account/portfolio-history?window=&limit=

HMAC

Série temporal de patrimônio, PnL acumulado e volume acumulado

Pontos de entrada por SDK:

Interface
Estado consolidado
Tabela de taxas
Série temporal

Rust

fetch_account_state()

fetch_account_fees()

fetch_portfolio_history(window, limit)

Python

fetch_account_state()

fetch_account_fees()

fetch_portfolio_history(window, limit)

TypeScript

getAccountState()

getAccountFees()

getPortfolioHistory({ window, limit })

CLI

nexus account state

nexus account fees

nexus account portfolio-history --window --limit

Estado consolidado da conta

GET /account/state retorna os agregados do portfólio e todas as posições abertas construídos a partir de uma leitura no servidor. Como as duas metades vêm do mesmo snapshot, summary.open_positions_count é sempre igual ao comprimento de positions.

O resumo carrega collateral, total_equity, total_unrealized_pnl, total_realized_pnl_24h, total_volume_24h, open_positions_count, open_orders_count, margin_used, available_margin e withdrawable.

withdrawable é o saldo que pode sair da conta: a margem livre autoritativa do motor, com piso em zero, max(0, available_margin). A margem livre já desconta do patrimônio a margem inicial de cada posição e toda reserva pré-negociação de ordens, então este é o valor do qual um saque pode dispor. Não é total_equity, nem collateral. Uma conta no negativo é limitada a "0" e nunca é reportada como negativa. O valor vem da visão de margem autoritativa, então, quando essa visão está indisponível, o endpoint falha de forma fechada com 502 em vez de retornar um número estimado localmente.

Tabela de taxas

GET /account/fees informa o que a plataforma cobra da conta hoje. Essa é a taxa prospectiva da tabela, não uma média realizada sobre execuções passadas.

Campo
Observações

maker_fee_bps

Pontos-base principais. Pode ser negativo; zero é uma sentinela quando schedule=unknown

taker_fee_bps

Pontos-base principais; zero é uma sentinela quando schedule=unknown

tier

Atualmente sempre base; ainda não há níveis por conta

schedule

per_market, reference ou unknown; trate como uma string aberta

markets

Taxas dos mercados no buffer de execuções retido; ordenado por market_id

volume_30d

Valor nocional negociado nos últimos 30 dias (janela móvel), string decimal. Melhor esforço, veja a flag abaixo

volume_30d_estimated

true quando volume_30d pode estar subcontado (o buffer de execuções de origem estava na capacidade máxima)

discounts

Descontos ativos. Atualmente sempre vazio

Quando schedule é per_market, use as linhas de markets retornadas como as taxas autoritativas. O par de nível superior é apenas o resumo modal determinístico delas. O buffer de execuções em memória, com limite de tamanho, pode ser reiniciado ou descartar mercados antigos, então uma linha ausente não é evidência de que a conta nunca negociou naquele mercado. reference significa que o buffer retido não tem nenhum mercado com tabela espelhada e que o par de nível superior é a taxa modal determinística entre todos os mercados espelhados da plataforma. Nos dois cálculos modais, vence o par com a maior contagem de ocorrências, e empates são resolvidos para o par (maker_fee_bps, taker_fee_bps) lexicograficamente menor. unknown significa que os parâmetros de mercado estão indisponíveis. markets fica vazio e os dois valores de bps principais são sentinelas zero, não uma tabela sem taxas. Hoje não existe nenhum programa de níveis ou descontos por conta. Trate schedule como aberto e não crie ramificações para um formato de desconto que não existe.

Série temporal do portfólio

GET /account/portfolio-history retorna patrimônio, PnL de negociação acumulado e valor nocional negociado acumulado ao longo de uma janela, com downsampling no servidor. Os pontos vêm do mais antigo para o mais recente.

window

Cadência

Máx. de pontos

Período

day

5 min

288

24 h

week

1 h

168

7 d

month

6 h

120

30 d

all

1 d

366

~1 y

Omitir window resulta em day. Um valor fora desse conjunto é rejeitado com 400 (invalid_window). Se o parâmetro for repetido, o primeiro valor é usado. limit precisa estar entre 1 e 366. Dentro desse intervalo, ele restringe o resultado e é limitado à capacidade da janela em vez de rejeitado, então pedir 366 pontos de day retorna 288 em vez de um erro. Fora desse intervalo, a requisição é rejeitada com 400.

A resposta ecoa a window e o cadence_ms que foram servidos. Leia-os de volta em vez de presumir os valores que você enviou, para que os eixos do seu gráfico usem os valores servidos.

Cada ponto carrega timestamp_ms, equity, pnl e volume. pnl e volume são acumulados até aquela amostra, não por intervalo. Para mostrar a atividade por intervalo em um gráfico, calcule você mesmo a diferença entre pontos adjacentes.

Campos de posição enriquecidos

As posições retornadas por /account/state (e /positions) carregam detalhes de risco por posição junto com symbol, side, size, entryPrice, unrealizedPnl e realizedPnl:

Campo
Significado

notional

abs(size) × mark price

initialMargin

Margem inicial mantida contra a posição, no modelo de margem cruzada

roe

Retorno sobre a margem inicial: unrealizedPnl / initialMargin

max_leverage

Alavancagem máxima que o mercado permite, a partir de seus parâmetros de risco

leverage

O multiplicador de alavancagem da conta para esta posição

funding_paid

Financiamento acumulado da posição. Veja a convenção de sinal abaixo

Os nomes são o vocabulário unificado do CCXT, então um cliente ccxt.nexus() lê esse formato diretamente. Os campos sem equivalente no CCXT mantêm a grafia própria da plataforma: size, roe, max_leverage, funding_paid. GET /account não tem esse formato. Ele é repassado pelo motor de matching e responde com um objeto mais restrito, sob os nomes próprios do motor.

O servidor calcula esses campos no caminho de leitura de baixa latência em vez de fazer uma ida e volta ao motor de matching, o que mantém o endpoint rápido. A contrapartida é que, quando um dos insumos não está disponível nesse caminho, o campo é null e um <field>_error companheiro carrega um motivo legível por máquina em vez de um número fabricado.

leverage é atualmente sempre null, com leverage_error definido como margin_state_not_mirrored. Derivá-lo exige a configuração de alavancagem da conta ou sua margem alocada, e nenhuma das duas está disponível no caminho de leitura. Não o reconstrua a partir de initialMargin. Essa expressão se reduz a 1 / initial_margin_rate, que é uma constante por mercado e não a alavancagem real da posição, então estaria errada para todas as posições do mercado.

funding_paid é positivo quando pago. Um valor positivo significa que a posição pagou financiamento, e um valor negativo significa que ela recebeu financiamento. Ele está sempre presente, é "0" antes de qualquer financiamento acumular, e fica limitado pelo histórico de financiamento que a plataforma retém. Inverter esse sinal transforma um custo em receita numa tela de P&L, então escreva um teste para isso.

Ler esses valores com segurança

Valores monetários são strings decimais, não números. equity, pnl, volume, withdrawable, notional e os demais são decimais de precisão arbitrária serializados como strings para não perder precisão. Faça o parse deles com um tipo decimal. Passá-los por um float (parseFloat, float(), as f64) reintroduz o erro de arredondamento que a codificação em string existe para evitar. Os campos de alavancagem (leverage, max_leverage) são números JSON de fato.

Campos derivados têm três estados, não dois. Cada um dos cinco campos de posição calculados (notional, initialMargin, roe, leverage e max_leverage) pode ser:

  1. um valor: calculado e autoritativo;

  2. null: reportado, mas não calculável, e o <field>_error correspondente diz por quê;

  3. ausente: o servidor é anterior ao campo.

Reduzir qualquer um deles a 0 inventa dados. "Não reportado", "não calculável" e "zero" são três respostas diferentes para um usuário que pergunta quanto vale sua posição, e só uma delas é um número. Renderize os casos ausentes como uma lacuna explícita (a CLI imprime -) e exiba o <field>_error quando você o tiver. O mesmo vale para withdrawable. Ele é opcional no schema, então uma implantação mais antiga pode omiti-lo, e usar "0" como padrão diria a alguém que não tem nada disponível quando o servidor nunca reportou o valor.

Esses cinco são exatamente os campos que têm um <field>_error companheiro. funding_paid não é um deles. Ele está sempre presente, então não existe funding_paid_error para verificar.

Prefira /account/state a duas chamadas. Buscar /account/summary e /positions separadamente são duas requisições independentes contra uma conta ativa. Uma execução que ocorra entre elas retorna um agregado que discorda da lista de posições (open_positions_count diz três, o array tem quatro), e isso acontece sob qualquer carga real. O endpoint consolidado sustenta as duas metades com uma leitura coerente.

Trate os códigos de falha de forma distinta. 401 é um problema de credencial ou de relógio. Verifique se o X-Timestamp está a até 30 segundos do horário do servidor antes de presumir que a chave está errada. 429 significa que você excedeu o orçamento de requisições; consulte Limites de requisições e recue em vez de tentar novamente de imediato. Três rotas desta página (/account/summary, /fills e /account/portfolio-history) custam cinco unidades desse orçamento cada, em vez de uma, então consultá-las em um loop apertado esgota a cota de 20/s de um chamador Pro cinco vezes mais rápido do que a contagem de requisições sugere. /account/state custa uma e retorna o resumo e as posições juntos, que é a forma mais barata de ler ambos. 502 em /account/state e /account/summary significa que a visão de margem autoritativa estava inacessível e o servidor se recusou a adivinhar. Tente novamente e não recorra a um withdrawable calculado localmente.

Exemplo

Os números acima são coerentes entre si. A um preço de marca de 86000, notional é 0.25 × 86000, unrealizedPnl é 0.25 × (86000 − 84000), initialMargin é notional × 1/max_leverage, roe é unrealizedPnl / initialMargin, e withdrawable é igual a total_equity − margin_used do resumo, porque não há ordens abertas reservando margem. Observe as duas grafias nessa última cláusula. margin_used no objeto SUMMARY é o agregado da conta e mantém seu nome. initialMargin em uma posição é o requisito por posição.

Exemplos executáveis de ponta a ponta estão nos repositórios dos SDKs: examples/portfolio.ts e examples/portfolio.rs.

Relacionados

Status: prévia de desenvolvimento na testnet. Essas rotas estão presentes na especificação OpenAPI v0.7.2 e seguem atuais na v0.9.90. Fixe uma versão da especificação em produção e verifique as notas de release de cada SDK antes de atualizar. /account/fees não tem programa de níveis ou descontos por conta hoje, e leverage reporta null até que o estado de margem de que ele precisa seja espelhado. Credenciais e saldos da testnet não têm valor no mundo real.

Atualizado