RE: [Quickfix-developers] Custom message
Brought to you by:
orenmnero
|
From: Mike S. <MS...@rj...> - 2006-03-13 19:45:30
|
I apologize in advance for the length of this message.
Because one of the exchanges I'm communicating with has custom nonFIX =
message types, I've had to create a custom message type 'CI' within =
QuickFix. To do this, I created a class calld TraderLoginResponse =
within the fix42 folder of quickfix_net_messages_vs8. The code for that =
looks like this...
namespace QuickFix42
{
public class TraderLoginResponse : Message
{
public TraderLoginResponse() : base(MsgType()) { }
static QuickFix.MsgType MsgType() { return new =
QuickFix.MsgType("CI"); }
public void set(QuickFix.Username value)
{ setField(value); }
public QuickFix.Username get(QuickFix.Username value)
{ getField(value); return value; }
public QuickFix.Username getUsername()
{
QuickFix.Username value =3D new QuickFix.Username();
getField(value); return value;
}
public bool isSet(QuickFix.Username field)
{ return isSetField(field); }
public bool isSetUsername()
{ return isSetField(553); }
};
}
I then added the message to my data dictionary. It looks like this....
<message name=3D"TraderLoginResponse" msgtype=3D"CI" msgcat=3D"admin">
<field name=3D"Username" required=3D"Y"/>
</message>
I also had to add the field definition for Username to the data =
dictionary.
<field number=3D"553" name=3D"Username" type=3D"STRING"/>
When I get a CI message from the exchange, I'm getting the following =
error.
Message 47 Rejected: Conditionally Required Field Missing
Here is what the CI message looks like
8=3DFIX.4.2?
9=3D74?
35=3DCI?
49=3DXXX?
56=3DXXXX?
34=3D47?
52=3D20060313-18:50:46.462?
57=3DX?
553=3DXXX?
10=3D131?
Fyi....here is my header definition in the data dictionary.
<header>
<field name=3D"BeginString" required=3D"Y"/>
<field name=3D"BodyLength" required=3D"Y"/>
<field name=3D"MsgType" required=3D"Y"/>
<field name=3D"SenderCompID" required=3D"Y"/>
<field name=3D"TargetCompID" required=3D"Y"/>
<field name=3D"DeliverToCompID" required=3D"N"/>
<field name=3D"MsgSeqNum" required=3D"Y"/>
<field name=3D"SenderSubID" required=3D"N"/>
<field name=3D"TargetSubID" required=3D"N"/>
<field name=3D"PossDupFlag" required=3D"N"/>
<field name=3D"PossResend" required=3D"N"/>
<field name=3D"SendingTime" required=3D"Y"/>
<field name=3D"OrigSendingTime" required=3D"N"/>
</header>
Does anybody have any ideas as to why I would be getting this message =
and how I can fix it?
Thanks in advance,
Mike
-----Original Message-----
From: Joerg Thoennes [mailto:Joe...@ma...]=20
Sent: Friday, March 10, 2006 11:12 AM
To: Mike Smith
Cc: qui...@li...
Subject: Re: [Quickfix-developers] Custom message
Hi Mike,
> I'm trying to connect to an exchange and they have a custom Trader =
Login
> message with a message type of CG. Has anybody created a custom =
message
> before? If so, could you send me a code sample or give me a few tips?
I assume this message is outbound, ie to be sent to the exchange.
The FIX messages for QF are generated by some XSLT and Ruby scripts from =
the FIX data=20
dictionary. You could use these scripts to generate your own messages =
from a modified=20
FIX4*.xml file, but I do not know how much tweaking is still needed to =
do this.
If you just need one message, just copy a small message, ie =
NewOrderSingle and adapt it to=20
your needs. I.e. for java code in =
quickfix/src/java/src/quickfix/fix40/NewOrderSingle.java:
package quickfix.fix40;
import quickfix.FieldNotFound;
import quickfix.Group;
import quickfix.field.*;
public class NewOrderSingle extends Message
{
public NewOrderSingle()
{
getHeader().setField(new MsgType("D"));
}
public NewOrderSingle(
quickfix.field.ClOrdID aClOrdID,
quickfix.field.HandlInst aHandlInst,
quickfix.field.Symbol aSymbol,
quickfix.field.Side aSide,
quickfix.field.OrderQty aOrderQty,
quickfix.field.OrdType aOrdType ) {
getHeader().setField(new MsgType("D"));
set(aClOrdID);
set(aHandlInst);
set(aSymbol);
set(aSide);
set(aOrderQty);
set(aOrdType);
}
public void set(quickfix.field.ClOrdID value)
{ setField(value); }
public quickfix.field.ClOrdID get(quickfix.field.ClOrdID value)
throws FieldNotFound
{ getField(value); return value; }
...
Copy this to your code tree and adapt it, eg:
package smith.mike...;
import quickfix.FieldNotFound;
import quickfix.Group;
import quickfix.field.*;
public class CustomMessage extends Message
{
public CustomMessage()
{
getHeader().setField(new MsgType("CG"));
}
public CustomMessage(
quickfix.field.XXX field1, ... ) {
getHeader().setField(new MsgType("CG"));
set(field1);
...
}
public void set(quickfix.field.XXX value)
{ setField(value); }
public quickfix.field.XXX get(quickfix.field.XXX value)
throws FieldNotFound
{ getField(value); return value; }
...
If you have repeating group, this is a bit more complicated.
Now you can say
message =3D new CustomMessage( value1, .... );
Session.sendToTarget( message, sessionId ); ...
If you want to receive such message, you have to update your data =
dictionary to include it
and create your own MessageFactory to tell QF how to messages with =
MsgType=3DCG to a Java=20
object.
Please apply this to C# or C++ analogeously.
Cheers, J=F6rg
--=20
Joerg Thoennes
http://macd.com
Tel.: +49 (0)241 44597-24 Macdonald Associates GmbH
Fax : +49 (0)241 44597-10 Lothringer Str. 52, D-52070 Aachen
|