Click here to Skip to main content
15,879,095 members
Articles / Programming Languages / C#

Fix Message Implementation using QuickFix

Rate me:
Please Sign up or sign in to vote.
4.83/5 (18 votes)
6 Sep 2011CPOL3 min read 146K   4.4K   36   43
This article is about how to use QuickFix .NET engine.

Purpose

The purpose of this document is to give brief details about FIX and basic implementation of messages using QuickFix .NET library.

First of all, we need to know what is FIX protocol.

What is FIX Protocol?

It is a series of messaging specifications for the electronic communication of trade-related messages. It has been developed through the collaboration of banks, broker-dealers, exchanges, industry utilities and associations, institutional investors, and information technology providers from around the world. These market participants share a vision of a common, global language for the automated trading of financial instruments.

Most of the exchanges use this standard for communication like sending Order, Executions, MarketData, etc. There are many versions of specifications released by FIX organization like 4.0, 4.2, 5.0, etc.

You can read more about FIX on http://www.fixprotocol.org.

What is QuickFix?

QuickFIX is a free and open source implementation of the FIX protocol in various languages like C++, Java, ruby, .NET, etc.

So let’s start with implementation of Fix Messages. I am going to create two applications, server and client which we call as FixAcceptor and FixInitiator respectively.

Implementation with C#

To use QuickFix engine, we’ll need two DLLs quickfix_net.dll and quickfix_net_message.dll which can be downloaded from QuickFix website.

I created one solution which has two projects FixAcceptor and FixInitiator. FixAcceptor is active as server and FixInitiator is client app.

FixAcceptor

To start FixAcceptor, we need to configure and configurations are put into acceptor.cfg which should be pretty straight forward configurations like below:

C#
[DEFAULT]
ConnectionType=acceptor
SocketAcceptPort=5001
SocketReuseAddress=Y
StartTime=00:00:00
EndTime=00:00:00
FileLogPath=log
FileStorePath=c:\fixfiles
[SESSION]
BeginString=FIX.4.2
SenderCompID=EXECUTOR
TargetCompID=CLIENT1
DataDictionary=c:\user\nek\Code\FIX test App\data Dictionary\FIX42.xml
  • Connection type tells this application will run as Acceptor which is server.
  • SocketAcceptPort: listening port.
  • Session tag: is having configuration for creating session between client application (initiator) and acceptor.
  • BegingString: This sets session will work on which Fix Message specification.
  • SenderCompID: Id of server which will listen and send messages.
  • TargetCompID=Id of client to which server will send messages.
  • DataDictionary: Path of data dictionary file which is XML format, this file has message specifications according to various specifications versions.

Source Code

To start any session with Fix, we need to create Class which should implement QuickFix.Application interface. It has the following methods to be implemented:

C#
public interface Application 
{ 
void fromAdmin(Message __p1, SessionID __p2); 
void fromApp(Message __p1, SessionID __p2); 
void onCreate(SessionID __p1); 
void onLogon(SessionID __p1); 
void onLogout(SessionID __p1); 
void toAdmin(Message __p1, SessionID __p2); 
void toApp(Message __p1, SessionID __p2); 
} 

public override void onMessage(QuickFix42.NewOrderSingle order, SessionID sessionID) 
{ 
Symbol symbol = new Symbol(); 
Side side = new Side(); 
OrdType ordType = new OrdType(); 
OrderQty orderQty = new OrderQty(); 
Price price = new Price(); 
ClOrdID clOrdID = new ClOrdID(); 
order.get(ordType); 
if (ordType.getValue() != OrdType.LIMIT) 
throw new IncorrectTagValue(ordType.getField()); 
order.get(symbol); 
order.get(side); 
order.get(orderQty); 
order.get(price); 
order.get(clOrdID); 
QuickFix42.ExecutionReport executionReport = new QuickFix42.ExecutionReport 
(genOrderID(), 
genExecID(), 
new ExecTransType(ExecTransType.NEW), 
new ExecType(ExecType.FILL), 
new OrdStatus(OrdStatus.FILLED), 
symbol, 
side, 
new LeavesQty(0), 
new CumQty(orderQty.getValue()), 
new AvgPx(price.getValue())); 
executionReport.set(clOrdID); 
executionReport.set(orderQty); 
executionReport.set(new LastShares(orderQty.getValue())); 
executionReport.set(new LastPx(price.getValue())); 
if (order.isSetAccount()) 
executionReport.set(order.getAccount()); 
try 
{ 
Session.sendToTarget(executionReport, sessionID); 
} 
catch (SessionNotFound) { } 
}
Session.sendToTarget(executionReport, sessionID);

The above statement sends executionReport object to session which is built between client and server.

Start FixAcceptor Application

C#
[STAThread]
static void Main(string[] args)
{
SessionSettings settings = new SessionSettings(@"acceptor.cfg");
FixServerApplication application = new FixServerApplication();
FileStoreFactory storeFactory = new FileStoreFactory(settings);
ScreenLogFactory logFactory = new ScreenLogFactory(settings);
MessageFactory messageFactory = new DefaultMessageFactory();
SocketAcceptor acceptor
= new SocketAcceptor(application, storeFactory, settings, logFactory, messageFactory);
acceptor.start();
Console.WriteLine("press <enter> to quit");
Console.Read();

acceptor.stop();
}

Steps

  1. Create SessionSettings object with config file.
  2. Create object of Application class.
  3. Create Object of SocketAcceptor class by passing SessionSettings.
  4. Run Start method of acceptor object.

Start FixInitiator

To start FixAcceptor, we need to configure and configurations are put into acceptor.cfg which should be pretty straight forward configurations like below:

C#
[DEFAULT]
ConnectionType=initiator
HeartBtInt=30
ReconnectInterval=1
FileStorePath=c:\fixfiles
FileLogPath=log
StartTime=00:00:00
EndTime=00:00:00
UseDataDictionary=N
SocketConnectHost=localhost
[SESSION]
BeginString=FIX.4.2
SenderCompID=CLIENT1
TargetCompID=FixServer
SocketConnectPort=5001
  • Connection type tells this application will run as Acceptor which is server.
  • SocketAcceptPort: listening port.
  • Session tag: is having configuration for creating session between client application (initiator) and acceptor.
  • BeginString: this sets session will work on which Fix Message specification
  • SenderCompID: Id of client which will send messages
  • TargetCompID: Id of server to which server will listen messages
  • DataDictionary: Path of data dictionary file which is xml format, this file is having message specifications according to various specifications versions.

Source Code

To start any session with Fix, we need to create class which should implement QuickFix.Application interface.

C#
public class ClientInitiator : QuickFix.Application 
{ 
public void onCreate(QuickFix.SessionID value) 
{ 
//Console.WriteLine("Message OnCreate" + value.toString()); 
} 
public void onLogon(QuickFix.SessionID value) 
{ 
//Console.WriteLine("OnLogon" + value.toString()); 
} 
public void onLogout(QuickFix.SessionID value) 
{ 
// Console.WriteLine("Log out Session" + value.toString()); 
} 
public void toAdmin(QuickFix.Message value, QuickFix.SessionID session) 
{ 
//Console.WriteLine("Called Admin :" + value.ToString()); 
} 
public void toApp(QuickFix.Message value, QuickFix.SessionID session) 
{ 
// Console.WriteLine("Called toApp :" + value.ToString()); 
} 
public void fromAdmin(QuickFix.Message value, SessionID session) 
{ 
// Console.WriteLine("Got message from Admin" + value.ToString()); 
} 
public void fromApp(QuickFix.Message value, SessionID session) 
{ 
if (value is QuickFix42.ExecutionReport) 
{ 
QuickFix42.ExecutionReport er = (QuickFix42.ExecutionReport)value; 
ExecType et = (ExecType)er.getExecType(); 
if (et.getValue() == ExecType.FILL) 
{ 
//TODO: implement code 
} 
} 
Console.WriteLine("Got message from App" + value.ToString()); 
} 

} 
/// <summary> 
/// The main entry point for the application. 
/// </summary> 
//[STAThread] 
static void Main() 
{ 
ClientInitiator app = new ClientInitiator(); 
SessionSettings settings = new SessionSettings(
    @"c:\users\nek\Code\FIX test App\initiator.cfg"); 
QuickFix.Application application = new ClientInitiator(); 
FileStoreFactory storeFactory = new FileStoreFactory(settings); 
ScreenLogFactory logFactory = new ScreenLogFactory(settings); 
MessageFactory messageFactory = new DefaultMessageFactory(); 
SocketInitiator initiator = new SocketInitiator(application, storeFactory, settings, 
    logFactory, messageFactory); 
initiator.start(); 
Thread.Sleep(3000); 
SessionID sessionID = (SessionID)list[0]; 
QuickFix42.NewOrderSingle order = new QuickFix42.NewOrderSingle(new ClOrdID("DLF"), 
    new HandlInst(HandlInst.MANUAL_ORDER), new Symbol("DLF"), new Side(Side.BUY), 
    new TransactTime(DateTime.Now), new OrdType(OrdType.LIMIT)); 
order.set(new OrderQty(45)); 
order.set(new Price(25.4d)); 
Session.sendToTarget(order, sessionID); 
Console.ReadLine(); 
initiator.stop(); 
}

Steps

  1. Create application class object, i.e., ClientInitiator.
  2. Create object of SessionSettings class.
  3. Create SocketInitiator class.
  4. Run Start method.
  5. Create session id.

How to Send Order

Create order object of NewOrderSingle class. Set type of order, symbol, side, etc., and send order by SendToTarget method.

Receive Order Notification in Client

You can receive sent order acknowledgement in FromApp method in application class.

Start Application

C#
QuickFix42.NewOrderSingle order = new QuickFix42.NewOrderSingle(new ClOrdID("DLF"), 
    new HandlInst(HandlInst.MANUAL_ORDER), new Symbol("DLF"), new Side(Side.BUY), 
    new TransactTime(DateTime.Now), new OrdType(OrdType.LIMIT));

order.set(new OrderQty(45));

order.set(new Price(25.4d));

Session.sendToTarget(order, sessionID); 
public void fromApp(QuickFix.Message value, SessionID session)
{
if (value is QuickFix42.ExecutionReport)
{
QuickFix42.ExecutionReport er = (QuickFix42.ExecutionReport)value;
ExecType et = (ExecType)er.getExecType();
if (et.getValue() == ExecType.FILL)
{
//TODO: implement code
}
}
Console.WriteLine("Got message from App" + value.ToString());

}
  1. Run FixAccceptor.
  2. Then Run FixInitiator. This application will send order to FixAcceptor.

Fix Initiator

fixInitiator.png

Fix Acceptor

FixAcceptor.png

I’ll continue the advanced version of Fix message implementation in next blog.

Please give your valuable feedback.

There is also the need to inherit MessageCracker class which has some virtual methods to handle messages like: the below method invokes when any Order is sent by client then this method sends execution report of this order to client. ExecutionReport can be Filled, Cancelled, etc. Filled Execution Report means order has been successfully executed on exchange.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Architect Saxo Bank A/S
Denmark Denmark
• Solution Architect /Principle Lead Developer with 12 years of IT experience with more emphasize on Capital Domain and Investment banking domain.
• Strong experience in Continuous Integration, Delivery and DevOps solutions.
• Strong experience in drafting solutions, stakeholder communications and risk management.
• Proved strong coding and designing skills with agile approaches (TDD, XP framework, Pair Programming).
• Delivered many projects with involvement from inception to delivery phase.
• Strong experience in high performance, multithreaded, low latency applications.
• Ability to communicate with the business and technical stake holders effectively.
• Have extensive experience in Capital Market Domain: Front Office & BackOffice (Algorithm Trading tools, messaging framework, Enterprise bus, integration of FIX APIs and many trading APIs).
• Functional knowledge of Portfolio/Wealth Management, Equities, Fixed Income, Derivatives, Forex.
• Practical knowledge of building and practicing agile delivery methodologies (SCRUM, TDD, Kanban).

Technical Skills

• Architectural: Solution Design, Architectural Presentations (Logical, Component, Physical, UML diagrams)
• Languages: C#, C++
• Server Technologies: WCF, Web API,
• Middle Ware: ActiveMQ, RabbitMQ, Enterprise Service Bus
• UI Technologies: Winforms and WPF
• Web Technologies: Asp.Net Mvc, KnockOutJS, JQuery, Advance Java Scripts Concepts
• Databases: Sql Server 2008 +, MySQL
• Tools/Frameworks: TFS, SVN, NUnit, Rhino Mocks, Unity, NAnt, QuickFix/n, Nhibernate, LINQ, JIRA,

Functional Skills

• Wealth Management System, Trade Life Cycle, Trading Components and their integrations
• Working knowledge of Stocks, Bonds, CFDs,Forex, Futures and Options
• Pricing Systems, Market Data Management,
• BackOffice Processes : Settlement Processes, Netting, Tax, Commissions, Corporate Actions Handling,
• Reporting Solutions : OLTP and OLAP Data model designing
• FIX Engine implementation and integration

Comments and Discussions

 
QuestionSending News Message type Pin
Huzifa Terkawi9-May-23 5:00
Huzifa Terkawi9-May-23 5:00 
AnswerRe: Sending News Message type Pin
Neeraj Kaushik198010-May-23 21:20
Neeraj Kaushik198010-May-23 21:20 
PraiseRe: Sending News Message type Pin
Huzifa Terkawi12-May-23 12:34
Huzifa Terkawi12-May-23 12:34 
QuestionSource Code Pin
Mohit Singla8-Jul-21 3:21
Mohit Singla8-Jul-21 3:21 
QuestionCLIENT INITIATOR AS WINDOWS SERVICE C# Pin
Mohit Singla2-Mar-20 5:23
Mohit Singla2-Mar-20 5:23 
AnswerRe: CLIENT INITIATOR AS WINDOWS SERVICE C# Pin
Neeraj Kaushik198029-Jun-20 9:02
Neeraj Kaushik198029-Jun-20 9:02 
QuestionHow to get the session ID from logon function to some other class? Pin
Sohaib Ameen22-Jan-19 2:50
Sohaib Ameen22-Jan-19 2:50 
Questionhow to connect quickFix with FXall using C# Pin
kpg1237-Jun-18 3:44
kpg1237-Jun-18 3:44 
QuestionQuickFix with boost::asio Pin
eshustin18-Aug-16 10:18
eshustin18-Aug-16 10:18 
AnswerRe: QuickFix with boost::asio Pin
Neeraj Kaushik198018-Aug-16 11:24
Neeraj Kaushik198018-Aug-16 11:24 
GeneralI am waiting for your next blog Pin
Southmountain23-Jan-16 18:24
Southmountain23-Jan-16 18:24 
GeneralRe: I am waiting for your next blog Pin
Neeraj Kaushik19802-Apr-16 3:26
Neeraj Kaushik19802-Apr-16 3:26 
QuestionSocketConnectHost Pin
Member 1197658611-Sep-15 0:12
Member 1197658611-Sep-15 0:12 
AnswerRe: SocketConnectHost Pin
Neeraj Kaushik198016-Sep-15 9:59
Neeraj Kaushik198016-Sep-15 9:59 
QuestionUsername and Password Pin
Archimedes2428-Apr-15 1:18
professionalArchimedes2428-Apr-15 1:18 
QuestionHelp with QuoteRequest Pin
Member 136612530-Jun-14 1:44
Member 136612530-Jun-14 1:44 
Questionhello,can you help me Pin
zengjunjie22-Apr-14 23:30
zengjunjie22-Apr-14 23:30 
QuestionHelp Fix Protocol Pin
Quartana9-Mar-14 22:52
Quartana9-Mar-14 22:52 
QuestionExample causes problem for FIXT.1.1 version Pin
shafiqul bashar27-Aug-12 20:03
shafiqul bashar27-Aug-12 20:03 
AnswerRe: Example causes problem for FIXT.1.1 version Pin
Neeraj Kaushik198027-Aug-12 20:40
Neeraj Kaushik198027-Aug-12 20:40 
GeneralRe: Example causes problem for FIXT.1.1 version Pin
shafiqul bashar28-Aug-12 0:29
shafiqul bashar28-Aug-12 0:29 
Thanks Neeraj, for the reply.

I saw your post.
Can you please send me the sample application in vb.net for connection with FIXT.1.1?

Please do this favor.
I am eagerly waiting for your reply.


-Russel
GeneralRe: Example causes problem for FIXT.1.1 version Pin
inamalvi25-Mar-13 18:42
inamalvi25-Mar-13 18:42 
GeneralFIX is connecting on Single Machine only i.e.SocketConnectHost=localhost for connecting in LAN network i used SocketConnectHost=remote but not work Pin
SamadhanBagal29-Feb-12 1:28
SamadhanBagal29-Feb-12 1:28 
GeneralRe: FIX is connecting on Single Machine only i.e.SocketConnectHost=localhost for connecting in LAN network i used SocketConnectHost=remote but not work Pin
Neeraj Kaushik198029-Feb-12 1:52
Neeraj Kaushik198029-Feb-12 1:52 
GeneralRe: FIX is connecting on Single Machine only i.e.SocketConnectHost=localhost for connecting in LAN network i used SocketConnectHost=remote but not work Pin
khokon771-Aug-12 23:15
khokon771-Aug-12 23:15 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.