如何在 QuickFix/J 中创建列表顺序消息
How to create list order message in QuickFix/J
我正在尝试生成一个 "list orders"(外汇订单),由我的 TargetCompID 使用 QuickFix/J 库执行。
如果我正确理解 FIX 消息标准,我的消息必须包含以下字段(我已将我的值放在括号中):
Header部分
- 8 BeginString (FIX.4.4)
- 9 BodyLength(发送时由quickfixj计算并提供)
- 35 MsgType (E = NewOrderList)
- 34 MsgSeqNum(发送时由quickfixj计算并提供)
- 49 SenderCompId(就是我)
- 52 SendingTime(发送时由quickfixj计算并提供)
- 56 TargetCompId(这是我的交易对手,将执行我的外汇订单)
然后body部分
- 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 应用程序 ("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);
}
我正在尝试生成一个 "list orders"(外汇订单),由我的 TargetCompID 使用 QuickFix/J 库执行。
如果我正确理解 FIX 消息标准,我的消息必须包含以下字段(我已将我的值放在括号中):
Header部分
- 8 BeginString (FIX.4.4)
- 9 BodyLength(发送时由quickfixj计算并提供)
- 35 MsgType (E = NewOrderList)
- 34 MsgSeqNum(发送时由quickfixj计算并提供)
- 49 SenderCompId(就是我)
- 52 SendingTime(发送时由quickfixj计算并提供)
- 56 TargetCompId(这是我的交易对手,将执行我的外汇订单)
然后body部分
- 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 应用程序 ("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);
}