Information about the ALO protocol, the order entry protocol for trading purposes at Base Exchange.
Authorized Trading Members will send buy and sell orders through the ALO Order Entry Gateway. Accepted orders will be subject to matching conditions according to their parameters. Orders that cannot be executed immediately will be recorded in the Order Book, following price-time priority, for execution when suitable market conditions arise.
Through these gateways, Trading Members may send New Order, Cancel and Replace requests for previously submitted orders, as well as receive the corresponding executions. For a better understanding of the Execution Rules, refer to the Operating Procedures Manual. For information about Market Data, refer to the ALI protocol.
| Version | Compatible with previous version |
Change Description | Date |
|---|---|---|---|
| 3.0 | No | Added GTD and GTC TimeInForce; Added OrderLifeSpan, MaxLifeSpan fields; Changed rejection and cancellation codes; Renamed FirmId to FirmCode |
08/11/2026 |
| 2.0 | No | Added EnteringTrader field to Order Accepted message; Changed rejection codes |
07/21/2025 |
| 1.0 | - | Original version | 11/08/2024 |
ALO is a native order entry protocol in binary format, designed with a focus on simplicity and performance.
The ALO protocol consists of a bidirectional communication channel between the ALO host and the client application, mediated by a lower-level protocol, BaseTCP. Outbound messages, that is, from the ALO host to the client, are always sequenced and have guaranteed delivery by the lower-level protocol (BaseTCP), while inbound messages have no delivery guarantee by design. The description of the available message types is presented in later sections.
Each ALO User, equivalent to an order entry session, has at least one associated physical ALO host. Additional physical ALO hosts may be linked to the same ALO User, acting as replicas and generating the same outbound messages. If there is any doubt about the successful receipt of a given message by the ALO host, for example in case of a connection failure, the client application may safely resend the message to the ALO host and/or send it to multiple replicas associated with the same ALO User, with no risk of generating duplicate requests.
All field lengths are expressed in bytes.
Alpha fields allow uppercase and lowercase ASCII characters. Fixed-width Alpha fields are right-padded with spaces.
Numeric fields are binary formatted, big-endian numbers, unsigned values.
The Price field is a Numeric field with 4 implied decimal places.
It is the responsibility of the Trading Member to request the creation of its ALO Users.
Defines which accounts the ALO User may submit orders for.
AccXY, AccYZ and AccZX.| Name | Length | Values | Notes |
|---|---|---|---|
| Type | 1 | Alpha | O = Enter Order |
| UserRefNum | 4 | Integer | Must be day-unique and strictly increasing for each ALO User |
| Side | 1 | Alpha | B = Buy, S = Sell |
| Quantity | 4 | Integer | Must be > 0 and < 1,000,000 |
| Symbol | 8 | Alpha | Stock symbol |
| Price | 4 | Integer | Must be > 0 and < $200,000.00 Price = $200,000.00 or 0x7FFFFFFF indicates Market Order |
| TimeInForce | 1 | Alpha | 0 = Day, 1 = GTC, 3 = IOC, 4 = FOK, 6 = GTD |
| OrderLifeSpan | 2 | Integer | Number of standard days that this order must stay alive. Required when TimeInForce is GTD, in this case must be >= 0 <= 365 |
| PostOnly | 1 | Alpha | P = Post Only (Book-or-Cancel), N = No |
| Attributable | 1 | Alpha | A = Display order FirmCode on market data, N = Don't display order FirmCode on market data |
| ClOrdId | 14 | Alpha | Customer order identifier |
| AccountId | 4 | Integer | Optional. Forwarded to clearing and settlement venues |
| STPKey | 4 | Integer | Self Trade Prevention key 0 = no STP |
| EnteringTrader | 5 | Alpha | EnteringTrader identifier For no EnteringTrader use all whitespace or all null character (ASCII 0) |
| Name | Length | Values | Notes |
|---|---|---|---|
| Type | 1 | Alpha | U = Replace Order |
| OrigUserRefNum | 4 | Integer | Original order UserRefNum |
| UserRefNum | 4 | Integer | Must be unique and increasing |
| Quantity | 4 | Integer | Desired total quantity |
| Price | 4 | Integer | Replacement price |
| OrderLifeSpan | 2 | Integer | Replacement order life span, when TimeInForce is GTD must be <= MaxLifeSpan |
| ClOrdId | 14 | Alpha | Customer replace request identifier |
| EnteringTrader | 5 | Alpha | EnteringTrader identifier |
| Name | Length | Values | Notes |
|---|---|---|---|
| Type | 1 | Alpha | X = Cancel Order |
| UserRefNum | 4 | Integer | Original Enter Order UserRefNum |
| ClOrdId | 14 | Alpha | Customer cancel request identifier |
| EnteringTrader | 5 | Alpha | EnteringTrader identifier |
| Name | Length | Values | Notes |
|---|---|---|---|
| Type | 1 | Alpha | S = System Event |
| Timestamp | 8 | Integer | Nanoseconds since midnight |
| Event Code | 1 | Alpha | S = Start Of Day, E = End Of Day |
OrderState Dead is sent by the server when the inbound message is accepted and immediatly canceled.
To avoid sending an OrderAccepted followed by an OrderCanceled message the OrderState Dead is used (e.g.: market order with no executed quantity).
| Name | Length | Values | Notes |
|---|---|---|---|
| Type | 1 | Alpha | A = Accepted Order |
| Timestamp | 8 | Integer | Nanoseconds since midnight |
| UserRefNum | 4 | Integer | Order UserRefNum |
| Side | 1 | Alpha | Entered side |
| Quantity | 4 | Integer | Accepted quantity |
| Symbol | 8 | Alpha | Symbol |
| Price | 4 | Integer | Price |
| TimeInForce | 1 | Alpha | TimeInForce |
| OrderLifeSpan | 2 | Integer | Order life span duration |
| MaxLifeSpan | 2 | Integer | Maximum duration for OrderLifeSpan |
| PostOnly | 1 | Alpha | PostOnly |
| Attributable | 1 | Alpha | Attributable |
| OrderRefNum | 8 | Integer | Exchange-assigned unique order reference |
| OrderState | 1 | Alpha | L = Live, D = Dead |
| ClOrdId | 14 | Alpha | Customer order identifier |
| AccountId | 4 | Integer | AccountId |
| STPKey | 4 | Integer | STP key |
| EnteringTrader | 5 | Alpha | EnteringTrader identifier |
| Name | Length | Values | Notes |
|---|---|---|---|
| Type | 1 | Alpha | U = Replaced Order |
| Timestamp | 8 | Integer | Nanoseconds since midnight |
| OrigUserRefNum | 4 | Integer | Order being replaced |
| UserRefNum | 4 | Integer | New order UserRefNum |
| Side | 1 | Alpha | Original side |
| Quantity | 4 | Integer | Outstanding quantity |
| Symbol | 8 | Alpha | Symbol |
| Price | 4 | Integer | Price |
| OrderLifeSpan | 2 | Integer | Order life span |
| OrderRefNum | 8 | Integer | Exchange-assigned reference |
| OrderState | 1 | Alpha | L = Live, D = Dead |
| ClOrdId | 14 | Alpha | Customer replace identifier |
| Name | Length | Values | Notes |
|---|---|---|---|
| Type | 1 | Alpha | C = Canceled Order |
| Timestamp | 8 | Integer | Nanoseconds since midnight |
| UserRefNum | 4 | Integer | Order canceled |
| Quantity | 4 | Integer | Incremental canceled quantity |
| ClOrdId | 14 | Alpha | Customer cancel identifier |
| Reason | 1 | Alpha | Cancellation reason |
| Code | Reason |
|---|---|
| 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 |
| Name | Length | Values | Notes |
|---|---|---|---|
| Type | 1 | Alpha | E = Executed Order |
| Timestamp | 8 | Integer | Nanoseconds since midnight |
| UserRefNum | 4 | Integer | Executed order |
| Quantity | 4 | Integer | Executed quantity |
| Price | 4 | Integer | Execution price |
| LiquidityFlag | 1 | Alpha | A = Added, R = Removed |
| MatchNumber | 8 | Integer | Trade identifier |
| CounterFirmCode | 4 | Integer | Trading counterparty |
| Name | Length | Values | Notes |
|---|---|---|---|
| Type | 1 | Alpha | J = Rejected |
| Timestamp | 8 | Integer | Nanoseconds since midnight |
| OrigUserRefNum | 4 | Integer | Original order reference Used when rejecting Replace Order messages |
| UserRefNum | 4 | Integer | Rejected order |
| Reason | 2 | Integer | Reject reason code |
| ClOrdId | 14 | Alpha | Customer request identifier |
| Code | Reason |
|---|---|
| 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 |
| Name | Length | Values | Notes |
|---|---|---|---|
| Type | 1 | Alpha | B = Broken Trade |
| Timestamp | 8 | Integer | Nanoseconds since midnight |
| UserRefNum | 4 | Integer | Order whose trade is being broken |
| MatchNumber | 8 | Integer | Broken trade Match Number |
| Reason | 1 | Alpha | E = Erroneous, C = Consent, S = Supervisory |