Working With Messages
User-Defined Fields
FIX allows users to define fields not defined in the specifications. How can QuickFIX be used to set and get user defined fields? Well one answer would be to use the non-type safe set and get fields like so:
C++
message.setField(6123, "value"); message.getField(6123);
Python
message.setField(quickfix.StringField(6123, "value")) field = message.getField(quickfix.StringField(6123)
Ruby
message.setField(Quickfix::StringField.new(6123, "value")) field = message.getField(Quickfix::StringField(6123).new())
QuickFIX also provides supplies macros for creating type safe field objects.
C++
#include "quickfix/Field.h"
namespace FIX
{
USER_DEFINE_STRING(MyStringField, 6123);
USER_DEFINE_PRICE(MyPriceField, 8756);
}
Python
from quickfix import *
class MyStringField(quickfix.StringField):
def __init__(self, data = None)
if data == None:
quickfix.StringField.__init__(self, 6123)
else:
quickfix.StringField.__init__(self, 6123, data)
class MyPriceField(quickfix.DoubleField):
def __init__(self, data = None)
if data == None:
quickfix.DoubleField.__init__(self, 8756)
else:
quickfix.DoubleField.__init__(self, 8756, data)
Ruby
require 'quickfix_ruby'
class MyStringField < Quickfix::StringField
def initialize( data = nil )
if( data == nil )
super(6123)
else
super(6123, data)
end
end
end
class MyDoubleField < Quickfix::DoubleField
def initialize( data = nil )
if( data == nil )
super(8756)
else
super(8756, data)
end
end
end
User defined fields must be declared within the
FIX
namespace. Now, elsewhere in your application, you can write code like this:
C++
MyStringField stringField("string");
MyPriceField priceField(14.54);
message.setField(stringField);
message.setField(priceField);
message.getField(stringField);
message.getField(priceField);
Ruby
stringField = MyStringField("string")
priceField = MyPriceField(14.54)
message.setField(stringField)
message.setField(priceField)
message.getField(stringField)
message.getField(priceField)
Python
stringField = MyStringField.new("string")
priceField = MyPriceField.new(14.54)
message.setField(stringField)
message.setField(priceField)
message.getField(stringField)
message.getField(priceField)
These macros allow you to define fields of all supported FIX types. Keep in mind you can write fields of any type types as long as you supply a new macro and convertor that can convert your type to and from a string.
C++
USER_DEFINE_STRING( NAME, NUM ) USER_DEFINE_CHAR( NAME, NUM ) USER_DEFINE_PRICE( NAME, NUM ) USER_DEFINE_INT( NAME, NUM ) USER_DEFINE_AMT( NAME, NUM ) USER_DEFINE_QTY( NAME, NUM ) USER_DEFINE_CURRENCY( NAME, NUM ) USER_DEFINE_MULTIPLEVALUESTRING( NAME, NUM ) USER_DEFINE_EXCHANGE( NAME, NUM ) USER_DEFINE_UTCTIMESTAMP( NAME, NUM ) USER_DEFINE_BOOLEAN( NAME, NUM ) USER_DEFINE_LOCALMKTDATE( NAME, NUM ) USER_DEFINE_DATA( NAME, NUM ) USER_DEFINE_FLOAT( NAME, NUM ) USER_DEFINE_PRICEOFFSET( NAME, NUM ) USER_DEFINE_MONTHYEAR( NAME, NUM ) USER_DEFINE_DAYOFMONTH( NAME, NUM ) USER_DEFINE_UTCDATE( NAME, NUM ) USER_DEFINE_UTCTIMEONLY( NAME, NUM ) USER_DEFINE_NUMINGROUP( NAME, NUM ) USER_DEFINE_SEQNUM( NAME, NUM ) USER_DEFINE_LENGTH( NAME, NUM ) USER_DEFINE_PERCENTAGE( NAME, NUM ) USER_DEFINE_COUNTRY( NAME, NUM )