如何在 QuickFix/J 中创建列表顺序消息

How to create list order message in QuickFix/J

我正在尝试生成一个 "list orders"(外汇订单),由我的 TargetCompID 使用 QuickFix/J 库执行。

如果我正确理解 FIX 消息标准,我的消息必须包含以下字段(我已将我的值放在括号中):

Header部分

然后body部分

然后重复以下字段列表(我的列表中每个订单一个列表字段):

我已经做到了(在 java / quickfixj 中):

Message message = new Message();
Header header = message.getHeader();
header.setField(new BeginString("FIX.4.4"));
header.setField(new MsgType("E"));
header.setField(new SenderCompID("it's me"));
header.setField(new TargetCompID("my counterparty"));
message.setField(new ListID(_fixListId));
message.setField(new TotNoOrders(_list.size()));
message.setField(new NoOrders(_list.size()));
int idx = 0;
for (Order order : _list) {
    message.setField(new ClOrdID(order.getId()));
    message.setField(new ListSeqNo(++idx));
    //message.setField(.... other fields to add to describe my order)
}

但是这样做,在我的 quickfixj 应用程序 ("This is a callback for application messages that you are being sent to a counterparty") 的回调函数 toApp 中,显示参数 (syso(message)) 中的消息仅显示我的消息里有一个订单,这是我下的最后一个订单。

看起来它们是一些我们可以在 QuickFixJ 中创建的 "group",我们可以在同一条消息中添加多个组。但是有很多种类的组,我不知道哪种组适合我的"list order",如果有的话?我看到 Message 有一个子类,它是 NewOrderList(这是我的 MsgType = E),但它不是 "group";并且必须可以创建 Message 并直接提供 MsgType...

或者我没有正确理解 FIX 消息标准和我必须提供的字段?

此致,

亚历克斯

您应该使用 QuickFIX/J 中的预定义消息,而不是从头开始创建消息。

对于你的情况,我会开始查看 quickfix.fix44.NewOrderList

通过使用此 class,将在消息的页眉和页脚部分为您填写大量字段(BeginString、BodyLength、MsgType、CheckSum 等)。然后您只需要主要关注消息的主要部分(即正文)。

对于重复组,有帮助程序 class 可用于在消息中设置该信息。例如。对于 NewOrderList.NoOrders:

quickfix.fix44.NewOrderList fixMessage = new quickfix.fix44.NewOrderList (
    .... // check constructor for what parameters to pass
);
// ...
quickfix.fix44.NewOrderList.NoOrders noOrders = new quickfix.fix44.NewOrderList.NoOrders();
// ...
fixMessage.addGroup( noOrders );

好的,我知道了。

我使用了通用组,并手动设置了字段。

所以更新的代码解决方案是:

Message message = new Message();
Header header = message.getHeader();
header.setField(new BeginString("FIX.4.4"));
header.setField(new MsgType("E"));
header.setField(new SenderCompID("it's me"));
header.setField(new TargetCompID("my counterparty"));
message.setField(new ListID(_fixListId));
message.setField(new TotNoOrders(_list.size()));
message.setField(new NoOrders(_list.size()));
int idx = 0;
for (Order order : _list) {
    Group group = new Group(18, new ClOrdID().getTag()); //18 is the number of field I will add below inot the group, second paramaeter is the first field of the group
    group.setField(new ClOrdID(order.getId()));
    group.setField(new ListSeqNo(++idx));
    //message.setField(.... other fields to add to describe my order)
    message.addGroup(group);
}