Informações sobre o protocolo ALO, protocolo de entrada de ordens para fins de negociação na Base Exchange.
Participantes de Negociação autorizados enviarão ordens de compra e venda por meio do Gateway de Entrada de Ordens ALO. As ordens aceitas estarão sujeitas às condições de matching de acordo com seus parâmetros. As ordens que não puderem ser executadas imediatamente serão registradas no Livro de Ofertas, seguindo a prioridade preço-tempo, para execução quando houver condições adequadas de mercado.
Por meio desses gateways, os Participantes de Negociação poderão enviar solicitações de Nova Ordem, Cancelamento e Substituição de ordens previamente enviadas, além de receber as respectivas execuções. Para uma melhor compreensão das Regras de Execução, consulte o Manual de Procedimentos Operacionais. Para informações sobre Market Data, consulte o protocolo ALI.
| Versão | Compatível com versão anterior |
Descrição da Alteração | Data |
|---|---|---|---|
| 3.0 | Não | Adicionados VAD e VAC ao campo TimeInForce; Adicionados os campos OrderLifeSpan e MaxLifeSpan; Alterados os códigos de rejeição e cancelamento; FirmId renomeado para FirmCode |
11/08/2026 |
| 2.0 | Não | Adicionado campo EnteringTrader na mensagem de Ordem Aceita; Alterados os códigos de rejeição |
21/07/2025 |
| 1.0 | - | Versão original | 11/08/2024 |
ALO é um protocolo nativo de entrada de ordens em formato binário, projetado com foco em simplicidade e desempenho.
O protocolo ALO consiste em um canal de comunicação bidirecional entre o host ALO e a aplicação cliente, intermediado por um protocolo de nível inferior, o BaseTCP. As mensagens de saída, ou seja, do host ALO para o cliente, são sempre sequenciadas e possuem entrega garantida pelo protocolo de nível inferior (BaseTCP), enquanto as mensagens de entrada não possuem garantia de entrega por design. A descrição dos tipos de mensagens disponíveis é apresentada nas seções posteriores.
Cada Usuário ALO, equivalente a uma sessão de entrada de ordens, possui pelo menos um host físico ALO associado. Hosts físicos ALO adicionais podem ser vinculados ao mesmo Usuário ALO, funcionando como réplicas e gerando as mesmas mensagens de saída. Caso haja qualquer dúvida sobre o recebimento bem-sucedido de uma determinada mensagem pelo host ALO, por exemplo em caso de falha de conexão, a aplicação cliente pode reenviar com segurança a mensagem ao host ALO e/ou enviá-la para múltiplas réplicas associadas ao mesmo Usuário ALO, sem risco de gerar solicitações duplicadas.
Todos os comprimentos dos campos são considerados em bytes.
Campos do tipo Alfanumérico permitem caracteres ASCII maiúsculos e minúsculos. Campos Alfanuméricos de largura fixa são preenchidos à direita com espaços.
Campos do tipo Numérico são representados em formato binário, big-endian e unsigned.
O campo Preço é um campo Numérico com 4 casas decimais implícitas.
É responsabilidade do Participante de Negociação solicitar a criação de seus Usuários ALO.
Define para quais contas o Usuário ALO pode enviar ordens.
AccXY, AccYZ e AccZX.| Nome | Comprimento | Tipo | Observações |
|---|---|---|---|
| Type | 1 | Alfanumérico | O = Inserir Ordem |
| UserRefNum | 4 | Numérico | Deve ser único por dia e estritamente crescente para cada Usuário ALO |
| Side | 1 | Alfanumérico | B = Compra, S = Venda |
| Quantity | 4 | Numérico | Deve ser > 0 e < 1.000.000 |
| Symbol | 8 | Alfanumérico | Código do ativo |
| Price | 4 | Numérico | Deve ser > 0 e < 200.000,00 Preço = 200.000,00 ou 0x7FFFFFFF indica Ordem a Mercado |
| TimeInForce | 1 | Alfanumérico | 0 = Dia, 1 = VAC, 3 = IOC, 4 = TON, 6 = VAD |
| OrderLifeSpan | 2 | Numérico | Número de dias padrão em que a ordem permanecerá ativa. Obrigatório quando TimeInForce = GTD; nesse caso deve ser >= 0 e <= 365 |
| PostOnly | 1 | Alfanumérico | P = Passiva ou Cancela, N = Não |
| Attributable | 1 | Alfanumérico | A = Exibe FirmCode da ordem no market data, N = Não exibe FirmCode da ordem no market data |
| ClOrdId | 14 | Alfanumérico | Identificador da ordem do cliente |
| AccountId | 4 | Numérico | Opcional. Encaminhado para sistemas de compensação e liquidação |
| STPKey | 4 | Numérico | Chave de Self Trade Prevention 0 = sem STP |
| EnteringTrader | 5 | Alfanumérico | Identificador do operador. Para ausência de EnteringTrader, utilizar apenas espaços em branco ou caracteres nulos (ASCII 0) |
| Nome | Comprimento | Tipo | Observações |
|---|---|---|---|
| Type | 1 | Alfanumérico | U = Substituir Ordem |
| OrigUserRefNum | 4 | Numérico | UserRefNum original da ordem |
| UserRefNum | 4 | Numérico | Deve ser único e crescente |
| Quantity | 4 | Numérico | Quantidade total desejada |
| Price | 4 | Numérico | Preço de substituição |
| OrderLifeSpan | 2 | Numérico | Nova duração da ordem. Quando TimeInForce for VAD, deve ser <= MaxLifeSpan |
| ClOrdId | 14 | Alfanumérico | Identificador da solicitação de substituição do cliente |
| EnteringTrader | 5 | Alfanumérico | Identificador do operador |
| Nome | Comprimento | Tipo | Observações |
|---|---|---|---|
| Type | 1 | Alfanumérico | X = Cancelar Ordem |
| UserRefNum | 4 | Numérico | UserRefNum original da ordem enviada |
| ClOrdId | 14 | Alfanumérico | Identificador da solicitação de cancelamento do cliente |
| EnteringTrader | 5 | Alfanumérico | Identificador do operador |
| Nome | Comprimento | Tipo | Observações |
|---|---|---|---|
| Type | 1 | Alfanumérico | S = Evento de Sistema |
| Timestamp | 8 | Numérico | Nanosegundos desde a meia-noite |
| Event Code | 1 | Alfanumérico | S = Início do Dia, E = Fim do Dia |
O estado Dead é enviado pelo servidor quando a mensagem de entrada é aceita e imediatamente cancelada.
Para evitar o envio de uma mensagem OrderAccepted seguida de uma mensagem OrderCanceled, utiliza-se o estado Dead (por exemplo: ordem a mercado sem quantidade executada).
| Nome | Comprimento | Tipo | Observações |
|---|---|---|---|
| Type | 1 | Alfanumérico | A = Ordem Aceita |
| Timestamp | 8 | Numérico | Nanosegundos desde a meia-noite |
| UserRefNum | 4 | Numérico | UserRefNum da ordem |
| Side | 1 | Alfanumérico | Lado da ordem informada |
| Quantity | 4 | Numérico | Quantidade aceita |
| Symbol | 8 | Alfanumérico | Ativo |
| Price | 4 | Numérico | Preço |
| TimeInForce | 1 | Alfanumérico | TimeInForce |
| OrderLifeSpan | 2 | Numérico | Duração da ordem |
| MaxLifeSpan | 2 | Numérico | Duração máxima permitida para OrderLifeSpan |
| PostOnly | 1 | Alfanumérico | PostOnly |
| Attributable | 1 | Alfanumérico | Attributable |
| OrderRefNum | 8 | Numérico | Referência única da ordem atribuída pela bolsa |
| OrderState | 1 | Alfanumérico | L = Ativa (Live), D = Encerrada (Dead) |
| ClOrdId | 14 | Alfanumérico | Identificador da ordem do cliente |
| AccountId | 4 | Numérico | AccountId |
| STPKey | 4 | Numérico | STPKey |
| EnteringTrader | 5 | Alfanumérico | Identificador do operador |
| Nome | Comprimento | Tipo | Observações |
|---|---|---|---|
| Type | 1 | Alfanumérico | U = Ordem Substituída |
| Timestamp | 8 | Numérico | Nanosegundos desde a meia-noite |
| OrigUserRefNum | 4 | Numérico | UserRefNum da ordem original |
| UserRefNum | 4 | Numérico | Novo UserRefNum da ordem |
| Side | 1 | Alfanumérico | Lado original da ordem |
| Quantity | 4 | Numérico | Quantidade remanescente |
| Symbol | 8 | Alfanumérico | Ativo |
| Price | 4 | Numérico | Preço |
| OrderLifeSpan | 2 | Numérico | Duração da ordem |
| OrderRefNum | 8 | Numérico | Referência atribuída pela bolsa |
| OrderState | 1 | Alfanumérico | L = Ativa (Live), D = Encerrada (Dead) |
| ClOrdId | 14 | Alfanumérico | Identificador da substituição do cliente |
| Nome | Comprimento | Tipo | Observações |
|---|---|---|---|
| Type | 1 | Alfanumérico | C = Ordem Cancelada |
| Timestamp | 8 | Numérico | Nanosegundos desde a meia-noite |
| UserRefNum | 4 | Numérico | Ordem cancelada |
| Quantity | 4 | Numérico | Quantidade cancelada |
| ClOrdId | 14 | Alfanumérico | Identificador de cancelamento do cliente |
| Reason | 1 | Alfanumérico | Motivo do cancelamento |
| Código | Motivo |
|---|---|
| 82 | CanceledRemaining |
| 75 | VCM |
| 84 | STP |
| 83 | Supervisory |
| 77 | MaximumNumOrders |
| 80 | PriceOutsideVCMRange |
| 79 | PostOnly |
| 90 | System |
| 101 | OpSDP |
| 102 | OpSPVD |
| 111 | DocSDP |
| 112 | DocSPVD |
| 113 | DocSFD |
| 121 | AccSDP |
| 122 | AccSPVD |
| 123 | AccSFD |
| 131 | CapSDP |
| 132 | CapSPVD |
| 161 | CarryingDocSDP |
| 162 | CarryingDocSPVD |
| 163 | CarryingDocSFD |
| 171 | CarryingAccSDP |
| 172 | CarryingAccSPVD |
| 173 | CarryingAccSFD |
| Nome | Comprimento | Tipo | Observações |
|---|---|---|---|
| Type | 1 | Alfanumérico | E = Ordem Executada |
| Timestamp | 8 | Numérico | Nanosegundos desde a meia-noite |
| UserRefNum | 4 | Numérico | Ordem executada |
| Quantity | 4 | Numérico | Quantidade executada |
| Price | 4 | Numérico | Preço de execução |
| LiquidityFlag | 1 | Alfanumérico | A = Adicionou liquidez, R = Removeu liquidez |
| MatchNumber | 8 | Numérico | Identificador da negociação |
| CounterFirmCode | 4 | Numérico | Participante de Negociação contraparte do negócio |
| Nome | Comprimento | Tipo | Observações |
|---|---|---|---|
| Type | 1 | Alfanumérico | J = Rejeitada |
| Timestamp | 8 | Numérico | Nanosegundos desde a meia-noite |
| OrigUserRefNum | 4 | Numérico | Referência original da ordem. Utilizada ao rejeitar mensagens de Substituição de Ordem |
| UserRefNum | 4 | Numérico | Ordem rejeitada |
| Reason | 2 | Numérico | Código do motivo da rejeição |
| ClOrdId | 14 | Alfanumérico | Identificador da solicitação do cliente |
| Código | Motivo |
|---|---|
| 1 | PortMessageRateRestriction |
| 2 | OutOfTime |
| 3 | Duplicate |
| 4 | AccountNotAuthorized |
| 5 | OperatorNotAuthorized |
| 6 | AccountNotFound |
| 7 | OperatorNotFound |
| 20 | InvalidSide |
| 21 | InvalidDate |
| 22 | InvalidQuantity |
| 23 | InvalidVolume |
| 24 | InvalidSymbol |
| 25 | InvalidPrice |
| 26 | InvalidTimeInForce |
| 27 | InvalidPostOnly |
| 28 | InvalidOrderLifespan |
| 40 | Halted |
| 41 | NoRefPrice |
| 42 | PriceOutsideRange |
| 43 | PostOnly |
| 44 | MaximumNumOrders |
| 60 | PriceOutsideSpread |
| 85 | OpExchangeProtected |
| 86 | OpExchangeBlocked |
| 87 | AccExchangeProtected |
| 88 | AccExchangeBlocked |
| 90 | OpExchangeTMOC |
| 91 | OpExchangeTMOV |
| 92 | OpExchangeSPCI |
| 93 | OpExchangeSPVI |
| 94 | AccExchangeTMOC |
| 95 | AccExchangeTMOV |
| 96 | AccExchangeSPCI |
| 97 | AccExchangeSPVI |
| 101 | OpProtected |
| 102 | OpBlocked |
| 103 | OpGroupNotAllowed |
| 104 | OpTMOC |
| 105 | OpTMOV |
| 106 | OpSPCI |
| 107 | OpSPVI |
| 111 | DocProtected |
| 112 | DocBlocked |
| 113 | DocGroupNotAllowed |
| 114 | DocTMOC |
| 115 | DocTMOV |
| 116 | DocSPCI |
| 117 | DocSPVI |
| 121 | AccProtected |
| 122 | AccBlocked |
| 123 | AccGroupNotAllowed |
| 124 | AccTMOC |
| 125 | AccTMOV |
| 126 | AccSPCI |
| 127 | AccSPVI |
| 131 | CapProtected |
| 132 | CapBlocked |
| 161 | CarryingDocProtected |
| 162 | CarryingDocBlocked |
| 163 | CarryingDocGroupNotAllowed |
| 164 | CarryingDocTMOC |
| 165 | CarryingDocTMOV |
| 166 | CarryingDocSPCI |
| 167 | CarryingDocSPVI |
| 171 | CarryingAccProtected |
| 172 | CarryingAccBlocked |
| 173 | CarryingAccGroupNotAllowed |
| 174 | CarryingAccTMOC |
| 175 | CarryingAccTMOV |
| 176 | CarryingAccSPCI |
| 177 | CarryingAccSPVI |
| 10004 | CrossBuyAccountNotAuthorized |
| 10006 | CrossBuyAccountNotFound |
| 10007 | CrossBuyOperatorNotFound |
| 10024 | CrossBuyInvalidSymbol |
| 10022 | CrossBuyInvalidQuantity |
| 10023 | CrossBuyInvalidVolume |
| 10101 | CrossBuyOpProtected |
| 10102 | CrossBuyOpBlocked |
| 10103 | CrossBuyOpGroupNotAllowed |
| 10104 | CrossBuyOpTMOC |
| 10105 | CrossBuyOpTMOV |
| 10106 | CrossBuyOpSPCI |
| 10107 | CrossBuyOpSPVI |
| 10111 | CrossBuyDocProtected |
| 10112 | CrossBuyDocBlocked |
| 10113 | CrossBuyDocGroupNotAllowed |
| 10114 | CrossBuyDocTMOC |
| 10115 | CrossBuyDocTMOV |
| 10116 | CrossBuyDocSPCI |
| 10117 | CrossBuyDocSPVI |
| 10121 | CrossBuyAccProtected |
| 10122 | CrossBuyAccBlocked |
| 10123 | CrossBuyAccGroupNotAllowed |
| 10124 | CrossBuyAccTMOC |
| 10125 | CrossBuyAccTMOV |
| 10126 | CrossBuyAccSPCI |
| 10127 | CrossBuyAccSPVI |
| 10131 | CrossBuyCapProtected |
| 10132 | CrossBuyCapBlocked |
| 10161 | CrossBuyCarryingDocProtected |
| 10162 | CrossBuyCarryingDocBlocked |
| 10163 | CrossBuyCarryingDocGroupNotAllowed |
| 10164 | CrossBuyCarryingDocTMOC |
| 10165 | CrossBuyCarryingDocTMOV |
| 10166 | CrossBuyCarryingDocSPCI |
| 10167 | CrossBuyCarryingDocSPVI |
| 10171 | CrossBuyCarryingAccProtected |
| 10172 | CrossBuyCarryingAccBlocked |
| 10173 | CrossBuyCarryingAccGroupNotAllowed |
| 10174 | CrossBuyCarryingAccTMOC |
| 10175 | CrossBuyCarryingAccTMOV |
| 10176 | CrossBuyCarryingAccSPCI |
| 10177 | CrossBuyCarryingAccSPVI |
| 11004 | CrossSellAccountNotAuthorized |
| 11006 | CrossSellAccountNotFound |
| 11007 | CrossSellOperatorNotFound |
| 11024 | CrossSellInvalidSymbol |
| 11022 | CrossSellInvalidQuantity |
| 11023 | CrossSellInvalidVolume |
| 11101 | CrossSellOpProtected |
| 11102 | CrossSellOpBlocked |
| 11103 | CrossSellOpGroupNotAllowed |
| 11104 | CrossSellOpTMOC |
| 11105 | CrossSellOpTMOV |
| 11106 | CrossSellOpSPCI |
| 11107 | CrossSellOpSPVI |
| 11111 | CrossSellDocProtected |
| 11112 | CrossSellDocBlocked |
| 11113 | CrossSellDocGroupNotAllowed |
| 11114 | CrossSellDocTMOC |
| 11115 | CrossSellDocTMOV |
| 11116 | CrossSellDocSPCI |
| 11117 | CrossSellDocSPVI |
| 11121 | CrossSellAccProtected |
| 11122 | CrossSellAccBlocked |
| 11123 | CrossSellAccGroupNotAllowed |
| 11124 | CrossSellAccTMOC |
| 11125 | CrossSellAccTMOV |
| 11126 | CrossSellAccSPCI |
| 11127 | CrossSellAccSPVI |
| 11131 | CrossSellCapProtected |
| 11132 | CrossSellCapBlocked |
| 11161 | CrossSellCarryingDocProtected |
| 11162 | CrossSellCarryingDocBlocked |
| 11163 | CrossSellCarryingDocGroupNotAllowed |
| 11164 | CrossSellCarryingDocTMOC |
| 11165 | CrossSellCarryingDocTMOV |
| 11166 | CrossSellCarryingDocSPCI |
| 11167 | CrossSellCarryingDocSPVI |
| 11171 | CrossSellCarryingAccProtected |
| 11172 | CrossSellCarryingAccBlocked |
| 11173 | CrossSellCarryingAccGroupNotAllowed |
| 11174 | CrossSellCarryingAccTMOC |
| 11175 | CrossSellCarryingAccTMOV |
| 11176 | CrossSellCarryingAccSPCI |
| 11177 | CrossSellCarryingAccSPVI |
| 12006 | CrossBuyAsyncAccountNotFound |
| 12007 | CrossBuyAsyncOperatorNotFound |
| 12101 | CrossBuyAsyncOpSDP |
| 12102 | CrossBuyAsyncOpSPVD |
| 12103 | CrossBuyAsyncOpSFD |
| 12111 | CrossBuyAsyncDocSDP |
| 12112 | CrossBuyAsyncDocSPVD |
| 12113 | CrossBuyAsyncDocSFD |
| 12121 | CrossBuyAsyncAccSDP |
| 12122 | CrossBuyAsyncAccSPVD |
| 12123 | CrossBuyAsyncAccSFD |
| 12131 | CrossBuyAsyncCapSDP |
| 12132 | CrossBuyAsyncCapSPVD |
| 12133 | CrossBuyAsyncCapSFD |
| 12161 | CrossBuyAsyncCarryingDocSDP |
| 12162 | CrossBuyAsyncCarryingDocSPVD |
| 12163 | CrossBuyAsyncCarryingDocSFD |
| 12171 | CrossBuyAsyncCarryingAccSDP |
| 12172 | CrossBuyAsyncCarryingAccSPVD |
| 12173 | CrossBuyAsyncCarryingAccSFD |
| 13006 | CrossSellAsyncAccountNotFound |
| 13007 | CrossSellAsyncOperatorNotFound |
| 13101 | CrossSellAsyncOpSDP |
| 13102 | CrossSellAsyncOpSPVD |
| 13103 | CrossSellAsyncOpSFD |
| 13111 | CrossSellAsyncDocSDP |
| 13112 | CrossSellAsyncDocSPVD |
| 13113 | CrossSellAsyncDocSFD |
| 13121 | CrossSellAsyncAccSDP |
| 13122 | CrossSellAsyncAccSPVD |
| 13123 | CrossSellAsyncAccSFD |
| 13131 | CrossSellAsyncCapSDP |
| 13132 | CrossSellAsyncCapSPVD |
| 13133 | CrossSellAsyncCapSFD |
| 13161 | CrossSellAsyncCarryingDocSDP |
| 13162 | CrossSellAsyncCarryingDocSPVD |
| 13163 | CrossSellAsyncCarryingDocSFD |
| 13171 | CrossSellAsyncCarryingAccSDP |
| 13172 | CrossSellAsyncCarryingAccSPVD |
| 13173 | CrossSellAsyncCarryingAccSFD |
| Nome | Comprimento | Tipo | Observações |
|---|---|---|---|
| Type | 1 | Alfanumérico | B = Negócio Cancelado |
| Timestamp | 8 | Numérico | Nanosegundos desde a meia-noite |
| UserRefNum | 4 | Numérico | Ordem cujo negócio está sendo cancelado |
| MatchNumber | 8 | Numérico | MatchNumber do negócio cancelado |
| Reason | 1 | Alfanumérico | E = Errôneo, C = Consentido, S = Supervisor |