Documentation for QuickFIX/C++ (with Python and Ruby)

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 )