Limites de posição, margem, limites fat-finger e um kill switch precisam responder em cada ordem antes que ela deixe o gateway. É assim que essas checagens vivem dentro do caminho da ordem em vez de ao lado dele: que estado fica em memória, o que é recalculado de forma incremental e o que acontece depois de um reinício. As restrições vêm primeiro.
Uma ordem chega ao gateway. Antes de sair para a venue, algo precisa decidir se a conta pode enviá-la. Essa decisão roda em cada ordem, inclusive na esmagadora maioria que está perfeitamente em ordem, então seu custo é pago por todo o tráfego normal, e não apenas pelas rejeições.
Essa é a restrição a nomear primeiro. Uma checagem de risco colocada no caminho da ordem é um imposto sobre a entrada de ordens. A pergunta de engenharia não é como deixar a checagem esperta, é como deixá-la pequena o bastante para que os traders não a sintam, e honesta o bastante para que ela ainda recuse as ordens que precisa recusar.
O hot path responde exatamente uma pergunta: esta ordem pode ser enviada agora, dado o que sabemos no momento sobre esta conta. As checagens que respondem a essa pergunta ficam. As que respondem a outra pergunta saem.
Todo o resto roda ao lado do caminho, sobre o mesmo estado, sem segurar a ordem. Isso alimenta os limites que o hot path aplica, mas não fica entre o trader e a venue.
A linha divisória é uma pergunta, não uma categoria. No caminho: esta ordem pode sair. Ao lado do caminho: quais deveriam ser os limites. Qualquer coisa que responda à segunda pergunta e ainda assim segure a ordem é um erro de design, por mais importante que a checagem seja.
O estado de que uma checagem pré-negociação precisa - posições atuais, ordens ativas, margem usada e disponível, configuração de limites - vive na memória do processo que toma a decisão. Não em um cache na frente de um banco de dados, não atrás de uma chamada de rede. No processo.
A razão não é só velocidade, embora uma consulta seja ordens de grandeza mais cara do que uma busca em um array local. A razão é correção. Um banco de dados guarda a posição como ela foi escrita. A checagem de risco precisa da posição incluindo ordens enviadas há instantes que ainda não foram executadas, confirmadas ou persistidas. Se você lê do armazenamento, você verifica contra um passado que já foi ultrapassado pelo seu próprio fluxo.
Na prática, isso molda o processo do jeito que qualquer componente de baixa latência é moldado:
O banco de dados é onde a posição é registrada. Não é onde a posição é conhecida.
Um recálculo completo da exposição e da margem de uma conta percorre cada posição e cada ordem ativa. Esse custo cresce com o tamanho do book, o que significa que a checagem de risco ficaria mais lenta justamente para os clientes que mais operam. Por isso o hot path não recalcula. Ele aplica um delta.
A conta carrega agregados correntes - exposição líquida e bruta por instrumento e por grupo, margem usada, nocional em trânsito. Uma ordem que chega produz uma pequena mudança nesses agregados, os valores alterados são comparados com os limites, e a ordem é aceita ou rejeitada. O trabalho é proporcional à ordem, e não à carteira.
O recálculo completo continua acontecendo - em um cronograma, quando parâmetros de margem mudam e como autoverificação periódica contra o resultado incremental. Ele roda fora do caminho, sobre uma cópia, e seu resultado ou é trocado ou é levantado como divergência. Um estado incremental que se afasta silenciosamente do estado real é pior do que nenhuma checagem, então a comparação não é opcional.
Medido no caminho de risco que construímos, a checagem pré-negociação em si se completa em <1 ms. Esse número cobre a decisão sobre o estado em memória, não a jornada completa de uma ordem do cliente até a venue e de volta.
Um kill switch é usado justamente quando algo já está errado. Isso descarta construí-lo sobre a mesma maquinaria que pode ser aquilo que está errado. Ele é um caminho separado, com regras próprias.
Parar novas ordens é a metade fácil. A metade difícil é o que o switch faz com as ordens já em repouso na venue: retirar cotações e cancelar ordens ativas precisa ser possível enquanto o caminho de envio está desativado. Esse caminho de cancelamento merece testes próprios, porque ele é exercitado no pior dia, e não em um dia normal.
O estado em memória é uma visão derivada de um registro durável. É isso que torna um reinício sobrevivível. Todo evento que muda o estado de risco - uma ordem aceita, uma reserva liberada, uma execução aplicada, um limite alterado, o switch acionado - é acrescentado a um journal na máquina local antes de ser efetivado adiante.
O tempo de recuperação passa então a depender do tamanho do journal e da disponibilidade do drop copy, e não do tamanho do book, e o modo de falha de cada incógnita é o mesmo: recusar-se a operar a conta.
Vale enunciar os limites honestos com clareza, porque são eles que decidem se essa arquitetura serve:
A amBrain constrói esse tipo de caminho de risco pré-negociação para corretoras e prop firms, com os hot paths escritos em Rust. O time trabalha com infraestrutura de trading a partir de Yerevan, na Armênia, desde 2019.
Nosso time de engenharia é especializado em soluções de FinTech. Vamos conversar sobre como dar vida ao seu projeto.