Trader OMS FIX API Specs
PROGRAMMING GUIDE
Copyright © 2025
Introduction
FIX API for trading is based on version 4.3 of the FIX protocol. The API is used to trade instruments available in the system. Throughout the document, it's assumed that you have a general understanding of FIX protocol version 4.3.
NOTE: FIX Server also supports FIX versions higher than 4.3. Please contact support in case of version mismatch problems or for specific conditions and appropriate configurations.
Technical Support
Please contact devcenter@koala.markets for all kinds of technical support and troubleshooting inquiries.
General Considerations
Time Zone
The system uses Coordinated Universal Time (UTC). You should handle any time zone conversions that may be required on your side.
Payload Security
The host communicates using SSL-encrypted TCP sockets. No special SSL certificates are needed for now. The client can use an SSL-enabled FIX initiator/client or use SSL tunneling. SSL-tunneling functionality is provided by freely available open-source products. For additional support or consultancy regarding SSL tunneling, contact our technical support team.
IP Filtering
Clients are identified by their IP addresses in the system. To connect, the following prerequisites should be met:
- The static IP set of the client should be cleared at the host.
- The client should use the provided host address and port.
Credentials
To connect to FIX API host, the client must obtain the following:
- TargetCompId
- SenderCompId
- User Name
- Password
- Price Feed URL (or IP) and Port
- Trading URL (or IP) and Port
Instrument Identification
The system supports the following for identifying an instrument between the client and the host:
- Tag 55 – Symbol: Common, "human understood" representation of the security. If you use "Tag 48 – SecurityID + Tag 22 – SecurityIDSource," then please provide "[N/A]" as the value for Tag 55.
- Tag 48 – SecurityID + Tag 22 - SecurityIDSource: International Securities Identification Number (ISIN) which uniquely identifies a security. Its structure is defined in ISO 6166.
Please contact our technical support team for the latest list of instruments available for trading.
Multi Session
FIX API is configured to provide two sessions per client; one for price feed, one for order management. Both sessions should be configured to reset sequence numbers on login. Additionally, for price feed sessions, FIX messages should not be persisted to facilitate maximum throughput.
Trading and Price Feed Session Times
Currently, the system provides securities only from Börse Düsseldorf (Quotrix). Börse Düsseldorf working hours for price feeds and trading sessions are as follows:
Price Feed Sessions:
Monday – Friday: 07:00 – 22:05 Germany Time
Trading Sessions:
Monday – Friday: 08:00 – 22:00 Germany Time
Session Administration Messages
Login
The Login message is sent by a client to initiate a FIX session. The Login message establishes the communication session, authenticates the connecting client, and initializes the message sequence number. FIX session login message type "A" should be the first message sent by the FIX API client to the server after establishing a network connection. Note that the password in the client's login message should match the expected value; otherwise, the session will be terminated. The login message is needed for both Data feed session and trading session.
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| Standard Header | Y | MsgType = Login (A) | |
| 98 | Encrypt Method | Y | Always unencrypted |
| 108 | HeartBtInt | Y | Heartbeat interval in seconds |
| 141 | ResetSeqNumFlag | N | Set to 'Y' to indicate both sides of a FIX session should reset sequence numbers. Must be 'Y' on pricing feed sessions. |
| 553 | Username | Y | |
| 554 | Password | Y | |
| Standard Trailer | Y |
Example Login
8=FIX.4.3 9=133 35=A 34=1 49=TRADE-DEV-DESKTOP-CLIENT 52=20220412-09:54:08.496 56=TRADE 98=0 108=30 141=Y 553=username 554=password 10=215
Heartbeat
Message sent during quite intervals on the connection to ensure that connection is still alive.
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| Standard Header | Y | MsgType = Heartbeat (0) | |
| 112 | TestReqId | C | Required when the heartbeat is the result of a test request message |
| Standard Trailer | Y |
Logout
Message used to terminate a FIX connection. Can be sent by the client or the host.
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| Standard Header | Y | MsgType = Logout (5) | |
| 58 | Text | N | |
| Standard Trailer | Y |
Remark: Either a logout message followed by a disconnection or a disconnection will suffice for logout.
Trading Message Types
Session Flow
- API Client submits an order with NewOrderSingle message
- FIX API responds with one or more ExecutionReport messages
NewOrderSingle (Tag 35=D)
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| Standard Header | Y | MsgType = NewOrderSingle (D) | |
| 11 | ClOrdID | Y | Unique ID for the session |
| 1 | Account | N | Account ID of client-side customer (may be required in some cases depending on the client) |
| 583 | ClOrdLinkID | N | Used to indicate client-side customer Account, Ticket ID and Group name (eg. string "1000-12384-DemoGrp1"). Account and Ticket ID must be numbers. All three fields must be populated with a default value even if it is not used/available. |
| 55 | Symbol | C | Either Tag 55 or Tag 48 & 22 will be sent based on how market data is requested initially. If only Tag 48 & 22 will be used, then use 55="[N/A]" |
| 48 | SecurityID | C | Either Tag 55 or Tag 48 & 22 will be sent based on how market data is requested initially. |
| 22 | SecurityIDSource | C | ISIN number (4)Either Tag 55 or Tag 48 & 22 will be sent based on how market data is requested initially. |
| 54 | Side | Y | 1=Buy 2=Sell |
| 60 | TransactTime | Y | Time this order request was initiated/released by the trader, trading system, or intermediary. |
| 38 | OrderQty | Y | Quantity of order. |
| 40 | OrdType | Y | 1 = Market2 = Limit |
| 44 | Price | C | Required on OrdType Limit or Previously Quoted. Price combined with Slippage (if any) represents the worst price the client will accept. |
| 15 | Currency | N | Identifies the currency used for price (3-character ISO 4217 currency code value) |
| 59 | TimeInForce | Y | Immediate or Cancel (3)Fill or Kill (4)Good Till Date (6) – ExpireDate tag 432 required |
| 432 | ExpireDate | C | Date of order expiration (the local market date at which the order can be traded last). If TimeInForce is Good Till Date (6), this is required. Format: 'YYYYMMDD' |
| 21 | HandInst | Y | 1 |
| Standard Trailer | Y |
ExecutionReport (Tag 35=8, after NewOrderSingle)
After NewOrderSingle message, one or more ExecutionReport messages can be sent by FIX API.
ExecutionReport can be just for acknowledgement (ack.) about the NewOrderSingle message received without having any order filling execution. Therefore, OrdStatus (tag 39) must be checked about the order status within ExecutionReport.
Some of the possible scenarios:
- rejected, i.e. OrdStatus (tag 39=8)
- accepted as new, i.e. OrdStatus (tag 39=0)
- accepted as pending new, i.e. OrdStatus (tag 39=A)
- canceled, i.e. OrdStatus (tag 39=4)
- expired, i.e. OrdStatus (tag 39=C)
- partially filled, i.e. OrdStatus (tag 39=1)
- filled, i.e. OrdStatus (tag 39=2)
An ExecutionReport will be reporting the execution alongside the status of the order type if any happens.
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| Standard Header | Y | MsgType = ExecutionReport (8) | |
| 37 | OrderID | Y | Represents the unique order ID provided by FIX API |
| 11 | ClOrdID | Y | ClOrdID from preceding NewOrderSingle message |
| 17 | ExecID | Y | Represents the unique execution ID |
| 150 | ExecType | Y | New (0)Pending New (A) Fill (2)Rejected (8) |
| 39 | OrdStatus | Y | New (0) – when order accepted / this msg is ack. Pending New (A) – when order accepted / waiting Partially Filled (1), Filled (2) – when complete quantity filled, Done for Day (3) – when day completes un-filled, Canceled (4), Rejected (8), Calculated (B), Expired (C) – when unfilled within provided TimeInForce or based on venue deadline |
| 58 | Text | N | Provided for information about the result with human readable text |
| 55 | Symbol | C | Either Tag 55 or Tag 48 & 22 will be sent based on how market data is requested initially. |
| 48 | SecurityID | C | Either Tag 55 or Tag 48 & 22 will be sent based on how market data is requested initially. |
| 22 | SecurityIDSource | C | ISIN number (4)Either Tag 55 or Tag 48 & 22 will be sent based on how market data is requested initially. |
| 54 | Side | Y | 1=Buy 2=Sell |
| 38 | OrderQty | Y | Order quantity from order (in same denomination) |
| 44 | Price | N | Order price from order. If the order is filled completely or partially |
| 32 | LastQty | N | Fill quantity if ExecType=F, in same denomination as OrderQty |
| 31 | LastPx | N | Fill price if ExecType=F |
| 151 | LeavesQty | Y | Unfilled quantity remaining (0 if ExecType=F, OrderQty otherwise) |
| 14 | CumQty | Y | Filled quantity (OrderQty if ExecType=F, 0 otherwise) |
| 6 | AvgPx | Y | Filled price. |
| 60 | TransactTime | N | Time the transaction represented by this ExecutionReport occurred |
| 526 | SecondaryClOrdID | N | Additional order ID, used for reporting purposes |
| Standard Trailer | Y |
OrderCancelRequest (35=F)
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| Standard Header | Y | MsgType = OrderCancelRequest (F) | |
| 11 | ClOrdID | Y | Unique ID for order to cancel which was assigned by client when creating order with NewOrderSingle. |
| 41 | OrigClOrdID | N | original identifier of the order as assigned in NewOrderSingle message by client in field ClOrdID |
| 37 | OrderID | Y | Unique ID for order to cancel which was assigned by the FIX API in ExecutionReport after creating order with NewOrderSingle |
| 55 | Symbol | C | Either Tag 55 or Tag 48 & 22 will be sent based on how market data is requested initially. If only Tag 48 & 22 will be used, then use 55="[N/A]" |
| 48 | SecurityID | C | Either Tag 55 or Tag 48 & 22 will be sent based on how market data is requested initially. |
| 22 | SecurityIDSource | C | ISIN number (4)Either Tag 55 or Tag 48 & 22 will be sent based on how market data is requested initially. |
| 54 | Side | Y | 1=Buy 2=Sell |
| 38 | OrderQty | Y | Quantity of order. |
| 40 | OrdType | Y | 1 = Market2 = Limit |
| 60 | TransactTime | Y | Time this order request was initiated/released by the trader, trading system, or intermediary. |
| Standard Trailer | Y |
ExecutionReport (Tag 35=8, after OrderCancelRequest)
After OrderCancelRequest message, if the request is put into processing, it may respond with one or more ExecutionReport messages by FIX API.
If the OrderCancelRequest message is rejected, then it’ll not respond with ExecutionReport, but it’ll be rejected via OrderCancelReject (35=9) message. In this case, please see the section for OrderCancelReject (35=9).
ExecutionReport can be just for acknowledgement (ack.) about the OrderCancelRequest message received without canceling at first. Therefore, OrdStatus (tag 39) has to be checked about the order status within the ExecutionReport.
Some of the possible scenarios:
- pending cancel, i.e. OrdStatus (tag 39=6)
- canceled, i.e. OrdStatus (tag 39=4)
An ExecutionReport will be reporting the execution type alongside the status of the order if any happens.
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| Standard Header | Y | MsgType = ExecutionReport (8) | |
| 37 | OrderID | Y | Represents the unique order ID provided by FIX API |
| 11 | ClOrdID | Y | ClOrdID from preceding NewOrderSingle message |
| 41 | OrigClOrdID | N | original identifier of the order as assigned in NewOrderSingle message by client in field ClOrdID |
| 17 | ExecID | Y | Represents the unique execution ID |
| 150 | ExecType | Y | Canceled (4)Pending Cancel (6) |
| 39 | OrdStatus | Y | Canceled (4)Pending Cancel (6) – notifies that it’s in canceling |
| 58 | Text | N | Provided for information about the result with human readable text |
| 55 | Symbol | C | Either Tag 55 or Tag 48 & 22 will be sent based on how market data is requested initially. |
| 48 | SecurityID | C | Either Tag 55 or Tag 48 & 22 will be sent based on how market data is requested initially. |
| 22 | SecurityIDSource | C | ISIN number (4)Either Tag 55 or Tag 48 & 22 will be sent based on how market data is requested initially. |
| 54 | Side | Y | 1=Buy 2=Sell |
| 38 | OrderQty | Y | Order quantity from order (in same denomination) |
| 40 | OrdType | Y | |
| 44 | Price | N | Order price from order. If the order is filled completely or partially |
| 32 | LastQty | N | Fill quantity if ExecType=F, in same denomination as OrderQty |
| 31 | LastPx | N | Fill price if ExecType=F |
| 151 | LeavesQty | Y | Unfilled quantity remaining (0 if ExecType=F, OrderQty otherwise) |
| 14 | CumQty | Y | Filled quantity (OrderQty if ExecType=F, 0 otherwise) |
| 6 | AvgPx | Y | Filled price. |
| 60 | TransactTime | N | Time the transaction represented by this ExecutionReport occurred |
| Standard Trailer | Y |
OrderCancelReject (Tag 35=9, after OrderCancelRequest)
After OrderCancelRequest message, if the request is rejected, it’ll be rejected via OrderCancelReject (35=9) message. In this case
OrdStatus (tag 39) has to be checked about the order status within the OrderCancelReject.
An ExecutionReport will be reporting the execution type alongside the status of the order if any happens.
| Tag | Field Name | Required | Comments |
|---|---|---|---|
| Standard Header | Y | MsgType = ExecutionReport (8) | |
| 37 | OrderID | Y | Represents the unique order ID provided by FIX API |
| 11 | ClOrdID | Y | ClOrdID from preceding NewOrderSingle message |
| 41 | OrigClOrdID | N | original identifier of the order as assigned in NewOrderSingle message by client in field ClOrdID |
| 39 | OrdStatus | Y | Rejected (8) – order cancel is rejected |
| 434 | CxlRejResponseTo | Y | identifies the type of request that this OrderCancelReject is in response to |
| 102 | CxlRejReason | Y | int code to identify reason for the reject |
| 1 | Account | N | |
| 58 | Text | N | Provided for information about the result with human readable text |
| 60 | TransactTime | N | Time the transaction occurred |
| Standard Trailer | Y |
Examples
FIX API – market order buy - TimeInForce - Immediate Or Cancel - ISIN DE000PAH0038 example – filled order
Sent to FIX API
Note that your SenderCompID and TargetCompID may differ. Below is just an example.
ClOrdID=11=1649763811406
SenderCompID=49= TRADE-DEV-DESKTOP-CLIENT
TargetCompID=56= TRADE
Symbol=55=[N/A]
SecurityID=48= DE000PAH0038
SecurityIDSource=22=4 (ISIN)
OrderType=40=1 (Market)
Side=54=1 (Buy)
Currency=15=EUR
OrderQty=38=1
TimeInForce=59=3 (Immediate or Cancel)
TransactTime=60=20220412-11:43:31.426 (UTC)
HandlInst=21=1
8=FIX.4.39=20235=D34=349=TRADE-DEV-DESKTOP-CLIENT52=20220412-11:43:31.42756=TRADE11=164976381140615=EUR21=122=438=140=148=DE000PAH003854=155=[N/A]59=360=20220412-11:43:31.426100=10=146
Received from FIX API
An acknowledgement ExecutionReport message (accepted order with OrdStatus=39=0)
8=FIX.4.39=25935=834=349=TRADE52=20220412-11:43:30.88856=TRADE-DEV-DESKTOP-CLIENT6=011=164976381140614=015=EUR17=b184143d-7fc8-4a9a-f05c-08da1c6ae86622=437=eed8c58f-ae9c-4bef-f539-08da1c6ae6ec38=139=040=148=DE000PAH003854=155=[N/A]58=ORDER ENTERED SUCCESSFULLY150=0151=110=253
A filled ExecutionReport message
- filled order with status OrdStatus=39=2
- filled at Price=44=81.08
- filled AvgPx=6=0
- filled CumQty=14=1 (fully filled in this example)
- ExecType=150=F (filled fully or partialy)
- LeavesQty=151=0 (no quantity left to fill, because it filled completely)
8=FIX.4.39=26835=834=449=TRADE52=20220412-11:43:31.14956=TRADE-DEV-DESKTOP-CLIENT6=011=164976381140614=115=EUR17=8b31cd0f-7f5e-4916-f05d-08da1c6ae86622=437=eed8c58f-ae9c-4bef-f539-08da1c6ae6ec38=139=240=144=81.0848=DE000PAH003854=155=[N/A]58=ORDER EXECUTED60=20220412-11:43:30.560150=F151=010=224
FIX API – market order buy - TimeInForce - Immediate Or Cancel - ISIN DE000PAH0038 example – canceled by venue
Sent to FIX API
Note that your SenderCompID and TargetCompID may differ. Below is just an example.
ClOrdID=11=1649758221291
SenderCompID=49= TRADE-DEV-DESKTOP-CLIENT
TargetCompID=56= TRADE
Symbol=55=[N/A]
SecurityID=48= DE000PAH0038
SecurityIDSource=22=4 (ISIN)
OrderType=40=1 (Market)
Side=54=1 (Buy)
Currency=15=EUR
OrderQty=38=1
TimeInForce=59=3 (Immediate or Cancel)
TransactTime=60=20220412-10:10:21.290 (UTC)
HandlInst=21=1
8=FIX.4.39=20335=D34=549=TRADE-DEV-DESKTOP-CLIENT52=20220412-10:10:21.29056=TRADE11=164975822129115=EUR21=122=438=140=148=DE000PAH003854=155=[N/A]59=360=20220412-10:10:21.29010=181
Received from FIX API
An acknowledgement ExecutionReport message
8=FIX.4.39=29335=834=649=TRADE52=20220412-10:10:28.11556=TRADE-DEV-DESKTOP-CLIENT6=011=164975822129114=015=EUR17=b184143d-7fc8-4a9a-f05c-08da1c6ae86622=437=eed8c58f-ae9c-4bef-f539-08da1c6ae6ec38=139=040=148=DE000PAH003854=155=DE000PAH003858=ORDER ENTERED SUCCESSFULLY150=0151=110=143
A canceled ExecutionReport message
8=FIX.4.39=31535=834=749=TRADE52=20220412-10:10:43.14356=TRADE-DEV-DESKTOP-CLIENT6=011=164975822129114=015=EUR17=8b31cd0f-7f5e-4916-f05d-08da1c6ae86622=437=eed8c58f-ae9c-4bef-f539-08da1c6ae6ec38=139=440=148=DE000PAH003854=B55=DE000PAH003858=LO DELETED BY CANCEL-COND. RAISED (EXECADDON=2).150=4151=110=098
FIX API – cancel order - ISIN DE000PAH0038 example – canceled by venue
Sent to FIX API
Note that your SenderCompID and TargetCompID may differ. Below is just an example.
ClOrdID=11=1649767541802
SenderCompID=49= TRADE-DEV-DESKTOP-CLIENT
TargetCompID=56= TRADE
Symbol=55=[N/A]
SecurityID=48= DE000PAH0038
SecurityIDSource=22=4 (ISIN)
OrderType=40=1 (Market)
Side=54=1 (Buy)
Currency=15=EUR
OrderQty=38=1
TransactTime=60=20220412-12:45:59.697 (UTC)
8=FIX.4.39=22635=F34=10149=TRADE-DEV-DESKTOP-CLIENT52=20220412-12:46:02.31056=TRADE11=164976754180222=437=61287aa8-e31e-41d1-f53a-08da1c6ae6ec38=140=141=164976754180248=DE000PAH003854=155=[N/A]60=20220412-12:45:59.69710=088
Received from FIX API
A canceled ExecutionReport message
8=FIX.4.39=31035=834=10149=TRADE52=20220412-12:46:06.82356=TRADE-DEV-DESKTOP-CLIENT6=011=164976754180214=015=EUR17=dd266635-fa06-433e-f05f-08da1c6ae86622=437=61287aa8-e31e-41d1-f53a-08da1c6ae6ec38=139=440=141=61287aa8-e31e-41d1-f53a-08da1c6ae6ec48=DE000PAH003854=155=DE000PAH003858=OK150=4151=110=04