Sunday, 16 December 2012

Fix8 version 0.6.6 released


I have just released 0.6.6 before Christmas.Here is a summary...

  1. Support for clang (LLVM) compilation (see Jira)
  2. Bug fixes that may have prevented users from executing the performance test that came with 0.6.5. (see Jira)
Thanks again to all those who have helped along the way.

Sunday, 9 December 2012

Friday, 7 December 2012

Fix8 version 0.6.5 release pending

I am about to release 0.6.5. Just conferring with a few people and doing some more testing. Here is a summary...

  1. Change to Lesser GPL license - more permissive, removes viral aspects of GPLv2
  2. Numerous bug fixes - especially session, session wrappers and test applications (see Jira)
  3. Decode performance improvement, now roughly matches encode.
  4. Full description of performance test methodology and results, including script to permit users to test and compare code performance (also on our web site).

Wednesday, 28 November 2012

Lesser GPL

After some consideration and feedback, we have decided to change our license to the Lesser GPL.

From GNU:

The GNU Project has two principal licenses to use for libraries. One is the GNU Lesser GPL; the other is the ordinary GNU GPL. The choice of license makes a big difference: using the Lesser GPL permits use of the library in proprietary programs; using the ordinary GPL for a library makes it available only for free programs.
Which license is best for a given library is a matter of strategy, and it depends on the details of the situation. At present, most GNU libraries are covered by the Lesser GPL.
We will roll this out in the next version (very soon).

Thursday, 22 November 2012

Fix8 version 0.6.4 released

More bug fixes reported by users. Thanks to all!

Please check Jira issues page for details.

Sunday, 18 November 2012

File based persistence

I've had a few requests to remove the dependency on BerkeleyDB.

Starting in 0.6.3 I've added file based persistence code but I have not enabled it yet. It is not tested.
If anybody would like to enable it and test please do. The relevant section is commented out in the method:

Persister *Configuration::create_persister 

in

./runtime/configuration.cpp

Within the next few releases I will make file based persistence the default, and make BerkeleyDB optional. I am not expecting performance difference although there may be some.

I have marked version 0.7.0 for release of this feature.

Fix8 version 0.6.3 released

A number of issues have been fixed - mostly reported by users.
Please check Jira issues page for details.

Tuesday, 23 October 2012

Fix8 version 0.6.2 released

  1. Changed to GPLv2; 
  2. added shell command pipe variable import to XML; added xi:include to XML;
  3. Jira Issues Page 
  4. Jira integration with github

Sunday, 7 October 2012

Fix8 version 0.6.1 released

Some minor bug fixes.
"Added configurable max message length(maxmsglen); xml xpath permits absolute xpaths; fixed issue with compiler and msgtype;"

Saturday, 15 September 2012

C++11 fork

I am planning on forking fix8 in github to create a c++11 branch. There are some powerful improvements to the language that fix8 could really benefit from. It will also help me improve my grasp of the changes.

I am using gcc 4.7.1 with -std=c++11 compilation switch.

Sunday, 29 July 2012

Fix8 version 0.6.0 released

I have released Fix8 version 0.6.0 today. This is a performance release and will:

1. reduce the encode/decode latency, improve throughput
2. add a metadata driven test harness

home

harness

This test client uses the FIX8::consolemenu class to provide a simple metadat driven test client. All of the messages and fields generated by the compiler are available.

The following is an example run:


% ./harness -r -l client -c hf_client.xml

?=help >
Key     Command
===     =======
?       Help
c       Create messages
d       Delete messages
e       Edit messages
l       Logout
r       Read messages from disk
s       Send messages
w       Write messages to disk
x       Exit

?=help >

--------------------------------------------------
 Select message to create
--------------------------------------------------
[0]  Heartbeat(0)
[1]  TestRequest(1)
[2]  ResendRequest(2)
[3]  Reject(3)
[4]  SequenceReset(4)
[5]  Logout(5)
[6]  IOI(6)
[7]  Advertisement(7)
[8]  ExecutionReport(8)
[9]  OrderCancelReject(9)
[a]  Logon(A)
[b]  DerivativeSecurityList(AA)
[c]  NewOrderMultileg(AB)
[d]  MultilegOrderCancelReplace(AC)
[e]  TradeCaptureReportRequest(AD)
[f]  TradeCaptureReport(AE)
[g]  OrderMassStatusRequest(AF)
[h]  QuoteRequestReject(AG)
[i]  RFQRequest(AH)
[j]  QuoteStatusReport(AI)
[k]  QuoteResponse(AJ)
[l]  Confirmation(AK)
[m]  PositionMaintenanceRequest(AL)
[n]  PositionMaintenanceReport(AM)
[o]  RequestForPositions(AN)
[p]  RequestForPositionsAck(AO)
[q]  PositionReport(AP)
[r]  TradeCaptureReportRequestAck(AQ)
[s]  TradeCaptureReportAck(AR)
[t]  AllocationReport(AS)
[u]  AllocationReportAck(AT)
[v]  ConfirmationAck(AU)
[w]  SettlementInstructionRequest(AV)
[x]  AssignmentReport(AW)
[y]  CollateralRequest(AX)
[z]  CollateralAssignment(AY)
[A]  CollateralResponse(AZ)
[B]  News(B)
[C]  CollateralReport(BA)
[D]  CollateralInquiry(BB)
[E]  NetworkCounterpartySystemStatusRequest(BC)
[F]  NetworkCounterpartySystemStatusResponse(BD)
[G]  UserRequest(BE)
[H]  UserResponse(BF)
[I]  CollateralInquiryAck(BG)
[J]  ConfirmationRequest(BH)
[K]  TradingSessionListRequest(BI)
[L]  TradingSessionList(BJ)
[M]  SecurityListUpdateReport(BK)
[N]  AdjustedPositionReport(BL)
Page 1/3 Press ENTER for next page, '.' to Quit or type an option>G

--------------------------------------------------
 UserRequest: Select field to add
--------------------------------------------------
[0]  RawDataLength(95)
[1]  RawData(96)
[2] *Username(553)
[3]  Password(554)
[4] *UserRequestID(923)
[5] *UserRequestType(924)
[6]  NewPassword(925)
[7]  EncryptedPasswordMethod(1400)
[8]  EncryptedPasswordLen(1401)
[9]  EncryptedPassword(1402)
[a]  EncryptedNewPasswordLen(1403)
[b]  EncryptedNewPassword(1404)
Page 1/1 Press ENTER for next page, '.' to Quit or type an option>2


Username: dakka

--------------------------------------------------
 UserRequest: Select field to add
--------------------------------------------------
[0]  RawDataLength(95)
[1]  RawData(96)
[2] +Username (553): dakka
[3]  Password(554)
[4] *UserRequestID(923)
[5] *UserRequestType(924)
[6]  NewPassword(925)
[7]  EncryptedPasswordMethod(1400)
[8]  EncryptedPasswordLen(1401)
[9]  EncryptedPassword(1402)
[a]  EncryptedNewPasswordLen(1403)
[b]  EncryptedNewPassword(1404)
Page 1/1 Press ENTER for next page, '.' to Quit or type an option> 4

UserRequestID: 1

--------------------------------------------------
 UserRequest: Select field to add
--------------------------------------------------
[0]  RawDataLength(95)
[1]  RawData(96)
[2] +Username (553): dakka
[3]  Password(554)
[4] +UserRequestID (923): 1
[5] *UserRequestType(924)
[6]  NewPassword(925)
[7]  EncryptedPasswordMethod(1400)
[8]  EncryptedPasswordLen(1401)
[9]  EncryptedPassword(1402)
[a]  EncryptedNewPasswordLen(1403)
[b]  EncryptedNewPassword(1404)
Page 1/1 Press ENTER for next page, '.' to Quit or type an option> 5
--------------------------------------------------
 UserRequestType: Select realm value to add
--------------------------------------------------
[0]  LOG_ON_USER (1)
[1]  LOG_OFF_USER (2)
[2]  CHANGE_PASSWORD_FOR_USER (3)
[3]  REQUEST_INDIVIDUAL_USER_STATUS (4)
Page 1/1 Press ENTER for next page, '.' to Quit or type an option> 3
--------------------------------------------------
 UserRequest: Select field to add
--------------------------------------------------
[0]  RawDataLength(95)
[1]  RawData(96)
[2] +Username (553): dakka
[3]  Password(554)
[4] +UserRequestID (923): 1
[5] +UserRequestType (924): CHANGE_PASSWORD_FOR_USER (3)
[6]  NewPassword(925)
[7]  EncryptedPasswordMethod(1400)
[8]  EncryptedPasswordLen(1401)
[9]  EncryptedPassword(1402)
[a]  EncryptedNewPasswordLen(1403)
[b]  EncryptedNewPassword(1404)
Page 1/1 Press ENTER for next page, '.' to Quit or type an option> .


UserRequest ("BE")
   Username (553): dakka
   UserRequestID (923): 1
   UserRequestType (924): CHANGE_PASSWORD_FOR_USER (3)

Add to list? (y/n):y
--------------------------------------------------
 Select message to create
--------------------------------------------------
[0]  Heartbeat(0)
[1]  TestRequest(1)
[2]  ResendRequest(2)
[3]  Reject(3)
[4]  SequenceReset(4)
[5]  Logout(5)
[6]  IOI(6)
[7]  Advertisement(7)
[8]  ExecutionReport(8)
[9]  OrderCancelReject(9)
[a]  Logon(A)
[b]  DerivativeSecurityList(AA)
[c]  NewOrderMultileg(AB)
[d]  MultilegOrderCancelReplace(AC)
[e]  TradeCaptureReportRequest(AD)
[f]  TradeCaptureReport(AE)
[g]  OrderMassStatusRequest(AF)
[h]  QuoteRequestReject(AG)
[i]  RFQRequest(AH)
[j]  QuoteStatusReport(AI)
[k]  QuoteResponse(AJ)
[l]  Confirmation(AK)
[m]  PositionMaintenanceRequest(AL)
[n]  PositionMaintenanceReport(AM)
[o]  RequestForPositions(AN)
[p]  RequestForPositionsAck(AO)
[q]  PositionReport(AP)
[r]  TradeCaptureReportRequestAck(AQ)
[s]  TradeCaptureReportAck(AR)
[t]  AllocationReport(AS)
[u]  AllocationReportAck(AT)
[v]  ConfirmationAck(AU)
[w]  SettlementInstructionRequest(AV)
[x]  AssignmentReport(AW)
[y]  CollateralRequest(AX)
[z]  CollateralAssignment(AY)
[A]  CollateralResponse(AZ)
[B]  News(B)
[C]  CollateralReport(BA)
[D]  CollateralInquiry(BB)
[E]  NetworkCounterpartySystemStatusRequest(BC)
[F]  NetworkCounterpartySystemStatusResponse(BD)
[G]  UserRequest(BE)
[H]  UserResponse(BF)
[I]  CollateralInquiryAck(BG)
[J]  ConfirmationRequest(BH)
[K]  TradingSessionListRequest(BI)
[L]  TradingSessionList(BJ)
[M]  SecurityListUpdateReport(BK)
[N]  AdjustedPositionReport(BL)
Page 1/3 Press ENTER for next page, '.' to Quit or type an option> .


?=help >
% ?

Key     Command
===     =======
?       Help
c       Create messages
d       Delete messages
e       Edit messages
l       Logout
r       Read messages from disk
s       Send messages
w       Write messages to disk
x       Exit

?=help > s

Send messages? (y/n):y
?=help > x

%

notes:
1. Mandatory fields are maked with an '*'
2. Fields that have values are marked with an '+'
3. For fields that have pre-defined domain values, a sub-menu of valid values is presented to select

Thursday, 19 July 2012

Fix8 version 0.6.0 to be released soon

Fix8 version 0.6.0 will be released very soon. This release will again address performance (substantial improvements here) Also I have added a simple metadata driven test harness. There have also been numerous bug fixes and improvements. Time poverty is all that is holding this back ;(

Monday, 11 June 2012

Fix8 version 0.5.8 released

I have just released fix8 0.5.8. This release addresses the reported problems with repeating groups. See earlier post.

Thursday, 7 June 2012

Bug in 0.5.7: repeating groups

0.5.7 introduced a bug whereby repeating groups were inadvertently broken. The sample f8test would not build and the number of repeating elements field preceding the repeating groups was not generated by the compiler.

I am going to release a fix in the next day or so. Mea culpa.

Friday, 25 May 2012

Fix8 version 0.5.7 released

I am releasing Fix8 version 0.5.7 today. This is a performance release and is designed to:

1. reduce the encode/decode latency
2. reduce message and field ctor./ dtor times
3. optimise internal message field lookups

home

hftest

I have also included a new test application designed to provide an example of high frequency use. The new application is called hftest and will be built by default. Its configuration and operation is similar to the other test client/server f8test.

You can preload (pre-construct and populate) a specified number of NewOrderSingle messages and then transmit them in one go. In the following example, we preload 200000 orders and send them. The server then responds with ExecutionReports (acks and fills).

The following is an example run:


% ./hftest -r -l client
0000001 A 2012-05-21 09:18:43.632024292 Starting session
0000002 A 2012-05-21 09:18:43.632259581 Trying to connect to: 127.0.0.1:11002 (1)
0000003 A 2012-05-21 09:18:43.632577430 Connection successful
0000004 A 2012-05-21 09:18:43.632741462 Session connected
0000005 B 2012-05-21 09:18:43.637290025 Heartbeat interval is 5


Key     Command
===     =======
?       Help
a       Send all Preloaded NewOrderSingle msgs
l       Logout
n       Send a NewOrderSingle msg
p       Preload n NewOrderSingle msgs
x       Exit




0 NewOrderSingle msgs currently preloaded.
Enter number of NewOrderSingle msgs to preload:200000
200000 NewOrderSingle msgs preloaded.
200000 NewOrderSingle msgs sent
0 NewOrderSingle msgs remaining.
787000 ExecutionReport msgs received
0000006 C 2012-05-21 09:25:31.043745212 Session terminating


Latency


On my test machine which is a
mac mini (Intel(R) Core(TM) i7-2635QM CPU @ 2.00GHz)
running Ubuntu 12.04 64 bit
4GB RAM

Simple ExecutionReport:
encode 20us, decode 72us, ctor 8us, dtor 3.4us

Simple NewOrderSingle
encode 17us, decode 70us, ctor 7us, dtor 2.6us