2

我正在尝试使用 QuickFix/J lib 生成由我的 TargetCompID 执行的“列表订单”(外汇订单)。

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

标题部分

  • 8 开始字符串 (FIX.4.4)
  • 9 BodyLength(发送时由quickfixj计算并提供)
  • 35 MsgType (E = NewOrderList)
  • 34 MsgSeqNum(将在发送时由 quickfixj 计算和提供)
  • 49 SenderCompId(就是我)
  • 52 SendingTime(发送时由quickfixj计算并提供)
  • 56 TargetCompId(这是我的交易对手,将执行我的外汇订单)

然后是身体部位

  • 66 ListId (uniq id 计算)
  • 68 ToNoOrders(我的订单数量到列表中)
  • 73 NoOrders(与我将立即生成完整订单列表的计数值相同)

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

  • 11 ClOrdId(我的订单编号)
  • 67 ListSeqNo(我列表中的订单索引:从 1 到 N;N = ToNoOrders = NoOrders)
  • ... 其他几个字段,如 15(货币)、120(SettlCurrency)

为此,我已经完成了(在 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 应用程序的回调函数 toApp 中(“这是您正在发送给交易对手的应用程序消息的回调”),在参数 (syso(message)) 中显示消息表明只有一个订单在我的信息中,这是我发出的最后一个命令。

看起来它们是我们可以在 QuickFixJ 中创建的一些“组”,我们可以在同一条消息中添加多个组。但是有很多类型的组,我不知道什么组适合我的“列表顺序”,如果有的话?我看到有一个 Message 的子类,它是 NewOrderList(它是我的 MsgType = E),但它不是一个“组”;并且必须可以直接创建 Message 并提供 MsgType ......

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

问候,

亚历克斯

4

2 回答 2

3

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

在你的情况下,我会开始看quickfix.fix44.NewOrderList.

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

对于重复组,有一些辅助类可用于在消息中设置该信息。例如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 );
于 2016-03-03T14:17:51.353 回答
1

好的,我知道了。

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

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

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);
}
于 2016-03-03T14:27:45.510 回答