I want to log QuickFix messages in sort of parsed mode like tagname,Value
I cannot find existing functionality. I am using QuickFix.Net.
I was thinking about providing some sort of method that would iterate through all presenting tags and parse them using data dictionary.
There is a Java sample http://www.quickfixj.org/confluence/display/qfj/Using+Message+Metadata that can be converted to .NET and that may prove to be useful:
public class MetadataExample {
public static void main(String[] args) throws Exception {
DataDictionary dd = new DataDictionary("FIX44.xml");
Message m = new Message("8=FIX.4.4\0019=247\00135=s\00134=5\001"
+ "49=sender\00152=20060319-09:08:20.881\001"
+ "56=target\00122=8\00140=2\00144=9\00148=ABC\00155=ABC\001"
+ "60=20060319-09:08:19\001548=184214\001549=2\001"
+ "550=0\001552=2\00154=1\001453=2\001448=8\001447=D\001"
+ "452=4\001448=AAA35777\001447=D\001452=3\00138=9\00154=2\001"
+ "453=2\001448=8\001447=D\001452=4\001448=aaa\001447=D\001"
+ "452=3\00138=9\00110=056\001", dd);
MessagePrinter printer = new MessagePrinter();
printer.print(System.out, dd, m);
}
}
public class MessagePrinter {
public void print(DataDictionary dd, Message message) throws FieldNotFound {
String msgType = message.getHeader().getString(MsgType.FIELD);
printFieldMap("", dd, msgType, message.getHeader());
printFieldMap("", dd, msgType, message);
printFieldMap("", dd, msgType, message.getTrailer());
}
private void printFieldMap(String prefix, DataDictionary dd, String msgType, FieldMap fieldMap)
throws FieldNotFound {
Iterator fieldIterator = fieldMap.iterator();
while (fieldIterator.hasNext()) {
Field field = (Field) fieldIterator.next();
if (!isGroupCountField(dd, field)) {
String value = fieldMap.getString(field.getTag());
if (dd.hasFieldValue(field.getTag())) {
value = dd.getValueName(field.getTag(), fieldMap.getString(field.getTag())) + " (" + value + ")";
}
System.out.println(prefix + dd.getFieldName(field.getTag()) + ": " + value);
}
}
Iterator groupsKeys = fieldMap.groupKeyIterator();
while (groupsKeys.hasNext()) {
int groupCountTag = ((Integer) groupsKeys.next()).intValue();
System.out.println(prefix + dd.getFieldName(groupCountTag) + ": count = "
+ fieldMap.getInt(groupCountTag));
Group g = new Group(groupCountTag, 0);
int i = 1;
while (fieldMap.hasGroup(i, groupCountTag)) {
if (i > 1) {
System.out.println(prefix + " ----");
}
fieldMap.getGroup(i, g);
printFieldMap(prefix + " ", dd, msgType, g);
i++;
}
}
}
private boolean isGroupCountField(DataDictionary dd, Field field) {
return dd.getFieldTypeEnum(field.getTag()) == FieldType.NumInGroup;
}
}
Output:
BeginString: FIX.4.4
BodyLength: 247
MsgSeqNum: 5
MsgType: NewOrderCross (s)
SenderCompID: sender
SendingTime: 20060319-09:08:20.881
TargetCompID: target
SecurityIDSource: EXCHANGE_SYMBOL (8)
OrdType: LIMIT (2)
Price: 9
SecurityID: ABC
Symbol: ABC
TransactTime: 20060319-09:08:19
CrossID: 184214
CrossType: CROSS_TRADE_WHICH_IS_EXECUTED_PARTIALLY_AND_THE_REST_IS_CANCELLED (2)
CrossPrioritization: NONE (0)
NoSides: count = 2
OrderQty: 9
Side: BUY (1)
NoPartyIDs: count = 2
PartyIDSource: PROPRIETARY_CUSTOM_CODE (D)
PartyID: 8
PartyRole: CLEARING_FIRM (4)
----
PartyIDSource: PROPRIETARY_CUSTOM_CODE (D)
PartyID: AAA35777
PartyRole: CLIENT_ID (3)
----
OrderQty: 9
Side: SELL (2)
NoPartyIDs: count = 2
PartyIDSource: PROPRIETARY_CUSTOM_CODE (D)
PartyID: 8
PartyRole: CLEARING_FIRM (4)
----
PartyIDSource: PROPRIETARY_CUSTOM_CODE (D)
PartyID: aaa
PartyRole: CLIENT_ID (3)
CheckSum: 056
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With