Skip to main content

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.

TagField NameRequiredComments
Standard HeaderYMsgType = Login (A)
98Encrypt MethodYAlways unencrypted
108HeartBtIntYHeartbeat interval in seconds
141ResetSeqNumFlagNSet to 'Y' to indicate both sides of a FIX session should reset sequence numbers. Must be 'Y' on pricing feed sessions.
553UsernameY
554PasswordY
Standard TrailerY

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.

TagField NameRequiredComments
Standard HeaderYMsgType = Heartbeat (0)
112TestReqIdCRequired when the heartbeat is the result of a test request message
Standard TrailerY

Logout

Message used to terminate a FIX connection. Can be sent by the client or the host.

TagField NameRequiredComments
Standard HeaderYMsgType = Logout (5)
58TextN
Standard TrailerY

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)

TagField NameRequiredComments
Standard HeaderYMsgType = NewOrderSingle (D)
11ClOrdIDYUnique ID for the session
1AccountNAccount ID of client-side customer (may be required in some cases depending on the client)
583ClOrdLinkIDNUsed 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.
55SymbolCEither 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]"
48SecurityIDCEither Tag 55 or Tag 48 & 22 will be sent based on how market data is requested initially.
22SecurityIDSourceCISIN number (4)Either Tag 55 or Tag 48 & 22 will be sent based on how market data is requested initially.
54SideY1=Buy 2=Sell
60TransactTimeYTime this order request was initiated/released by the trader, trading system, or intermediary.
38OrderQtyYQuantity of order.
40OrdTypeY1 = Market2 = Limit
44PriceCRequired on OrdType Limit or Previously Quoted. Price combined with Slippage (if any) represents the worst price the client will accept.
15CurrencyNIdentifies the currency used for price (3-character ISO 4217 currency code value)
59TimeInForceYImmediate or Cancel (3)Fill or Kill (4)Good Till Date (6) – ExpireDate tag 432 required
432ExpireDateCDate 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'
21HandInstY1
Standard TrailerY

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.

TagField NameRequiredComments
Standard HeaderYMsgType = ExecutionReport (8)
37OrderIDYRepresents the unique order ID provided by FIX API
11ClOrdIDYClOrdID from preceding NewOrderSingle message
17ExecIDYRepresents the unique execution ID
150ExecTypeYNew (0)Pending New (A) Fill (2)Rejected (8)
39OrdStatusYNew (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
58TextNProvided for information about the result with human readable text
55SymbolCEither Tag 55 or Tag 48 & 22 will be sent based on how market data is requested initially.
48SecurityIDCEither Tag 55 or Tag 48 & 22 will be sent based on how market data is requested initially.
22SecurityIDSourceCISIN number (4)Either Tag 55 or Tag 48 & 22 will be sent based on how market data is requested initially.
54SideY1=Buy 2=Sell
38OrderQtyYOrder quantity from order (in same denomination)
44PriceNOrder price from order. If the order is filled completely or partially
32LastQtyNFill quantity if ExecType=F, in same denomination as OrderQty
31LastPxNFill price if ExecType=F
151LeavesQtyYUnfilled quantity remaining (0 if ExecType=F, OrderQty otherwise)
14CumQtyYFilled quantity (OrderQty if ExecType=F, 0 otherwise)
6AvgPxYFilled price.
60TransactTimeNTime the transaction represented by this ExecutionReport occurred
526SecondaryClOrdIDNAdditional order ID, used for reporting purposes
Standard TrailerY

OrderCancelRequest (35=F)

TagField NameRequiredComments
Standard HeaderYMsgType = OrderCancelRequest (F)
11ClOrdIDYUnique ID for order to cancel which was assigned by client when creating order with NewOrderSingle.
41OrigClOrdIDNoriginal identifier of the order as assigned in NewOrderSingle message by client in field ClOrdID
37OrderIDYUnique ID for order to cancel which was assigned by the FIX API in ExecutionReport after creating order with NewOrderSingle
55SymbolCEither 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]"
48SecurityIDCEither Tag 55 or Tag 48 & 22 will be sent based on how market data is requested initially.
22SecurityIDSourceCISIN number (4)Either Tag 55 or Tag 48 & 22 will be sent based on how market data is requested initially.
54SideY1=Buy 2=Sell
38OrderQtyYQuantity of order.
40OrdTypeY1 = Market2 = Limit
60TransactTimeYTime this order request was initiated/released by the trader, trading system, or intermediary.
Standard TrailerY

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.

TagField NameRequiredComments
Standard HeaderYMsgType = ExecutionReport (8)
37OrderIDYRepresents the unique order ID provided by FIX API
11ClOrdIDYClOrdID from preceding NewOrderSingle message
41OrigClOrdIDNoriginal identifier of the order as assigned in NewOrderSingle message by client in field ClOrdID
17ExecIDYRepresents the unique execution ID
150ExecTypeYCanceled (4)Pending Cancel (6)
39OrdStatusYCanceled (4)Pending Cancel (6) – notifies that it’s in canceling
58TextNProvided for information about the result with human readable text
55SymbolCEither Tag 55 or Tag 48 & 22 will be sent based on how market data is requested initially.
48SecurityIDCEither Tag 55 or Tag 48 & 22 will be sent based on how market data is requested initially.
22SecurityIDSourceCISIN number (4)Either Tag 55 or Tag 48 & 22 will be sent based on how market data is requested initially.
54SideY1=Buy 2=Sell
38OrderQtyYOrder quantity from order (in same denomination)
40OrdTypeY
44PriceNOrder price from order. If the order is filled completely or partially
32LastQtyNFill quantity if ExecType=F, in same denomination as OrderQty
31LastPxNFill price if ExecType=F
151LeavesQtyYUnfilled quantity remaining (0 if ExecType=F, OrderQty otherwise)
14CumQtyYFilled quantity (OrderQty if ExecType=F, 0 otherwise)
6AvgPxYFilled price.
60TransactTimeNTime the transaction represented by this ExecutionReport occurred
Standard TrailerY

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.

TagField NameRequiredComments
Standard HeaderYMsgType = ExecutionReport (8)
37OrderIDYRepresents the unique order ID provided by FIX API
11ClOrdIDYClOrdID from preceding NewOrderSingle message
41OrigClOrdIDNoriginal identifier of the order as assigned in NewOrderSingle message by client in field ClOrdID
39OrdStatusYRejected (8) – order cancel is rejected
434CxlRejResponseToYidentifies the type of request that this OrderCancelReject is in response to
102CxlRejReasonYint code to identify reason for the reject
1AccountN
58TextNProvided for information about the result with human readable text
60TransactTimeNTime the transaction occurred
Standard TrailerY

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