Receiving Messages
Receiving messages in QuickFIX/n is type safe and simple:
public void OnMessage(
QuickFix.FIX44.NewOrderSingle order,
SessionID sessionID)
{
ProcessOrder(order.Price, order.OrderQty, order.Account);
}
Receiving Type Safe Messages
The best way to write an app is with the specific,
strongly typed
Message
and
Field
classes, which we'll mixin with MessageCracker.
We import the
MessageCracker
class, inherit from it, then call
Crack
inside FromApp:
using QuickFix;
public class MyApplication : MessageCracker, IApplication
{
public void FromApp(Message msg, SessionID sessionID)
{
Crack(msg, sessionID);
}
//...
}
Crack
will then call the appropriate overloaded
OnMessage
callback. This example receives orders and security definitions:
public void OnMessage(
QuickFix.FIX44.NewOrderSingle ord,
SessionID sessionID)
{
ProcessOrder(ord.Price, ord.OrderQty, ord.Account);
}
public void OnMessage(
QuickFix.FIX44.SecurityDefinition secDef,
SessionID sessionID)
{
GotSecDef(secDef);
}
Example Message Cracker
Putting it all together, a full application with type safe orders looks like this:
public class MyApplication : MessageCracker, IApplication
{
public void OnMessage(
QuickFix.FIX42.NewOrderSingle ord,
SessionID sessionID)
{
ProcessOrder(ord.Price, ord.OrderQty, ord.Account);
}
protected void ProcessOrder(
Price price,
OrderQty quantity,
Account account)
{
//...
}
#region Application Methods
public void FromApp(Message msg, SessionID sessionID)
{
Crack(msg, sessionID);
}
public void OnCreate(SessionID sessionID) { }
public void OnLogout(SessionID sessionID) { }
public void OnLogon(SessionID sessionID) { }
public void FromAdmin(Message msg, SessionID sessionID)
{ }
public void ToAdmin(Message msg, SessionID sessionID)
{ }
public void ToApp(Message msg, SessionID sessionID)
{ }
#endregion
}
Less Type Safe
It is possible to receive message callbacks with only the base class Message.
This is not recommended!
We lose the type safe
Group
and
Field
properties and extra boilerplate logic is required:
// NOT RECOMMENDED
public class MyApplication : IApplication
{
public void FromApp(Message msg, SessionID sessionID)
{
string msgType = msg.Header.GetString(Tags.MsgType);
if (msgType.Equals(MsgType.EXECUTION_REPORT))
{
string account = msg.GetString(Tags.Account);
decimal price = msg.GetDecimal(Tags.Price);
}
}
// ...same Application callbacks as above
}